Sistema de ban (SQLite3) [Actualización 17/02/2019]
#1
Sistema de Ban SQLite3

• Créditos:
- Federicomb > is_valid_hid();

• Descripción:
Un sistema de ban que interactúa con una base de datos, tiene la posibilidad de agregar IP's, SteamID's y HID's por un tiempo establecido en minutos, baneando al usuario y facilitando así la exclusión del mismo.

• Cambios:
- Optimización del código
- Reducción de tablas
- Ahora se puede ver la información del usuario baneado en la lista de ban.
- Corregido algunos errores.
- Ahora se crea un log por cada acción realizada: ban, unban, etc...

• Comandos:
- say /.!ban: Abre el menú de ban
- amx_ban_add_ip: "IP" "MINUTOS" "RAZÓN": Agrega una IP a la base de datos.
- amx_ban_add_steamid: "STEAMID" "MINUTOS" "RAZÓN": Agrega un STEAMID a la base de datos.
- amx_ban_add_hid: "HID" "MINUTOS" "RAZÓN": Agrega una HID a la base de datos.
- amx_ban_system_update_frequency 60.0: Tiempo en el que actualiza la lista de ban, para verificar el tiempo.

• Características del menú principal

- Expulsar usuarios: Expulsar a un usuario del servidor
- Banear usuarios: Banea a un usuario del servidor: El ban puede ser por (IP / STEAMID / HWIWD [sXe necesario]).
- Banear IP: Agrega una IP a la base de datos.
- Banear STEAMID: Agrega un STEAMID a la base de datos.
- Lista de usuarios baneados con su descripción del ban:
- Lista de ban: Permite ver los usuarios baneados, así mismo el NOMBRE DE USUARIO, IP, STEAMID y HID de los últimos diez que se desconectaron.


• Menú de ban

- Calcular días en minutos: Permite calcular los minutos que equivalen a x días.
- Calcular horas en minutos: Permite calcular los minutos que equivalen a x horas.
- Introducir minutos: Introduce los minutos del ban.
- Introducir razón: Introduce la razón del ban.
- Minutos en total: Calcula los minutos introducidos de los días y las horas.
- Tipo de ban: Introduce el tipo de ban (IP / STEAMID / HID).
- Ejecutar el ban: Ejecuta el ban al usuario.

• Imágenes
[Imagen: l933TMx.png]
[Imagen: 0aGhuSU.png]
[Imagen: CwdOnrm.png]
[Imagen: jVbi4S3.png]
[Imagen: NpBlLm0.png]
[Imagen: d0tsxOL.png]
[Imagen: CVM5E6z.png]
[Imagen: T9dPnqH.png]

• Lista de usuarios desconectados

- Permite visualizar los últimos diez usuarios que se desconectaron del servidor, el cual obtiene su NOMBRE DE USUARIO, IP, STEAMID y HID.
- Puede visualizarse a través de consola o en un menú.

[Imagen: NwBjwVq.png]
[Imagen: HD8KajN.png]
[Imagen: cjyiC5b.png]


Archivos adjuntos
.sq3   sql_ban_database.sq3 (Tamaño: 7 KB / Descargas: 134)
.sma   Descargar AMXX / ban_system.sma (Tamaño: 53.58 KB / Descargas: 223)
Responder
#2
Una buena pregunta sería, por qué interactúa con 2 bases de datos Whatever

O al menos eso da a entender el títuloInsecure
[Imagen: paypalqr.png]
Responder
#3
(26/10/2018, 12:46 PM)Neeeeeeeeeel.- escribió: Una buena pregunta sería, por qué interactúa con 2 bases de datos Whatever

O al menos eso da a entender el títuloInsecure

En realidad el título se refiere a que tiene para MySQL y SQLite3 (?
Responder
#4
Por qué no hacer directamente algo como 'amx_add_ban "ip/steamid/hid" "tiempo" "razon"'?
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#5
En Breaking Gaming, usabamos el Advanced Bans vía MySQL.
Edito: (Trae UnBan Menú, Ban Menú). Y MySQL Threads de Destro.

Código del AMX:
Código PHP:
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <regex>
#include <colorchat>

#define PLUGIN_NAME    "Advanced Bans"
#define PLUGIN_VERSION    "0.8.1"
#define PLUGIN_AUTHOR    "Exolent MySQL heNK'"

#pragma semicolon 1



// ===============================================
// CUSTOMIZATION STARTS HERE
// ===============================================


// uncomment the line below if you want this plugin to
// load old bans from the banned.cfg and listip.cfg files
//#define KEEP_DEFAULT_BANS


// uncomment the line below if you want the history to be in one file
//#define HISTORY_ONE_FILE


// if you must have a maximum amount of bans to be compatible with AMXX versions before 1.8.0
// change this number to your maximum amount
// if you would rather have unlimited (requires AMXX 1.8.0 or higher) then set it to 0
#define MAX_BANS 0


// if you want to use SQL for your server, then uncomment the line below
#define USING_SQL


// ===============================================
// CUSTOMIZATION ENDS HERE
// ===============================================



#if defined USING_SQL
#include <mysqlt>

new const Datos_MySQLt [ ] [ ] = {
    
""//Web
    
""//User 
    
""//Pass
    
"" //Db
};


#define TABLE_NAME        "advanced_bans"
#define KEY_NAME        "name"
#define KEY_STEAMID        "steamid"
#define KEY_BANLENGTH        "banlength"
#define KEY_UNBANTIME        "unbantime"
#define KEY_REASON        "reason"
#define KEY_ADMIN_NAME        "admin_name"
#define KEY_ADMIN_STEAMID    "admin_steamid"

#define RELOAD_BANS_INTERVAL    60.0
#endif

#define REGEX_IP_PATTERN "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
#define REGEX_STEAMID_PATTERN "^^STEAM_0:(0|1):\d+$"

new Regex:g_IP_pattern;
new 
Regex:g_SteamID_pattern;
new 
g_regex_return;

/*bool:IsValidIP(const ip[])
{
    return regex_match_c(ip, g_IP_pattern, g_regex_return) > 0;
}*/

#define IsValidIP(%1) (regex_match_c(%1, g_IP_pattern, g_regex_return) > 0)

/*bool:IsValidAuthid(const authid[])
{
    return regex_match_c(authid, g_SteamID_pattern, g_regex_return) > 0;
}*/

#define IsValidAuthid(%1) (regex_match_c(%1, g_SteamID_pattern, g_regex_return) > 0)


enum // for name displaying
{
    
ACTIVITY_NONE// nothing is shown
    
ACTIVITY_HIDE// admin name is hidden
    
ACTIVITY_SHOW  // admin name is shown
};
new const 
g_admin_activity[] =
{
    
ACTIVITY_NONE// amx_show_activity 0 = show nothing to everyone
    
ACTIVITY_HIDE// amx_show_activity 1 = hide admin name from everyone
    
ACTIVITY_SHOW// amx_show_activity 2 = show admin name to everyone
    
ACTIVITY_SHOW// amx_show_activity 3 = show name to admins but hide it from normal users
    
ACTIVITY_SHOW// amx_show_activity 4 = show name to admins but show nothing to normal users
    
ACTIVITY_HIDE  // amx_show_activity 5 = hide name from admins but show nothing to normal users
};
new const 
g_normal_activity[] =
{
    
ACTIVITY_NONE// amx_show_activity 0 = show nothing to everyone
    
ACTIVITY_HIDE// amx_show_activity 1 = hide admin name from everyone
    
ACTIVITY_SHOW// amx_show_activity 2 = show admin name to everyone
    
ACTIVITY_HIDE// amx_show_activity 3 = show name to admins but hide it from normal users
    
ACTIVITY_NONE// amx_show_activity 4 = show name to admins but show nothing to normal users
    
ACTIVITY_NONE  // amx_show_activity 5 = hide name from admins but show nothing to normal users
};


#if MAX_BANS <= 0
enum _:BannedData
{
    
bd_name[32],
    
bd_steamid[35],
    
bd_banlength,
    
bd_unbantime[32],
    
bd_reason[128],
    
bd_admin_name[64],
    
bd_admin_steamid[35]
};

new 
Trie:g_trie;
new Array:
g_array;
#else
new g_names[MAX_BANS][32];
new 
g_steamids[MAX_BANS][35];
new 
g_banlengths[MAX_BANS];
new 
g_unbantimes[MAX_BANS][32];
new 
g_reasons[MAX_BANS][128];
new 
g_admin_names[MAX_BANS][64];
new 
g_admin_steamids[MAX_BANS][35];
#endif
new g_total_bans;

#if !defined USING_SQL
new g_ban_file[64];
#else
new Handle:g_iHost;
new 
Handle:g_sql_tuple;
new 
bool:g_loading_bans true;
#endif


new ab_immunity;
new 
ab_bandelay;
new 
ab_unbancheck;

new 
amx_show_activity;

#if MAX_BANS <= 0
new Array:g_maxban_times;
new Array:
g_maxban_flags;
#else
#define MAX_BANLIMITS    30
new g_maxban_times[MAX_BANLIMITS];
new 
g_maxban_flags[MAX_BANLIMITS];
#endif
new g_total_maxban_times;

new 
g_unban_entity;

new 
g_max_clients;

new 
g_msgid_SayText;

new 
g_iSelectedPlayer[33];

enum _:TypeData{
    
Tiempo_Name[32],
    
Tiempo_Tiempo
};

new const 
szRazones[][] = {
    
"Wall Hack",
    
"Stopear Screen",
    
"Insultar",
    
"Spammear",
    
"Molestar / Flood",
    
"Tirar Servidor",
    
"Cheat"
};

new const 
szTiempos[][] = {
    { 
"5 Minutos"},
    { 
"10 Minutos"10 },
    { 
"20 Minutos"20 },
    { 
"30 Minutos"30 },
    { 
"40 Minutos"40 },
    { 
"50 Minutos"50 },
    { 
"1 Hora"60 },
    { 
"1 Dia"1440 },
    { 
"Permanente"}
};

public 
plugin_init()
{
    
    
register_plugin(PLUGIN_NAMEPLUGIN_VERSIONPLUGIN_AUTHOR);
    
register_cvar("advanced_bans"PLUGIN_VERSIONFCVAR_SPONLY);
    
    
register_dictionary("advanced_bans.txt");
    
    
register_concmd("amx_ban""CmdBan"ADMIN_BAN"<nick, #userid, authid> <time in minutes> <reason>");
    
register_concmd("amx_banip""CmdBanIp"ADMIN_BAN"<nick, #userid, authid> <time in minutes> <reason>");
    
register_concmd("amx_addban""CmdAddBan"ADMIN_BAN"<name> <authid or ip> <time in minutes> <reason>");
    
register_concmd("amx_unban""CmdUnban"ADMIN_BAN"<authid or ip>");
    
register_concmd("amx_banlist""CmdBanList"ADMIN_BAN"[start] -- shows everyone who is banned");
    
register_srvcmd("amx_addbanlimit""CmdAddBanLimit", -1"<flag> <time in minutes>");
    
register_clcmd("amx_bans_menu""CmdBanMenu"ADMIN_BAN"muestra un menu con los players");
    
register_clcmd("amx_unbanmenu""CmdUnBanMenu"ADMIN_BAN"muestra un menu con los players banneados");
    
    
register_clcmd("INGRESAR_TIEMPO""Messagemode_Tiempo");
    
register_clcmd("INGRESAR_RAZON""Messagemode_Razon");
    
    
    
ab_immunity register_cvar("ab_immunity""1");
    
ab_bandelay register_cvar("ab_bandelay""1.0");
    
ab_unbancheck register_cvar("ab_unbancheck""5.0");
    
    
amx_show_activity register_cvar("amx_show_activity""2");
    
    
#if MAX_BANS <= 0
    
g_trie TrieCreate();
    
g_array ArrayCreate(BannedData);
    
#endif
    
    #if !defined MAX_BANLIMITS
    
g_maxban_times ArrayCreate(1);
    
g_maxban_flags ArrayCreate(1);
    
#endif
    
    #if !defined USING_SQL
    
get_datadir(g_ban_filesizeof(g_ban_file) - 1);
    
add(g_ban_filesizeof(g_ban_file) - 1"/advanced_bans.txt");
    
    
LoadBans();
    
#else
    
g_iHost mysql_makehost Datos_MySQLt ], Datos_MySQLt ], Datos_MySQLt ], Datos_MySQLt ] );
    
    new 
error1 32 ], errnum;
    
g_sql_tuple mysql_connect g_iHosterrnumerror1sizeof error1 ) );
    
    if ( 
errnum ){
        
log_to_file "MySQLt_AB_init.log""Error: [%d] - [%s]"errnumerror1 );
        return 
pause "a" );
    }
    
    
mysql_performance 2525);
    
LoadBans();
    
    
#endif
    
    
new error[2];
    
g_IP_pattern regex_compile(REGEX_IP_PATTERNg_regex_returnerrorsizeof(error) - 1);
    
g_SteamID_pattern regex_compile(REGEX_STEAMID_PATTERNg_regex_returnerrorsizeof(error) - 1);
    
    
g_max_clients get_maxplayers();
    
    
g_msgid_SayText get_user_msgid("SayText");
    
    return 
PLUGIN_CONTINUE;
}



public 
plugin_cfg()
{
    
CreateUnbanEntity();
}

public 
CreateUnbanEntity()
{
    static 
failtimes;
    
    
g_unban_entity create_entity("info_target");
    
    if( !
is_valid_ent(g_unban_entity) )
    {
        ++
failtimes;
        
        
log_amx("[ERROR] Failed to create unban entity (%i/10)"failtimes);
        
        if( 
failtimes 10 )
        {
            
set_task(1.0"CreateUnbanEntity");
        }
        else
        {
            
log_amx("[ERROR] Could not create unban entity!");
        }
        
        return;
    }
    
    
entity_set_string(g_unban_entityEV_SZ_classname"unban_entity");
    
entity_set_float(g_unban_entityEV_FL_nextthinkget_gametime() + 1.0);
    
    
register_think("unban_entity""FwdThink");
}


public 
client_authorized(client)
{
    static 
authid[35];
    
get_user_authid(clientauthidsizeof(authid) - 1);
    
    static 
ip[35];
    
get_user_ip(clientipsizeof(ip) - 11);
    
    
#if MAX_BANS > 0
    
static banned_authid[35], bool:is_ip;
    for( new 
0g_total_bansi++ )
    {
        
copy(banned_authidsizeof(banned_authid) - 1g_steamids[i]);
        
        
is_ip bool:(containi(banned_authid".") != -1);
        
        if( 
is_ip && equal(ipbanned_authid) || !is_ip && equal(authidbanned_authid) )
        {
            static 
name[32], reason[128], unbantime[32], admin_name[32], admin_steamid[64];
            
copy(namesizeof(name) - 1g_names[i]);
            
copy(reasonsizeof(reason) - 1g_reasons[i]);
            new 
banlength g_banlengths[i];
            
copy(unbantimesizeof(unbantime) - 1g_unbantimes[i]);
            
copy(admin_namesizeof(admin_name) - 1g_admin_names[i]);
            
copy(admin_steamidsizeof(admin_steamid) - 1g_admin_steamids[i]);
    
            
PrintBanInformation(clientnamebanned_authidreasonbanlengthunbantimeadmin_nameadmin_steamidtruetrue);
            
            
            
set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer"client);
            break;
        }
    }
    
#else
    
static array_pos;
    
    if( 
TrieGetCell(g_trieauthidarray_pos) || TrieGetCell(g_trieiparray_pos) )
    {
        static 
data[BannedData];
        
ArrayGetArray(g_arrayarray_posdata);
        
        
PrintBanInformation(clientdata[bd_name], data[bd_steamid], data[bd_reason], data[bd_banlength], data[bd_unbantime], data[bd_admin_name], data[bd_admin_steamid], truetrue);
        
        
set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer"client);
    }
    
#endif
}
public 
CmdBanMenu(id){
    if (!(
get_user_flags(id) & ADMIN_BAN)){
        
ColorChat(idGREEN"^4[AdvancedBans] ^1No tienes acceso al ban menú." );
        return 
PLUGIN_HANDLED;
    }
    
    new 
iMenu menu_create("\r[AdvancedBans] \wBan Menu""HandlerBanMenu");
    
    new 
iUsers 12 ];
    for ( new 
1<= g_max_clientsi++ ) { 
        
        if ( 
is_user_connected ) ) { 
            new 
name[33];
            
get_user_name(iname32);
            
num_to_str get_user_userid ), iUserssizeof iUsers ) );
            
menu_additem iMenunameiUsers );
        }
    }
    
    
menu_setprop(iMenuMPROP_BACKNAME"Atras");
    
menu_setprop(iMenuMPROP_NEXTNAME"Siguiente");
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
    
menu_display(idiMenu);
    
    return 
PLUGIN_HANDLED;
    
}


public 
HandlerBanMenu(idmenuitem){
    if(
item == MENU_EXIT){
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }
    
    new 
iAccesscallback;
    new 
szData[64], szName[64];
    
menu_item_getinfo(menuitemiAccessszDatasizeof(szData), szNamesizeof(szName), callback);
    
    
g_iSelectedPlayer[id] = str_to_num(szData);
    
client_cmd2(id"messagemode ^"INGRESAR_TIEMPO^"");
    
    
    return 
PLUGIN_HANDLED;
}

new 
Tiempo[33][32];
new 
Razon[64][32];

public 
Messagemode_Tiempo(id){
    
    
//get_user_name(id, g_iSelectedPlayer[id], sizeof(g_iSelectedPlayer[]));
    
    
ColorChat(idGREEN"^4[AdvancedBans] ^1Ingresa el tiempo a banear");
    
    
read_args(Tiempo[id], sizeof(Tiempo[]));
    
remove_quotes(Tiempo[id]);
    
    new 
arg[33];
    
read_argv(1arg32);
    
remove_quotes(arg);
    
    if(!
is_str_num(arg) || !is_str_num(Tiempo[id])){
        
ColorChat(idGREEN"^4[AdvancedBans] ^1Sólo números");
        
client_cmd2(id"messagemode ^"INGRESAR_TIEMPO^"");
        return 
PLUGIN_HANDLED;
    }
    
    
client_cmd2(id"messagemode ^"INGRESAR_RAZON^"");
    
    return 
PLUGIN_CONTINUE;
    
}

public 
Messagemode_Razon(id){
    
    
    
ColorChat(idGREEN"^4[AdvancedBans] ^1Ingresa la razon!");
    
ColorChat(idGREEN"^4[AdvancedBans] ^1Una vez dado al enter, el player se banear automaticamente");
    
    
read_args(Razon[id], sizeof(Razon[]));
    
remove_quotes(Razon[id]);
    
    new 
arg[33];
    
read_argv(1arg32);
    
remove_quotes(arg);
    
    if(!
strlen(arg) || !strlen(Razon[id])){
        
ColorChat(idGREEN"^4[AdvancedBans] ^1No puedes dejar un espacio en blanco");
        
client_cmd2(id"messagemode ^"INGRESAR_RAZON^"");
        return 
PLUGIN_HANDLED;
    }
    
    
client_cmd2(id"amx_ban ^"#%d^" ^"%s^" ^"%s^"", g_iSelectedPlayer[id], Tiempo[id], Razon[id]);
    
    
return PLUGIN_CONTINUE;
}


public 
CmdBan(clientlevelcid)
{
    if( !
cmd_access(clientlevelcid4) ) return PLUGIN_HANDLED;
    
    static 
arg[128];
    
read_argv(1argsizeof(arg) - 1);
    
    new 
target cmd_target(clientargGetTargetFlags(client));
    if( !
target ) return PLUGIN_HANDLED;
    
    static 
target_authid[35];
    
get_user_authid(targettarget_authidsizeof(target_authid) - 1);
    
    if( !
IsValidAuthid(target_authid) )
    {
        
console_print(client"[AdvancedBans] %L"client"AB_NOT_AUTHORIZED");
        return 
PLUGIN_HANDLED;
    }
    
    
#if MAX_BANS <= 0
    
if( TrieKeyExists(g_trietarget_authid) )
    {
        
console_print(client"[AdvancedBans] %L"client"AB_ALREADY_BANNED_STEAMID");
        return 
PLUGIN_HANDLED;
    }
    
#else
    
for( new 0g_total_bansi++ )
    {
        if( !
strcmp(target_authidg_steamids[i], 1) )
        {
            
console_print(client"[AdvancedBans] %L"client"AB_ALREADY_BANNED_STEAMID");
            return 
PLUGIN_HANDLED;
        }
    }
    
#endif
    
    
if(is_user_admin(target) || client == target){
        
console_print(client"[AdvancedBans] No puedes banear a un ADMIN o a ti mismo");
        return 
PLUGIN_HANDLED;
    }
    
    
read_argv(2argsizeof(arg) - 1);
    
    new 
length str_to_num(arg);
    new 
maxlength GetMaxBanTime(client);
    
    if( 
maxlength && (!length || length maxlength) )
    {
        
console_print(client"[AdvancedBans] %L"client"AB_MAX_BAN_TIME"maxlength);
        return 
PLUGIN_HANDLED;
    }
    
    static 
unban_time[64];
    if( 
length == )
    {
        
formatex(unban_timesizeof(unban_time) - 1"%L"client"AB_PERMANENT_BAN");
    }
    else
    {
        
GenerateUnbanTime(lengthunban_timesizeof(unban_time) - 1);
    }
    
    
read_argv(3argsizeof(arg) - 1);
    
    static 
admin_name[64], target_name[32];
    
get_user_name(clientadmin_namesizeof(admin_name) - 1);
    
get_user_name(targettarget_namesizeof(target_name) - 1);
    
    static 
admin_authid[35];
    
get_user_authid(clientadmin_authidsizeof(admin_authid) - 1);
    
    
AddBan(target_nametarget_authidarglengthunban_timeadmin_nameadmin_authid);
    
    
PrintBanInformation(targettarget_nametarget_authidarglengthunban_timeadmin_nameadmin_authidtruetrue);
    
PrintBanInformation(clienttarget_nametarget_authidarglengthunban_timeadmin_nameadmin_authidfalsefalse);
    
    
set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer"target);
    
    
GetBanTime(lengthunban_timesizeof(unban_time) - 1);
    
    
PrintActivity(admin_name"^x04[AdvancedBans] $name^x01 :^x03  banned %s. Reason: %s. Ban Length: %s"target_nameargunban_time);
    
    
    
Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s"admin_nameadmin_authidtarget_nametarget_authidargunban_time);
    
    return 
PLUGIN_HANDLED;
}

public 
CmdBanIp(clientlevelcid)
{
    if( !
cmd_access(clientlevelcid4) ) return PLUGIN_HANDLED;
    
    static 
arg[128];
    
read_argv(1argsizeof(arg) - 1);
    
    new 
target cmd_target(clientargGetTargetFlags(client));
    if( !
target ) return PLUGIN_HANDLED;
    
    static 
target_ip[35];
    
get_user_ip(targettarget_ipsizeof(target_ip) - 11);
    
    
#if MAX_BANS <= 0
    
if( TrieKeyExists(g_trietarget_ip) )
    {
        
console_print(client"[AdvancedBans] %L"client"AB_ALREADY_BANNED_IP");
        return 
PLUGIN_HANDLED;
    }
    
#else
    
for( new 0g_total_bansi++ )
    {
        if( !
strcmp(target_ipg_steamids[i], 1) )
        {
            
console_print(client"[AdvancedBans] %L"client"AB_ALREADY_BANNED_IP");
            return 
PLUGIN_HANDLED;
        }
    }
    
#endif
    
    
if(is_user_admin(target) || client == target){
        
console_print(client"[AdvancedBans] No puedes banear a un ADMIN o a ti mismo");
        return 
PLUGIN_HANDLED;
    }
    
    
read_argv(2argsizeof(arg) - 1);
    
    new 
length str_to_num(arg);
    new 
maxlength GetMaxBanTime(client);
    
    if( 
maxlength && (!length || length maxlength) )
    {
        
console_print(client"[AdvancedBans] %L"client"AB_MAX_BAN_TIME"maxlength);
        return 
PLUGIN_HANDLED;
    }
    
    static 
unban_time[32];
    
    if( 
length == )
    {
        
formatex(unban_timesizeof(unban_time) - 1"%L"client"AB_PERMANENT_BAN");
    }
    else
    {
        
GenerateUnbanTime(lengthunban_timesizeof(unban_time) - 1);
    }
    
    
read_argv(3argsizeof(arg) - 1);
    
    static 
admin_name[64], target_name[32];
    
get_user_name(clientadmin_namesizeof(admin_name) - 1);
    
get_user_name(targettarget_namesizeof(target_name) - 1);
    
    static 
admin_authid[35];
    
get_user_authid(clientadmin_authidsizeof(admin_authid) - 1);
    
    
AddBan(target_nametarget_iparglengthunban_timeadmin_nameadmin_authid);
    
    
PrintBanInformation(targettarget_nametarget_iparglengthunban_timeadmin_nameadmin_authidtruetrue);
    
PrintBanInformation(clienttarget_nametarget_iparglengthunban_timeadmin_nameadmin_authidfalsefalse);
    
    
set_task(get_pcvar_float(ab_bandelay), "TaskDisconnectPlayer"target);
    
    
GetBanTime(lengthunban_timesizeof(unban_time) - 1);
    
    
PrintActivity(admin_name"^x04[AdvancedBans] $name^x01 :^x03  banned %s. Reason: %s. Ban Length: %s"target_nameargunban_time);
    
    
Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s"admin_nameadmin_authidtarget_nametarget_ipargunban_time);
    
    return 
PLUGIN_HANDLED;
}

public 
CmdAddBan(clientlevelcid)
{
    if( !
cmd_access(clientlevelcid5) ) return PLUGIN_HANDLED;
    
    static 
target_name[32], target_authid[35], bantime[10], reason[128];
    
read_argv(1target_namesizeof(target_name) - 1);
    
read_argv(2target_authidsizeof(target_authid) - 1);
    
read_argv(3bantimesizeof(bantime) - 1);
    
read_argv(4reasonsizeof(reason) - 1);
    
    new 
bool:is_ip bool:(containi(target_authid".") != -1);
    
    if( !
is_ip && !IsValidAuthid(target_authid) )
    {
        
console_print(client"[AdvancedBans] %L"client"AB_INVALID_STEAMID");
        
console_print(client"[AdvancedBans] %L"client"AB_VALID_STEAMID_FORMAT");
        
        return 
PLUGIN_HANDLED;
    }
    else if( 
is_ip )
    {
        new 
pos contain(target_authid":");
        if( 
pos )
        {
            
target_authid[pos] = 0;
        }
        
        if( !
IsValidIP(target_authid) )
        {
            
console_print(client"[AdvancedBans] %L"client"AB_INVALID_IP");
            
            return 
PLUGIN_HANDLED;
        }
    }
    
    
#if MAX_BANS <= 0
    
if( TrieKeyExists(g_trietarget_authid) )
    {
        
console_print(client"[AdvancedBans] %L"clientis_ip "AB_ALREADY_BANNED_IP" "AB_ALREADY_BANNED_STEAMID");
        return 
PLUGIN_HANDLED;
    }
    
#else
    
for( new 0g_total_bansi++ )
    {
        if( !
strcmp(target_authidg_steamids[i], 1) )
        {
            
console_print(client"[AdvancedBans] %L"clientis_ip "AB_ALREADY_BANNED_IP" "AB_ALREADY_BANNED_STEAMID");
            return 
PLUGIN_HANDLED;
        }
    }
    
#endif
    
    
new length str_to_num(bantime);
    new 
maxlength GetMaxBanTime(client);
    
    if( 
maxlength && (!length || length maxlength) )
    {
        
console_print(client"[AdvancedBans] %L"client"AB_MAX_BAN_TIME"maxlength);
        return 
PLUGIN_HANDLED;
    }
    
    if( 
is_user_connected(find_player(is_ip "d" "c"target_authid)) )
    {
        
client_cmd(client"amx_ban ^"%s^" %i ^"%s^""target_authidlengthreason);
        return 
PLUGIN_HANDLED;
    }
    
    static 
unban_time[32];
    if( 
length == )
    {
        
formatex(unban_timesizeof(unban_time) - 1"%L"client"AB_PERMANENT_BAN");
    }
    else
    {
        
GenerateUnbanTime(lengthunban_timesizeof(unban_time) - 1);
    }
    
    static 
admin_name[64], admin_authid[35];
    
get_user_name(clientadmin_namesizeof(admin_name) - 1);
    
get_user_authid(clientadmin_authidsizeof(admin_authid) - 1);
    
    
AddBan(target_nametarget_authidreasonlengthunban_timeadmin_nameadmin_authid);
    
    
PrintBanInformation(clienttarget_nametarget_authidreasonlengthunban_time""""falsefalse);
    
    
GetBanTime(lengthunban_timesizeof(unban_time) - 1);
    
    
PrintActivity(admin_name"^x04[AdvancedBans] $name^x01 :^x03  banned %s %s. Reason: %s. Ban Length: %s"is_ip "IP" "SteamID"target_authidreasonunban_time);
    
    
Log("%s <%s> banned %s <%s> || Reason: ^"%s^" || Ban Length: %s"admin_nameadmin_authidtarget_nametarget_authidreasonunban_time);
    
    return 
PLUGIN_HANDLED;
}

public 
CmdUnBanMenu(id){
    if (!(
get_user_flags(id) & ADMIN_BAN)){
        
ColorChat(idGREEN"^4[AdvancedBans] ^1No tienes acceso al ban menú." );
        return 
PLUGIN_HANDLED;
    }
    
    if(
read_argc()){
        
ColorChat(idGREEN"^4[AdvancedBans] ^1Player Name ^3| ^1Razón del Ban ^3| ^1Admin Name");
        
ColorChat(idGREEN"^4[AdvancedBans] ^1Una vez seleccionado el player se baneara automaticamente");
    }
    
    new 
iMenu menu_create("\r[AdvancedBans] \wUnban Menu:^n\wNombre \d| \wRazon \d| \wAdmin Name""HandlerUnBanMenu");
    
    if(!
g_total_bans)
        
ColorChat(idGREEN"^4[AdvancedBans] ^1No hay banneados en este momento");
    
    for ( new 
0g_total_bansi++ ){
        static 
data[BannedData];
        
ArrayGetArray(g_arrayidata);
        static 
iLen[127];
        
formatex(iLen126"%s \r[%s] \d[%s]"data[bd_name], data[bd_reason], data[bd_admin_name]);
        
        
menu_additem(iMenuiLen);
    }
    
    
menu_setprop(iMenuMPROP_BACKNAME"Atras");
    
menu_setprop(iMenuMPROP_NEXTNAME"Siguiente");
    
menu_setprop(iMenuMPROP_EXITNAME"Salir");
    
    
menu_display(idiMenu);
    
    return 
PLUGIN_HANDLED;

}

public 
HandlerUnBanMenu(idmenuitem){
    if(
item == MENU_EXIT){
        
menu_destroy(menu);
        return 
PLUGIN_HANDLED;
    }
    
    new 
iAccesscallback;
    new 
szData[64], szName[64];
    
menu_item_getinfo(menuitemiAccessszDatasizeof(szData), szNamesizeof(szName), callback);
    
    static 
data[BannedData];
    
ArrayGetArray(g_arrayitemdata);
    
    
client_cmd2(id"amx_unban ^"%s^""data[bd_steamid]);
    
    
//new admin_name[33];
    //get_user_name(id, admin_name, 32);
    //ColorChat(0, GREEN,"^4[AdvancedBans] %s^1 :^3  unbanned %s^1 [%s] [Ban Reason: %s]", admin_name, data[bd_name], data[bd_steamid], data[bd_reason]);
    
    
    //RemoveBan(item, data[bd_steamid]);
    
    
    
    
menu_destroy(menu);
    return 
PLUGIN_HANDLED;
}

public 
CmdUnban(clientlevelcid)
{
    if( !
cmd_access(clientlevelcid2) ) return PLUGIN_HANDLED;
    
    static 
arg[35];
    
read_argv(1argsizeof(arg) - 1);
    
    
#if MAX_BANS > 0
    
static banned_authid[35];
    for( new 
0g_total_bansi++ )
    {
        
copy(banned_authidsizeof(banned_authid) - 1g_steamids[i]);
        
        if( 
equal(argbanned_authid) )
        {
            static 
admin_name[64];
            
get_user_name(clientadmin_namesizeof(admin_name) - 1);
            
            static 
name[32], reason[128];
            
copy(namesizeof(name) - 1g_names[i]);
            
copy(reasonsizeof(reason) - 1g_reasons[i]);
            
            
PrintActivity(admin_name"^x04[AdvancedBans] $name^x01 :^x03  unbanned %s^x01 [%s] [Ban Reason: %s]"nameargreason);
            
            static 
authid[35];
            
get_user_authid(clientauthidsizeof(authid) - 1);
            
            
Log("%s <%s> unbanned %s <%s> || Ban Reason: ^"%s^""admin_nameauthidnameargreason);
            
            
RemoveBan(i);
            
            return 
PLUGIN_HANDLED;
        }
    }
    
#else
    
if( TrieKeyExists(g_triearg) )
    {
        static 
array_pos;
        
TrieGetCell(g_trieargarray_pos);
        
        static 
data[BannedData];
        
ArrayGetArray(g_arrayarray_posdata);
        
        static 
unban_name[32];
        
get_user_name(clientunban_namesizeof(unban_name) - 1);
        
        
PrintActivity(unban_name"^x04[AdvancedBans] $name^x01 :^x03  unbanned %s^x01 [%s] [Ban Reason: %s]"data[bd_name], data[bd_steamid], data[bd_reason]);
        
        static 
admin_name[64];
        
get_user_name(clientadmin_namesizeof(admin_name) - 1);
        
        static 
authid[35];
        
get_user_authid(clientauthidsizeof(authid) - 1);
        
        
Log("%s <%s> unbanned %s <%s> || Ban Reason: ^"%s^""admin_nameauthiddata[bd_name], data[bd_steamid], data[bd_reason]);
        
        
RemoveBan(array_posdata[bd_steamid]);
        
        return 
PLUGIN_HANDLED;
    }
    
#endif
    
    
console_print(client"[AdvancedBans] %L"client"AB_NOT_IN_BAN_LIST"arg);
    
    return 
PLUGIN_HANDLED;
}

public 
CmdBanList(clientlevelcid)
{
    if( !
cmd_access(clientlevelcid1) ) return PLUGIN_HANDLED;
    
    if( !
g_total_bans )
    {
        
console_print(client"[AdvancedBans] %L"client"AB_NO_BANS");
        return 
PLUGIN_HANDLED;
    }
    
    static 
start;
    
    if( 
read_argc() > )
    {
        static 
arg[5];
        
read_argv(1argsizeof(arg) - 1);
        
        
start min(str_to_num(arg), g_total_bans) - 1;
    }
    else
    {
        
start 0;
    }
    
    new 
last min(start 10g_total_bans);
    
    if( 
client == )
    {
        
server_cmd("echo ^"%L^""client"AB_BAN_LIST_NUM"start 1last);
    }
    else
    {
        
client_cmd(client"echo ^"%L^""client"AB_BAN_LIST_NUM"start 1last);
    }
    
    for( new 
startlasti++ )
    {
        
#if MAX_BANS <= 0
        
static data[BannedData];
        
ArrayGetArray(g_arrayidata);
        
        
PrintBanInformation(clientdata[bd_name], data[bd_steamid], data[bd_reason], data[bd_banlength], data[bd_unbantime], data[bd_admin_name], data[bd_admin_steamid], truefalse);
        
#else
        
static name[32], steamid[35], reason[128], banlengthunbantime[32], admin_name[32], admin_steamid[35];
        
        
copy(namesizeof(name) - 1g_names[i]);
        
copy(steamidsizeof(steamid) - 1g_steamids[i]);
        
copy(reasonsizeof(reason) - 1g_reasons[i]);
        
banlength g_banlengths[i];
        
copy(unbantimesizeof(unbantime) - 1g_unbantimes[i]);
        
copy(admin_namesizeof(admin_name) - 1g_admin_names[i]);
        
copy(admin_steamidsizeof(admin_steamid) - 1g_admin_steamids[i]);
        
        
PrintBanInformation(clientnamesteamidreasonbanlengthunbantimeadmin_nameadmin_steamidtruefalse);
        
#endif
    
}
    
    if( ++
last g_total_bans )
    {
        if( 
client == )
        {
            
server_cmd("echo ^"%L^""client"AB_BAN_LIST_NEXT"last);
        }
        else
        {
            
client_cmd(client"echo ^"%L^""client"AB_BAN_LIST_NEXT"last);
        }
    }
    
    return 
PLUGIN_HANDLED;
}

public 
CmdAddBanLimit()
{
    if( 
read_argc() != )
    {
        
log_amx("amx_addbanlimit was used with incorrect parameters!");
        
log_amx("Usage: amx_addbanlimit <flags> <time in minutes>");
        return 
PLUGIN_HANDLED;
    }
    
    static 
arg[16];
    
    
read_argv(1argsizeof(arg) - 1);
    new 
flags read_flags(arg);
    
    
read_argv(2argsizeof(arg) - 1);
    new 
minutes str_to_num(arg);
    
    
#if !defined MAX_BANLIMITS
    
ArrayPushCell(g_maxban_flagsflags);
    
ArrayPushCell(g_maxban_timesminutes);
    
#else
    
if( g_total_maxban_times >= MAX_BANLIMITS )
    {
        static 
notified;
        if( !
notified )
        {
            
log_amx("The amx_addbanlimit has reached its maximum!");
            
notified 1;
        }
        return 
PLUGIN_HANDLED;
    }
    
    
g_maxban_flags[g_total_maxban_times] = flags;
    
g_maxban_times[g_total_maxban_times] = minutes;
    
#endif
    
g_total_maxban_times++;
    
    return 
PLUGIN_HANDLED;
}

public 
FwdThink(entity)
{
    if( 
entity != g_unban_entity ) return;
    
    
#if defined USING_SQL
    
if( g_total_bans && !g_loading_bans )
    
#else
    
if( g_total_bans )
    
#endif
    
{
        static 
_hours[5], _minutes[5], _seconds[5], _month[5], _day[5], _year[7];
        
format_time(_hourssizeof(_hours) - 1"%H");
        
format_time(_minutessizeof(_minutes) - 1"%M");
        
format_time(_secondssizeof(_seconds) - 1"%S");
        
format_time(_monthsizeof(_month) - 1"%m");
        
format_time(_daysizeof(_day) - 1"%d");
        
format_time(_yearsizeof(_year) - 1"%Y");
        
        
// c = current
        // u = unban
        
        
new c_hours str_to_num(_hours);
        new 
c_minutes str_to_num(_minutes);
        new 
c_seconds str_to_num(_seconds);
        new 
c_month str_to_num(_month);
        new 
c_day str_to_num(_day);
        new 
c_year str_to_num(_year);
        
        static 
unban_time[32];
        static 
u_hoursu_minutesu_secondsu_monthu_dayu_year;
        
        for( new 
0g_total_bansi++ )
        {
            
#if MAX_BANS <= 0
            
static data[BannedData];
            
ArrayGetArray(g_arrayidata);
            
            if( 
data[bd_banlength] == ) continue;
            
#else
            
if( g_banlengths[i] == ) continue;
            
#endif
            
            #if MAX_BANS <= 0
            
copy(unban_timesizeof(unban_time) - 1data[bd_unbantime]);
            
#else
            
copy(unban_timesizeof(unban_time) - 1g_unbantimes[i]);
            
#endif
            
replace_all(unban_timesizeof(unban_time) - 1":"" ");
            
replace_all(unban_timesizeof(unban_time) - 1"/"" ");
            
            
parse(unban_time,\
                
_hourssizeof(_hours) - 1,\
                
_minutessizeof(_minutes) - 1,\
                
_secondssizeof(_seconds) - 1,\
                
_monthsizeof(_month) - 1,\
                
_daysizeof(_day) - 1,\
                
_yearsizeof(_year) - 1
                
);
            
            
u_hours str_to_num(_hours);
            
u_minutes str_to_num(_minutes);
            
u_seconds str_to_num(_seconds);
            
u_month str_to_num(_month);
            
u_day str_to_num(_day);
            
u_year str_to_num(_year);
            
            if( 
u_year c_year
            
|| u_year == c_year && u_month c_month
            
|| u_year == c_year && u_month == c_month && u_day c_day
            
|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours c_hours
            
|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours == c_hours && u_minutes c_minutes
            
|| u_year == c_year && u_month == c_month && u_day == c_day && u_hours == c_hours && u_minutes == c_minutes && u_seconds <= c_seconds )
            {
                
#if MAX_BANS <= 0
                
Log("Ban time is up for: %s [%s]"data[bd_name], data[bd_steamid]);
                
                Print(
"^x04[AdvancedBans]^x03 %s^x01[^x04%s^x01]^x03 ban time is up!^x01 [Ban Reason: %s]"data[bd_name], data[bd_steamid], data[bd_reason]);
                
                
RemoveBan(idata[bd_steamid]);
                
#else
                
Log("Ban time is up for: %s [%s]"g_names[i], g_steamids[i]);
                
                Print(
"^x04[AdvancedBans]^x03 %s^x01[^x04%s^x01]^x03 ban time is up!^x01 [Ban Reason: %s]"g_names[i], g_steamids[i], g_reasons[i]);
                
                
RemoveBan(i);
                
#endif
                
                
i--; // current pos was replaced with another ban, so we need to check it again.
            
}
        }
    }
    
    
entity_set_float(g_unban_entityEV_FL_nextthinkget_gametime() + get_pcvar_float(ab_unbancheck));
}

public 
TaskDisconnectPlayer(client)
{
    
server_cmd("kick #%i ^"Fuiste banneado del ServidorMira tu consola^""get_user_userid(client));
    
//server_cmd("kick #%i ^"You are banned from this server. Check your console^"", get_user_userid(client));
}

AddBan(const target_name[], const target_steamid[], const reason[], const length, const unban_time[], const admin_name[], const admin_steamid[])
{
    
#if MAX_BANS > 0
    
if( g_total_bans == MAX_BANS )
    {
        
log_amx("Ban list is full! (%i)"g_total_bans);
        return;
    }
    
#endif
    
    #if defined USING_SQL
    
static target_name2[32], reason2[128], admin_name2[32];
    
MakeStringSQLSafe(target_nametarget_name2sizeof(target_name2) - 1);
    
MakeStringSQLSafe(reasonreason2sizeof(reason2) - 1);
    
MakeStringSQLSafe(admin_nameadmin_name2sizeof(admin_name2) - 1);
        
    static 
query[512];

    
    
formatex(querysizeof(query) - 1,\
        
"INSERT INTO `%s` (`%s`, `%s`, `%s`, `%s`, `%s`, `%s`, `%s`) VALUES ('%s', '%s', '%i', '%s', '%s', '%s', '%s');",\
        
TABLE_NAMEKEY_NAMEKEY_STEAMIDKEY_BANLENGTHKEY_UNBANTIMEKEY_REASONKEY_ADMIN_NAMEKEY_ADMIN_STEAMID,\
        
target_name2target_steamidlengthunban_timereason2admin_name2admin_steamid
        
);
    
    
    
    
//SQL_ThreadQuery(g_sql_tuple, "QueryAddBan", query);
    
mysql_query g_sql_tuple"QueryAddBan"query );
    
#else
    
new fopen(g_ban_file"a+");
    
    
fprintf(f"^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
        
target_steamid,\
        
target_name,\
        
length,\
        
unban_time,\
        
reason,\
        
admin_name,\
        
admin_steamid
        
);
    
    
fclose(f);
    
#endif
    
    #if MAX_BANS <= 0
    
static data[BannedData];
    
copy(data[bd_name], sizeof(data[bd_name]) - 1target_name);
    
copy(data[bd_steamid], sizeof(data[bd_steamid]) - 1target_steamid);
    
data[bd_banlength] = length;
    
copy(data[bd_unbantime], sizeof(data[bd_unbantime]) - 1unban_time);
    
copy(data[bd_reason], sizeof(data[bd_reason]) - 1reason);
    
copy(data[bd_admin_name], sizeof(data[bd_admin_name]) - 1admin_name);
    
copy(data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1admin_steamid);
    
    
TrieSetCell(g_trietarget_steamidg_total_bans);
    
ArrayPushArray(g_arraydata);
    
#else
    
copy(g_names[g_total_bans], sizeof(g_names[]) - 1target_name);
    
copy(g_steamids[g_total_bans], sizeof(g_steamids[]) - 1target_steamid);
    
g_banlengths[g_total_bans] = length;
    
copy(g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1unban_time);
    
copy(g_reasons[g_total_bans], sizeof(g_reasons[]) - 1reason);
    
copy(g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1admin_name);
    
copy(g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1admin_steamid);
    
#endif
    
    
g_total_bans++;
    
    
#if MAX_BANS > 0
    
if( g_total_bans == MAX_BANS )
    {
        
log_amx("Ban list is full! (%i)"g_total_bans);
    }
    
#endif
}

#if defined USING_SQL
//public QueryAddBan(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
public QueryAddBan failstateerror[], errnumdata[], sizeFloat:queuetime )
{
    
    
    
    if( 
failstate == TQUERY_CONNECT_FAILED )
    {
        
set_fail_state("Could not connect to database.");
    }
    else if( 
failstate == TQUERY_QUERY_FAILED )
    {
        
set_fail_state("Query failed.");
    }
    else if( 
errnum )
    {
        
log_amx("Error on query: %s"error);
    }
    else
    {
        
// Yay, ban was added! We can all rejoice!
    
}
    
}

//public QueryDeleteBan(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
public QueryDeleteBan failstateerror[], errnumdata[], sizeFloat:queuetime )
{
    
    if( 
failstate == TQUERY_CONNECT_FAILED )
    {
        
set_fail_state("Could not connect to database.");
    }
    else if( 
failstate == TQUERY_QUERY_FAILED )
    {
        
set_fail_state("Query failed.");
    }
    else if( 
errnum )
    {
        
log_amx("Error on query: %s"error);
    }
    else
    {
        
// Yay, ban was deleted! We can all rejoice!
    
}
    
}

//public QueryLoadBans(failstate, Handle:query, error[], errcode, data[], datasize, Float:queuetime)
public QueryLoadBans failstateerror[], errnumdata[], sizeFloat:queuetime )
{
    
    if( 
failstate == TQUERY_CONNECT_FAILED )
    {
        
set_fail_state("Could not connect to database.");
    }
    else if( 
failstate == TQUERY_QUERY_FAILED )
    {
        
set_fail_state("Query failed.");
    }
    else if( 
errnum )
    {
        
log_amx("Error on query: %s"error);
    }
    else
    {
        
//if( SQL_NumResults(query) )
        
if ( mysql_num_results ( ) )
        {
            
#if MAX_BANS <= 0
            
static data[BannedData];
            
            
//while( SQL_MoreResults(query) )
            
while ( mysql_more_results ( ) )
            
#else
            //while( SQL_MoreResults(query) && g_total_bans < MAX_BANS )
            
while ( mysql_more_results ( ) && g_total_bans MAX_BANS );
            
#endif
            
{
                
#if MAX_BANS <= 0
                
                
mysql_read_result 0data[bd_name], sizeof(data[bd_name])-);
                
mysql_read_result 1data[bd_steamid], sizeof(data[bd_steamid])-);
                
data[bd_banlength] = mysql_read_result );
                
mysql_read_result 3data[bd_unbantime], sizeof(data[bd_unbantime])-);
                
mysql_read_result 4data[bd_reason], sizeof(data[bd_reason])-);
                
mysql_read_result 5data[bd_admin_name], sizeof(data[bd_admin_name]) -);
                
mysql_read_result 6data[bd_admin_steamid], sizeof(data[bd_admin_steamid])-);
                
                
ArrayPushArray(g_array,data);
                
TrieSetCell(g_trie,data[bd_steamid],g_total_bans);
                
#else
                
mysql_read_result 0g_names[g_total_bans], charsmax g_names [ ] ) );
                
mysql_read_result 1g_steamids[g_total_bans], charsmax g_steamids [ ] ) );
                
g_banlengths[g_total_bans] = mysql_read_result );
                
mysql_read_result 3g_unbantimes g_total_bans ], charsmax g_unbantimes [ ] ) );
                
mysql_read_result 4g_reasons[g_total_bans], charsmax g_reasons [ ] ) );
                
mysql_read_result 5g_admin_names g_total_bans ], charsmax g_admin_names [ ] ) );
                
mysql_read_result 6g_admin_steamids[g_total_bans], charsmax g_admin_steamids [ ] ) );
                
#endif
                
                
g_total_bans++;
                
                
mysql_next_row ( );
                
                
                
/*
                SQL_ReadResult2(0, data[bd_name], sizeof(data[bd_name]) - 1);
                SQL_ReadResult2(1, data[bd_steamid], sizeof(data[bd_steamid]) - 1);
                data[bd_banlength] = SQL_ReadResult2(2);
                SQL_ReadResult2(3, data[bd_unbantime], sizeof(data[bd_unbantime]) - 1);
                SQL_ReadResult2(4, data[bd_reason], sizeof(data[bd_reason]) - 1);
                SQL_ReadResult2(5, data[bd_admin_name], sizeof(data[bd_admin_name]) - 1);
                SQL_ReadResult2(6, data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1);
                
                ArrayPushArray(g_array, data);
                TrieSetCell(g_trie, data[bd_steamid], g_total_bans);
                #else
                SQL_ReadResult2(0, g_names[g_total_bans], sizeof(g_names[]) - 1);
                SQL_ReadResult2(1, g_steamids[g_total_bans], sizeof(g_steamids[]) - 1);
                g_banlengths[g_total_bans] = SQL_ReadResult(query, 2);
                SQL_ReadResult2(3, g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1);
                SQL_ReadResult2(4, g_reasons[g_total_bans], sizeof(g_reasons[]) - 1);
                SQL_ReadResult2(5, g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1);
                SQL_ReadResult2(6, g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1);
                #endif
                
                g_total_bans++;
                
                //SQL_NextRow(query);
                mysql_next_row();
                */
                
            
}
        }
        
        
set_task(RELOAD_BANS_INTERVAL"LoadBans");
        
        
g_loading_bans false;
    }
}
#endif

#if MAX_BANS > 0
RemoveBan(remove)
{
    
#if defined USING_SQL
    
static query[128];
    
formatex(querysizeof(query) - 1,\
        
"DELETE FROM `%s` WHERE `%s` = '%s';",\
        
TABLE_NAMEKEY_STEAMIDg_steamids[remove]
        );
    
    
mysql_query(g_sql_tuple"QueryDeleteBan"query);
    
//SQL_ThreadQuery(g_sql_tuple, "QueryDeleteBan", query);
    
    #endif
    
    
for( new removeg_total_bansi++ )
    {
        if( (
1) == g_total_bans )
        {
            
copy(g_names[i], sizeof(g_names[]) - 1"");
            
copy(g_steamids[i], sizeof(g_steamids[]) - 1"");
            
g_banlengths[i] = 0;
            
copy(g_unbantimes[i], sizeof(g_unbantimes[]) - 1"");
            
copy(g_reasons[i], sizeof(g_reasons[]) - 1"");
            
copy(g_admin_names[i], sizeof(g_admin_names[]) - 1"");
            
copy(g_admin_steamids[i], sizeof(g_admin_steamids[]) - 1"");
        }
        else
        {
            
copy(g_names[i], sizeof(g_names[]) - 1g_names[1]);
            
copy(g_steamids[i], sizeof(g_steamids[]) - 1g_steamids[1]);
            
g_banlengths[i] = g_banlengths[1];
            
copy(g_unbantimes[i], sizeof(g_unbantimes[]) - 1g_unbantimes[1]);
            
copy(g_reasons[i], sizeof(g_reasons[]) - 1g_reasons[1]);
            
copy(g_admin_names[i], sizeof(g_admin_names[]) - 1g_admin_names[1]);
            
copy(g_admin_steamids[i], sizeof(g_admin_steamids[]) - 1g_admin_steamids[1]);
        }
    }
    
    
g_total_bans--;
    
    
#if !defined USING_SQL
    
new fopen(g_ban_file"wt");
    
    static 
name[32], steamid[35], banlengthunbantime[32], reason[128], admin_name[32], admin_steamid[35];
    for( new 
0g_total_bansi++ )
    {
        
copy(namesizeof(name) - 1g_names[i]);
        
copy(steamidsizeof(steamid) - 1g_steamids[i]);
        
banlength g_banlengths[i];
        
copy(unbantimesizeof(unbantime) - 1g_unbantimes[i]);
        
copy(reasonsizeof(reason) - 1g_reasons[i]);
        
copy(admin_namesizeof(admin_name) - 1g_admin_names[i]);
        
copy(admin_steamidsizeof(admin_steamid) - 1g_admin_steamids[i]);
        
        
fprintf(f"^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
            
steamid,\
            
name,\
            
banlength,\
            
unbantime,\
            
reason,\
            
admin_name,\
            
admin_steamid
            
);
    }
    
    
fclose(f);
    
#endif
}
#else
RemoveBan(pos, const authid[])
{
    
TrieDeleteKey(g_trieauthid);
    
ArrayDeleteItem(g_arraypos);
    
    
g_total_bans--;
    
    
#if defined USING_SQL
    
static query[128];
    
formatex(querysizeof(query) - 1,\
        
"DELETE FROM `%s` WHERE `%s` = '%s';",\
        
TABLE_NAMEKEY_STEAMIDauthid
        
);
    
    
//SQL_ThreadQuery(g_sql_tuple, "QueryDeleteBan", query);
    
    
mysql_query g_sql_tuple"QueryDeleteBan"query );
    
    new 
data[BannedData];
    for( new 
0g_total_bansi++ )
    {
        
ArrayGetArray(g_arrayidata);
        
TrieSetCell(g_triedata[bd_steamid], i);
    }
    
#else
    
new fopen(g_ban_file"wt");
    
    new 
data[BannedData];
    for( new 
0g_total_bansi++ )
    {
        
ArrayGetArray(g_arrayidata);
        
TrieSetCell(g_triedata[bd_steamid], i);
        
        
fprintf(f"^"%s^" ^"%s^" %i ^"%s^" ^"%s^" ^"%s^" ^"%s^"^n",\
            
data[bd_steamid],\
            
data[bd_name],\
            
data[bd_banlength],\
            
data[bd_unbantime],\
            
data[bd_reason],\
            
data[bd_admin_name],\
            
data[bd_admin_steamid]
            );
    }
    
    
fclose(f);
    
#endif
}
#endif

#if defined KEEP_DEFAULT_BANS
LoadOldBans(filename[])
{
    if( 
file_exists(filename) )
    {
        new 
fopen(filename"rt");
        
        static 
data[96];
        static 
command[10], minutes[10], steamid[35], lengthunban_time[32];
        
        while( !
feof(f) )
        {
            
fgets(fdatasizeof(data) - 1);
            if( !
data[0] ) continue;
            
            
parse(datacommandsizeof(command) - 1minutessizeof(minutes) - 1steamidsizeof(steamid) - 1);
            if( 
filename[0] == 'b' && !equali(command"banid") || filename[0] == 'l' && !equali(command"addip") ) continue;
            
            
length str_to_num(minutes);
            
GenerateUnbanTime(lengthunban_timesizeof(unban_time) - 1);
            
            
AddBan(""steamid""lengthunban_time"""");
        }
        
        
fclose(f);
        
        static 
filename2[32];
        
        
// copy current
        
copy(filename2sizeof(filename2) - 1filename);
        
        
// cut off at the "."
        // banned.cfg = banned
        // listip.cfg = listip
        
filename2[containi(filename2".")] = 0;
        
        
// add 2.cfg
        // banned = banned2.cfg
        // listip = listip2.cfg
        
add(filename2sizeof(filename2) - 1"2.cfg");
        
        
// rename file so that it isnt loaded again
        
while( !rename_file(filenamefilename21) ) { }
    }
}
#endif

public LoadBans()
{
    if( 
g_total_bans )
    {
        
#if MAX_BANS <= 0
        
TrieClear(g_trie);
        
ArrayClear(g_array);
        
#endif
        
        
g_total_bans 0;
    }
    
    
#if defined USING_SQL
    
static query[128];
    
formatex(querysizeof(query) - 1,\
        
"SELECT * FROM `%s`;",\
        
TABLE_NAME
        
);
    
    
    
//SQL_ThreadQuery(g_sql_tuple, "QueryLoadBans", query);
    
mysql_query g_sql_tuple"QueryLoadBans"query );
    
    
    
g_loading_bans true;
    
#else
    
if( file_exists(g_ban_file) )
    {
        new 
fopen(g_ban_file"rt");
        
        static 
filedata[512], length[10];
        
        
#if MAX_BANS <= 0
        
static data[BannedData];
        while( !
feof(f) )
        
#else
        
while( !feof(f) && g_total_bans MAX_BANS )
        
#endif
        
{
            
fgets(ffiledatasizeof(filedata) - 1);
            
            if( !
filedata[0] ) continue;
            
            
#if MAX_BANS <= 0
            
parse(filedata,\
                
data[bd_steamid], sizeof(data[bd_steamid]) - 1,\
                
data[bd_name], sizeof(data[bd_name]) - 1,\
                
lengthsizeof(length) - 1,\
                
data[bd_unbantime], sizeof(data[bd_unbantime]) - 1,\
                
data[bd_reason], sizeof(data[bd_reason]) - 1,\
                
data[bd_admin_name], sizeof(data[bd_admin_name]) - 1,\
                
data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1
                
);
            
            
data[bd_banlength] = str_to_num(length);
            
            
ArrayPushArray(g_arraydata);
            
TrieSetCell(g_triedata[bd_steamid], g_total_bans);
            
#else
            
static steamid[35], name[32], unbantime[32], reason[128], admin_name[32], admin_steamid[35];
            
            
parse(filedata,\
                
steamidsizeof(steamid) - 1,\
                
namesizeof(name) - 1,\
                
lengthsizeof(length) - 1,\
                
unbantimesizeof(unbantime) - 1,\
                
reasonsizeof(reason) - 1,\
                
admin_namesizeof(admin_name) - 1,\
                
admin_steamidsizeof(admin_steamid) - 1
                
);
            
            
copy(g_names[g_total_bans], sizeof(g_names[]) - 1name);
            
copy(g_steamids[g_total_bans], sizeof(g_steamids[]) - 1steamid);
            
g_banlengths[g_total_bans] = str_to_num(length);
            
copy(g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1unbantime);
            
copy(g_reasons[g_total_bans], sizeof(g_reasons[]) - 1reason);
            
copy(g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1admin_name);
            
copy(g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1admin_steamid);
            
#endif
            
            
g_total_bans++;
        }
        
        
fclose(f);
    }
    
#endif
    
    // load these after, so when they are added to the file with AddBan(), they aren't loaded again from above.
    
    #if defined KEEP_DEFAULT_BANS
    
LoadOldBans("banned.cfg");
    
LoadOldBans("listip.cfg");
    
#endif
}

#if defined USING_SQL
MakeStringSQLSafe(const input[], output[], len)
{
    
copy(outputleninput);
    
replace_all(outputlen"'""*");
    
replace_all(outputlen"^"", "*");
    replace_all(output, len, "
`", "*");
}
#endif

GetBanTime(const bantime, length[], len)
{
    new minutes = bantime;
    new hours = 0;
    new days = 0;
    
    while( minutes >= 60 )
    {
        minutes -= 60;
        hours++;
    }
    
    while( hours >= 24 )
    {
        hours -= 24;
        days++;
    }
    
    new bool:add_before;
    if( minutes )
    {
        formatex(length, len, "%i minute%s", minutes, minutes == 1 ? "" : "s");
        
        add_before = true;
    }
    if( hours )
    {
        if( add_before )
        {
            format(length, len, "%i hour%s, %s", hours, hours == 1 ? "" : "s", length);
        }
        else
        {
            formatex(length, len, "%i hour%s", hours, hours == 1 ? "" : "s");
            
            add_before = true;
        }
    }
    if( days )
    {
        if( add_before )
        {
            format(length, len, "%i day%s, %s", days, days == 1 ? "" : "s", length);
        }
        else
        {
            formatex(length, len, "%i day%s", days, days == 1 ? "" : "s");
            
            add_before = true;
        }
    }
    if( !add_before )
    {
        // minutes, hours, and days = 0
        // assume permanent ban
        copy(length, len, "Permanent Ban");
    }
}

GenerateUnbanTime(const bantime, unban_time[], len)
{
    static _hours[5], _minutes[5], _seconds[5], _month[5], _day[5], _year[7];
    format_time(_hours, sizeof(_hours) - 1, "%H");
    format_time(_minutes, sizeof(_minutes) - 1, "%M");
    format_time(_seconds, sizeof(_seconds) - 1, "%S");
    format_time(_month, sizeof(_month) - 1, "%m");
    format_time(_day, sizeof(_day) - 1, "%d");
    format_time(_year, sizeof(_year) - 1, "%Y");
    
    new hours = str_to_num(_hours);
    new minutes = str_to_num(_minutes);
    new seconds = str_to_num(_seconds);
    new month = str_to_num(_month);
    new day = str_to_num(_day);
    new year = str_to_num(_year);
    
    minutes += bantime;
    
    while( minutes >= 60 )
    {
        minutes -= 60;
        hours++;
    }
    
    while( hours >= 24 )
    {
        hours -= 24;
        day++;
    }
    
    new max_days = GetDaysInMonth(month, year);
    while( day > max_days )
    {
        day -= max_days;
        month++;
    }
    
    while( month > 12 )
    {
        month -= 12;
        year++;
    }
    
    formatex(unban_time, len, "%i:%02i:%02i %i/%i/%i", hours, minutes, seconds, month, day, year);
}

GetDaysInMonth(month, year=0)
{
    switch( month )
    {
        case 1:        return 31; // january
        case 2:        return ((year % 4) == 0) ? 29 : 28; // february
        case 3:        return 31; // march
        case 4:        return 30; // april
        case 5:        return 31; // may
        case 6:        return 30; // june
        case 7:        return 31; // july
        case 8:        return 31; // august
        case 9:        return 30; // september
        case 10:    return 31; // october
        case 11:    return 30; // november
        case 12:    return 31; // december
    }
    
    return 30;
}

GetTargetFlags(client)
{
    static const flags_no_immunity = (CMDTARGET_ALLOW_SELF|CMDTARGET_NO_BOTS);
    static const flags_immunity = (CMDTARGET_ALLOW_SELF|CMDTARGET_NO_BOTS|CMDTARGET_OBEY_IMMUNITY);
    
    switch( get_pcvar_num(ab_immunity) )
    {
        case 1: return flags_immunity;
        case 2: return access(client, ADMIN_IMMUNITY) ? flags_no_immunity : flags_immunity;
    }
    
    return flags_no_immunity;
}

GetMaxBanTime(client)
{
    if( !g_total_maxban_times ) return 0;
    
    new flags = get_user_flags(client);
    
    for( new i = 0; i < g_total_maxban_times; i++ )
    {
        #if !defined MAX_BANLIMITS
        if( flags & ArrayGetCell(g_maxban_flags, i) )
        {
            return ArrayGetCell(g_maxban_times, i);
        }
        #else
        if( flags & g_maxban_flags[i] )
        {
            return g_maxban_times[i];
        }
        #endif
    }
    
    return 0;
}

PrintBanInformation(client, const target_name[], const target_authid[], const reason[], const length, const unban_time[], const admin_name[], const admin_authid[], bool:show_admin, bool:show_website)
{
    static /*website[64],*/ ban_length[64];
    
    if ( client == 0 ) {
        server_print ( "================== BREAKING GAMING ======================" );
        server_print ( "Informacion de tu ban" );
        server_print ( "Tu nombre: %s", target_name );
        server_print ( "La razon de tu ban fue: %s", reason );
        server_print ( "Tu %s %s", IsValidAuthid ( target_authid ) ? "SteamID" : "IP", target_authid );
        
        if ( length > 0 ) {
            GetBanTime ( length, ban_length, sizeof(ban_length) - 1 );
            server_print ( "Tiempo de tu ban: %s", ban_length );
        }
        
        server_print ( "Seras desbanneado en: %s", unban_time );
        
        if ( show_admin ) {
            server_print ( "Nombre del Admin: %s", admin_name );
            server_print ( "SteamID del Admin: %s", admin_authid );
            
        }
        
        if ( show_website ) {
            
            server_print ( "" );
            server_print ( "Si crees que tu ban fue injusto , reclamalo en: www.breakingaming.com o fb.com/groups/breakingamingcs" );
            server_print ( "" );
            
        }
        server_print ( "================== BREAKING GAMING ======================" ); 
        
    }
    else {
        
        client_cmd2 ( client, "echo ================== BREAKING GAMING ======================" );
        client_cmd2 ( client, "echo Informacion de tu ban" );
        client_cmd2 ( client, "echo Tu nombre: %s", target_name );
        client_cmd2 ( client, "echo La razon de tu ban fue: %s", reason );
        client_cmd2 ( client, "echo Tu %s %s", IsValidAuthid ( target_authid ) ? "SteamID" : "IP", target_authid );
        
        if ( length > 0 ) {
            GetBanTime ( length, ban_length, sizeof(ban_length) - 1 );
            client_cmd2 ( client, "echo Tiempo de tu ban: %s", ban_length );
        }
        client_cmd2 ( client, "echo Seras desbanneado en: %s", unban_time );
        
        if ( show_admin ) {
            client_cmd2 ( client, "echo Nombre del Admin: %s", admin_name );
            client_cmd2 ( client, "echo SteamID del Admin: %s", admin_authid );
            
        }
        
        if ( show_website ) {
            
            client_cmd2 ( client, "echo ^"^"" );
            client_cmd2 ( client, "echo Si crees que tu ban fue injusto , reclamalo en: www.breakingaming.com o fb.com/groups/breakingamingcs" );
            client_cmd2 ( client, "echo ^"^"" );
            
        }
        client_cmd2 ( client, "echo ================== BREAKING GAMING ======================" ); 
    }
}

PrintActivity(const admin_name[], const message_fmt[], any:...)
{
    if( !get_playersnum() ) return;
    
    new activity = get_pcvar_num(amx_show_activity);
    if( !(0 <= activity <= 5) )
    {
        set_pcvar_num(amx_show_activity, (activity = 2));
    }
    
    static message[192], temp[192];
    vformat(message, sizeof(message) - 1, message_fmt, 3);
    
    for( new client = 1; client <= g_max_clients; client++ )
    {
        if( !is_user_connected(client) ) continue;
        
        switch( is_user_admin(client) ? g_admin_activity[activity] : g_normal_activity[activity] )
        {
            case ACTIVITY_NONE:
            {
                
            }
            case ACTIVITY_HIDE:
            {
                copy(temp, sizeof(temp) - 1, message);
                replace(temp, sizeof(temp) - 1, "
$name", "ADMIN");
                
                message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
                write_byte(client);
                write_string(temp);
                message_end();
            }
            case ACTIVITY_SHOW:
            {
                copy(temp, sizeof(temp) - 1, message);
                replace(temp, sizeof(temp) - 1, "
$name", admin_name);
                
                message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
                write_byte(client);
                write_string(temp);
                message_end();
            }
        }
    }
}

Print(const message_fmt[], any:...)
{
    if( !get_playersnum() ) return;
    
    static message[192];
    vformat(message, sizeof(message) - 1, message_fmt, 2);
    
    for( new client = 1; client <= g_max_clients; client++ )
    {
        if( !is_user_connected(client) ) continue;
        
        message_begin(MSG_ONE_UNRELIABLE, g_msgid_SayText, _, client);
        write_byte(client);
        write_string(message);
        message_end();
    }
}

Log(const message_fmt[], any:...)
{
    static message[256];
    vformat(message, sizeof(message) - 1, message_fmt, 2);
    
    static filename[96];
    #if defined HISTORY_ONE_FILE
    if( !filename[0] )
    {
        get_basedir(filename, sizeof(filename) - 1);
        add(filename, sizeof(filename) - 1, "/logs/ban_history.log");
    }
    #else
    static dir[64];
    if( !dir[0] )
    {
        get_basedir(dir, sizeof(dir) - 1);
        add(dir, sizeof(dir) - 1, "/logs");
    }
    
    format_time(filename, sizeof(filename) - 1, "%m%d%Y");
    format(filename, sizeof(filename) - 1, "%s/BAN_HISTORY_%s.log", dir, filename);
    #endif
    
    log_amx("%s", message);
    log_to_file(filename, "%s", message);
}

/*
stock SQL_ReadResult2(column, {Float,_}:...){
    new args = numargs();

    if(args == 2) return mysql_read_result(column);
    if(args == 3)
    {
        new Float:value;
        mysql_read_result(column, value);
        setarg(2, _, _:value);
        return 1;
    }
    else {
        new string[512], len = getarg(3);
    
        mysql_read_result(column, string, 511);
        
        len = min(getarg(3), strlen(string));
        new cell;
        while(cell < len)
        {
            if(!setarg(2, cell, string[cell])) break;
            cell++;
        }
        setarg(2, len, 0);
        return len;
    }
    
    return 0;
}
*/ 
PHP: (Créditos Lemon)
Código PHP:
<style>
.
sxeUl {
    list-
style-typenone;
    
margin0;
    
padding0;
    
overflowhidden;
    
background-color#333333;
}
.
sxeButton {
    
font-weight500;
    
font-family'Montserrat';
    
text-transformuppercase;
    
text-aligncenter;
    
text-decorationnone;
    
text-shadownone;
    
white-spacenowrap;
    
vertical-alignmiddle;
    
border-radius3px;
    
border1px solid rgba(0,0,0,0.1);
    
transition0.1s all linear;
    
user-selectnone;
}
.
sxeButton_medium {
    
font-size13px;
    
line-height38px;
    
padding0 20px;
}
.
sxeButton_important {
    
color#ffffff;
}
.
tdclass {
    
background-color:#013ADF;
}
.
sxeLi {
    
floatleft;
}

.
sxeLi a {
    
displayblock;
    
colorwhite;
    
text-aligncenter;
    
padding16px;
    
text-decorationnone;
}

.
sxeLi a:hover {
    
background-color#111111;
}
</
style>
<
script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<
br><br>
<
div>
<?
    
$Group = \IPS\Member::loggedIn()->groups;
    
    
$host_db "localhost";
       
$usuario_db "";
    
$clave_db "";
    
$admin_db ""
    
    
$conex mysqli_connect($host_db$usuario_db$clave_db$admin_db);
    
    if(
$Group[0] == || $Group[0] == 4){
        
$STEAMID $_GET['steamid'];
        
        if(
strlen($STEAMID)){
            
$STEAMID mysqli_real_escape_string($conex$STEAMID);
            
$consulta sprintf("DELETE FROM advanced_bans WHERE steamid=\"%s\""$STEAMID);
            
            
$query mysqli_query($conex$consulta);
            
mysqli_free_result($query);
        }
    }else{
        die(
"");
    }
    
    
$query mysqli_query($conex"SELECT COUNT(*) AS total FROM advanced_bans");
    
    
$row mysqli_fetch_assoc($query);

    
$total $row['total'];

    
mysqli_free_result($query);
    
    
$limit 13;

    
$pages ceil($total $limit);

    
$page min($pagesfilter_input(INPUT_GET'page'FILTER_VALIDATE_INT, array(
        
'options' => array(
            
'default'   => 1,
            
'min_range' => 1,
        ),
    )));
    
    
    
$offset = ($page 1)  * $limit;

    
$start $offset 1;
    
$end min(($offset $limit), $total);

    echo 
'<ul class="sxeUl">';

    
$pagemin 1;
    echo 
'<li class="sxeLi"><a href="?ban=normal&page='.$pagemin.'"><i class="fa fa-angle-double-left" style="font-size:18px"></i></a></li>';
    echo 
'<li class="sxeLi"><a href="?ban=normal&page='.$pagemin.'"><strong>Anterior</strong></a></li>';

    for(
$i $pagemin-2$i $page;$i++){
        if(
$i 1)
                continue;
        echo 
'<li class="sxeLi"><a href="??ban=normal&page='.$i.'">'.$i.'</a></li>';
    }
    
    echo 
'<li class="sxeLi"><a class="sxeButton sxeButton_important" style="background-color:#f9a519" href="??ban=normal&page='.$page.'">'.$page.'</a></li>';
    
//rgb(66,186,255)

    
if($page $pages){
        
$pagemax $page+1;
        for(
$i $pagemax;$i <= $pages && $i $pagemax+3;$i++){
            echo 
'<li class="sxeLi"><a href="?ban=normal&page='.$i.'">'.$i.'</a></li>';
        }
        echo 
'<li class="sxeLi"><a href="?ban=normal&page='.$pagemax.'"><strong>Siguiente</strong></a></li>';
        echo 
'<li class="sxeLi"><a href="?ban=normal&page='.$pages.'"><i class="fa fa-angle-double-right" style="font-size:18px"></i></a></li>';
    }
?>
</ul>
</div>
<br><br>
<div class='cWidgetContainer '  data-role='widgetReceiver' data-orientation='horizontal' data-widgetArea='header'>
        <ul class='ipsList_reset'>
            <li class='ipsWidget ipsWidget_horizontal ipsBox' data-blockID='app_cms_Blocks_hn41vxp6f' data-blockConfig="true" data-blockTitle="Custom Blocks" data-blockErrorMessage="This block cannot be shown. This could be because it needs configuring, is unable to show on this page, or will show after reloading this page." data-controller='core.front.widgets.block'>
<li class="cForumRow ipsBox ipsSpacer_bottom" data-categoryid="59">
        <h2 class="ipsType_sectionTitle ipsType_reset cForumTitle">
            <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd>Nombre</dd></dl></div>
            <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd>Razon</dd></dl></div>
            <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd>Tiempo del Ban</dd></dl></div>
            <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd style="margin-left:25%">SteamID</dd></dl></div>
            <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd style="margin-left:35%">Administrador</dd></dl></div>
            <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd style="margin-left:50%">Accion</dd></dl></div>
        </h2>

        <ol class="ipsDataList ipsDataList_large ipsDataList_zebra ipsAreaBackground_reset" data-role="forums">
            <li style="text-align: center;">
<?php
    $consulta 
sprintf("
        SELECT
            *
        FROM
            advanced_bans
        LIMIT
            %d
        OFFSET
            %d
    "
$limit$offset);
    
    
?>
    
    <?php
     $query 
mysqli_query($conex$consulta);
    while(
$row mysqli_fetch_assoc($query)){
        
$STEAMID $row["steamid"];
        
?>
        <li class='cForumRow ipsDataItem ipsDataItem_responsivePhoto  ipsClearfix' id='<?echo 'li' $STEAMID;?>'>
            <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd><?echo $row["name"];?></dd></dd></dl></div>
            <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd><?echo $row["reason"];?></dd></dd></dl></div>
            <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd><?echo $row["banlength"];?></dd></dl></div>
            <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd><?echo $row["steamid"];?></dd></dl></div>
        <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd><?echo $row["admin_name"];?></dd></dl></div>
        <div class='ipsDataItem_stats ipsDataItem_statsLarge'><dl><dd><a class="ipsButton ipsButton_normal" href="?ban=normal&page=<?echo $page;?>&steamid=<?echo $STEAMID;?>" style="width:100%">Remover Ban</a></dd></dl></div></li>
        <?
    
}
    
    
mysqli_free_result($query);
    
?>
    </ol>
    </li></li>
                
            
        </ul>
    </div>
<?
    
echo '</tr></table><br><br>';
    echo 
'<ul class="sxeUl">';

    echo 
'<li class="sxeLi"><a href="?ban=normal&bans=normal&page='.$pagemin.'"><i class="fa fa-angle-double-left" style="font-size:18px"></i></a></li>';
    echo 
'<li class="sxeLi"><a href="?ban=normal&page='.$pagemin.'"><strong>Anterior</strong></a></li>';

    for(
$i $pagemin-2$i $page;$i++){
        if(
$i 1)
                continue;
        echo 
'<li class="sxeLi"><a href="?ban=normal&page='.$i.'">'.$i.'</a></li>';
    }
    
    echo 
'<li class="sxeLi"><a class="sxeButton sxeButton_important" style="background-color:rgb(66,186,255)" href="?ban=normal&page='.$page.'">'.$page.'</a></li>';

    if(
$page $pages){
        for(
$i $pagemax;$i <= $pages && $i $pagemax+3;$i++){
            echo 
'<li class="sxeLi"><a href="?ban=normal&page='.$i.'">'.$i.'</a></li>';
        }
        echo 
'<li class="sxeLi"><a href="?ban=normal&page='.$pagemax.'"><strong>Siguiente</strong></a></li>';
        echo 
'<li class="sxeLi"><a href="?ban=normal&page='.$pages.'"><i class="fa fa-angle-double-right" style="font-size:18px"></i></a></li>';
    }
    
    
    
mysqli_close($conex);
?>
Responder
#6
(26/10/2018, 12:48 PM)Cristian escribió: En realidad el título se refiere a que tiene para MySQL y SQLite3 (?
Ahí miré el código. Si usa SQLite, el código PHP que está escrito no tiene soporte para eso, perdiendo el sentido del plguin ya que se podría usar el advanced bans que está recontra probado.
[Imagen: paypalqr.png]
Responder
#7
(26/10/2018, 04:41 PM)Neeeeeeeeeel.- escribió:
(26/10/2018, 12:48 PM)Cristian escribió: En realidad el título se refiere a que tiene para MySQL y SQLite3 (?
Ahí miré el código. Si usa SQLite, el código PHP que está escrito no tiene soporte para eso, perdiendo el sentido del plguin ya que se podría usar el advanced bans que está recontra probado.

El sentido del plugin es excluir al usuario. Justamente el motd en PHP es para la versión MySQL para ponerlo en algún foro o algo por el sentido. La versión SQLite obviamente no soporta PHP.

Código PHP:
// #define USE_SQLITE 
Responder
#8
si se necesita de la flag ADMIN_RCON para banear porque en el main messagemode solo chequeas si es admin o no igual que en los menus, allí podría haber un bug Interesting

edit: no es necesario pero puede ser opcional de ponerle un filtro de comandos especiales delete, insert, etc aunque es al p2
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

(18/11/2014, 05:47 PM)Neeeeeeeeeel.- escribió: Por qué necesitan una guía para todo? Meté mano y que salga lo que salga... es la mejor forma de aprender.

(16/05/2016, 11:08 PM)kikizon2 escribió: No cabe duda que tienen mierda en vez de cerebro, par de pendejos v:
Responder
#9
Horrible la forma de como chequeas si sigue o no baneado y la forma de desbanear(que feo es el spanglish). Y en vez de hacer tan repetitivo todo, podrías hacer una consulta que seleccione y guarde en un Trie, los usuarios cuyo (ban_time < tiempo_del_mapa*2) y ahí manjearlo sin consultas, solo check; así no chequeas todos, aunque generalmente son pocos los usuarios baneados. Pero podrías evitar todo este dolor de cabeza con funciones propias de mysql, con sqlite tenes que hacerlo de la forma que actualmente usas.
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Responder
#10
(26/10/2018, 06:26 PM)Kane escribió: Horrible la forma de como chequeas si sigue o no baneado y la forma de desbanear(que feo es el spanglish). Y en vez de hacer tan repetitivo todo, podrías hacer una consulta que seleccione y guarde en un Trie, los usuarios cuyo (ban_time < tiempo_del_mapa*2) y ahí manjearlo sin consultas, solo check; así no chequeas todos, aunque generalmente son pocos los usuarios baneados. Pero podrías evitar todo este dolor de cabeza con funciones propias de mysql, con sqlite tenes que hacerlo de la forma que actualmente usas.

Gracias por comentar y por tus críticas constructivas.

1) ¿Cómo verificarías vos si el usuario está baneado o no?. Lo hice de esa forma por que hay como 4 tablas para cada almacenamiento, cabe destacar que hay varias formas que están muy mal echas, quizás por el hecho que no tengo tanto conocimiento en estos temas. Pero de seguro hay formas mejores y mucho más por aprender.


2) Lo de los Tries no lo había pensado, es una buena opción.
Responder
#11
Qué ventajas tiene sobre el Advanced Bans?
[Imagen: paypalqr.png]
Responder
#12
(14/11/2018, 04:58 PM)Neeeeeeeeeel.- escribió: Qué ventajas tiene sobre el Advanced Bans?

Por ahora ninguna, lo único y quizás es que tiene más control a la hora de manejar el sistema de ban, es decir, introducir minutos, razón, una mayor facilidad y acceso a la hora de restringir a un usuario, ya que prácticamente se puede banear a través de menú y consola, igual hay bastantes cosas que mejorar en el código y en las consultas.
Responder
#13
(14/11/2018, 09:16 PM)Cristian escribió:
(14/11/2018, 04:58 PM)Neeeeeeeeeel.- escribió: Qué ventajas tiene sobre el Advanced Bans?

Por ahora ninguna, lo único y quizás es que tiene más control a la hora de manejar el sistema de ban, es decir, introducir minutos, razón, una mayor facilidad y acceso a la hora de restringir a un usuario, ya que prácticamente se puede banear a través de menú y consola, igual hay bastantes cosas que mejorar en el código y en las consultas.

El soporte de Mysql y Sqlite es una ventaja, el advanced bans no lo tiene, También podés banear por HWID otra cosa que el Advanced Bans no tiene y lo de los calculos también, diría yo, no sé.
Responder
#14
L 11/27/2018 - 02:22:56: String formatted incorrectly - parameter 3 (total 2)
L 11/27/2018 - 02:22:56: [AMXX] Displaying debug trace (plugin "ban_system.amxx", version "1.0")
L 11/27/2018 - 02:22:56: [AMXX] Run time error 25: parameter error
L 11/27/2018 - 02:22:56: [AMXX] [0] ban_system.sma::concmd_ban_add_hid (line 618)
Responder
#15
(26/11/2018, 08:21 PM)ptaha525 escribió: L 11/27/2018 - 02:22:56: String formatted incorrectly - parameter 3 (total 2)
L 11/27/2018 - 02:22:56: [AMXX] Displaying debug trace (plugin "ban_system.amxx", version "1.0")
L 11/27/2018 - 02:22:56: [AMXX] Run time error 25: parameter error
L 11/27/2018 - 02:22:56: [AMXX] [0] ban_system.sma::concmd_ban_add_hid (line 618)

Perdón, no pude darle soporte al proyecto debido a una mudanza, no tengo ni luz en casa, y estoy del teléfono. Ese error se debe a que hay un %s en la parte en donde se detiene la función cuyas funciones son concmd_ban_add_ip, concmd_ban_add_steamid, concmd_ban_add_hid. Por otro lado, ya pude fixear gran parte del código y las tablas reduciéndolas a 1 sola. Cuando vuelva todo a la normalidad lo publico.
Responder
#16
Ahí actualice el Thread.
Responder
#17
( 14) Error: Access denied for user 'surfmod'@'%' to database 'sql_ban_database'

#if defined USE_SQLITE
#define SQL_HOST "37.59.43.196"
#define SQL_USER "surfmod"
#define SQL_PASSWORD "PASSWORDREMOVED"
#define SQL_DRIVE "surfmod"
#else
#define SQL_HOST "37.59.43.196"
#define SQL_USER "surfmod"
#define SQL_PASSWORD "PASSWORDREMOVED"
#define SQL_DRIVE "surfmod"
#endif

What about the file sql_ban_databse.sq3 ?  What i have to do with this file??????????????????????????????

When i try to upload sql_ban_database.sq3 to phpmyadmin:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SQLite format 3' at line 1
Responder
#18
(07/06/2020, 06:44 AM)Infamous2020 escribió: ( 14) Error: Access denied for user 'surfmod'@'%' to database 'sql_ban_database'

#if defined USE_SQLITE
#define SQL_HOST "37.59.43.196"
#define SQL_USER "surfmod"
#define SQL_PASSWORD "PASSWORDREMOVED"
#define SQL_DRIVE "surfmod"
#else
#define SQL_HOST "37.59.43.196"
#define SQL_USER "surfmod"
#define SQL_PASSWORD "PASSWORDREMOVED"
#define SQL_DRIVE "surfmod"
#endif

What about the file sql_ban_databse.sq3 ?  What i have to do with this file??????????????????????????????

When i try to upload sql_ban_database.sq3 to phpmyadmin:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SQLite format 3' at line 1


SQLite != SQL...


This forum is for spanish users only
[Imagen: bvpq9q-6.png]

NO DOY AYUDA VIA MENSAJE PRIVADO

* Si requieres algún servicio de pago puedes contactarme vía MP o en mi facebook
Responder
#19
no me compila, es como que queda cargando y nunca avanza ni da errores, primera vez que me pasa con un plugin
Responder
#20
capas tenes una línea muy grande y aun usas el amx studio xd

puedes revisar eso Whatever


Aunque existe el amxbans también
[Imagen: zcsztw-4.png] [Imagen: 6u5fj2-4.png]
[Imagen: linkedin_thumb_image.png][Imagen: 76561198283253977.png][Imagen: linkedin_thumb_image.png]
Responder
#21
A mi me compilo sin ningún problema con la versión 1.8.3
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)