Не так давно мне понадобился способ связки IPB форума с сервером для получение информации зарегистрирован ли игрок или нет. Использовать mysql в данном случаи не совсем разумно, ибо требовалось это всё для cso где и так нагрузка жесткая и ответ будет приходит в районе 3-4 секунд, что не очень прикольно.
В данном статье я постараюсь вам рассказать, как проверить регистрацию на форуме и получить любые данные юзера. Ответ будет приходить моментально, что очень поможет
От вас требуется:
IPB Версия от 3.xx
Сервер
Мозг
Принцип работы:
На скрипт будет уходить get-запрос с данными, после чего от него уйдет ответ через rcon протокол.
Плагин:
[pawn]
- #include <amxmodx>
- #include <amxmisc>
- #include <sockets>
- #define PLUGIN "IPBAuth"
- #define VERSION "1.0"
- #define AUTHOR "CrAsH"
- #define HOST "hard-cs.ru" //Куда уйдет запрос
- #define HANDLER "/check_reg.php" //Скрипт обработчика
- new iPlayerAuth[33] //Будет хранить авторизовался ли игрок или нет
- public plugin_init()
- {
- register_plugin(PLUGIN, VERSION, AUTHOR)
- register_clcmd("say /auth_good", "AuthTest") //Запуск проверки авторизации( Будет верная )
- register_clcmd("say /auth_fail1", "AuthTest1") //Запуск проверки авторизации( Изер не найден )
- register_clcmd("say /auth_fail2", "AuthTest2") //Запуск проверки авторизации( Изер найден, неверный пасс )
- register_concmd("forum_auth_resuilt", "CheckReg") //Консольная команда для получение ответа от скрипта
- }
- public AuthTest(id)
- {
- if(iPlayerAuth[id])
- {
- ChatColor(id, "!tВы !yуспешно !gавторизовались !yна !tфоруме")
- return PLUGIN_HANDLED
- }
- GetForumAuth(id, "amx-x", "123456")
- return PLUGIN_HANDLED
- }
- public AuthTest1(id)
- {
- GetForumAuth(id, "amx-x123", "123456")
- return PLUGIN_HANDLED
- }
- public AuthTest2(id)
- {
- GetForumAuth(id, "amx-x", "12345678")
- return PLUGIN_HANDLED
- }
- public CheckReg()
- {
- new szResuilt[128] //Будет хранить всё, что пришло
- read_args(szResuilt, charsmax( szResuilt )) //Формируем всё в 1 строку
- new szParseID[32], szParseType[32], szParseForumID[32], szParseForunMessage[32] //Парсим то, что пришло
- parse(szResuilt,
- szParseID, charsmax( szParseID ),
- szParseType, charsmax( szParseType ),
- szParseForumID, charsmax( szParseForumID ),
- szParseForunMessage, charsmax( szParseForunMessage )
- )
- new id = str_to_num( szParseID ) //Получаем id игрока, который ввел данные
- new iType = str_to_num( szParseType ) //Получаем число, которое отправили
- new iForumID = str_to_num( szParseForumID ) //Получаем id игрока, который у него на форуме
- new iForumMsg = str_to_num( szParseForunMessage ) //Получаем сколько сообщений у него на форуме
- if(!is_user_connected(id)) //Если игрок вдруг вышел, то нахрен это нужно
- return PLUGIN_CONTINUE
- switch( iType ) //Проверяем что пришло
- {
- case 1: //Пользователь не найден
- {
- ChatColor(id, "!tПользователь !gне найден")
- }
- case 2: //Пользователь найден, но неверный пароль
- {
- ChatColor(id, "!tНеверный !gпароль")
- }
- case 3: //Всё круто =)
- {
- iPlayerAuth[id] = true
- ChatColor(id, "!tВы !yуспешно !gавторизовались !yна !tфоруме")
- ChatColor(id, "!tВаш !yid: !g%d", iForumID)
- ChatColor(id, "!yУ !tвас !g%d !yсообщений на форуме", iForumMsg)
- }
- }
- return PLUGIN_CONTINUE
- }
- stock GetForumAuth(id, szName[], szPassword[])
- {
- new szText[512] //Массив для записи запроса
- new szIP[32], szRcon[32] //Получаемые данные
- get_user_ip(0, szIP, charsmax( szIP ), 0) //IP:PORT
- get_cvar_string("rcon_password", szRcon, charsmax( szRcon )) //Rcon
- if(!strlen( szRcon )) //если ркон пустой
- {
- new iRandom = random_num(10000000, 99999999) //Создаем рандомный Rcon
- formatex(szRcon, charsmax( szRcon ), "%d", iRandom) //записываем
- set_cvar_string("rcon_password", szRcon)
- }
- //Создаем запрос
- formatex(szText, charsmax( szText ), "GET %s?ip=%s&rconpass=%s&id=%d&name=%s&password=%s HTTP/1.1^nHOST:%s^r^n^r^n", HANDLER, szIP, szRcon, id, szName, szPassword, HOST)
- new iError //Будет хранить ошибку, если таковые имеются
- new iSocket = socket_open(HOST, 80, SOCKET_TCP, iError) //Открываем соединение с хостом
- socket_send(iSocket, szText, charsmax( szText )) //Отправляем запрос на скрипт
- socket_close(iSocket) //Закрываем соединения
- }
- stock ChatColor(const id, const input[], any:...)
- {
- new count = 1, players[32]
- static msg[191]
- vformat(msg, 190, input, 3)
- replace_all(msg, 190, "!g", "^4")
- replace_all(msg, 190, "!y", "^1")
- replace_all(msg, 190, "!t", "^3")
- if (id) players[0] = id; else get_players(players, count, "ch")
- {
- for (new i = 0; i < count; i++)
- {
- if (is_user_connected(players[i]))
- {
- message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
- write_byte(players[i]);
- write_string(msg);
- message_end();
- }
- }
- }
- }
Обработчик check_reg.php
[pawn]
- <?php
- $ip = $_GET['ip']; //Получаем IP:Port
- $rcon = $_GET['rconpass']; //Получаем Rcon
- $id = $_GET['id']; //Получаем id игрока
- $name = $_GET['name']; //Получаем ник
- $md5Pass = $_GET['password']; //Получаем пасс
- include("rcon_hl_net.inc"); //Подключаем inc для отправки ответа
- $server = new Rcon(); //создаем
- $array = explode(':', $ip); //делим ип и пароль по разделителю
- //Собираем данные для запроса
- $server_ip= $array[0];
- $server_port= $array[1];
- $server_password= $rcon;
- //Подключаем всю лабуду от ipb
- define('IPS_ENFORCE_ACCESS', TRUE);
- define('IPB_THIS_SCRIPT', 'public');
- require_once( './initdata.php' );
- require_once( IPS_ROOT_PATH . 'sources/base/ipsRegistry.php' );
- require_once( IPS_ROOT_PATH . 'sources/base/ipsController.php' );
- $registry = ipsRegistry::instance();
- $registry->init();
- $member = IPSMember::load( $name, 'none', 'username' ); //Получаем массив данных
- if(!$member['member_id']) //Если идентификатор форума не найден
- {
- $server->Connect($server_ip, $server_port, $server_password); //Коннектимся к серверу
- $command = "forum_auth_resuilt ".$id." 1"; //Создаем команду для отправки и передаем число 1, что будет говорить о том, что юзера нет
- $server->RconCommand($command); //отправляем
- $server->Disconnect(); //закрываем соединение
- exit; //Заканчиваем
- }
- //Форматируем символы пароля
- $md5Pass = str_replace("gigahash", "#", $md5Pass);
- $md5Pass = str_replace("&", "&", $md5Pass);
- $md5Pass = str_replace("\\", "\", $md5Pass);
- $md5Pass = str_replace("!", "!", $md5Pass);
- $md5Pass = str_replace("$", "$", $md5Pass);
- $md5Pass = str_replace("\", """, $md5Pass);
- $md5Pass = str_replace("<", "<", $md5Pass);
- $md5Pass = str_replace(">", ">", $md5Pass);
- $md5Pass = str_replace("'", "'", $md5Pass);
- $md5Pass=md5($md5Pass);
- if(IPSMember::authenticateMember( $member['member_id'], $md5Pass ))
- {
- $server->Connect($server_ip, $server_port, $server_password); //Коннектимся к серверу
- $command="forum_auth_resuilt ".$id." 3 ".$member['member_id']." ".$member['posts'].""; //Создаем команду для отправки и передаем число 3, что будет говорить о том, что всё круто
- $res = $server->RconCommand($command); //отправляем
- $server->Disconnect(); //закрываем соединение
- }else{
- $server->Connect($server_ip, $server_port, $server_password); //Коннектимся к серверу
- $command="forum_auth_resuilt ".$id." 2"; //Создаем команду для отправки и передаем число 2, что будет говорить о том, что пасс неверный
- $res = $server->RconCommand($command); //отправляем
- $server->Disconnect(); //закрываем соединение
- }
- ?>
Способ установки:
1) Компилируем плагин в кодировке utf8 без bom( Для отображение русского текста )
2) Кидаем check_reg.php в корень ipb( Где файлы index.php, initdata.php )
3) Проверяем, включен ли модуль socket в moduels.ini
4) Перезапускаем серв, пробуем
Команды:
say /auth_good //Данные будут верные, авторизация пройдет
say /auth_fail1 //Юзер не найден в базе( Логин не верный )
say /auth_fail2 //Юзер найден, но пароль неверный
Скриншоты:
Вы можете передать любые данные из таблицы members, главное правильно указать ячейки.
Применение плагина может любым. Главное иметь воображение.
Так же прикладываю готовые в файлы, чтобы не было путаниц