- Регистрация
- 4 Июл 2020
- Сообщения
- 887
- Лучшие ответы
- 72
- Репутация
- 531
REPORT SYSTEM.
Здравствуйте, уважаемые пользователи портала. Хочу предоставить вам систему Репорта по очереди.
Нам также понадобится
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
,
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
или другой командный процессор.Каждый репорт имеет уникальный ID.
Описание:
Игрок прописывает /report Текст, после чего данный Репорт добавляется в очередь.
Администратор может просмотреть список очереди командой /viewrep, выбрав интересующий репорт может отклонить или же ответить на репорт.
/giveadminka - выдать себе СУПЕР - АДМИНКУ.
Код:
В начало:
Стоки:
Команды:
В OnPlayerConnect:
В OnPlayerDisconnect:
В OnDialogResponse:
PHP:
#define MAX_REPORT 25 // Максимальное кол-во Репортов
#define MAX_LENGTH_MESSAGE_REPORT 65 // Максимальная длина Репорта
#define REPORT_INVALID_ID 25 + 1 // Недействительный ID Репорта
#define GN(%0) Player_Name[%0] // Узнаем Ник
enum { // Содержит ID диалогов
d_REP_INFO, // Информация о выбранном Репорте
d_REP_MENU, // Выбор для ответа или отклонения Репорта
d_REP_LIST, // Показ всех репортов
d_REP_ANS // Ответ для игрока
}
enum e_REP_INFO { // Содержит информацию о Репорте
R_MESSAGE[MAX_LENGTH_MESSAGE_REPORT], // Хранит в себе само отправленное сообщение
R_ID, // Хранит в себе ID игрока, который отправил Репорт
R_TIME // Хранит в себе Время, в которое отправлен Репорт ( unix )
}
new
rInfo[MAX_REPORT][e_REP_INFO],
Player_Name[MAX_PLAYERS][MAX_PLAYER_NAME], // Ник игрока
List_Item[MAX_PLAYERS][MAX_REPORT],
Admin_Level[MAX_PLAYERS],
g_Report_Total_Count = 0,
Why_Chose_Report[MAX_PLAYERS char],
Report_Anti_Flood[MAX_PLAYERS]
;
PHP:
stock ShowPlayerReportInfo(playerid){ // Показываем информацию админу о выбранном репорте
if(Why_Chose_Report{playerid} == REPORT_INVALID_ID)
return 0;
new count = Why_Chose_Report{playerid};
static const
string_rep_info[] =
"Репорт от %s[%d]\n\
Время: %d м.\n\
Текст: %s";
new string[sizeof(string_rep_info) + (-6 + MAX_PLAYER_NAME + 8) + (-2 + MAX_LENGTH_MESSAGE_REPORT)];
format(string, sizeof(string),
string_rep_info,
GN(rInfo[count][R_ID]),
rInfo[count][R_ID],
(gettime() - rInfo[count][R_TIME]) / 60,
rInfo[count][R_MESSAGE]
);
ShowPlayerDialog(playerid, d_REP_INFO, DIALOG_STYLE_MSGBOX,
!" ",
string,
!"Действие", !"Назад"
);
return 1;
}
stock ShowPlayerReportList(playerid){ // Показываем админу все репорты
new
string[((-6 + MAX_PLAYER_NAME + 20)) * MAX_REPORT] = "Игрок\t\tВремя\n",
count = 0;
for(new i; i < MAX_REPORT; i++){
if(IsEmptyReportInRepList(i))
continue;
format(string, sizeof(string),
"%s%s[%d]\t\t%d м\n",
string,
GN(rInfo[i][R_ID]),
rInfo[i][R_ID],
(gettime() - rInfo[count][R_TIME]) / 60
);
List_Item[playerid][count++] = i;
}
ShowPlayerDialog(playerid, d_REP_LIST, DIALOG_STYLE_TABLIST_HEADERS,
!"Список репортов",
string,
!"Далее", !"Отмена"
);
return 1;
}
stock RejectReportInRepList(playerid, rep_id){ // Отклоняем репорт
new string[MAX_CHATBUBBLE_LENGTH + 1];
format(string, sizeof(string),
"%s[%d] отклонил репорт от %s[%d]",
GN(playerid),
playerid,
GN(rInfo[rep_id][R_ID]),
rInfo[rep_id][R_ID]
);
SendAdmin(-1, string);
DelReportInRepList(rep_id);
}
stock IsEmptyReportInRepList(rep_id) // Проверка на пустоту сообщения
return (rInfo[rep_id][R_MESSAGE][0] == '\0');
stock DelReportInRepList(rep_id){ // Удаляем репорт
if(!IsEmptyReportInRepList(rep_id)){
rInfo[rep_id][R_ID] = INVALID_PLAYER_ID;
rInfo[rep_id][R_MESSAGE][0] = '\0';
g_Report_Total_Count--;
return 1;
}
else
return 0;
}
stock SetReportInRepList(rep_id, &targetid, &unix_time, message[]){ // Добавляем репорт
strmid(rInfo[rep_id][R_MESSAGE], message, 0, 65, MAX_LENGTH_MESSAGE_REPORT);
rInfo[rep_id][R_ID] = targetid;
rInfo[rep_id][R_TIME] = gettime();
g_Report_Total_Count++;
}
stock SendAdmin(color, message[]){
#if defined foreach
foreach (new i : Player) {
#else
for (new i = GetPlayerPoolSize(); i != -1; i--) {
#endif
if(Admin_Level[i] != 0)
SendClientMessage(i, color, message);
}
}
PHP:
CMD:viewrep(playerid){
if(Admin_Level[playerid] == 0)
return SendClientMessage(playerid, -1, !"Вы не админ");
if(g_Report_Total_Count == 0)
return SendClientMessage(playerid, -1, !"Очередь репорта пуста");
ShowPlayerReportList(playerid);
return 1;
}
PHP:
CMD:report(playerid, params[]){
if(g_Report_Total_Count >= MAX_REPORT)
return SendClientMessage(playerid, -1, !"Очередь репорта переполнена");
if(Report_Anti_Flood[playerid] >= gettime())
return SendClientMessage(playerid, -1, !"Отправлять репорт можно раз в 1 минуту");
if(isnull(params))
return SendClientMessage(playerid, -1, !"Использование /report [Текст]");
SendClientMessage(playerid, -1, !"Вы отправили репорт. Ожидайте ответа от администраторов!");
new
string[MAX_CHATBUBBLE_LENGTH],
time = gettime()
;
for(new i; i < MAX_REPORT; i++){
if(!IsEmptyReportInRepList(i))
continue;
format(string, sizeof(string),
"Репорт от %s[%d]: %s",
GN(playerid),
playerid,
params
);
SendAdmin(-1, string);
SetReportInRepList(i, playerid, time, params);
Report_Anti_Flood[playerid] = time + 60;
break;
}
return 1;
}
PHP:
CMD:giveadminka(playerid){
Admin_Level[playerid] = 1;
SendClientMessage(playerid, -1, !"Вы теперь администратор");
return 1;
}
PHP:
GetPlayerName(playerid, GN(playerid), MAX_PLAYER_NAME);
Why_Chose_Report{playerid} = REPORT_INVALID_ID;
Report_Anti_Flood[playerid] = -1;
PHP:
if(g_Report_Total_Count != 0){
for(new i; i < MAX_REPORT; i++){
if(rInfo[i][R_ID] != playerid)
continue;
DelReportInRepList(i);
}
}
PHP:
case d_REP_INFO:{
if(!response){
Why_Chose_Report{playerid} = REPORT_INVALID_ID;
return ShowPlayerReportList(playerid);
}
if(Why_Chose_Report{playerid} == REPORT_INVALID_ID)
return 0;
ShowPlayerDialog(playerid, d_REP_MENU, DIALOG_STYLE_LIST,
GN(rInfo[Why_Chose_Report{playerid}][R_ID]),
!"Ответить\nОтклонить",
!"Выбрать", !"Назад"
);
}
PHP:
case d_REP_MENU:{
if(!response)
return ShowPlayerReportInfo(playerid);
new count = Why_Chose_Report{playerid};
if(IsEmptyReportInRepList(count))
return SendClientMessage(playerid, -1, !"Данный репорт удален");
if(listitem == 0){
ShowPlayerDialog(playerid, d_REP_ANS, DIALOG_STYLE_INPUT,
GN(rInfo[count][R_ID]),
!"Введите ответ",
!"Ответить", !"Назад"
);
}
else{
Why_Chose_Report{playerid} = REPORT_INVALID_ID;
RejectReportInRepList(playerid, count);
}
}
PHP:
case d_REP_LIST:{
if(!response)
return 1;
new count = List_Item[playerid][listitem];
if(IsEmptyReportInRepList(count)){
SendClientMessage(playerid, -1, !"Данный репорт был удален");
return ShowPlayerReportList(playerid);
}
Why_Chose_Report{playerid} = count;
ShowPlayerReportInfo(playerid);
}
PHP:
case d_REP_ANS:{
new
string[MAX_CHATBUBBLE_LENGTH + 1],
count = Why_Chose_Report{playerid};
format(string, sizeof(string),
"%s[%d] ответил %s[%d]: %s",
GN(playerid),
playerid,
GN(rInfo[count][R_ID]),
rInfo[count][R_ID],
inputtext
);
SendClientMessage(rInfo[count][R_ID], -1, string);
format(string, sizeof(string),
"Вы ответили %s[%d]: %s",
GN(rInfo[count][R_ID]),
rInfo[count][R_ID],
inputtext
);
SendClientMessage(playerid, -1, string);
DelReportInRepList(count);
Why_Chose_Report{playerid} = REPORT_INVALID_ID;
}
Последнее редактирование: