Система технической поддержки

Stich

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

После 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[6 * 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 q; q < MAX_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(; q < MAX_PLAYER_QUESTIONS; ++q)Player_ID_question[playerid][q] = -1;
    Player_question_all{playerid} = 0;
    for(q = 0; q < MAX_SPECIES_REPLY; ++q)Agent_assessment[playerid][q] = 0;
В OnPlayerDisconnect:
PHP:
 for(new q; q < MAX_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("/вопрос", cmdtext, true, 8) == 0)return ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Техподдержка","Введите вопрос и агенты техподдержки в ближайшее время на них ответят","Отправить","Отмена");
 if(strcmp("/ответ", cmdtext, true, 7) == 0)
 {
  if(Agent{playerid} == 1)return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Техподдержка","Введите ID вопроса","Дальше","Отмена");
 }
 if(strcmp("/все_вопросы", cmdtext, true, 13) == 0)
 {
  if(Agent{playerid} == 1)
  {
      new String_support1[6],l;String_support = "";
   for(new q; q < MAX_QUESTIONS; ++q)
   {
       if(ID_question[q] == -1)continue;
       if(l >= MAX_AGENT)break;
       format(String_support1,6,"#%d\n",q);
       strcat(String_support,String_support1);
       Agent_list_ID_question[playerid][l] = q;
       l++;
      }
      if(l == 0)return SendClientMessage(playerid,0xCC0000ff, "На данный момент вопросов нет!");
    return ShowPlayerDialog(playerid,6,DIALOG_STYLE_LIST,"Техподдержка",String_support,"Выбрать","Закрыть");
  }
 }
 if(strcmp("/все_агенты", cmdtext, true, 12) == 0)
 {
     new name[MAX_PLAYER_NAME],l;String_support = "";
  for(new q; q < MAX_PLAYERS; ++q)
  {
      if(Agent{q} == 0)continue;
   GetPlayerName(q,name,MAX_PLAYER_NAME);
   strcat(String_support, name),strcat(String_support, "\n");
      Agent_list_ID_question[playerid][l] = q;
      l++;
  }
  if(l == 0)return SendClientMessage(playerid,0xCC0000ff, "На данный момент агентов нет!");
  return ShowPlayerDialog(playerid,8,DIALOG_STYLE_LIST,"Техподдержка",String_support,"Выбрать","Закрыть");
 }
 //Для теста
 if(strcmp("/sethelp_0", cmdtext, true, 10) == 0){Agent{playerid} = 0;return 1;}
 if(strcmp("/sethelp_1", cmdtext, true, 10) == 0){Agent{playerid} = 1;return 1;}
В OnDialogResponse:
PHP:
 switch(dialogid)
 {
     case 1:
     {
       if(response)
   {
    if(strlen(inputtext) < 5 || 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(; q < 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(q == MAX_QUESTIONS - 1 && ID_question[MAX_QUESTIONS - 1] == -1)return SendClientMessage(playerid,0xCC0000ff,"Отправьте вопрос позже!");
    for(new q1; q1 < MAX_PLAYER_QUESTIONS; ++q1)
    {
        if(Player_ID_question[playerid][q1] == -1)Player_ID_question[playerid][q1] = q;
    }
    Player_question_all{playerid}++;
    for(q = 0; q < MAX_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) < 0 || 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) < 2 || 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 == 0 && Min == 0)format(String_support,350,"Ваш вопрос: %s\nОтвет: %s\n\nАгенты техподдержки думали над вопросом %d секунд и ответили !",Player_question[Agent_str[playerid]],inputtext,Sec);
    else if(Hour == 0 && 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 q; q < MAX_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 q = MAX_SPECIES_REPLY - 1; q > -1; --q)
     strcat(String_support, Title_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) < 2 || 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 == 0 && Min == 0)format(String_support,350,"Ваш вопрос: %s\nОтвет: %s\n\nАгенты техподдержки думали над вопросом %d секунд и ответили !",Player_question[Agent_str[playerid]],inputtext,Sec);
    else if(Hour == 0 && 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 q; q < MAX_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 q = MAX_SPECIES_REPLY - 1; q > -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 q; q < MAX_QUESTIONS; ++q)
 {
     if(ID_question[q] == -1)continue;
     if(GetTime - Time_question[q] > MAX_TIME_QUESTION)
  {
      for(new q1; q1 < 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 n; n < strlen(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
Верх