GS-Client: Uid Ban System

Плагин АМХХ GS-Client: Uid Ban System 1.0.3

Нет прав для скачивания
C++:
#include <amxmodx>
#include <amxmisc>
#include <authemu>

#define AUTO_CONFIG //Авто-создание конфига.

new const PLUGIN[] = "GS-Client: Uid Ban System";
new const VERSION[] = "1.0.3";
new const AUTHOR[] = "wellasgood";

new const Folder[] = "addons/UID-Bans"; //Основная папка плагина (хранение Access файла и логов)
new const AccessFile[] = "UID-Bans.txt"; //Файл хранения информации о UID забаненных.
new const LoggingFolder[] = "UID-Bans_Logs"; //Название папки для хранения логов.

enum //Избавляемся от магический цифр (непонятных) по коду.
{
    NAME_LENGHT = 64,
    DATA_LENGHT = 11,
    INFO_LENGHT = 3,
    DATE_LENGHT = 16
};

enum _:CvarData
{
    Float:TIME_CHECK,
    Float:TIME_KICK_ONE,
    Float:TIME_KICK_TWO
};

new eCvarData[CvarData];

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    register_dictionary("gsc_uid_ban_system.txt");

    register_clcmd("say /ubm", "OpenUidBansMenu", ADMIN_RCON, "Access the Uid Ban System Menu");

    RegCvars();

    #if defined AUTO_CONFIG
    AutoExecConfig(true, "gsc_uid_ban_system");
    #endif
}
/*-----------------------------*/
RegCvars()
{
    bind_pcvar_float(create_cvar(
        .name = "gsc_time_check",
        .string = "3.0",
        .description = "Time to check the player after it is connected.", //Время до проверки игрока после его подключения.
        .has_min = false,
        .min_val = 0.0,
        .has_max = false,
        .max_val = 0.0),
        eCvarData[TIME_CHECK]
    );

    bind_pcvar_float(create_cvar(
        .name = "gsc_time_kick_one",
        .string = "1.0",
        .description = "Time to kick the player after performing the check.", //Время до кика игрока после выполнения проверки.
        .has_min = false,
        .min_val = 0.0,
        .has_max = false,
        .max_val = 0.0),
        eCvarData[TIME_KICK_ONE]
    );

    bind_pcvar_float(create_cvar(
        .name = "gsc_time_kick_two",
        .string = "1.0",
        .description = "Time to kick the player after selecting in the menu.", //Время до кика игрока после выбора в меню.
        .has_min = false,
        .min_val = 0.0,
        .has_max = false,
        .max_val = 0.0),
        eCvarData[TIME_KICK_TWO]
    );
}
/*-----------------------------*/
public plugin_cfg()
{
    if(!dir_exists(Folder)){
        mkdir(Folder);
    }

    if(!file_exists(fmt("%s/%s", Folder, AccessFile))){
        new File = fopen(fmt("%s/%s", Folder, AccessFile), "at");
        fclose(File);
    }

    if(!dir_exists(fmt("%s/%s", Folder, LoggingFolder))){
        mkdir(fmt("%s/%s", Folder, LoggingFolder));
    }

    new LogDate[DATE_LENGHT];
    get_time("%d_%m_%y", LogDate, charsmax(LogDate));

    if(!file_exists(fmt("%s/%s/uid_bans-log_%s.txt", Folder, LoggingFolder, LogDate))){
        new LogFile = fopen(fmt("%s/%s/uid_bans-log_%s.txt", Folder, LoggingFolder, LogDate), "at");
        fclose(LogFile);
    }
}
/*-----------------------------*/
public client_putinserver(Player)
{
    if(is_user_authemu(Player)){
        set_task_ex(eCvarData[TIME_CHECK], "CheckUidBan", Player);
    }
}
/*-----------------------------*/
public CheckUidBan(Player)
{
    new UIDHashOld[DATA_LENGHT], UIDHashNew[DATA_LENGHT], Data[DATA_LENGHT];

    aemu_get_clientinfo(Player, aci_unique_id, UIDHashNew, charsmax(UIDHashNew));

    new f = fopen(fmt("%s/%s", Folder, AccessFile), "rt");

    while(!feof(f)){
        fgets(f, Data, charsmax(Data));
        trim(Data);

        if(!Data[0]){
            continue;
        }

        parse(Data, UIDHashOld, charsmax(UIDHashOld));

        if(equal(UIDHashOld, UIDHashNew)){
            set_task_ex(eCvarData[TIME_KICK_ONE], "PlayerKick", Player);
        }
    }

    fclose(f);
}
/*-----------------------------*/
public OpenUidBansMenu(id, level, cid)
{
    if(!cmd_access(id, level, cid, 2, false)){
        return PLUGIN_HANDLED;
    }

    ShowUidBanMenu(id);
    return PLUGIN_HANDLED;
}
/*-----------------------------*/
ShowUidBanMenu(id)
{
    if(!is_user_connected(id)){
        return;
    }

    new UidBanPlayerMenu[NAME_LENGHT];
    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_TITLE");

    new Menu = menu_create(UidBanPlayerMenu, "Handle_ShowUidBanMenu");
    new Callback = menu_makecallback("Ignore_ShowUidBanMenu");

    new Name[MAX_NAME_LENGTH], Info[INFO_LENGHT], Players[MAX_PLAYERS], PlayersCount;

    get_players_ex(Players, PlayersCount, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV);

    for(new Player, i; i < PlayersCount; i++){
        Player = Players[i];
        Info[0] = Player;

        get_user_name(Player, Name, charsmax(Name));
        menu_additem(Menu, Name, Info, .callback = Callback);
    }

    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_BACK");
    menu_setprop(Menu, MPROP_BACKNAME, UidBanPlayerMenu);

    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_NEXT");
    menu_setprop(Menu, MPROP_NEXTNAME, UidBanPlayerMenu);

    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_EXIT");
    menu_setprop(Menu, MPROP_EXITNAME, UidBanPlayerMenu);

    menu_display(id, Menu);
}
/*-----------------------------*/
public Handle_ShowUidBanMenu(id, Menu, Item)
{
    if(Item == MENU_EXIT){
        menu_destroy(Menu);
        return PLUGIN_HANDLED;
    }

    new Info[INFO_LENGHT], Buffer;

    menu_item_getinfo(Menu, Item, Buffer, Info, charsmax(Info), .callback = Buffer);
    menu_destroy(Menu);

    new Player = Info[0];

    WriteDataToCfg(Player);

    ShowUidBanMenu(id);
    return PLUGIN_HANDLED;
}
/*-----------------------------*/
WriteDataToCfg(Player)
{
    new Name[MAX_NAME_LENGTH], AuthID[MAX_AUTHID_LENGTH], Ip[MAX_IP_LENGTH+1];

    get_user_name(Player, Name, charsmax(Name));
    get_user_authid(Player, AuthID, charsmax(AuthID));
    get_user_ip(Player, Ip, charsmax(Ip), 1);

    new Data[DATA_LENGHT], UIDHash[DATA_LENGHT];

    aemu_get_clientinfo(Player, aci_unique_id, UIDHash, charsmax(UIDHash));

    formatex(Data, charsmax(Data), "%s", UIDHash);
    write_file(fmt("%s/%s", Folder, AccessFile), Data, -1);

    new LogDate[DATE_LENGHT];
    get_time("%d_%m_%y", LogDate, charsmax(LogDate));

    log_to_file(fmt("%s/%s/uid_bans-log_%s.txt", Folder, LoggingFolder, LogDate), "%L", LANG_SERVER, "UID_BAN_LOGS", Name, AuthID, Ip, UIDHash);

    set_task_ex(eCvarData[TIME_KICK_TWO], "PlayerKick", Player);
}
/*-----------------------------*/
public Ignore_ShowUidBanMenu(id, Menu, Item)
{
    new Info[INFO_LENGHT], Buffer;
    menu_item_getinfo(Menu, Item, Buffer, Info, charsmax(Info), .callback = Buffer);

    new Player = Info[0];

    if(!is_user_authemu(Player)){
        return ITEM_DISABLED;
    }

    if(Player == id){
        return ITEM_DISABLED;
    }

    return ITEM_IGNORE;
}
/*-----------------------------*/
public PlayerKick(Player)
{
    server_cmd("kick #%d %L", get_user_userid(Player), LANG_PLAYER, "UID_KICK_REASON");
}
/*-----------------------------*/
C++:
#include <amxmodx>
#include <amxmisc>
#include <sqlx>
#include <authemu>

#define AUTO_CONFIG //Авто-создание конфига.

new const PLUGIN[] = "GS-Client: Uid Ban System";
new const VERSION[] = "1.0.3";
new const AUTHOR[] = "wellasgood";

new const Folder[] = "addons/UID-Bans"; //Основная папка плагина (хранение Access файла и логов)
new const LoggingFolder[] = "UID-Bans_Logs"; //Название папки для хранения логов.

const QueryLength = 1024;

enum //Избавляемся от магический цифр (непонятных) по коду.
{
    NAME_LENGHT = 64,
    STRING_LENGHT = 128,
    DATA_LENGHT = 11,
    INFO_LENGHT = 3,
    DATE_LENGHT = 16
};

enum _:SqlCvarData
{
    SQL_MODULE[10],
    SQL_HOST[64],
    SQL_USER[64],
    SQL_PASS[64],
    SQL_DB[64],
    SQL_TABLE[64],
    SQL_CREATE_TABLE
};

enum _:SqlType
{
    TYPE,
    ID
};

enum //Типы для хендлера обработчика sql
{
    SQL_VOID,
    SQL_LOAD,
    SQL_INSERT
};

enum _:RowIDs
{
    ROW_ID,
    ROW_STEAM,
    ROW_UID
};

new const RowNames[RowIDs][] =
{
    "id",
    "steam",
    "uid"
};

enum _:CvarData
{
    Float:TIME_CHECK,
    Float:TIME_KICK_ONE,
    Float:TIME_KICK_TWO
};

new Handle:SQL_Tuple, eCvarData[CvarData], eSqlCvarData[SqlCvarData];

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    register_dictionary("gsc_uid_ban_system.txt");

    register_clcmd("say /ubm", "OpenUidBansMenu", ADMIN_RCON, "Access the Uid Ban System Menu");

    RegCvars();

    #if defined AUTO_CONFIG
    AutoExecConfig(true, "gsc_uid_ban_system");
    #endif
}
/*-----------------------------*/
RegCvars()
{
    bind_pcvar_float(create_cvar(
        .name = "gsc_time_check",
        .string = "3.0",
        .description = "Time to check the player after it is connected.", //Время до проверки игрока после его подключения.
        .has_min = false,
        .min_val = 0.0,
        .has_max = false,
        .max_val = 0.0),
        eCvarData[TIME_CHECK]
    );

    bind_pcvar_float(create_cvar(
        .name = "gsc_time_kick_one",
        .string = "1.0",
        .description = "Time to kick the player after performing the check.", //Время до кика игрока после выполнения проверки.
        .has_min = false,
        .min_val = 0.0,
        .has_max = false,
        .max_val = 0.0),
        eCvarData[TIME_KICK_ONE]
    );

    bind_pcvar_float(create_cvar(
        .name = "gsc_time_kick_two",
        .string = "1.0",
        .description = "Time to kick the player after selecting in the menu.", //Время до кика игрока после выбора в меню.
        .has_min = false,
        .min_val = 0.0,
        .has_max = false,
        .max_val = 0.0),
        eCvarData[TIME_KICK_TWO]
    );

    bind_pcvar_string(create_cvar(
        .name = "gsc_sql_module",
        .string = "mysql",
        .description = "Module for working with MySQL database."), //Модуль для работы с базой данных MySQL.
        eSqlCvarData[SQL_MODULE],
        charsmax(eSqlCvarData[SQL_MODULE])
    );

    bind_pcvar_string(create_cvar(
        .name = "gsc_sql_host",
        .string = "127.0.0.1",
        .description = "Host where the database is located."), //Хост где расположена база данных.
        eSqlCvarData[SQL_HOST],
        charsmax(eSqlCvarData[SQL_HOST])
    );

    bind_pcvar_string(create_cvar(
        .name = "gsc_sql_user",
        .string = "user",
        .description = "Database User."), //Пользователь базы данных.
        eSqlCvarData[SQL_USER],
        charsmax(eSqlCvarData[SQL_USER])
    );

    bind_pcvar_string(create_cvar(
        .name = "gsc_sql_pass",
        .string = "12345",
        .description = "User password."), //Пароль пользователя.
        eSqlCvarData[SQL_PASS],
        charsmax(eSqlCvarData[SQL_PASS])
    );

    bind_pcvar_string(create_cvar(
        .name = "gsc_sql_db",
        .string = "gsc_uid_bans",
        .description = "Database name."), //Наименование базы данных.
        eSqlCvarData[SQL_DB],
        charsmax(eSqlCvarData[SQL_DB])
    );

    bind_pcvar_string(create_cvar(
        .name = "gsc_sql_table",
        .string = "uid_bans",
        .description = "Name of the table for auto-creation."), //Наименование таблицы для автосоздания.
        eSqlCvarData[SQL_TABLE],
        charsmax(eSqlCvarData[SQL_TABLE])
    );

    bind_pcvar_num(create_cvar(
        .name = "gsc_sql_create_tb",
        .string = "1",
        .description = "Auto-create table structure. (off|on > 0|1)", //Автосоздание структуры таблицы. (выкл|вкл > 0|1)
        .has_min = true,
        .min_val = 0.0,
        .has_max = true,
        .max_val = 1.0),
        eSqlCvarData[SQL_CREATE_TABLE]
    );
}
/*-----------------------------*/
public plugin_cfg()
{
    if(!dir_exists(Folder)){
        mkdir(Folder);
    }

    if(!dir_exists(fmt("%s/%s", Folder, LoggingFolder))){
        mkdir(fmt("%s/%s", Folder, LoggingFolder));
    }

    new LogDate[DATE_LENGHT];
    get_time("%d_%m_%y", LogDate, charsmax(LogDate));

    if(!file_exists(fmt("%s/%s/uid_bans-log_%s.txt", Folder, LoggingFolder, LogDate))){
        new LogFile = fopen(fmt("%s/%s/uid_bans-log_%s.txt", Folder, LoggingFolder, LogDate), "at");
        fclose(LogFile);
    }

    SQL_Tuple = SQL_MakeDbTuple(eSqlCvarData[SQL_HOST], eSqlCvarData[SQL_USER], eSqlCvarData[SQL_PASS], eSqlCvarData[SQL_DB]);
    SqlConnect();
}
/*-----------------------------*/
public client_putinserver(Player)
{
    if(is_user_authemu(Player)){
        set_task_ex(eCvarData[TIME_CHECK], "CheckUidBan", Player);
    }
}
/*-----------------------------*/
public CheckUidBan(Player)
{
    new UIDHash[DATA_LENGHT], Query[QueryLength];

    aemu_get_clientinfo(Player, aci_unique_id, UIDHash, charsmax(UIDHash));

    formatex(Query, charsmax(Query), "SELECT `%s` FROM `%s` WHERE `%s` = '%s'", RowNames[ROW_UID], eSqlCvarData[SQL_TABLE], RowNames[ROW_UID], UIDHash);

    new SqlData[SqlType];

    SqlData[TYPE] = SQL_LOAD;
    SqlData[ID] = Player;

    SQL_ThreadQuery(SQL_Tuple, "SQL_Handler", Query, SqlData, sizeof SqlData);
}
/*-----------------------------*/
public OpenUidBansMenu(id, level, cid)
{
    if(!cmd_access(id, level, cid, 2, false)){
        return PLUGIN_HANDLED;
    }

    ShowUidBanMenu(id);
    return PLUGIN_HANDLED;
}
/*-----------------------------*/
ShowUidBanMenu(id)
{
    if(!is_user_connected(id)){
        return;
    }

    new UidBanPlayerMenu[NAME_LENGHT];
    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_TITLE");

    new Menu = menu_create(UidBanPlayerMenu, "Handle_ShowUidBanMenu");
    new Callback = menu_makecallback("Ignore_ShowUidBanMenu");

    new Name[MAX_NAME_LENGTH], Info[INFO_LENGHT], Players[MAX_PLAYERS], PlayersCount;

    get_players_ex(Players, PlayersCount, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV);

    for(new Player, i; i < PlayersCount; i++){
        Player = Players[i];
        Info[0] = Player;

        get_user_name(Player, Name, charsmax(Name));
        menu_additem(Menu, Name, Info, .callback = Callback);
    }

    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_BACK");
    menu_setprop(Menu, MPROP_BACKNAME, UidBanPlayerMenu);

    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_NEXT");
    menu_setprop(Menu, MPROP_NEXTNAME, UidBanPlayerMenu);

    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_EXIT");
    menu_setprop(Menu, MPROP_EXITNAME, UidBanPlayerMenu);

    menu_display(id, Menu);
}
/*-----------------------------*/
public Handle_ShowUidBanMenu(id, Menu, Item)
{
    if(Item == MENU_EXIT){
        menu_destroy(Menu);
        return PLUGIN_HANDLED;
    }

    new Info[INFO_LENGHT], Buffer;

    menu_item_getinfo(Menu, Item, Buffer, Info, charsmax(Info), .callback = Buffer);
    menu_destroy(Menu);

    new Player = Info[0];

    WriteDataToCfg(Player);

    ShowUidBanMenu(id);
    return PLUGIN_HANDLED;
}
/*-----------------------------*/
WriteDataToCfg(Player)
{
    new Name[MAX_NAME_LENGTH], AuthID[MAX_AUTHID_LENGTH], Ip[MAX_IP_LENGTH+1];

    get_user_name(Player, Name, charsmax(Name));
    get_user_authid(Player, AuthID, charsmax(AuthID));
    get_user_ip(Player, Ip, charsmax(Ip), 1);

    new UIDHash[DATA_LENGHT];

    aemu_get_clientinfo(Player, aci_unique_id, UIDHash, charsmax(UIDHash));

    new LogDate[DATE_LENGHT];

    get_time("%d_%m_%y", LogDate, charsmax(LogDate));

    log_to_file(fmt("%s/%s/uid_bans-log_%s.txt", Folder, LoggingFolder, LogDate), "%L", LANG_SERVER, "UID_BAN_LOGS", Name, AuthID, Ip, UIDHash);

    new Query[QueryLength];

    formatex(Query, charsmax(Query), "INSERT INTO `%s` \
            (`%s`,`%s`)\
            VALUES('%s','%s')\
            ",
            eSqlCvarData[SQL_TABLE],

            RowNames[ROW_STEAM],
            RowNames[ROW_UID],

            AuthID,
            UIDHash
    );

    new SqlData[SqlType];

    SqlData[TYPE] = SQL_INSERT;
    SqlData[ID] = Player;

    SQL_ThreadQuery(SQL_Tuple, "SQL_Handler", Query, SqlData, sizeof SqlData);
}
/*-----------------------------*/
public Ignore_ShowUidBanMenu(id, Menu, Item)
{
    new Info[INFO_LENGHT], Buffer;
    menu_item_getinfo(Menu, Item, Buffer, Info, charsmax(Info), .callback = Buffer);

    new Player = Info[0];

    if(!is_user_authemu(Player)){
        return ITEM_DISABLED;
    }

    if(Player == id){
        return ITEM_DISABLED;
    }

    return ITEM_IGNORE;
}
/*-----------------------------*/
public PlayerKick(Player)
{
    server_cmd("kick #%d %L", get_user_userid(Player), LANG_PLAYER, "UID_KICK_REASON");
}

/*-----------------------------*/
/*-----NEXT SQL FUNCTIONS------*/
/*-----------------------------*/

SqlConnect()
{
    new ErrNum, ErrOne[STRING_LENGHT];
    new Handle:Test = SQL_Connect(SQL_Tuple, ErrNum, ErrOne, charsmax(ErrOne));

    if(Test == Empty_Handle){
        new ErrTwo[STRING_LENGHT];
        formatex(ErrTwo, charsmax(ErrTwo), "[GS-Client: Uid Ban System]: SQL ERROR #%d, %s", ErrNum, ErrOne);
        set_fail_state(ErrTwo); //подключение не удалось, офаем плагин.
    }
    else{
        if(eSqlCvarData[SQL_CREATE_TABLE]){
            CreateDB(); //создание таблицы автоматически.
        }
        SQL_FreeHandle(Test); //закрытие соединения с БД.
    }
}
/*-----------------------------*/
CreateDB()
{
    new Query[QueryLength];

    if(strcmp(eSqlCvarData[SQL_MODULE], "mysql") == 0){
        SQL_SetAffinity(eSqlCvarData[SQL_MODULE])

        formatex(Query, charsmax(Query), "\
                CREATE TABLE IF NOT EXISTS `%s` (\
                    `%s` int(11) NOT NULL AUTO_INCREMENT,\
                    `%s` varchar(32) NOT NULL,\
                    `%s` varchar(10) NOT NULL,\
                    PRIMARY KEY (%s)\
                );",
                eSqlCvarData[SQL_TABLE],

                RowNames[ROW_ID],
                RowNames[ROW_STEAM],
                RowNames[ROW_UID],

                RowNames[ROW_ID]
        );
    }
    else if(strcmp(eSqlCvarData[SQL_MODULE], "sqlite") == 0){
        SQL_SetAffinity(eSqlCvarData[SQL_MODULE])

        formatex(Query, charsmax(Query), "\
                CREATE TABLE IF NOT EXISTS `%s` (\
                    `%s` INTEGER PRIMARY KEY AUTOINCREMENT,\
                    `%s` TEXT,\
                    `%s` TEXT,\
                );",
                eSqlCvarData[SQL_TABLE],

                RowNames[ROW_ID],
                RowNames[ROW_STEAM],
                RowNames[ROW_UID]
        );
    }
    else{
        set_fail_state("[GS-Client: Uid Ban System]: Invalid ^"sql module^" value!"); //sql модули неактивны (выключены и тп).
    }

    new SqlData[SqlType];

    SqlData[TYPE] = SQL_VOID;

    SQL_ThreadQuery(SQL_Tuple, "SQL_Handler", Query, SqlData, sizeof SqlData);
}
/*-----------------------------*/
public SQL_Handler(FailState, Handle:SqlQuery, Err[], ErrNum, Data[], Size)
{
    if(FailState != TQUERY_SUCCESS){
        log_amx("[GS-Client: Uid Ban System]: SQL ERROR #%d, %s", ErrNum, Err);
        return PLUGIN_HANDLED;
    }

    new Player = Data[ID];

    switch(Data[TYPE])
    {
        case SQL_VOID:
        {
            return PLUGIN_HANDLED;
        }
        case SQL_LOAD:
        {
            if(SQL_NumResults(SqlQuery)){
                set_task_ex(eCvarData[TIME_KICK_ONE], "PlayerKick", Player);
            }
        }
        case SQL_INSERT:
        {
            set_task_ex(eCvarData[TIME_KICK_TWO], "PlayerKick", Player);
        }
    }

    return PLUGIN_HANDLED;
}
/*-----------------------------*/
C++:
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <authemu>

#define AUTO_CONFIG //Авто-создание конфига.

new const PLUGIN[] = "GS-Client: Uid Ban System";
new const VERSION[] = "1.0.3";
new const AUTHOR[] = "wellasgood";

new const Folder[] = "addons/UID-Bans"; //Основная папка плагина (хранение Access файла и логов)
new const LoggingFolder[] = "UID-Bans_Logs"; //Название папки для хранения логов.

enum //Избавляемся от магический цифр (непонятных) по коду.
{
    NAME_LENGHT = 64,
    DATA_LENGHT = 11,
    INFO_LENGHT = 3,
    DATE_LENGHT = 16
};

enum _:CvarData
{
    Float:TIME_CHECK,
    Float:TIME_KICK_ONE,
    Float:TIME_KICK_TWO
};

new eCvarData[CvarData], Vault;

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    register_dictionary("gsc_uid_ban_system.txt");

    register_clcmd("say /ubm", "OpenUidBansMenu", ADMIN_RCON, "Access the Uid Ban System Menu");

    RegCvars();

    #if defined AUTO_CONFIG
    AutoExecConfig(true, "gsc_uid_ban_system");
    #endif
}
/*-----------------------------*/
RegCvars()
{
    bind_pcvar_float(create_cvar(
        .name = "gsc_time_check",
        .string = "3.0",
        .description = "Time to check the player after it is connected.", //Время до проверки игрока после его подключения.
        .has_min = false,
        .min_val = 0.0,
        .has_max = false,
        .max_val = 0.0),
        eCvarData[TIME_CHECK]
    );

    bind_pcvar_float(create_cvar(
        .name = "gsc_time_kick_one",
        .string = "1.0",
        .description = "Time to kick the player after performing the check.", //Время до кика игрока после выполнения проверки.
        .has_min = false,
        .min_val = 0.0,
        .has_max = false,
        .max_val = 0.0),
        eCvarData[TIME_KICK_ONE]
    );

    bind_pcvar_float(create_cvar(
        .name = "gsc_time_kick_two",
        .string = "1.0",
        .description = "Time to kick the player after selecting in the menu.", //Время до кика игрока после выбора в меню.
        .has_min = false,
        .min_val = 0.0,
        .has_max = false,
        .max_val = 0.0),
        eCvarData[TIME_KICK_TWO]
    );
}
/*-----------------------------*/
public plugin_cfg()
{
    if(!dir_exists(Folder)){
        mkdir(Folder);
    }

    if(!dir_exists(fmt("%s/%s", Folder, LoggingFolder))){
        mkdir(fmt("%s/%s", Folder, LoggingFolder));
    }

    new LogDate[DATE_LENGHT];
    get_time("%d_%m_%y", LogDate, charsmax(LogDate));

    if(!file_exists(fmt("%s/%s/uid_bans-log_%s.txt", Folder, LoggingFolder, LogDate))){
        new LogFile = fopen(fmt("%s/%s/uid_bans-log_%s.txt", Folder, LoggingFolder, LogDate), "at");
        fclose(LogFile);
    }

    Vault = nvault_open("UID-bans");

    if(Vault == INVALID_HANDLE){
        set_fail_state("[GS-Client: Uid Ban System]: Error opening nVault file!");
    }
}
/*-----------------------------*/
public plugin_end()
{
    nvault_close(Vault);
}
/*-----------------------------*/
public client_putinserver(Player)
{
    if(is_user_authemu(Player)){
        set_task_ex(eCvarData[TIME_CHECK], "CheckUidBan", Player);
    }
}
/*-----------------------------*/
public CheckUidBan(Player)
{
    new UIDHash[DATA_LENGHT], Data[DATA_LENGHT];

    aemu_get_clientinfo(Player, aci_unique_id, UIDHash, charsmax(UIDHash));

    new timestamp, AccessResult = nvault_lookup(Vault, UIDHash, Data, charsmax(Data), timestamp);

    if(AccessResult){
        set_task_ex(eCvarData[TIME_KICK_ONE], "PlayerKick", Player);
    }
}
/*-----------------------------*/
public OpenUidBansMenu(id, level, cid)
{
    if(!cmd_access(id, level, cid, 2, false)){
        return PLUGIN_HANDLED;
    }

    ShowUidBanMenu(id);
    return PLUGIN_HANDLED;
}
/*-----------------------------*/
ShowUidBanMenu(id)
{
    if(!is_user_connected(id)){
        return;
    }

    new UidBanPlayerMenu[NAME_LENGHT];
    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_TITLE");

    new Menu = menu_create(UidBanPlayerMenu, "Handle_ShowUidBanMenu");
    new Callback = menu_makecallback("Ignore_ShowUidBanMenu");

    new Name[MAX_NAME_LENGTH], Info[INFO_LENGHT], Players[MAX_PLAYERS], PlayersCount;

    get_players_ex(Players, PlayersCount, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV);

    for(new Player, i; i < PlayersCount; i++){
        Player = Players[i];
        Info[0] = Player;

        get_user_name(Player, Name, charsmax(Name));
        menu_additem(Menu, Name, Info, .callback = Callback);
    }

    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_BACK");
    menu_setprop(Menu, MPROP_BACKNAME, UidBanPlayerMenu);

    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_NEXT");
    menu_setprop(Menu, MPROP_NEXTNAME, UidBanPlayerMenu);

    formatex(UidBanPlayerMenu, charsmax(UidBanPlayerMenu), "%L", id, "UID_BAN_MENU_EXIT");
    menu_setprop(Menu, MPROP_EXITNAME, UidBanPlayerMenu);

    menu_display(id, Menu);
}
/*-----------------------------*/
public Handle_ShowUidBanMenu(id, Menu, Item)
{
    if(Item == MENU_EXIT){
        menu_destroy(Menu);
        return PLUGIN_HANDLED;
    }

    new Info[INFO_LENGHT], Buffer;

    menu_item_getinfo(Menu, Item, Buffer, Info, charsmax(Info), .callback = Buffer);
    menu_destroy(Menu);

    new Player = Info[0];

    WriteDataToCfg(Player);

    ShowUidBanMenu(id);
    return PLUGIN_HANDLED;
}
/*-----------------------------*/
WriteDataToCfg(Player)
{
    new Name[MAX_NAME_LENGTH], AuthID[MAX_AUTHID_LENGTH], Ip[MAX_IP_LENGTH+1];

    get_user_name(Player, Name, charsmax(Name));
    get_user_authid(Player, AuthID, charsmax(AuthID));
    get_user_ip(Player, Ip, charsmax(Ip), 1);

    new UIDHash[DATA_LENGHT];

    aemu_get_clientinfo(Player, aci_unique_id, UIDHash, charsmax(UIDHash));

    nvault_set(Vault, UIDHash, AuthID);

    new LogDate[DATE_LENGHT];
    get_time("%d_%m_%y", LogDate, charsmax(LogDate));

    log_to_file(fmt("%s/%s/uid_bans-log_%s.txt", Folder, LoggingFolder, LogDate), "%L", LANG_SERVER, "UID_BAN_LOGS", Name, AuthID, Ip, UIDHash);

    set_task_ex(eCvarData[TIME_KICK_TWO], "PlayerKick", Player);
}
/*-----------------------------*/
public Ignore_ShowUidBanMenu(id, Menu, Item)
{
    new Info[INFO_LENGHT], Buffer;
    menu_item_getinfo(Menu, Item, Buffer, Info, charsmax(Info), .callback = Buffer);

    new Player = Info[0];

    if(!is_user_authemu(Player)){
        return ITEM_DISABLED;
    }

    if(Player == id){
        return ITEM_DISABLED;
    }

    return ITEM_IGNORE;
}
/*-----------------------------*/
public PlayerKick(Player)
{
    server_cmd("kick #%d %L", get_user_userid(Player), LANG_PLAYER, "UID_KICK_REASON");
}
/*-----------------------------*/
Назад
Сверху