Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для James_Cruise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.10.2014
    Сообщений
    11
    Репутация:
    0 ±

    Система агентов поддержки

    Система агентов поддержки с хранящей базой вопросов,а именно,игрок написал вопрос,агент поддержки зашёл на сервер,ввёл команду /все_вопросы ,и у него появились все ожидаемые вопросы.
    Каждый вопрос имеет своё время на ответ,после чего он аннулируется так же если игрок вышел с сервера при том не получил ответа,его вопрос/ы аннулируется.
    После ответа на вопрос,игроки могут поставить оценку агенту,который отвечал на вопрос.

     Код
    После include:
    PHP код:
    #define MAX_QUESTIONS               100 /* Сколько вопросов будет храниться в базе */
    #define MAX_PLAYER_QUESTIONS         5 /* Сколько вопросов игрок может задать с учётом,что он не получил ответа */
    #define MAX_SPECIES_REPLY             5 /* Сколько видов оценок */
    #define MAX_TEXT_REPLY                 2 /* Максимальная длина названия оценки,ставить на 1 больше */
    #define MAX_TIME_QUESTION      30*60000 /* Время в ms после чего вопрос будет удалён в случае ингора,на данный момент 30 минут */ 
    После new:
    PHP код:
    new Agent[MAX_PLAYERS char];
    new 
    Agent_str[MAX_PLAYERS];
    new 
    Agent_assessment[MAX_PLAYERS][MAX_SPECIES_REPLY];
    new 
    ID_question[MAX_QUESTIONS];
    new 
    Time_question[MAX_QUESTIONS];
    new 
    Player_question[MAX_QUESTIONS][160];
    new 
    Player_ID_question[MAX_PLAYERS][MAX_PLAYER_QUESTIONS];
    new 
    Player_question_all[MAX_PLAYERS char];
    new 
    Title_reply[MAX_SPECIES_REPLY][MAX_TEXT_REPLY] = { "1","2","3","4","5" };/* Тут напишешь названия оценок */
    new Agent_list_ID_question[MAX_PLAYERS][MAX_QUESTIONS];
    new 
    String_support[MAX_QUESTIONS];
    new 
    Timer_question;
    new 
    MAX_AGENT
    В OnGameInit:
    PHP код:
        MAX_AGENT floatround(sizeof(String_support)/(MAX_PLAYER_NAME+2),floatround_floor);
        
    printf("Система настроена под %d агент(ов|а) поддержки!",MAX_AGENT);
        for(new 
    qMAX_QUESTIONS; ++q)ID_question[q] = -1,Player_question[q] = "";
        
    Timer_question SetTimer("TimerHelp",1000,true); 
    В OnGameExit:
    PHP код:
        KillTimer(Timer_question); 
    В OnPlayerConnect:
    PHP код:
        new q;
        
    Agent{playerid} = 0;
        for(; 
    MAX_PLAYER_QUESTIONS; ++q)Player_ID_question[playerid][q] = -1;
        
    Player_question_all{playerid} = 0;
        for(
    0MAX_SPECIES_REPLY; ++q)Agent_assessment[playerid][q] = 0
    В OnPlayerDisconnect:
    PHP код:
        for(new qMAX_PLAYER_QUESTIONS; ++q)
         {
              if(
    Player_ID_question[playerid][q] != -1)ID_question[Player_ID_question[playerid][q]] = -1,Player_question[Player_ID_question[playerid][q]] = "";
           } 
    В OnPlayerCommandText:
    PHP код:
        if(strcmp("/вопрос"cmdtexttrue8) == 0)return ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Техподдержка","Введите вопрос и агенты техподдержки в ближайшее время на них ответят","Отправить","Отмена");
        if(
    strcmp("/ответ"cmdtexttrue7) == 0)
        {
            if(
    Agent{playerid} == 1)return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Техподдержка","Введите ID вопроса","Дальше","Отмена");
        }
        if(
    strcmp("/все_вопросы"cmdtexttrue13) == 0)
        {
            if(
    Agent{playerid} == 1)
            {
                new 
    String_support1[6],l;String_support "";
                for(new 
    qMAX_QUESTIONS; ++q)
                {
                    if(
    ID_question[q] == -1)continue;
                    if(
    >= MAX_AGENT)break;
                    
    format(String_support1,6,"#%d\n",q);
                    
    strcat(String_support,String_support1);
                    
    Agent_list_ID_question[playerid][l] = q;
                    
    l++;
                   }
                   if(
    == 0)return SendClientMessage(playerid,0xCC0000ff"На данный момент вопросов нет!");
                 return 
    ShowPlayerDialog(playerid,6,DIALOG_STYLE_LIST,"Техподдержка",String_support,"Выбрать","Закрыть");
            }
        }
        if(
    strcmp("/все_агенты"cmdtexttrue12) == 0)
        {
            new 
    name[MAX_PLAYER_NAME],l;String_support "";
            for(new 
    qMAX_PLAYERS; ++q)
            {
                if(
    Agent{q} == 0)continue;
                
    GetPlayerName(q,name,MAX_PLAYER_NAME);
                
    strcat(String_supportname),strcat(String_support"\n");
                   
    Agent_list_ID_question[playerid][l] = q;
                   
    l++;
            }
            if(
    == 0)return SendClientMessage(playerid,0xCC0000ff"На данный момент агентов нет!");
            return 
    ShowPlayerDialog(playerid,8,DIALOG_STYLE_LIST,"Техподдержка",String_support,"Выбрать","Закрыть");
        }
        
    //Для теста
        
    if(strcmp("/sethelp_0"cmdtexttrue10) == 0){Agent{playerid} = 0;return 1;}
        if(
    strcmp("/sethelp_1"cmdtexttrue10) == 0){Agent{playerid} = 1;return 1;} 
    В OnDialogResponse:
    PHP код:
        switch(dialogid)
        {
            case 
    1:
            {
                 if(
    response)
                {
                    if(
    strlen(inputtext) < || strlen(inputtext) > 90)return ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Техподдержка","Введите вопрос и агенты техподдержки в ближайшее время на них ответят","Отправить","Отмена"),SendClientMessage(playerid,0xCC0000ff"Вопрос может содержать не менее 5 символов и не более 90 символов!");
                    if(
    Player_question_all{playerid} >= MAX_PLAYER_QUESTIONS)return SendClientMessage(playerid,0xCC0000ff"Вы отправили слишком много вопросов,ожидайте ответа!");
                    new 
    name[MAX_PLAYER_NAME],q;String_support "";
                    
    GetPlayerName(playerid,name,MAX_PLAYER_NAME);
                       for(; 
    MAX_QUESTIONS; ++q)
                       {
                           if(
    ID_question[q] != -1)continue;
                           
    ID_question[q] = playerid;
                        
    format(Player_question[q],160,"%s[%d]: %s",name,playerid,inputtext);
                        
    format(String_support,160,"#%d - Вопрос от %s[%d]: %s",q,name,playerid,inputtext);
                        
    Time_question[q] = gettime();
                        break;
                       }
                       if(
    == MAX_QUESTIONS && ID_question[MAX_QUESTIONS 1] == -1)return SendClientMessage(playerid,0xCC0000ff,"Отправьте вопрос позже!");
                    for(new 
    q1q1 MAX_PLAYER_QUESTIONS; ++q1)
                    {
                        if(
    Player_ID_question[playerid][q1] == -1)Player_ID_question[playerid][q1] = q;
                    }
                    
    Player_question_all{playerid}++;
                    for(
    0MAX_PLAYERS; ++q)
                    {
                        if(
    Agent{q} == 0)continue;
                        
    SendClientMessage(q,0xFFCC33ff,String_support);
                    }
                    return 
    SendClientMessage(playerid,0xFFCC33ff"Ваш вопрос отправлен агентам техподдержки,ожидайте ответа!");
                   }
            }
            case 
    2:
            {
                 if(
    response)
                {
                    if(!
    strlen(inputtext))return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Техподдержка","Введите ID вопроса","Дальше","Отмена"),SendClientMessage(playerid,0xCC0000ff"Вы не ввели ID вопроса!");
                    if(
    strval(inputtext) < || strval(inputtext) > MAX_QUESTIONS)return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Техподдержка","Введите ID вопроса","Дальше","Отмена"),SendClientMessage(playerid,0xCC0000ff"Не верный ID вопроса!");
                    if(!
    IsNumerals(inputtext))return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Техподдержка","Введите ID вопроса","Дальше","Отмена"),SendClientMessage(playerid,0xCC0000ff"Вы ввели некорректный символ!");
                    if(
    ID_question[strval(inputtext)] == -1)return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Техподдержка","Введите ID вопроса","Дальше","Отмена"),SendClientMessage(playerid,0xCC0000ff"Введённый ID вопроса не существует!");
                    
    Agent_str[playerid] = strval(inputtext);String_support "";
                    
    format(String_support,200,"Введите ответ на вопрос:\n%s",Player_question[Agent_str[playerid]]);
                    return 
    ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Техподдержка",String_support,"Ответить","Назад");
                   }
            }
            case 
    3:
            {
                 if(
    response)
                {
                    if(
    ID_question[Agent_str[playerid]] == -1)return SendClientMessage(playerid,0xCC0000ff"Игрок вышел,или агенты поддержки уже ответили на вопрос!");
                    if(
    strlen(inputtext) < || strlen(inputtext) > 90)
                    {
                        
    SendClientMessage(playerid,0xCC0000ff"Ответ может содержать не менее 2 символов и не более 90 символов!");
                        
    String_support "";format(String_support,200,"Введите ответ на вопрос:\n%s",Player_question[Agent_str[playerid]]);
                        return 
    ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Техподдержка",String_support,"Ответить","Назад");
                    }
                    new 
    Hour,Min,Sec;Converter_q_gettime(Agent_str[playerid],Hour,Min,Sec);String_support "";
                    if(
    Hour == && Min == 0)format(String_support,350,"Ваш вопрос: %s\nОтвет: %s\n\nАгенты техподдержки думали над вопросом %d секунд и ответили !",Player_question[Agent_str[playerid]],inputtext,Sec);
                    else if(
    Hour == && Min != 0)format(String_support,350,"Ваш вопрос: %s\nОтвет: %s\n\nАгенты техподдержки думали над вопросом %d минут %d секунд и ответили !",Player_question[Agent_str[playerid]],inputtext,Min,Sec);
                    else if(
    Hour != 0)format(String_support,350,"Ваш вопрос: %s\nОтвет: %s\n\nАгенты техподдержки думали над вопросом %d часов %d минут %d секунд и ответили !",Player_question[Agent_str[playerid]],inputtext,Hour,Min,Sec);
                    
    ShowPlayerDialog(ID_question[Agent_str[playerid]],4,DIALOG_STYLE_MSGBOX,"Техподдержка",String_support,"Оценка","Закрыть");
                    for(new 
    qMAX_PLAYER_QUESTIONS; ++q)
                    {
                        if(
    Player_ID_question[playerid][ID_question[Agent_str[playerid]]] == Agent_str[playerid])Player_ID_question[playerid][ID_question[Agent_str[playerid]]] = -1;
                    }
                    
    Player_question_all{ID_question[Agent_str[playerid]]}--;
                    
    ID_question[Agent_str[playerid]] = -1;
                    return 
    SendClientMessage(playerid,0xFFCC33ff"Вы ответили на вопрос!");
                }
                else return 
    ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Техподдержка","Введите ID вопроса","Дальше","Отмена");
            }
            case 
    4:
            {
                 if(
    response)
                 {
                     
    String_support "";
                    for(new 
    MAX_SPECIES_REPLY 1> -1; --q)
                        
    strcat(String_supportTitle_reply[q]),strcat(String_support"\n");
                     return 
    ShowPlayerDialog(playerid,5,DIALOG_STYLE_LIST,"Выберите оценку работы агентов техподдержки",String_support,"Выбрать","Закрыть");
                 }
            }
            case 
    5:
             {
                 if(
    response)
                {
                    
    Agent_assessment[playerid][(MAX_SPECIES_REPLY 1) - listitem]++;
                    return 
    SendClientMessage(playerid,0xFFCC33ff"Спасибо за оценку!");
                }
            }
            case 
    6:
            {
                 if(
    response)
                   {
                       
    String_support "";Agent_str[playerid] = Agent_list_ID_question[playerid][listitem];
                    
    format(String_support,200,"Введите ответ на вопрос:\n%s",Player_question[Agent_str[playerid]]);
                    return 
    ShowPlayerDialog(playerid,7,DIALOG_STYLE_INPUT,"Техподдержка",String_support,"Ответить","Удалить вопрос");
                }
            }
            case 
    7:
            {
                 if(
    response)
                {
                    if(
    ID_question[Agent_str[playerid]] == -1)return SendClientMessage(playerid,0xCC0000ff"Игрок вышел,или агенты поддержки уже ответили на вопрос!");
                    if(
    strlen(inputtext) < || strlen(inputtext) > 90)
                    {
                        
    SendClientMessage(playerid,0xCC0000ff"Ответ может содержать не менее 2 символов и не более 90 символов!");
                        
    String_support "";format(String_support,200,"Введите ответ на вопрос:\n%s",Player_question[Agent_str[playerid]]);
                        return 
    ShowPlayerDialog(playerid,3,DIALOG_STYLE_INPUT,"Техподдержка",String_support,"Ответить","Назад");
                    }
                    new 
    Hour,Min,Sec;Converter_q_gettime(Agent_str[playerid],Hour,Min,Sec);String_support "";
                    if(
    Hour == && Min == 0)format(String_support,350,"Ваш вопрос: %s\nОтвет: %s\n\nАгенты техподдержки думали над вопросом %d секунд и ответили !",Player_question[Agent_str[playerid]],inputtext,Sec);
                    else if(
    Hour == && Min != 0)format(String_support,350,"Ваш вопрос: %s\nОтвет: %s\n\nАгенты техподдержки думали над вопросом %d минут %d секунд и ответили !",Player_question[Agent_str[playerid]],inputtext,Min,Sec);
                    else if(
    Hour != 0)format(String_support,350,"Ваш вопрос: %s\nОтвет: %s\n\nАгенты техподдержки думали над вопросом %d часов %d минут %d секунд и ответили !",Player_question[Agent_str[playerid]],inputtext,Hour,Min,Sec);
                    
    ShowPlayerDialog(ID_question[Agent_str[playerid]],4,DIALOG_STYLE_MSGBOX,"Техподдержка",String_support,"Оценка","Закрыть");
                    for(new 
    qMAX_PLAYER_QUESTIONS; ++q)
                    {
                        if(
    Player_ID_question[playerid][ID_question[Agent_str[playerid]]] == Agent_str[playerid])Player_ID_question[playerid][ID_question[Agent_str[playerid]]] = -1;
                    }
                    
    Player_question_all{ID_question[Agent_str[playerid]]}--;
                    
    ID_question[Agent_str[playerid]] = -1;
                    return 
    SendClientMessage(playerid,0xFFCC33ff"Вы ответили на вопрос!");
                }
                else
                {
                    
    Player_ID_question[playerid][ID_question[Agent_str[playerid]]] = -1;
                    
    Player_question_all{ID_question[Agent_str[playerid]]}--;
                    
    ID_question[Agent_str[playerid]] = -1;
                    return 
    SendClientMessage(playerid,0xCC0000ff"Вы удалили вопрос!");
                }
            }
            case 
    8:
            {
                 if(
    response)
                {
                    new 
    String_support1[MAX_PLAYER_NAME MAX_TEXT_REPLY];Agent_str[playerid] = Agent_list_ID_question[playerid][listitem],String_support "";
                    
    GetPlayerName(Agent_str[playerid],String_support1,MAX_PLAYER_NAME);
                    
    format(String_support,100,"Агент поддержки %s\n\nБаллы:\n",String_support1);
                    for(new 
    MAX_SPECIES_REPLY 1> -1; --q)
                    {
                        
    format(String_support1,sizeof(String_support1),"%s:%d\n",Title_reply[q],Agent_assessment[playerid][q]);
                        
    strcat(String_support,String_support1);
                    }
                    return 
    ShowPlayerDialog(playerid,8,DIALOG_STYLE_MSGBOX,"Техподдержка",String_support,"","Закрыть");
                }
            }
        } 
    В конце мода:
    PHP код:
    forward TimerHelp();
    public 
    TimerHelp()
    {
        new 
    GetTime gettime();
        for(new 
    qMAX_QUESTIONS; ++q)
        {
            if(
    ID_question[q] == -1)continue;
            if(
    GetTime Time_question[q] > MAX_TIME_QUESTION)
            {
                for(new 
    q1q1 MAX_PLAYER_QUESTIONS; ++q1)
                {
                    if(
    Player_ID_question[ID_question[q1]][q1] == q)Player_ID_question[ID_question[q]][q1] = -1;
                }
                
    Player_question_all{ID_question[q]}--;
                
    ID_question[q] = -1;
            }
        }
        return 
    1;
    }

    stock Converter_q_gettime(id_q, &hour ,&min ,&sec)
    {
        new 
    GetTime gettime() - Time_question[id_q];
        for(;;)
        {
             if(
    GetTime 3599)
            {
                
    GetTime-=3600;
                  if(
    min++ > 59)min 0,hour++;
            }
            else if(
    GetTime 59)
            {
                
    GetTime-=60;
                if(
    sec++ > 59)
                {
                    
    sec 0;
                    if(
    min++ > 59)min 0,hour++;
                }
            }
            else if(
    GetTime 60)
            {
                
    sec GetTime;
                break;
            }
        }
        return 
    1;
    }

    stock IsNumerals(text[])
    {
        for(new 
    nstrlen(text); ++n)
        {
            switch(
    text[n])
            {
                  case 
    '0'..'9': continue;
                default: return 
    0;
            }
        }
        return 
    1;



     Скриншоты
    После ввода /вопрос

    После ввода вопроса,все агенты поддержки получают данное сообщение:

    После ввода /все_вопросы появляется данный диалог,где можно выбрать все заданные вопросы и ответить на них

    Или же /ответ

    После выбора/ввода вопроса выходит данный диалог,где агент может ввести ответ или же удалить вопрос

    После отправки ответа,игрок получает диалог с ответом,где может дать оценку агенту а так же узнать время ответа

    На данный момент всего 5 видов оценок,их можно сменить а так же добавить

    После ввода /все_агенты появляется окошко со всеми онлайн агентами поддержки,при нажатии появляется окно баллов




    Команды:
    /вопрос - выводит диалог,в который нужно вводить вопрос(доступно всем игрокам)
    /ответ - выводит диалог,в который нужно вводить ID вопроса,затем ответ(доступно всем агентам)
    /все_вопросы - выводит диалог,в котом хранятся все ожидаемые вопросы,после нажатия на вопрос можно на него ответить(доступно всем агентам)
    /все_агенты - выводит всех онлайн агентов поддержи,при нажатии на агента,выходит окошко,в котом написаны его оценки,которые игрок оставляет после получения ответа(доступно всем игрокам)

    ВАЖНО:
    Для корректной работы,нужно синхронизировать переменную:
    PHP код:
    Agent{playerid}
    Player_ID_question[playerid][0]
    Player_ID_question[playerid][1]
    Player_ID_question[playerid][2]
    Player_ID_question[playerid][3]
    Player_ID_question[playerid][4
    Автор: James_Cruise (бывший ник Tracer)

  2. #2
    Аватар для gangzone.ini
    Пользователь

    Статус
    Оффлайн
    Регистрация
    15.06.2014
    Сообщений
    651
    Репутация:
    106 ±
    Неплохо)

  3. #3
    Аватар для [ForD]
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.11.2013
    Адрес
    Свердловская обл.
    Сообщений
    688
    Репутация:
    103 ±
    Задумка +
    реализация немного не то,но подстроить под себя труда особого нет.
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

    25% времени в программировании уходит на размышления о том, что пользователь может сделать не так.[HR]/Брайан Хьюмс/





    #FIXSAMP

  4. #4
    Аватар для Gromoboy
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.12.2014
    Сообщений
    0
    Репутация:
    0 ±
    Действительно интересная вещь. Молорик

  5. #5
    Аватар для VeRyNaYa
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.02.2015
    Адрес
    Беларусь
    Сообщений
    4
    Репутация:
    0 ±
    Т.е. Без записи в файл/базу?

  6. #6
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от VeRyNaYa Посмотреть сообщение
    Т.е. Без записи в файл/базу?
    ее можно и самому сделать :)

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •