Merlin
Умник
Что включено в это готовое решение:
-Использование MySQL;
-Отправка сообщения игроку, даже если он оффлайн;
-Поиск получателя в базе: Можно использовать маску для поиска, т.е. если вы хотите найти игрока с ником Games, можно в поиск ввести следущее: "G%ES"
% - означает произвольную длину символов, она может быть равна и нулю (кто сдает ЕГЭ по информатике, в задании А4 аналогичная вещь );
-Чтение сообщений (входящих и исходящих), возможность удаления сообщений;
-Все непрочитанные сообщения отмечены, а их кол-во указано в главном меню системы;
-После первого спавна при наличии непрочитанных сообщений, в правом нижнем углу будет уведомление о новых письмах;
-Также уведомление приходит, когда Вам отправил сообщение любой онлайн игрок на сервере;
-Возможность отправки онлайн игрокам через клик в табе, при клике в табе на себя - происходит открытие главного меню;
SQL запрос для создания таблиц:
Первая - хранит сообщения, вторая - добавляет при коннекте ники в базу (используется для поиска Ник-Неймов).
Если у вас аккуанты хранятся в MySQL, рекомендую заменить вторую таблицу на чтение данных из вашей таблицы с аккуантами.
Автор: Арес & Games
-Использование MySQL;
-Отправка сообщения игроку, даже если он оффлайн;
-Поиск получателя в базе: Можно использовать маску для поиска, т.е. если вы хотите найти игрока с ником Games, можно в поиск ввести следущее: "G%ES"
% - означает произвольную длину символов, она может быть равна и нулю (кто сдает ЕГЭ по информатике, в задании А4 аналогичная вещь );
-Чтение сообщений (входящих и исходящих), возможность удаления сообщений;
-Все непрочитанные сообщения отмечены, а их кол-во указано в главном меню системы;
-После первого спавна при наличии непрочитанных сообщений, в правом нижнем углу будет уведомление о новых письмах;
-Также уведомление приходит, когда Вам отправил сообщение любой онлайн игрок на сервере;
-Возможность отправки онлайн игрокам через клик в табе, при клике в табе на себя - происходит открытие главного меню;
SQL запрос для создания таблиц:
Как вы могли заметить, таблицы в запросе создается 2.CREATE TABLE `messages` (
`mID` int(6) NOT NULL AUTO_INCREMENT,
`Receiver` varchar(24) NOT NULL,
`Sender` varchar(24) NOT NULL,
`Date` varchar(32) NOT NULL,
`Message` varchar(200) NOT NULL,
`display` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`mID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `Names` (
`Name` VARCHAR( 24 ) NOT NULL
) ENGINE = MYISAM ;
Первая - хранит сообщения, вторая - добавляет при коннекте ники в базу (используется для поиска Ник-Неймов).
Если у вас аккуанты хранятся в MySQL, рекомендую заменить вторую таблицу на чтение данных из вашей таблицы с аккуантами.
PHP:
//Merlin Personal message system v1.1 by Games & APEC, 2012
#include
#include
#define HOST "localhost"
#define User "root"
#define DbName "tdm"
#define MySQLPass ""
#define ID_DIALOG 0 //ид сводобного диалога (шесть след. тоже должны быть свободны)
bool:CheckInput(source[]); //прототип ф-ии
new mID[MAX_PLAYERS], NameReceiver[MAX_PLAYERS][50], bool: FirstSpawn[MAX_PLAYERS];
new Text:Background, Text:NewMSG;
new RegMessage[] = "Добро пожаловать в систему оффлайн сообщений.\nВы можете отправлять сообщения игрокам, даже если их нет на сервере.\nДля отправки сообщения вы должны указать ник получателя. Если вы его забыли, то воспользуйтесь системой поиска.\nАвторы скрипта: Games and Apec";
public OnFilterScriptInit()
{
LoadTextDraws();
MySQL_Connect();
return 1;
}
public OnFilterScriptExit()
{
mysql_close();
return 1;
}
public OnPlayerConnect(playerid)
{
FirstSpawn[playerid] = false;
new query[500];
format(query, sizeof(query), "SELECT * FROM `Names` WHERE `Name` = '%s'" , PlayerName(playerid));
mysql_query(query);
mysql_store_result();
if(!mysql_num_rows())
{
format(query, sizeof(query),"INSERT INTO `messages` (`mID`, `Receiver`, `Sender`, `Date`, `Message`, `display`) VALUES (NULL, '%s', 'Gаmes & Apec', '%s', 'сообщение при регистрации', '0')",PlayerName(playerid), GetDate());
mysql_query(query);
format(query, sizeof(query), "INSERT INTO `Names` (`Name`) VALUES ('%s')", PlayerName(playerid));
mysql_query(query);
}
mysql_free_result();
}
public OnPlayerCommandText(playerid, cmdtext[])
{
if (!strcmp("/mail", cmdtext, true)) return mail(playerid);
return 0;
}
public OnPlayerSpawn(playerid)
{
if(!FirstSpawn[playerid])
{
SendClientMessage(playerid, -1, "{ffd800}На сервере установлена система почты. Для управления введите /mail");
FirstSpawn[playerid] = !FirstSpawn[playerid];
new query[500];
format(query, sizeof(query), "SELECT * FROM `messages` WHERE `Receiver` = '%s' AND `display` = '0'", PlayerName(playerid));
if(CheckLines(query)) NewMessage(playerid, 0);
}
return 1;
}
forward NewMessage(playerid, step);
public NewMessage(playerid, step)
{
switch(step)
{
case 0:
{
TextDrawShowForPlayer(playerid, Background);
TextDrawShowForPlayer(playerid, NewMSG);
}
case 1, 3: TextDrawHideForPlayer(playerid, NewMSG);
case 2, 4: TextDrawShowForPlayer(playerid, NewMSG);
case 5:
{
TextDrawHideForPlayer(playerid, Background);
TextDrawHideForPlayer(playerid, NewMSG);
}
}
if(step < 5) SetTimerEx("NewMessage", 1000, false, "ii", playerid, step+1);
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
WorkDialog(playerid, dialogid, response, listitem, inputtext);
return 0;
}
public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
if(!(playerid ^ clickedplayerid)) mail(playerid);
else
{
NameReceiver[playerid][0x0] = 0x0;
strcat(NameReceiver[playerid], PlayerName(clickedplayerid));
ShowPlayerDialog(playerid,ID_DIALOG+6,DIALOG_STYLE_INPUT,"Ввод текста","Введите текст сообщения:","Ок", "Отмена");
}
return 0;
}
stock MySQL_Connect()
{
mysql_connect(HOST, User, DbName , MySQLPass);
print("=>>Подключение: Host - "HOST" | User - "User"");
if(mysql_ping() == 1) print("MySQL Connect: ON");
else if(mysql_ping() == -1) print("MySQL Connect: OFF");
}
stock CheckLines(query[])
{
mysql_query(query);
mysql_store_result();
new count = mysql_num_rows();
mysql_free_result();
return count;
}
stock Output(playerid, ID_request)
{
new NAME[MAX_PLAYER_NAME], query[500], display;
GetPlayerName(playerid, NAME, MAX_PLAYER_NAME);
new ReadStr[][] = {"{ff0000}[Не прочитано]", "{00ff00}[Прочитано]"};
new Header[][] = {"Входящие сообщения","Исходящие сообщения"};
if(!ID_request) format(query, sizeof(query), "SELECT * FROM `messages` WHERE `Receiver` = '%s' AND `display` != '2'", NAME);
else format(query, sizeof(query), "SELECT * FROM `messages` WHERE `Sender` = '%s' AND `display` = '2'", NAME);
mysql_query(query);
mysql_store_result();
if(mysql_num_rows() > 0)
{
new messagelist[1000];
new Sender[50], Receiver[50], Date[50];
for(new i; i != mysql_num_rows(); i++)
{
mysql_fetch_row(query);
MySQLGetStr("Sender", Sender);
MySQLGetStr("Receiver", Receiver);
MySQLGetStr("Date", Date);
MySQLGetInt("display", display);
if(!ID_request)
{
if(!i) format(messagelist, sizeof(messagelist), "%s {0000ff}[%s] %s\n", Sender, Date, ReadStr[display]);
else format(messagelist, sizeof(messagelist), "%s%s {0000ff}[%s] %s\n", messagelist, Sender, Date, ReadStr[display]);
}
else
{
if(!i) format(messagelist, sizeof(messagelist), "%s {0000ff}[%s]\n", Receiver, Date);
else format(messagelist, sizeof(messagelist), "%s%s {0000ff}[%s]\n", messagelist, Receiver, Date);
}
}
if(!ID_request) ShowPlayerDialog(playerid, ID_DIALOG+1, 0x2, Header[ID_request], messagelist, "Ок", "Отмена");
else ShowPlayerDialog(playerid, ID_DIALOG+2, 0x2, Header[ID_request], messagelist, "Ок", "Отмена");
}
mysql_free_result();
}
stock mail(playerid)
{
new query[500], mainstr[255];
format(query, sizeof(query), "SELECT * FROM `messages` WHERE `Receiver` = '%s' AND `display` = '0'", PlayerName(playerid));
new unread = CheckLines(query);
format(query, sizeof(query), "SELECT * FROM `messages` WHERE `Receiver` = '%s' AND `display` != '2'", PlayerName(playerid));
new allmsg = CheckLines(query);
format(query, sizeof(query), "SELECT * FROM `messages` WHERE `Sender` = '%s' AND `display` = '2'", PlayerName(playerid));
new posted = CheckLines(query);
format(mainstr, sizeof(mainstr), "Входящие (%i / %i)\nИсходящие (%i)\nНаписать сообщение", unread, allmsg, posted);
ShowPlayerDialog(playerid, ID_DIALOG, 0x2, "Система сообщений", mainstr, "Ок", "Отмена");
return 1;
}
stock MySQLGetStr(data[], variable[])
{
mysql_fetch_field_row(variable, data);
}
stock MySQLGetInt(data[], &variable)
{
new request[128];
mysql_fetch_field_row(request, data);
variable = strval(request);
}
stock PlayerName(playerid)
{
new pname[MAX_PLAYER_NAME];
GetPlayerName(playerid,pname,sizeof(pname));
return pname;
}
stock LoadTextDraws()
{
Background = TextDrawCreate(637.000000, 412.000000, "~n~");
TextDrawBackgroundColor(Background, 255);
TextDrawFont(Background, 1);
TextDrawLetterSize(Background, -0.249999, 1.800001);
TextDrawColor(Background, -1);
TextDrawSetOutline(Background, 0);
TextDrawSetProportional(Background, 1);
TextDrawSetShadow(Background, 1);
TextDrawUseBox(Background, 1);
TextDrawBoxColor(Background, 100);
TextDrawTextSize(Background, 541.000000, 5.000000);
NewMSG = TextDrawCreate(545.000000, 414.000000, "New Message!");
TextDrawBackgroundColor(NewMSG, 255);
TextDrawFont(NewMSG, 0);
TextDrawLetterSize(NewMSG, 0.490000, 1.000000);
TextDrawColor(NewMSG, -1);
TextDrawSetOutline(NewMSG, 0);
TextDrawSetProportional(NewMSG, 1);
TextDrawSetShadow(NewMSG, 1);
}
stock WorkDialog(playerid, dialogid, response, listitem, inputtext[])
{
new query[500], string[500];
switch(dialogid)
{
case ID_DIALOG:
{
if(!response) return 1;
if(listitem == 0 || listitem == 1) Output(playerid, listitem);
else if(listitem == 2) ShowPlayerDialog(playerid,ID_DIALOG+4,DIALOG_STYLE_INPUT,"Поиск имени получателя","Перед отправкой сообщения Вам необходимо ввести имя пользователя,\nкоторому вы хотите отправить сообшение.Вы можете ввести и часть имени.\nНапример, Вы хотите отправить сообшение игроку с ником Games.\nВ этом случае для поиска имени достаточно ввести, \"mes\" или \"game\""," .:Ок:."," .:Отмена:.");
}
case ID_DIALOG+1, ID_DIALOG+2:
{
if(!response) return 1;
new Sender[50], Receiver[50], Date[50], Message[500];
if(!(dialogid ^ ID_DIALOG+1)) format(query, sizeof(query), "SELECT * FROM `messages` WHERE `Receiver` = '%s' AND `display` != '2'", PlayerName(playerid));
else format(query, sizeof(query), "SELECT * FROM `messages` WHERE `Sender` = '%s' AND `display` = '2'", PlayerName(playerid));
mysql_query(query);
mysql_store_result();
for(new i; i != listitem+1; i++) mysql_fetch_row(query);
MySQLGetStr("Sender", Sender);
MySQLGetStr("Receiver", Receiver);
MySQLGetStr("Date", Date);
MySQLGetStr("Message", Message);
MySQLGetInt("mID", mID[playerid]);
if(!(dialogid ^ ID_DIALOG+1))
{
if (!strcmp("Gаmes & Apec", Sender, true)) format(string, sizeof(string), "{0000ff}Отправитель:\n{ff0000}%s\n\n{0000ff}Время:\n{ff0000}%s\n\n{0000ff}Текст сообщения:\n{ff0000}%s", Sender, Date , RegMessage);
else format(string, sizeof(string), "{0000ff}Отправитель:\n{ff0000}%s\n\n{0000ff}Время:\n{ff0000}%s\n\n{0000ff}Текст сообщения:\n{ff0000}%s", Sender, Date , Message);
format(query, sizeof(query), "UPDATE `messages` SET `display` = '1' WHERE `mID` = '%i'", mID[playerid]);
mysql_query(query);
}
else format(string, sizeof(string), "{0000ff}Получатель:\n{ff0000}%s\n\n{0000ff}Время:\n{ff0000}%s\n\n{0000ff}Текст сообщения:\n{ff0000}%s", Receiver, Date , Message);
ShowPlayerDialog(playerid, ID_DIALOG+3, DIALOG_STYLE_MSGBOX, "Просмотр сообщения",string,"Удалить","Закрыть");
mysql_free_result();
}
case ID_DIALOG+3:
{
if(!response) return 1;
format(query, sizeof(query), "DELETE FROM `messages` WHERE `mID` = '%i'", mID[playerid]);
mysql_query(query);
}
case ID_DIALOG+4:
{
if(!response) return 1;
if(!strlen(inputtext) || !CheckInput(inputtext)) return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Поиск","Вы ничего не ввели или Вы ввели менее 2 букв/цифр для поиска!","Закрыть","");
new NAME[30];
mysql_real_escape_string(inputtext, string);
format(query, sizeof(query), "SELECT `Name` FROM `Names` WHERE `Name` LIKE '%c%s%c'",'%',string, '%');
mysql_query(query);
mysql_store_result();
if(mysql_num_rows() > 0)
{
new messagelist[500];
for(new i; i != mysql_num_rows(); i++)
{
mysql_fetch_row(query);
MySQLGetStr("Name", NAME);
if(!i) format(messagelist, sizeof(messagelist), "%s\n", NAME);
else format(messagelist, sizeof(messagelist), "%s%s\n", messagelist, NAME);
}
ShowPlayerDialog(playerid, ID_DIALOG+5, DIALOG_STYLE_LIST, "Результаты поиска", messagelist, "Ок", "Отмена");
}
else ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Поиск","Поиск не дал результатов.","Закрыть","");
mysql_free_result();
}
case ID_DIALOG+5:
{
if(!response) return 1;
NameReceiver[playerid][0x0] = 0x0;
strcat(NameReceiver[playerid], inputtext);
ShowPlayerDialog(playerid,ID_DIALOG+6,DIALOG_STYLE_INPUT,"Ввод текста","Введите текст сообщения:","Ок", "Отмена");
}
case ID_DIALOG+6:
{
if(!response) return 1;
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Отправка сообщения","Пустое сообщение нельзя отправить.","Закрыть","");
mysql_real_escape_string(inputtext, string);
format(query, sizeof(query),"INSERT INTO `messages` (`mID`, `Receiver`, `Sender`, `Date`, `Message`, `display`) VALUES (NULL, '%s', '%s', '%s', '%s', '0')",NameReceiver[playerid], PlayerName(playerid), GetDate(), string);
mysql_query(query);
format(query, sizeof(query),"INSERT INTO `messages` (`mID`, `Receiver`, `Sender`, `Date`, `Message`, `display`) VALUES (NULL, '%s', '%s', '%s', '%s', '2')",NameReceiver[playerid], PlayerName(playerid), GetDate(), string);
mysql_query(query);
for(new i; i != GetMaxPlayers(); i++)
{
if (!strcmp(NameReceiver[playerid], PlayerName(i), true))
{
NewMessage(i, 0);
break;
}
}
}
}
return 0;
}
stock GetDate()
{
new Date[50], Year, Month, Day, Hour, Minute, Second;
getdate(Year, Month, Day);
gettime(Hour, Minute, Second);
format(Date, sizeof(Date),"%02d.%02d.%d, %02d:%02d:%02d", Day, Month, Year, Hour, Minute, Second);
return Date;
}
stock bool:CheckInput(source[])
{
new count;
for(new i = 0x0; i != strlen(source); i++)
{
switch(source[i])
{
case 0x30..0x39, 0x41..0x5A, 0x61..0x7A: count++;
}
}
if(count >= 0x2) return true;
else return false;
}
Последнее редактирование:
