#include <amxmodx>
#include <sqlx>
#include <fakemeta>
#include <IQ>
#define REGCMD "acc" // Команда вызова
new g_szGroup[] = "aw"; // По каким правам группы искать id группы для выдачи через регистрацию с системы (Админ центр ../admin/users_groups)
new const g_szRegister_plugin[][] = {"[SQL] Player Acc", "1.0 BETA", "Mittu"};
enum _:ENUM_MENU_ID { ACC_ID }
new g_iMenuId[ENUM_MENU_ID];
enum _:SETTINGS_DB { HOST, USER, PASSWORD, DATABASE, TABLE_USERS[64], TABLE_ADMINS, TABLE_ADMINS_LIST, SALT, GROUP};
new g_szDataBase[SETTINGS_DB][64];
#define MAX_PLAYER 32
new g_szPlayerSteam[MAX_PLAYER + 1][34],
g_szPlayerIp[MAX_PLAYER + 1][23],
g_szPlayerLogin[MAX_PLAYER + 1][256],
g_szPlayerPassword[MAX_PLAYER + 1][256],
g_szPlayerMail[MAX_PLAYER + 1][33];
new bool:g_bPlayerLogin[MAX_PLAYER + 1],
bool:g_bPlayerPassword[MAX_PLAYER + 1],
bool:g_bPlayerMail[MAX_PLAYER + 1];
new Handle:g_SqlTuple;
new g_szQuery[2048];
new g_iUserGroup;
#define reg_menu(%0,%1,%2) register_menucmd(%0 = register_menuid(%1), 1023, %2)
#define user_valid(%0) (%0 && %0 <= MaxClients)
public plugin_precache()
{
new szCfgDir[64], szCfgFile[128], szBuffer[256], szKey[64], szValue[960], iFile;
get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
formatex(szCfgFile, charsmax(szCfgFile), "%s/unmq_engine/SQL.ini", szCfgDir);
if(!file_exists(szCfgFile))
{
new szError[100];
formatex(szError, charsmax(szError), "Отсутствует файл: %s", szCfgFile);
set_fail_state(szError);
return;
}
new iCaseSelect;
iFile = fopen(szCfgFile, "rt");
while(iFile && !feof(iFile))
{
fgets(iFile, szBuffer, charsmax(szBuffer));
replace(szBuffer, charsmax(szBuffer), "^n", "");
if(!szBuffer[0] || szBuffer[0] == ';' || szBuffer[0] == '{' || szBuffer[0] == '}' || szBuffer[0] == '#') continue;
if(szBuffer[0] == '[')
{
iCaseSelect++;
continue;
}
parse(szBuffer, szKey, charsmax(szKey), szValue, charsmax(szValue));
trim(szKey);
trim(szValue);
switch(iCaseSelect)
{
case 1:
{
if(equal(szKey, "DB_HOST")) copy(g_szDataBase[HOST], charsmax(g_szDataBase[]), szValue);
else if(equal(szKey, "DB_USER")) copy(g_szDataBase[USER], charsmax(g_szDataBase[]), szValue);
else if(equal(szKey, "DB_PASSWORD")) copy(g_szDataBase[PASSWORD], charsmax(g_szDataBase[]), szValue);
else if(equal(szKey, "DB_DATABASE")) copy(g_szDataBase[DATABASE], charsmax(g_szDataBase[]), szValue);
else if(equal(szKey, "DB_TABLE_USERS")) copy(g_szDataBase[TABLE_USERS], charsmax(g_szDataBase[]), szValue);
else if(equal(szKey, "DB_TABLE_ADMINS")) copy(g_szDataBase[TABLE_ADMINS], charsmax(g_szDataBase[]), szValue);
else if(equal(szKey, "DB_TABLE_ADMINS_LIST")) copy(g_szDataBase[TABLE_ADMINS_LIST], charsmax(g_szDataBase[]), szValue);
}
}
}
fclose(iFile);
}
/*
Запрос занял 0.0001 сек.
Запрос занял 0.26 сек.
*/
new g_iMakeDbTupleTimeOut = 3;
public plugin_cfg()
{
g_SqlTuple = SQL_MakeDbTuple(g_szDataBase[HOST], g_szDataBase[USER], g_szDataBase[PASSWORD], g_szDataBase[DATABASE], g_iMakeDbTupleTimeOut);
SQL_SetCharset(g_SqlTuple, "utf8");
Pre_QueryConnection_Salt();
Pre_QueryConnection_Users__groups()
}
Pre_QueryConnection_Salt()
{
format(g_szQuery, charsmax(g_szQuery), "SELECT `salt` FROM `config`");
SQL_ThreadQuery(g_SqlTuple, "SQL_QueryConnection_Salt", g_szQuery);
}
Pre_QueryConnection_Users__groups()
{
format(g_szQuery, charsmax(g_szQuery), "SELECT `id` FROM `users__groups` WHERE `rights` LIKE '%s'", g_szGroup);
SQL_ThreadQuery(g_SqlTuple, "SQL_QueryConnection_Users__groups", g_szQuery);
}
public SQL_QueryConnection_Users__groups(iState, Handle:hQuery, const szError[], iErrorCode, const szData[], iDataSize)
{
if(iState == TQUERY_CONNECT_FAILED || iState == TQUERY_QUERY_FAILED) return MySQL_connection_failed(iState, szError, iErrorCode, szData, iDataSize);
if(SQL_NumResults(hQuery)) g_iUserGroup = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "id"));
else
{
new szBuffer[192+1];
format(szBuffer, charsmax(szBuffer), "[Error SQL] if SELECT Users__groups FROM not ", g_szGroup);
set_fail_state(szBuffer);
return PLUGIN_HANDLED;
}
return PLUGIN_HANDLED;
}
public SQL_QueryConnection_Salt(iState, Handle:hQuery, const szError[], iErrorCode, const szData[], iDataSize)
{
if(iState == TQUERY_CONNECT_FAILED || iState == TQUERY_QUERY_FAILED) return MySQL_connection_failed(iState, szError, iErrorCode, szData, iDataSize);
if(SQL_NumResults(hQuery))
{
new iSize=10;
SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "salt"), g_szDataBase[SALT], iSize); // size = 10
}
else
{
new szBuffer[192+1];
format(szBuffer, charsmax(szBuffer), "[Error SQL] if SELECT salt FROM config");
set_fail_state(szBuffer);
return PLUGIN_HANDLED;
}
return PLUGIN_HANDLED;
}
public plugin_init()
{
register_plugin(g_szRegister_plugin[0], g_szRegister_plugin[1], g_szRegister_plugin[2]);
reg_menu(g_iMenuId[ACC_ID], "Show_Main__acc", "Handle_Main__acc");
new szClCmd[] = {"","say /","say_team /", "say ", "say_team "};
for(new i; i < sizeof(szClCmd); i++)
register_clcmd(fmt("%s%s", szClCmd[i], REGCMD), "Show_Main__acc");
register_clcmd("reg_login", "ClCmd_reg_login");
register_clcmd("reg_password", "ClCmd_reg_password");
register_clcmd("reg_mail", "ClCmd_reg_mail");
}
public client_putinserver(id)
{
get_user_authid(id, g_szPlayerSteam[id], charsmax(g_szPlayerSteam[]));
get_user_ip(id, g_szPlayerIp[id], charsmax(g_szPlayerIp[]), 1);
}
//! ============= ClCmd ============== >>>
public ClCmd_reg_mail(id)
{
if(!user_valid(id)) return PLUGIN_HANDLED;
new arg[32]; read_argv(1, arg, 31);
if(strlen(arg) < 3)
{
UTIL_SayText(id, "!yМаил не может быть меньше 3");
return Show_Main__acc(id);
}
if(strlen(arg) > 30)
{
UTIL_SayText(id, "!yМаил не может быть больше 30");
return Show_Main__acc(id);
}
if(!replace(arg, charsmax(arg), "@", "@"))
{
UTIL_SayText(id, "!yНевалидный @");
return Show_Main__acc(id);
}
g_bPlayerMail[id] = true;
g_szPlayerMail[id] = arg;
return Show_Main__acc(id);
}
public ClCmd_reg_password(id)
{
if(!user_valid(id)) return PLUGIN_HANDLED;
new arg[256]; read_argv(1, arg, 32);
if(strlen(arg) < 6)
{
UTIL_SayText(id, "!yПароль не может быть меньше 6");
return Show_Main__acc(id);
}
if(strlen(arg) > 15)
{
UTIL_SayText(id, "!yПароль не может быть больше 15");
return Show_Main__acc(id);
}
add(arg, charsmax(arg), g_szDataBase[SALT]);
hash_string(arg, Hash_Md5, arg, 255);
UTIL_backward_string(arg, charsmax(arg))
add(arg, charsmax(arg), "a");
g_bPlayerPassword[id] = true;
g_szPlayerPassword[id] = arg;
return Show_Main__acc(id);
}
public ClCmd_reg_login(id)
{
if(!user_valid(id)) return PLUGIN_HANDLED;
new arg[256]; read_argv(1, arg, 31);
if(strlen(arg) < 3)
{
UTIL_SayText(id, "!yЛогин не может быть меньше 3");
return Show_Main__acc(id);
}
if(strlen(arg) > 30)
{
UTIL_SayText(id, "!yЛогин не может быть больше 30");
return Show_Main__acc(id);
}
g_bPlayerLogin[id] = true;
g_szPlayerLogin[id] = arg;
new iParams[1]; iParams[0] = id;
format(g_szQuery, charsmax(g_szQuery), "SELECT * FROM `%s` WHERE (`%s`.`login` = '%s')", g_szDataBase[TABLE_USERS], g_szDataBase[TABLE_USERS], g_szPlayerLogin[id]);
SQL_ThreadQuery(g_SqlTuple, "SQL_QueryConnection_Poisk_login", g_szQuery, iParams, sizeof iParams);
return Show_Main__acc(id);
}
public SQL_QueryConnection_Poisk_login(iState, Handle:hQuery, const szError[], iErrorCode, const szData[], iDataSize)
{
if(iState == TQUERY_CONNECT_FAILED || iState == TQUERY_QUERY_FAILED) return MySQL_connection_failed(iState, szError, iErrorCode, szData, iDataSize); // Если не подключился к базе
new id = szData[0];
if(SQL_NumResults(hQuery))
{
g_bPlayerLogin[id] = false;
g_szPlayerLogin[id] = "";
UTIL_SayText(id, "Такой логин уже существует!")
}
else
{
if(equal(g_szPlayerLogin[id], "ID_PENDING")) return Show_Main__acc(id);
g_bPlayerLogin[id] = true;
return Show_Main__acc(id);
}
return PLUGIN_HANDLED;
}
//! ============= acc ============== >>>
public Show_Main__acc(id)
{
if(is_user_hltv(id) || is_user_bot(id) || !user_valid(id)) return PLUGIN_HANDLED
new szMenu[512], iKeys = (1<<9), iLen = formatex(szMenu, charsmax(szMenu), "^t^t^t\yIQ\r~^n^n");
if(unmq_get_users_id(id))
{
new szUserLogin[40]; unmq_get_users_login(id, szUserLogin);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^t^t^t\r#. \wЛогин\d&\wID: \y%s\r#%d^n", szUserLogin, unmq_get_users_id(id));
}
else
{
if(!g_bPlayerLogin[id]) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^t^t^t\y1. \wЛогин \yот 3 до 30 \r*^n");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^t^t^t\y1. \wЛогин \r%s^n", g_szPlayerLogin[id]);
if(!g_bPlayerPassword[id]) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^t^t^t\y2. \wПароль \yот 6 до 15 \r*^n^n");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^t^t^t\y2. \wПароль \r%s^n^n", g_szPlayerPassword[id]);
if(!g_bPlayerMail[id]) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^t^t^t\y3. \wПочта \dнеобязательно^n^n");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^t^t^t\y3. \wПочта: \r%s^n^n", g_szPlayerMail[id]);
if(!g_bPlayerPassword[id] && !g_bPlayerLogin[id]) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^t^t^t\y4. \yВход | рег по QR Code (окно)^n^n^n");
else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^t^t^t\y4. \wРегистрация | Вход^n^n^n");
iKeys |= (1<<0|1<<1|1<<2|1<<3);
}
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^t^t^t\y0. \wВыйти");
return show_menu(id, iKeys, szMenu, -1, "Show_Main__acc");
}
public Handle_Main__acc(id, iKey)
{
switch(iKey)
{
case 0: client_cmd(id,"messagemode reg_login");
case 1: client_cmd(id,"messagemode reg_password");
case 2: client_cmd(id,"messagemode reg_mail");
case 3:
{
if(!g_bPlayerPassword[id] && !g_bPlayerLogin[id]) show_motd(id, "Скоро");
else MySQL__Users_reg(id);
}
case 9: return PLUGIN_HANDLED;
}
return PLUGIN_HANDLED;
}
public MySQL__Users_reg(iPlayer)
{
//!=============== Регистрация акаунта ============= >
new iParams[1];
iParams[0] = iPlayer;
new g_szTime[20];
get_time("%Y-%m-%d %H:%M:%S", g_szTime, charsmax(g_szTime));
/* g_szTime[12] += 2; */
new szName[MAX_PLAYER + 1];
get_user_name(iPlayer, szName, 31);
new iMoney[MAX_PLAYER + 1] = 0;
formatex(g_szQuery, charsmax(g_szQuery), "INSERT INTO \
`%s`( \
`login`, `password`, `email`, `regdate`, `avatar`, \
`rights`, `name`, `nick`, `skype`, `vk`, \
`birth`, `signature`, `answers`, `shilings`, `stickers`, \
`thanks`, `last_activity`, `dell`, `last_topic`, `reit`, \
`proc`, `steam_id`, `steam_api`, `vk_api`, `fb`, \
`fb_api`, `active`, `im`, `telegram`, `prefix`, \
`game_time`, `protect`, `invited`, `email_notice`, `ip`, \
`browser`, `multi_account`, `gag`, `member_online`, `game_money`, \
`plugins_settings`, `discord` \
)\
VALUES (\
'%s', '%s', '%s', '%s', 'files/avatars/no_avatar.jpg',\
'%d', '---', '%s', '---', '---', \
'1900-01-01', '0', '0', '%d', '0', \
'0', '%s', '0', '0', '0', \
'0', '%s', '0', '0', '0', \
'0', '1', '1', '---', 'NULL', \
'0', '2', '0', '1', '%s', \
'NULL', 'NULL', '2', '0', '0', \
'NULL', 'NULL' \
)\
",
g_szDataBase[TABLE_USERS],
g_szPlayerLogin[iPlayer],
g_szPlayerPassword[iPlayer],
(g_bPlayerMail) ? g_szPlayerMail[iPlayer] : "null@mail.ru",
g_szTime, g_iUserGroup, szName[iPlayer], iMoney[iPlayer], g_szTime,
g_szPlayerSteam[iPlayer],
g_szPlayerIp[iPlayer]);
SQL_ThreadQuery(g_SqlTuple, "ThreadQueryHandler", g_szQuery);
unmq_while_users(iPlayer);
set_task(random_float(1.0, 3.0), "Task_AddEvents", iPlayer+985612);
//!=============== Регистрация акаунта ============= <
}
public Task_AddEvents(id)
{
id -= 985612;
new UserpId = unmq_get_users_id(id);
new iUnixDateReg = get_systime();
if(UserpId)
{
formatex(g_szQuery, charsmax(g_szQuery), "\
INSERT INTO `events`(`id`, `type`, `date`, `content`, `link`, `data_id`, `sec_data_id`, `author`, `access`) \
VALUES (NULL, '3', '%d', 'Зарегистрирован новый пользователь под именем %s', '../profile?id=%d', '%d', '0', '%d', ';')",
iUnixDateReg, g_szPlayerLogin[id], UserpId, UserpId, UserpId);
SQL_ThreadQuery(g_SqlTuple, "ThreadQueryHandler", g_szQuery);
}
if(task_exists(id+985612)) remove_task(id+985612);
}
public ThreadQueryHandler(iState, Handle:hQuery, const szError[], iErrorCode, const szData[], iDataSize)
{
if(iState == TQUERY_CONNECT_FAILED || iState == TQUERY_QUERY_FAILED) return MySQL_connection_failed(iState, szError, iErrorCode, szData, iDataSize); // Если не подключился к базе
// ? debug
/* new iResult = SQL_NumResults(hQuery);
if(iResult)
{
server_print("Sql result [%d] data[%d]", iResult, szData[0]);
}
new szBuffer[512];
SQL_GetQueryString(hQuery, szBuffer, charsmax(szBuffer));
server_print("[%s]", szBuffer); */
return 1;
}
public MySQL_connection_failed(iState, const szError[], iErrorCode, const szData[], iDataSize)
{
log_amx("[SQL] MySQL connection failed");
log_amx("[SQL] ERROR %d | %s", iErrorCode, szError);
if(iDataSize) log_amx("Query state: %d", szData[iState == TQUERY_CONNECT_FAILED ? 0 : 1]);
set_fail_state(szError);
return PLUGIN_HANDLED;
}
//! ============= stock ============== >>>
stock UTIL_backward_string(buffer[], maxlen)
{
static temp_buffer[256];
new len = strlen(buffer);
for(new a, i = len; i > 0; i--) temp_buffer[i - 1] = buffer[a++];
temp_buffer[len] = EOS;
copy(buffer, maxlen, temp_buffer);
new sz_buffer[256];
formatex(sz_buffer, charsmax(sz_buffer), "%s", temp_buffer);
return sz_buffer;
}
const MsgId_SayText = 76;
stock UTIL_SayText(pPlayer, const szMessage[], any:...)
{
new szBuffer[190];
if(numargs() > 2) vformat(szBuffer, charsmax(szBuffer), szMessage, 3);
else copy(szBuffer, charsmax(szBuffer), szMessage);
while(replace(szBuffer, charsmax(szBuffer), "!y", "^1")) {}
while(replace(szBuffer, charsmax(szBuffer), "!t", "^3")) {}
while(replace(szBuffer, charsmax(szBuffer), "!g", "^4")) {}
switch(pPlayer)
{
case 0:
{
for(new iPlayer = 1; iPlayer <= MaxClients; iPlayer++)
{
if(!is_user_connected(iPlayer) || !user_valid(iPlayer)) continue;
engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, MsgId_SayText, {0.0, 0.0, 0.0}, iPlayer);
write_byte(iPlayer);
write_string(szBuffer);
message_end();
}
}
default:
{
engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, MsgId_SayText, {0.0, 0.0, 0.0}, pPlayer);
write_byte(pPlayer);
write_string(szBuffer);
message_end();
}
}
}