PDA

Просмотр полной версии : [Мануал] Система агентов поддержки



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

После include:

#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:

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:

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:

KillTimer(Timer_question);

В OnPlayerConnect:

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:

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:

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:

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,"","Закрыть");
}
}
}

В конце мода:

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;
}

После ввода /вопрос
http://s013.radikal.ru/i324/1412/34/744628515f0e.jpg
После ввода вопроса,все агенты поддержки получают данное сообщение:
http://s018.radikal.ru/i528/1412/0c/105d7a1050d4.jpg
После ввода /все_вопросы появляется данный диалог,где можно выбрать все заданные вопросы и ответить на них
http://s40.radikal.ru/i087/1412/f2/db837aeb4436.jpg
Или же /ответ
http://s009.radikal.ru/i310/1412/5a/f58e75c28238.jpg
После выбора/ввода вопроса выходит данный диалог,где агент может ввести ответ или же удалить вопрос
http://s019.radikal.ru/i618/1412/6a/9ca3de24e4ec.jpg
После отправки ответа,игрок получает диалог с ответом,где может дать оценку агенту а так же узнать время ответа
http://s017.radikal.ru/i431/1412/fe/e92fd19eb00c.jpg
На данный момент всего 5 видов оценок,их можно сменить а так же добавить
http://s017.radikal.ru/i431/1412/fe/e92fd19eb00c.jpg
После ввода /все_агенты появляется окошко со всеми онлайн агентами поддержки,при нажатии появляется окно баллов
http://s004.radikal.ru/i206/1412/01/e6a479e54215.jpg
http://s008.radikal.ru/i305/1412/1c/4bea89c71534.jpg


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

ВАЖНО:
Для корректной работы,нужно синхронизировать переменную:

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)

gangzone.ini
10.12.2014, 11:32
Неплохо)

[ForD]
12.12.2014, 23:21
Задумка +
реализация немного не то,но подстроить под себя труда особого нет.

Gromoboy
14.12.2014, 02:54
Действительно интересная вещь. Молорик

VeRyNaYa
24.04.2015, 15:25
Т.е. Без записи в файл/базу?

Desulaid
01.05.2015, 18:17
Т.е. Без записи в файл/базу?

ее можно и самому сделать :)