[SQL] Player Acc

amxx [SQL] Player Acc 1.0 BETA

Нет прав для скачивания
Для CS 1.6
Автор
Mittu
Исходный код
C++:
#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();
        }
    }
}
Требования
[SQL] Core 1.2 BETA или выше!
Сайт на официальной системе GameCMS
Удаленное подключение сервера к базе MySQL
Требование ReAPI
Нет
Поддержка русского языка
Да
Совместимость
  1. HLDS
  2. REHLDS
Сверху Снизу