Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Мануал Репорт по очереди

Redoreck

Изучающий
Пользователь
Регистрация
4 Июл 2020
Сообщения
887
Лучшие ответы
72
Репутация
531
REPORT SYSTEM.

Здравствуйте, уважаемые пользователи портала. Хочу предоставить вам систему Репорта по очереди.
Нам также понадобится
, или другой командный процессор.

Каждый репорт имеет уникальный ID.
Описание:
Игрок прописывает /report Текст, после чего данный Репорт добавляется в очередь.
Администратор может просмотреть список очереди командой /viewrep, выбрав интересующий репорт может отклонить или же ответить на репорт.
/giveadminka - выдать себе СУПЕР - АДМИНКУ.

Код:
В начало:
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;
}
В OnPlayerConnect:
PHP:
GetPlayerName(playerid, GN(playerid), MAX_PLAYER_NAME);

Why_Chose_Report{playerid} = REPORT_INVALID_ID;
Report_Anti_Flood[playerid] = -1;
В OnPlayerDisconnect:
PHP:
if(g_Report_Total_Count != 0){
    for(new i; i < MAX_REPORT; i++){
        if(rInfo[i][R_ID] != playerid)
            continue;

        DelReportInRepList(i);
    }
}
В OnDialogResponse:
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;
}
 
Последнее редактирование:
Сверху Снизу