#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");
}
/*-----------------------------*/
#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;
}
/*-----------------------------*/
#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");
}
/*-----------------------------*/