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

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

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

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

Мануал Система обмена сообщениями

Статус
В этой теме нельзя размещать новые ответы.

Merlin

Умник
Что включено в это готовое решение:
-Использование MySQL;
-Отправка сообщения игроку, даже если он оффлайн;
-Поиск получателя в базе: Можно использовать маску для поиска, т.е. если вы хотите найти игрока с ником Games, можно в поиск ввести следущее: "G%ES"
% - означает произвольную длину символов, она может быть равна и нулю (кто сдает ЕГЭ по информатике, в задании А4 аналогичная вещь );
-Чтение сообщений (входящих и исходящих), возможность удаления сообщений;
-Все непрочитанные сообщения отмечены, а их кол-во указано в главном меню системы;
-После первого спавна при наличии непрочитанных сообщений, в правом нижнем углу будет уведомление о новых письмах;
-Также уведомление приходит, когда Вам отправил сообщение любой онлайн игрок на сервере;
-Возможность отправки онлайн игрокам через клик в табе, при клике в табе на себя - происходит открытие главного меню;

SQL запрос для создания таблиц:
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 ;
Как вы могли заметить, таблицы в запросе создается 2.
Первая - хранит сообщения, вторая - добавляет при коннекте ники в базу (используется для поиска Ник-Неймов).
Если у вас аккуанты хранятся в 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; 
}
Автор: Арес & Games
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу