Allied Modders en español

Versión completa: Solucionado Crear las tablas directamente desde el sma
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
buenas noches, quien me puede ayudar para que las tablas las cree directamente desde el sma
Código:
#include <amxmisc>
#include <sqlx>
#include <fakemeta>

#pragma semicolon 1

/*
=== CONSULTAS ===

// Borrar tablas
DROP TABLE IF EXISTS sql_ban;

// Vaciar contenido
DELETE FROM sql_ban;

// Crear tablas
CREATE TABLE IF NOT EXISTS `sql_ban`
(
    ban_name varchar(32) NOT NULL DEFAULT '',
    ban_admin_name varchar(32) NOT NULL DEFAULT '',
    ban_reason varchar(21) NOT NULL DEFAULT '',
    ban_user varchar(32) NOT NULL DEFAULT '',
    ban_time int NOT NULL DEFAULT '0',
    ban_map varchar(21) NOT NULL DEFAULT '',
    ban_register varchar(21) NOT NULL DEFAULT '',
    ban_expire varchar(21) NOT NULL DEFAULT '',
    ban_type varchar(8) NOT NULL DEFAULT '',
    ban_minutes int NOT NULL DEFAULT '0',
    ban_page int NOT NULL DEFAULT '0'
);
*/

#define PLUGIN_AUTHOR "; Cristian'"
#define PLUGIN_VERSION "v2.0"

#define SZPREFIX "!g[Sistema de ban]!y"

#define PRIVATE_DATA_CSMENUCODE 205
#define PRIVATE_DATA_LINUX 5

#define REASON_MAX_LENGTH 25
#define REASON_MIN_LENGTH 2

#define OPTION_BACKNAME "Pag. Anterior"
#define OPTION_NEXTNAME "Pag. Siguiente"
#define OPTION_EXITNAME "Menu Anterior"

#define USE_SQLITE

#define SQL_TABLE "sql_ban"
#define SQL_DATABASE "sql_ban_database"

#if defined USE_SQLITE
    #define SQL_HOST ""
    #define SQL_USER ""
    #define SQL_PASSWORD ""
    #define SQL_DRIVE "sqlite"
#else
    #define SQL_HOST "localhost"
    #define SQL_USER "root"
    #define SQL_PASSWORD ""
    #define SQL_DRIVE "mysql"
#endif

enum _:MENU_STRUCT
{
    MENU_KICK = 1,
    MENU_BAN,
    MENU_BAN_IP,
    MENU_BAN_STEAMID,
    MENU_BAN_REMOVE
};

enum _:MESSAGEMODE_STRUCT
{
    CALCULAR_DIAS_EN_MINUTOS,
    CALCULAR_HORAS_EN_MINUTOS,
    INTRODUCIR_MINUTOS,
    INTRODUCIR_RAZON,
    INTRODUCIR_IP,
    INTRODUCIR_STEAMID
};

enum _:BAN_TYPE_STRUCT
{
    BAN_IP,
    BAN_STEAMID
};

enum _:USERS_DISCONNECTED_STRUCT
{
    USER_NAME[32],
    USER_IP[16],
    USER_STEAMID[35]
};

enum _:STATS_BAN_STRUCT
{
    STAT_BAN_ADMIN_NAME[32],
    STAT_BAN_ADMIN_REASON[32],
    STAT_BAN_ADMIN_REGISTER[32],
    STAT_BAN_ADMIN_EXPIRE[32],
    STAT_BAN_ADMIN_MAP[32],
    STAT_BAN_TYPE_NAME[32],
    STAT_BAN_ADMIN_MINUTES,
    STAT_BAN_TYPE,
    STAT_BAN_TIME,
    STAT_BAN_QUERY_RESULT[35],
    STAT_BAN_QUERY_NAME[32]
};

new const BAN_TYPES[][] =
{
    "IP",
    "STEAMID"
};

new g_user_name[33][32];
new g_user_unban_name[33][32];
new g_user_ban_status[33];
new g_user_ban_admin[33][32];
new g_user_ban_reason[33][32];
new g_user_ban_register[33][32];
new g_user_ban_add[33][16];
new g_user_ban_expire[33][32];
new g_user_ban_minutes[33];
new g_user_ban_minutes_per_day_calculation[33];
new g_user_ban_minutes_per_hour_calculation[33];
new g_user_ban_selection[33];
new g_user_ban_map[33][32];
new g_user_ip[33][16];
new g_user_authid[33][35];
new g_user_ban_type[33];
new g_user_ban_type_name[33][32];
new g_user_page_selection[33];
new g_user_unban_selected[33];
new g_maxplayers[1 char];
new g_messagemode[33];
new g_user_disconnected[10][USERS_DISCONNECTED_STRUCT];
new g_number_users_disconnected;

new Trie:g_trie_ban_stats;
new Array:g_array_ban_stats;

new g_cvar_ban_system_update_frequency;

new Handle:g_sql_connection;
new Handle:g_sql_htuple;

public plugin_init()
{
    register_plugin("AMX Ban System", PLUGIN_VERSION, PLUGIN_AUTHOR);
    
    register_clcmd("say", "clcmd_say");
    register_clcmd("say_team", "clcmd_say");
    register_clcmd("CALCULAR_DIAS_EN_MINUTOS", "clcmd_messagemode");
    register_clcmd("CALCULAR_HORAS_EN_MINUTOS", "clcmd_messagemode");
    register_clcmd("INTRODUCIR_MINUTOS", "clcmd_messagemode");
    register_clcmd("INTRODUCIR_RAZON", "clcmd_messagemode");
    register_clcmd("INTRODUCIR_IP", "clcmd_messagemode");
    register_clcmd("INTRODUCIR_STEAMID", "clcmd_messagemode");
    register_clcmd("chooseteam", "clcmd_changeteam");
    register_clcmd("jointeam", "clcmd_changeteam");
    register_concmd("amx_ban_add_ip", "concmd_ban_add_ip", ADMIN_RCON, "Uso: amx_ban_add ^"IP^" ^"MINUTOS^" ^"RAZÓN^"");
    register_concmd("amx_ban_add_steamid", "concmd_ban_add_steamid", ADMIN_RCON, "Uso: amx_ban_add ^"STEAMID^" ^"MINUTOS^" ^"RAZÓN^"");
    
    register_menu("Show Option Ban", (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<9), "handled_show_option_ban");
    register_menu("Show Answer Unban", (1<<0)|(1<<1), "handled_show_answer_unban");
    register_menu("Handled Clcmd Ban", (1<<9), "handled___clcmd_ban");
    register_menu("Show Menu Information", (1<<0)|(1<<9), "handled_show_menu_ban_information");
    
    register_forward(FM_ClientUserInfoChanged, "fw_ClientUserInfoChanged");
    
    g_cvar_ban_system_update_frequency = register_cvar("amx_ban_system_update_frequency", "60.0");
    
    g_maxplayers{0} = get_maxplayers();
    
    new error, szerror[512], get_type[12];
    SQL_SetAffinity(SQL_DRIVE);
    SQL_GetAffinity(get_type, charsmax(get_type));
    
    g_sql_htuple = SQL_MakeDbTuple(SQL_HOST, SQL_USER, SQL_PASSWORD, SQL_DATABASE);
    
    g_sql_connection = SQL_Connect(g_sql_htuple, error, szerror, 511);
    
    if(g_sql_htuple == Empty_Handle)
    {
        log_to_file("SQL_Htuple.log", "%s", szerror);
        set_fail_state(szerror);
        return;
    }
    
    if(g_sql_connection == Empty_Handle)
    {
        log_to_file("SQL_Connection.log", "%s", szerror);
        set_fail_state(szerror);
        return;
    }
    
    g_trie_ban_stats = TrieCreate();
    g_array_ban_stats = ArrayCreate(STATS_BAN_STRUCT);
    
    set_task(1.0, "check_user_banned");
    set_task(3.0, "check_user_unixtime");
}

public plugin_end()
{
    TrieDestroy(g_trie_ban_stats);
    ArrayDestroy(g_array_ban_stats);
    
    if(g_sql_connection)
    {
        SQL_FreeHandle(g_sql_connection);
    }
}

sql_query_error(Handle:query)
{
    static error[56];
    SQL_QueryError(query, error, 55);
       
    chat_color(0, "%s !yError: !g%s!y.", SZPREFIX, error);
    log_to_file("SQL_Query_Error.txt", "Error: %s", error);
    SQL_FreeHandle(query);
}

public check_user_banned()
{
    new Handle:query;
    query = SQL_PrepareQuery(g_sql_connection, "SELECT `ban_admin_name`, `ban_reason`, `ban_map`, `ban_register`, `ban_expire`, `ban_type`, `ban_user`, `ban_name`, `ban_minutes`, `ban_page`, `ban_time` FROM `%s`;", SQL_TABLE);
    
    if(!SQL_Execute(query))
    {
        sql_query_error(query);
    }
    else if(SQL_NumResults(query))
    {
        new query_result[35], query_name[32], ban_admin[32], ban_reason[32], ban_map[32], ban_register[32], ban_expire[32], ban_type_name[32], ban_minutes, ban_page, ban_time;
        
        while (SQL_MoreResults(query))
        {
            SQL_ReadResult(query, 0, ban_admin, 32);
            SQL_ReadResult(query, 1, ban_reason, 32);
            SQL_ReadResult(query, 2, ban_map, 32);
            SQL_ReadResult(query, 3, ban_register, 32);
            SQL_ReadResult(query, 4, ban_expire, 32);
            SQL_ReadResult(query, 5, ban_type_name, 32);
            SQL_ReadResult(query, 6, query_result, 34);
            SQL_ReadResult(query, 7, query_name, 32);
            
            ban_minutes = SQL_ReadResult(query, 8);
            ban_page = SQL_ReadResult(query, 9);
            ban_time = SQL_ReadResult(query, 10);
            
            check_copy_stats(ban_admin, ban_reason, ban_map, ban_register, ban_expire, ban_type_name, query_result, query_name, ban_minutes, ban_page, ban_time);
            SQL_NextRow(query);
        }
        SQL_FreeHandle(query);
    }
    else
    {
        SQL_FreeHandle(query);
    }
}

check_copy_stats(const ban_admin[], const ban_reason[], const ban_map[], const ban_register[], const ban_expire[], const ban_type_name[], const query_result[], const query_name[], ban_minutes, ban_page, ban_time)
{
    new stats[STATS_BAN_STRUCT];
    
    copy(stats[STAT_BAN_ADMIN_NAME], charsmax(stats[STAT_BAN_ADMIN_NAME]), ban_admin);
    copy(stats[STAT_BAN_ADMIN_REASON], charsmax(stats[STAT_BAN_ADMIN_REASON]), ban_reason);
    copy(stats[STAT_BAN_ADMIN_MAP], charsmax(stats[STAT_BAN_ADMIN_MAP]), ban_map);
    copy(stats[STAT_BAN_ADMIN_REGISTER], charsmax(stats[STAT_BAN_ADMIN_REGISTER]), ban_register);
    copy(stats[STAT_BAN_ADMIN_EXPIRE], charsmax(stats[STAT_BAN_ADMIN_EXPIRE]), ban_expire);
    copy(stats[STAT_BAN_TYPE_NAME], charsmax(stats[STAT_BAN_TYPE_NAME]), ban_type_name);
    copy(stats[STAT_BAN_QUERY_RESULT], charsmax(stats[STAT_BAN_QUERY_RESULT]), query_result);
    copy(stats[STAT_BAN_QUERY_NAME], charsmax(stats[STAT_BAN_QUERY_NAME]), query_name);

    stats[STAT_BAN_ADMIN_MINUTES] = ban_minutes;
    stats[STAT_BAN_TYPE] = ban_page;
    stats[STAT_BAN_TIME] = ban_time;
    
    TrieSetArray(g_trie_ban_stats, query_result, stats, sizeof(stats));
    ArrayPushArray(g_array_ban_stats, stats);
}

public check_user_unixtime()
{
    new stats[STATS_BAN_STRUCT], i;
    
    for(i = 0; i < ArraySize(g_array_ban_stats); i++)
    {
        if (ArrayGetArray(g_array_ban_stats, i, stats))
        {    
            if (get_systime() > stats[STAT_BAN_TIME])
            {
                new Handle:query;
                query = SQL_PrepareQuery(g_sql_connection, "DELETE FROM `%s` WHERE `ban_user` = ^"%s^";", SQL_TABLE, stats[STAT_BAN_QUERY_RESULT]);
                
                if(!SQL_Execute(query))
                {
                    sql_query_error(query);
                }
                else
                {
                    if(stats[STAT_BAN_QUERY_NAME][0])
                    {
                        server_print("El ban de %s expiró", stats[STAT_BAN_QUERY_NAME]);
                        chat_color(0, "%s !yEl ban de !g%s!y expiró.", SZPREFIX, stats[STAT_BAN_QUERY_NAME]);
                        log_to_file("ban_systime_expire.txt", "El ban de <%s> expiró", stats[STAT_BAN_QUERY_NAME]);
                    }
                    else
                    {
                        server_print("El ban de %s expiró", stats[STAT_BAN_QUERY_RESULT]);
                        chat_color(0, "%s !yEl ban de !g%s!y expiró.", SZPREFIX, stats[STAT_BAN_QUERY_RESULT]);
                        log_to_file("ban_systime_expire.txt", "El ban de <%s> expiró", stats[STAT_BAN_QUERY_RESULT]);
                    }
                    TrieDeleteKey(g_trie_ban_stats, stats[STAT_BAN_QUERY_RESULT]);
                    ArrayDeleteItem(g_array_ban_stats, i);
                    SQL_FreeHandle(query);
                }
            }
        }
    }
    set_task(get_pcvar_float(g_cvar_ban_system_update_frequency), "check_user_unixtime");
}

public client_putinserver(id)
{
    get_user_name(id, g_user_name[id], 31);
    get_user_ip(id, g_user_ip[id], charsmax(g_user_ip[]), .without_port = 1);
    get_user_authid(id, g_user_authid[id], charsmax(g_user_authid[]));
    
    g_user_ban_admin[id][0] = '^0';
    g_user_ban_reason[id][0] = '^0';
    g_user_ban_register[id][0] = '^0';
    g_user_ban_expire[id][0] = '^0';
    g_user_ban_type_name[id][0] = '^0';
    g_user_ban_map[id][0] = '^0';
    g_user_ban_add[id][0] = '^0';
    g_user_unban_name[id][0] = '^0';
    g_user_ban_reason[id][0] = '^0';
    g_user_ban_selection[id] = 0;
    g_user_page_selection[id] = 0;
    g_user_ban_minutes[id] = 0;
    g_user_ban_minutes_per_day_calculation[id] = 0;
    g_user_ban_minutes_per_hour_calculation[id] = 0;
    g_user_ban_status[id] = 0;
    g_user_ban_type[id] = 0;
    g_user_unban_selected[id] = 0;
    
    set_task(0.25, "check_user_ban", id);
}

public check_user_ban(id)
{
    new stats[STATS_BAN_STRUCT];
    
    if(TrieGetArray(g_trie_ban_stats, g_user_ip[id], stats, sizeof(stats)) || TrieGetArray(g_trie_ban_stats, g_user_authid[id], stats, sizeof(stats)))
    {
        g_user_ban_status[id] = 1;
        
        copy(g_user_ban_admin[id], charsmax(g_user_ban_admin[]), stats[STAT_BAN_ADMIN_NAME]);
        copy(g_user_ban_reason[id], charsmax(g_user_ban_reason[]), stats[STAT_BAN_ADMIN_REASON]);
        copy(g_user_ban_map[id], charsmax(g_user_ban_map[]), stats[STAT_BAN_ADMIN_MAP]);
        copy(g_user_ban_register[id], charsmax(g_user_ban_register[]), stats[STAT_BAN_ADMIN_REGISTER]);
        copy(g_user_ban_expire[id], charsmax(g_user_ban_expire[]), stats[STAT_BAN_ADMIN_EXPIRE]);
        copy(g_user_ban_type_name[id], charsmax(g_user_ban_type_name[]), stats[STAT_BAN_TYPE_NAME]);
        
        g_user_ban_minutes[id] = stats[STAT_BAN_ADMIN_MINUTES];
        g_user_page_selection[id] = stats[STAT_BAN_TYPE];
        
        clcmd_changeteam(id);
        return;
    }
}

reset_vars_string(id)
{
    g_user_ban_add[id][0] = '^0';
}

public concmd_ban_add_ip(id, level, cid)
{
    if (!cmd_access(id, level, cid, 2))
        return PLUGIN_HANDLED;
    
    new Handle:query, args[35], reason[21], minutes[10], time[32], unixtime, name[32], map[32];
    read_argv(1, args, charsmax(args));
    read_argv(2, minutes, 9);
    read_argv(3, reason, 20);
    
    if(strlen(args) < 5)
    {
        console_print(id, "La IP introducida debe contener más de 5 carácteres");
        return PLUGIN_HANDLED;
    }
    
    if(!isdigit(minutes[0]))
    {
        console_print(id, "Los minutos no pueden ser letras");
        return PLUGIN_HANDLED;
    }
    
    if(!str_to_num(minutes))
    {
        console_print(id, "Tenés que introducir los minutos del ban");
        return PLUGIN_HANDLED;
    }
    
    if(strlen(reason) < REASON_MIN_LENGTH)
    {
        console_print(id, "La razón del ban debe tener al menos 5 carácteres");
        return PLUGIN_HANDLED;
    }
    else if(strlen(reason) > REASON_MAX_LENGTH)
    {
        console_print(id, "La razón del ban no debe superar los 20 carácteres");
        return PLUGIN_HANDLED;
    }
    copy(g_user_ban_reason[id], charsmax(g_user_ban_reason[]), reason);
    g_user_ban_minutes[id] = str_to_num(minutes);
    
    if(TrieKeyExists(g_trie_ban_stats, args))
    {
        console_print(id, "La IP introducida ya existe en la base de datos");
        return PLUGIN_HANDLED;
    }
    unixtime = (get_systime() + (g_user_ban_minutes[id] * 60));
    get_time("%d/%m/%Y - %H:%M:%S", time, 31);
    format_time(g_user_ban_expire[id], 31, "%d/%m/%Y - %H:%M:%S", unixtime);
    get_user_name(id, name, 31);
    get_mapname(map, 31);
    
    query = SQL_PrepareQuery(g_sql_connection, "INSERT INTO `%s` (`ban_admin_name`, `ban_reason`, `ban_user`, `ban_time`, `ban_map`, `ban_register`, `ban_expire`, `ban_minutes`, `ban_page`) VALUES (^"%s^", ^"%s^", ^"%s^", '%d', ^"%s^", ^"%s^", ^"%s^", '%d', '%d');", SQL_TABLE, g_user_name[id], g_user_ban_reason[id], args, unixtime, map, time, g_user_ban_expire[id], g_user_ban_minutes[id], g_user_page_selection[id]);

    if(!SQL_Execute(query))
    {
        sql_query_error(query);
    }
    else
    {
        SQL_FreeHandle(query);
        chat_color(0, "%s !g%s!y baneó la IP !g%s!y. Razón: !g%s!y.", SZPREFIX, g_user_name[id], args, g_user_ban_reason[id]);
        chat_color(0, "%s !yMinutos: !g%d minuto%s !t(%s)!y.", SZPREFIX, g_user_ban_minutes[id], (g_user_ban_minutes[id] == 1) ? "" : "s", check_time_calculated(g_user_ban_minutes[id]), (g_user_ban_minutes[id] == 1) ? "" : "s");
        log_to_file("ban_systime_ban_ip.txt", "<%s> baneó la IP <%s>", g_user_name[id], args);
        check_copy_stats(g_user_name[id], g_user_ban_reason[id], map, time, g_user_ban_expire[id], "", args, "", g_user_ban_minutes[id], MENU_BAN_IP, unixtime);    
        reset_vars_string(id);
    }
    return PLUGIN_HANDLED;
}

public concmd_ban_add_steamid(id, level, cid)
{
    if(!cmd_access(id, level, cid, 2))
    {
        return PLUGIN_HANDLED;
    }
    
    new Handle:query, args[35], reason[21], minutes[10], time[32], unixtime, name[32], map[32];
    read_argv(1, args, charsmax(args));
    read_argv(2, minutes, 9);
    read_argv(3, reason, 20);
    
    if(strlen(args) < 5)
    {
        console_print(id, "El SteamID introducido debe contener más de 5 carácteres");
        return PLUGIN_HANDLED;
    }
    
    if(!isdigit(minutes[0]))
    {
        console_print(id, "Los minutos no pueden ser letras");
        return PLUGIN_HANDLED;
    }
    
    if(!str_to_num(minutes))
    {
        console_print(id, "Tenés que introducir los minutos del ban");
        return PLUGIN_HANDLED;
    }
    
    if(strlen(reason) < REASON_MIN_LENGTH)
    {
        console_print(id, "La razón del ban debe tener al menos 5 carácteres");
        return PLUGIN_HANDLED;
    }
    else if(strlen(reason) > REASON_MAX_LENGTH)
    {
        console_print(id, "La razón del ban no debe superar los 20 carácteres");
        return PLUGIN_HANDLED;
    }
    
    copy(g_user_ban_reason[id], charsmax(g_user_ban_reason[]), reason);
    g_user_ban_minutes[id] = str_to_num(minutes);
    
    if(TrieKeyExists(g_trie_ban_stats, args))
    {
        console_print(id, "El SteamID introducido ya existe en la base de datos");
        return PLUGIN_HANDLED;
    }
    unixtime = (get_systime() + (g_user_ban_minutes[id] * 60));
    get_time("%d/%m/%Y - %H:%M:%S", time, 31);
    format_time(g_user_ban_expire[id], 31, "%d/%m/%Y - %H:%M:%S", unixtime);
    get_user_name(id, name, 31);
    get_mapname(map, 31);
    
    query = SQL_PrepareQuery(g_sql_connection, "INSERT INTO `%s` (`ban_admin_name`, `ban_reason`, `ban_user`, `ban_time`, `ban_map`, `ban_register`, `ban_expire`, `ban_minutes`, `ban_page`) VALUES (^"%s^", ^"%s^", ^"%s^", '%d', ^"%s^", ^"%s^", ^"%s^", '%d', '%d');", SQL_TABLE, g_user_name[id], g_user_ban_reason[id], args, unixtime, map, time, g_user_ban_expire[id], g_user_ban_minutes[id], g_user_page_selection[id]);

    if(!SQL_Execute(query))
    {
        sql_query_error(query);
    }
    else
    {
        SQL_FreeHandle(query);
        chat_color(0, "%s !g%s!y baneó el SteamID !g%s!y. Razón: !g%s!y.", SZPREFIX, g_user_name[id], args, g_user_ban_reason[id]);
        chat_color(0, "%s !yMinutos: !g%d minuto%s !t(%s)!y.", SZPREFIX, g_user_ban_minutes[id], (g_user_ban_minutes[id] == 1) ? "" : "s", check_time_calculated(g_user_ban_minutes[id]), (g_user_ban_minutes[id] == 1) ? "" : "s");
        log_to_file("ban_systime_ban_authid.txt", "<%s> baneó el SteamID <%s>", g_user_name[id], args);
        check_copy_stats(g_user_name[id], g_user_ban_reason[id], map, time, g_user_ban_expire[id], "", args, "", g_user_ban_minutes[id], MENU_BAN_STEAMID, unixtime);    
        reset_vars_string(id);
    }
    return PLUGIN_HANDLED;
}

public client_disconnected(id)
{
    static i, add_disconnected;
    add_disconnected = 1;
    
    for(i = 0; i < g_number_users_disconnected; i++)
    {
        if(equal(g_user_ip[id], g_user_disconnected[i][USER_IP]) && equal(g_user_authid[id], g_user_disconnected[i][USER_STEAMID]))
        {
            add_disconnected = 0;
            break;
        }
    }
    
    if(!add_disconnected)
    {
        return;
    }
    
    if(g_number_users_disconnected == 10)
    {
        g_number_users_disconnected = 0;
    }
    copy(g_user_disconnected[g_number_users_disconnected][USER_NAME], 31, g_user_name[id]);
    copy(g_user_disconnected[g_number_users_disconnected][USER_IP], 16, g_user_ip[id]);
    copy(g_user_disconnected[g_number_users_disconnected][USER_STEAMID], charsmax(g_user_disconnected[]), g_user_authid[id]);
        
    g_number_users_disconnected++;
}

public fw_ClientUserInfoChanged(id, buffer)
{
    static name[32];
    engfunc(EngFunc_InfoKeyValue, buffer, "name", name, charsmax(name));
    
    if(equali(name, g_user_name[id]))
    {
        return FMRES_IGNORED;
    }
    engfunc(EngFunc_SetClientKeyValue, id, buffer, "name", name);
    copy(g_user_name[id], 31, name);
    return FMRES_IGNORED;
}    

public clcmd_say(id)
{
    if(g_user_ban_status[id])
    {
        chat_color(id, "%s !yEstás baneado, no podés escribir por el chat.", SZPREFIX);
        return PLUGIN_HANDLED;
    }
    
    static args[9];
    read_args(args, charsmax(args));
    remove_quotes(args);
    trim(args);
    
    if(equal(args, "/ban") || equal(args, ".ban") || equal(args, "!ban"))
    {
        clcmd_ban(id);
        return PLUGIN_HANDLED;
    }
    return PLUGIN_CONTINUE;
}
    
public clcmd_ban(id)
{
    if(!is_user_admin(id))
    {
        return PLUGIN_HANDLED;
    }
    
    static menu;
    menu = menu_create("\yMenú de ban SQL", "handled_clcmd_ban");
    
    menu_additem(menu, "Expulsar\y,\w banear", "1", 0);
    menu_additem(menu, "Lista de ban^n", "2", 0);
    menu_additem(menu, "Último diez usuarios desconectados", "3", 0);
    menu_additem(menu, "Información del plugin", "4", 0);
    
    set_pdata_int(id, PRIVATE_DATA_CSMENUCODE, false, PRIVATE_DATA_LINUX);
    menu_display(id, menu);
    return PLUGIN_HANDLED;
}

public bs_admin_flags_check(id, menu, item)
{
    if(!(get_user_flags(id) & ADMIN_RCON))
    {
        return ITEM_DISABLED;
    }
    return ITEM_ENABLED;
}

public handled_clcmd_ban(id, menu, item)
{
    menu_destroy(menu);
    
    switch(item)
    {
        case 0: show_menu_ban(id);
        case 1: show_menu_ban_list(id);
        case 2: show_view_last_ten_disconnected(id);
        case 3:
        {
            static szmenu[530];
            format(szmenu, charsmax(szmenu), "\yInformación del plugin^n^n\wSistema de ban: \y%s^n\wAutor: \y%s^n^n\r* \yComandos^n\r* \wamx_ban_add_ip \y^"IP^" ^"Razón^" ^"Minutos^"^n\r* \wamx_ban_add_steamid \y^"STEAMID^" ^"Razón^" ^"Minutos^"^n\r* \wamx_ban_add_hid \y^"HID^" ^"Razón^" ^"Minutos^"^n^n\r0. \w%s", PLUGIN_VERSION, PLUGIN_AUTHOR, OPTION_EXITNAME);
            show_menu(id, (1<<9), szmenu, FM_NULLENT, "Handled Clcmd Ban");
        }
    }
    return PLUGIN_HANDLED;
}

public handled___clcmd_ban(id, key)
{
    if(key == 9)
    {
        clcmd_ban(id);
    }
    return PLUGIN_HANDLED;
}

show_menu_ban(id)
{
    static menu;
    menu = menu_create("\yExpulsar.. Banear usuario", "handled_show_menu_ban");
    
    menu_additem(menu, "Expulsar \yUSUARIO^n", "1", 0);
    menu_additem(menu, "Banear \yUSUARIO", "2", 0);
    menu_additem(menu, "Banear \yIP", "3", 0);
    menu_additem(menu, "Banear \ySTEAMID^n", "4", 0);
    
    set_pdata_int(id, PRIVATE_DATA_CSMENUCODE, false, PRIVATE_DATA_LINUX);
    menu_setprop(menu, MPROP_EXITNAME, OPTION_EXITNAME);
    menu_display(id, menu);
}

public handled_show_menu_ban(id, menu, item)
{
    menu_destroy(menu);
    
    switch(item)
    {
        case MENU_EXIT: clcmd_ban(id);
        case 0: show_menu_users(id, "Expulsar usuario", MENU_KICK);
        case 1: show_menu_users(id, "Banear usuario", MENU_BAN);
        case 2: show_option_ban(id, MENU_BAN_IP);
        case 3: show_option_ban(id, MENU_BAN_STEAMID);
    }
    return PLUGIN_HANDLED;
}

show_menu_ban_list(id)
{
    static menu, num[3], i, stats[STATS_BAN_STRUCT], sztext[28];
    menu = menu_create("\yLista de ban^nPresioná para ver la información", "handled_show_menu_ban_list");
    
    for(i = 0; i < ArraySize(g_array_ban_stats); i++)
    {
        ArrayGetArray(g_array_ban_stats, i, stats);
        num_to_str((i + 1), num, charsmax(num));
        
        if(stats[STAT_BAN_QUERY_NAME][0])
        {
            copy(sztext, charsmax(sztext), stats[STAT_BAN_QUERY_NAME]);
        }
        else
        {
            copy(sztext, charsmax(sztext), stats[STAT_BAN_QUERY_RESULT]);
        }
        menu_additem(menu, sztext, num);
    }
    menu_setprop(menu, MPROP_BACKNAME, OPTION_BACKNAME);
    menu_setprop(menu, MPROP_NEXTNAME, OPTION_NEXTNAME);
    menu_setprop(menu, MPROP_EXITNAME, OPTION_EXITNAME);
    menu_display(id, menu);
}

public handled_show_menu_ban_list(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        clcmd_ban(id);
        return PLUGIN_HANDLED;
    }
    static num[3], access, item_name[35], sztext[400], stats[STATS_BAN_STRUCT];
    menu_item_getinfo(menu, item, access, num, charsmax(num), item_name, charsmax(item_name), access);

    g_user_unban_selected[id] = str_to_num(num) - 1;
    
    ArrayGetArray(g_array_ban_stats, g_user_unban_selected[id], stats);
    formatex(sztext, charsmax(sztext), "\r* \yInformación del ban \d(%s)^n^n\r* \wAdministrador: \y%s^n\r* \wRazón: \y%s^n\r* \wMapa: \y%s^n\r* \wMinutos: \y%d minuto%s^n\r* \wTiempo calculado: \y%s^n\r* \wFecha del ban: \y%s^n\r* \wEl ban expira en la fecha: \y%s^n^n\r1. \wRemover el ban^n\r0. \wVolver al menú anterior", item_name, stats[STAT_BAN_ADMIN_NAME], stats[STAT_BAN_ADMIN_REASON], stats[STAT_BAN_ADMIN_MAP], stats[STAT_BAN_ADMIN_MINUTES], (stats[STAT_BAN_ADMIN_MINUTES] == 1) ? "" : "s", check_time_calculated(stats[STAT_BAN_ADMIN_MINUTES]), stats[STAT_BAN_ADMIN_REGISTER], stats[STAT_BAN_ADMIN_EXPIRE]);
        
    show_menu(id, (1<<0)|(1<<9), sztext, FM_NULLENT, "Show Menu Information");
    copy(g_user_unban_name[id], charsmax(g_user_unban_name[]), item_name);
    return PLUGIN_HANDLED;
}

public handled_show_menu_ban_information(id, key)
{
    switch(key)
    {
        case 0:
        {
            static sztext[100];
            
            format(sztext, charsmax(sztext), "\y¿Estás seguro de desbanear esto?^n\wSeleccionado: \y%s?^n^n\r1. \wSí^n\r2. \wNo", g_user_unban_name[id]);
            show_menu(id, (1<<0)|(1<<1), sztext, -1, "Show Answer Unban");
        }
        case 9: show_menu_ban_list(id);
    }
    return PLUGIN_HANDLED;
}

public handled_show_answer_unban(id, key)
{
    switch(key)
    {
        case 0:
        {
            new Handle:query, stats[STATS_BAN_STRUCT];
            ArrayGetArray(g_array_ban_stats, g_user_unban_selected[id], stats);
            
            query = SQL_PrepareQuery(g_sql_connection, "DELETE FROM `%s` WHERE `ban_user` = ^"%s^";", SQL_TABLE, stats[STAT_BAN_QUERY_RESULT]);
            
            if (!SQL_Execute(query))
                sql_query_error(query);
            else
            {
                static name[32];
                get_user_name(id, name, 31);
                
                if (stats[STAT_BAN_QUERY_NAME][0])
                {
                    chat_color(0, "%s !g%s!y desbaneó a !g%s!y.", SZPREFIX, name, stats[STAT_BAN_QUERY_NAME]);
                    log_to_file("ban_systime_unban.txt", "<%s> desbaneó a <%s>", stats[STAT_BAN_QUERY_NAME]);
                    TrieDeleteKey(g_trie_ban_stats, stats[STAT_BAN_QUERY_NAME]);
                }
                else
                {
                    chat_color(0, "%s !g%s!y desbaneó a !g%s!y.", SZPREFIX, name, stats[STAT_BAN_QUERY_RESULT]);
                    log_to_file("ban_systime_unban.txt", "<%s> desbaneó a <%s>", stats[STAT_BAN_QUERY_RESULT]);
                    TrieDeleteKey(g_trie_ban_stats, stats[STAT_BAN_QUERY_RESULT]);
                }
                ArrayDeleteItem(g_array_ban_stats, g_user_unban_selected[id]);
                show_menu_ban_list(id);
                SQL_FreeHandle(query);
            }
        }
        case 1: clcmd_ban(id);
    }
    return PLUGIN_HANDLED;
}

show_view_last_ten_disconnected(id)
{
    static menu;
    menu = menu_create("\yÚltimo diez usuarios desconectados", "handled_show_view_last_ten_disconnected");
    
    menu_additem(menu, "Ver lista en menú", "1", 0);
    menu_additem(menu, "Ver lista en consola", "2", 0);
    
    menu_setprop(menu, MPROP_BACKNAME, OPTION_BACKNAME);
    menu_setprop(menu, MPROP_NEXTNAME, OPTION_NEXTNAME);
    menu_setprop(menu, MPROP_EXITNAME, OPTION_EXITNAME);
    
    menu_display(id, menu);
}

public handled_show_view_last_ten_disconnected(id, menu, item)
{
    menu_destroy(menu);
    
    switch(item)
    {
        case MENU_EXIT: clcmd_ban(id);
        case 0: show_view_users_disconnected(id, 0);
        case 1: show_view_users_disconnected(id, 1);
    }
    return PLUGIN_HANDLED;
}

show_view_users_disconnected(id, page)
{
    static i, sztext[128];
    
    switch(page)
    {
        case 0:
        {
            static menu, num[2];
            menu = menu_create("\yUsuarios desconectados^nNombre de usuario | IP | STEAMID", "handled_show_view_users_disconnected");
            
            for (i = 0; i < g_number_users_disconnected; i++)
            {
                num_to_str((i + 1), num, charsmax(num));
                format(sztext, 127, "%s \r|\d%s \r| \d%s \r| \d%s", g_user_disconnected[i][USER_NAME], g_user_disconnected[i][USER_IP], g_user_disconnected[i][USER_STEAMID]);
                menu_additem(menu, sztext, num, _, menu_makecallback("bs_check_users_disconnected"));
            }
            menu_setprop(menu, MPROP_BACKNAME, OPTION_BACKNAME);
            menu_setprop(menu, MPROP_NEXTNAME, OPTION_NEXTNAME);
            menu_setprop(menu, MPROP_EXITNAME, OPTION_EXITNAME);
            menu_display(id, menu);
        }
        case 1:
        {
            client_cmd(id, "toggleconsole");
            
            console_print(id, "===== USUARIOS DESCONECTADOS =====");
            console_print(id, "");
            console_print(id, "");
            console_print(id, "");
            console_print(id, "# Nombre de usuario | IP | STEAMID | HWID");
            
            for(i = 0; i < g_number_users_disconnected; i++)
            {
                format(sztext, 127, "%d. %s | %s | %s", (i + 1), g_user_disconnected[i][USER_NAME], g_user_disconnected[i][USER_IP], g_user_disconnected[i][USER_STEAMID]);
                console_print(id, sztext);
            }
            console_print(id, "");
            console_print(id, "");
            console_print(id, "");
            console_print(id, "");
            console_print(id, "===== USUARIOS DESCONECTADOS =====");
            show_view_last_ten_disconnected(id);
        }
    }
    return PLUGIN_HANDLED;
}

public bs_check_users_disconnected(id, menu, item)
{
    return ITEM_DISABLED;
}
    
public handled_show_view_users_disconnected(id, menu, item)
{
    menu_destroy(menu);
    
    if(item == MENU_EXIT)
    {
        show_view_last_ten_disconnected(id);
    }
    return PLUGIN_HANDLED;
}    

show_menu_users(id, const tittle[], type)
{
    static menu, i, num[3];
    menu = menu_create(tittle, "handled_show_menu_users");
    
    g_user_page_selection[id] = type;
    
    for(i = 1; i <= g_maxplayers{0}; i++)
    {
        if(!is_user_connected(i))
        {
            continue;
        }
        num_to_str((i + 1), num, charsmax(num));
        menu_additem(menu, g_user_name[i], num);
    }
    menu_setprop(menu, MPROP_BACKNAME, OPTION_BACKNAME);
    menu_setprop(menu, MPROP_NEXTNAME, OPTION_NEXTNAME);
    menu_setprop(menu, MPROP_EXITNAME, OPTION_BACKNAME);
    
    set_pdata_int(id, PRIVATE_DATA_CSMENUCODE, false, PRIVATE_DATA_LINUX);
    menu_display(id, menu);
}

public handled_show_menu_users(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        show_menu_ban(id);
        return PLUGIN_HANDLED;
    }
    static num[3];
    static access;
    static itemid;
    
    menu_item_getinfo(menu, item, access, num, charsmax(num), _, _, access);
    itemid = str_to_num(num) - 1;
    menu_destroy(menu);
    
    if(is_user_connected(itemid))
    {
        switch(g_user_page_selection[id])
        {
            case MENU_BAN:
            {
                g_user_ban_selection[id] = itemid;
                show_option_ban(id, g_user_page_selection[id]);
            }
            case MENU_KICK:
            {
                chat_color(id, "%s !g%s!y expulsó a !g%s!y del servidor.", SZPREFIX, g_user_name[id], g_user_name[itemid]);
                server_cmd("kick #%d ^"Un administrador te expulsó del servidor^"", get_user_userid(itemid));
                show_menu_users(id, "Expulsar usuario", MENU_KICK);
            }
        }
    }
    return PLUGIN_HANDLED;
}

show_option_ban(id, page)
{
    g_user_page_selection[id] = page;
    
    static menu[512];
    
    switch(page)
    {
        case MENU_BAN:
        {
            static name[32];
            
            get_user_name(g_user_ban_selection[id], name, 31);
            format(menu, charsmax(menu), "\yBanear usuario^n^n\r* \wUsuario: \y%s^n^n\r1. \wSeleccionar otro usuario^n\r2. \wCalcular días en minutos: \y%d \d(%d minuto(s))^n\r3. \wCalcular horas en minutos: \y%d \d(%d minuto(s))^n^n\r* \dMinutos en total: \y%d^n^n\r4. \wIntroducir minutos: \y%d^n\r5. \wIntroducir razón: \y%s^n^n\r6. \yTipo de ban: \d%s^n\r7. \yEjecutar el ban^n^n\r0. \wVolver al menú anterior", name, g_user_ban_minutes_per_day_calculation[id], (1440 * g_user_ban_minutes_per_day_calculation[id]), g_user_ban_minutes_per_hour_calculation[id], (60 * g_user_ban_minutes_per_hour_calculation[id]), ((1440 * g_user_ban_minutes_per_day_calculation[id]) + (60 * g_user_ban_minutes_per_hour_calculation[id])), g_user_ban_minutes[id], g_user_ban_reason[id], BAN_TYPES[g_user_ban_type[id]]);
            show_menu(id, (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<9), menu, -1, "Show Option Ban");
        }
        case MENU_BAN_IP:
        {
            format(menu, charsmax(menu), "\yBanear IP^n^n\r* \wIP: \y%s^n^n\r1. \wIntroducir IP^n\r2. \wCalcular días en minutos: \y%d \d(%d minuto(s))^n\r3. \wCalcular horas en minutos: \y%d \d(%d minuto(s))^n^n\r* \dMinutos en total: \y%d^n^n\r4. \wIntroducir minutos: \y%d^n\r5. \wIntroducir razón: \y%s^n^n\r6. \yAgregar IP^n^n^n\r0. \wVolver al menú anterior", g_user_ban_add[id], g_user_ban_minutes_per_day_calculation[id], (1440 * g_user_ban_minutes_per_day_calculation[id]), g_user_ban_minutes_per_hour_calculation[id], (60 * g_user_ban_minutes_per_hour_calculation[id]), ((1440 * g_user_ban_minutes_per_day_calculation[id]) + (60 * g_user_ban_minutes_per_hour_calculation[id])), g_user_ban_minutes[id], g_user_ban_reason[id]);
            show_menu(id, (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<9), menu, -1, "Show Option Ban");
        }
        case MENU_BAN_STEAMID:
        {
            format(menu, charsmax(menu), "\yBanear STEAMID^n^n\r* \wSteamID: \y%s^n^n\r1. \wIntroducir SteamID^n\r2. \wCalcular días en minutos: \y%d \d(%d minuto(s))^n\r3. \wCalcular horas en minutos: \y%d \d(%d minuto(s))^n^n\r* \dMinutos en total: \y%d^n^n\r4. \wIntroducir minutos: \y%d^n\r5. \wIntroducir razón: \y%s^n^n\r6. \yAgregar STEAMID^n^n^n\r0. \wVolver al menú anterior", g_user_ban_add[id], g_user_ban_minutes_per_day_calculation[id], (1440 * g_user_ban_minutes_per_day_calculation[id]), g_user_ban_minutes_per_hour_calculation[id], (60 * g_user_ban_minutes_per_hour_calculation[id]), ((1440 * g_user_ban_minutes_per_day_calculation[id]) + (60 * g_user_ban_minutes_per_hour_calculation[id])), g_user_ban_minutes[id], g_user_ban_reason[id]);
            show_menu(id, (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<9), menu, -1, "Show Option Ban");
        }
    }
    return PLUGIN_HANDLED;
}

public handled_show_option_ban(id, key)
{
    switch(key)
    {
        case 0:
        {
            switch(g_user_page_selection[id])
            {
                case MENU_BAN: show_menu_users(id, "Banear usuario", MENU_BAN);
                case MENU_BAN_IP:
                {
                    g_messagemode[id] = INTRODUCIR_IP;
                    client_cmd(id, "messagemode INTRODUCIR_IP");
                }
                case MENU_BAN_STEAMID:
                {
                    g_messagemode[id] = INTRODUCIR_STEAMID;
                    client_cmd(id, "messagemode INTRODUCIR_STEAMID");
                }
            }
        }
        case 1:
        {
            g_messagemode[id] = CALCULAR_DIAS_EN_MINUTOS;
            client_cmd(id, "messagemode CALCULAR_DIAS_EN_MINUTOS");
        }
        case 2:
        {
            g_messagemode[id] = CALCULAR_HORAS_EN_MINUTOS;
            client_cmd(id, "messagemode CALCULAR_HORAS_EN_MINUTOS");
        }
        case 3:
        {
            g_messagemode[id] = INTRODUCIR_MINUTOS;
            client_cmd(id, "messagemode INTRODUCIR_MINUTOS");
        }
        case 4:
        {
            g_messagemode[id] = INTRODUCIR_RAZON;
            client_cmd(id, "messagemode INTRODUCIR_RAZON");
        }
        case 5:
        {
            switch(g_user_page_selection[id])
            {
                case MENU_BAN:
                {
                    if(g_user_ban_type[id] == 2)
                    {
                        g_user_ban_type[id] = 0;
                    }
                    else
                    {
                        g_user_ban_type[id]++;
                    }    
                    show_option_ban(id, g_user_page_selection[id]);
                }
                case MENU_BAN_IP:
                {
                    if(!strlen(g_user_ban_reason[id]))
                    {
                        chat_color(id, "%s !yTenés que introducir la razón del ban.", SZPREFIX);
                        show_option_ban(id, g_user_page_selection[id]);
                        return PLUGIN_HANDLED;
                    }
                    
                    if(!g_user_ban_minutes[id])
                    {
                        chat_color(id, "%s !yTenés que introducir los minutos del ban.", SZPREFIX);
                        show_option_ban(id, g_user_page_selection[id]);
                        return PLUGIN_HANDLED;
                    }
                    
                    if(!g_user_ban_add[id][0])
                    {
                        chat_color(id, "%s !yTenès que introducir una IP", SZPREFIX);
                        show_option_ban(id, g_user_page_selection[id]);
                        return PLUGIN_HANDLED;
                    }
                    
                    new Handle:query, time[32], unixtime, name[32], map[32];
                    
                    if(TrieKeyExists(g_trie_ban_stats, g_user_ban_add[id]))
                    {
                        chat_color(id, "%s !yLa IP introducida ya existe en la base de datos.", SZPREFIX);
                        show_option_ban(id, g_user_page_selection[id]);
                        return PLUGIN_HANDLED;
                    }
                    
                    unixtime = (get_systime() + (g_user_ban_minutes[id] * 60));
                    get_time("%d/%m/%Y - %H:%M:%S", time, 31);
                    format_time(g_user_ban_expire[id], 31, "%d/%m/%Y - %H:%M:%S", unixtime);
                    get_user_name(id, name, 31);
                    get_mapname(map, 31);
                    
                    query = SQL_PrepareQuery(g_sql_connection, "INSERT INTO `%s` (`ban_admin_name`, `ban_reason`, `ban_user`, `ban_time`, `ban_map`, `ban_register`, `ban_expire`, `ban_minutes`, `ban_page`) VALUES (^"%s^", ^"%s^", ^"%s^", '%d', ^"%s^", ^"%s^", ^"%s^", '%d', '%d');", SQL_TABLE, g_user_name[id], g_user_ban_reason[id], g_user_ban_add[id], unixtime, map, time, g_user_ban_expire[id], g_user_ban_minutes[id], g_user_page_selection[id]);
            
                    if(!SQL_Execute(query))
                    {
                        sql_query_error(query);
                    }
                    else
                    {
                        SQL_FreeHandle(query);
                        chat_color(0, "%s !g%s!y baneó la IP !g%s!y durante !g%d minuto%s!y. Razón: !g%s!y.", SZPREFIX, name, g_user_ban_add[id], g_user_ban_minutes[id], (g_user_ban_minutes[id] == 1) ? "" : "s", g_user_ban_reason[id]);
                        chat_color(0, "%s !yMinutos: !g%d minuto%s !t(%s)!y.", SZPREFIX, g_user_ban_minutes[id], (g_user_ban_minutes[id] == 1) ? "" : "s", check_time_calculated(g_user_ban_minutes[id]), (g_user_ban_minutes[id] == 1) ? "" : "s");
                        log_to_file("ban_system_ban_ip.txt", "<%s> baneó la IP <%s>", g_user_name[id], g_user_ban_add[id]);
                        check_copy_stats(g_user_name[id], g_user_ban_reason[id], map, time, g_user_ban_expire[id], "", g_user_ban_add[id], "", g_user_ban_minutes[id], MENU_BAN_IP, unixtime);    
                        reset_vars_string(id);
                    }
                }
                case MENU_BAN_STEAMID:
                {
                    if(!strlen(g_user_ban_reason[id]))
                    {
                        chat_color(id, "%s !yTenés que introducir la razón del ban.", SZPREFIX);
                        show_option_ban(id, g_user_page_selection[id]);
                        return PLUGIN_HANDLED;
                    }
                    
                    if(!g_user_ban_minutes[id])
                    {
                        chat_color(id, "%s !yTenés que introducir los minutos del ban.", SZPREFIX);
                        show_option_ban(id, g_user_page_selection[id]);
                        return PLUGIN_HANDLED;
                    }
                    
                    if(!g_user_ban_add[id][0])
                    {
                        chat_color(id, "%s !yTenès que introducir un SteamID", SZPREFIX);
                        show_option_ban(id, g_user_page_selection[id]);
                        return PLUGIN_HANDLED;
                    }
                    
                    new Handle:query, time[32], unixtime, name[32], map[31];
                    
                    if(TrieKeyExists(g_trie_ban_stats, g_user_ban_add[id]))
                    {
                        chat_color(id, "%s !yEl SteamID introducido ya existe en la base de datos.", SZPREFIX);
                        show_option_ban(id, g_user_page_selection[id]);
                        return PLUGIN_HANDLED;
                    }
                    
                    unixtime = (get_systime() + (g_user_ban_minutes[id] * 60));
                    get_time("%d/%m/%Y - %H:%M:%S", time, 31);
                    format_time(g_user_ban_expire[id], 31, "%d/%m/%Y - %H:%M:%S", unixtime);
                    get_user_name(id, name, 31);
                    get_mapname(map, 31);
                    
                    query = SQL_PrepareQuery(g_sql_connection, "INSERT INTO `%s` (`ban_admin_name`, `ban_reason`, `ban_user`, `ban_time`, `ban_map`, `ban_register`, `ban_expire`, `ban_minutes`, `ban_page`) VALUES (^"%s^", ^"%s^", ^"%s^", '%d', ^"%s^", ^"%s^", ^"%s^", ^"%s^", '%d', '%d');", SQL_TABLE, g_user_name[id], g_user_ban_reason[id], g_user_ban_add[id], unixtime, map, time, g_user_ban_expire[id], g_user_ban_minutes[id], g_user_page_selection[id]);
            
                    if(!SQL_Execute(query))
                    {
                        sql_query_error(query);
                    }
                    else
                    {
                        SQL_FreeHandle(query);
                        chat_color(0, "%s !g%s!y baneó el SteamID !g%s!y durante !g%d minuto%s!y. Razón: !g%s!y.", SZPREFIX, name, g_user_ban_add[id], g_user_ban_minutes[id], (g_user_ban_minutes[id] == 1) ? "" : "s", g_user_ban_reason[id]);
                        log_to_file("ban_system_ban_authid.txt", "<%s> baneó el SteamID <%s>", g_user_name[id], g_user_ban_add[id]);
                        check_copy_stats(g_user_name[id], g_user_ban_reason[id], map, time, g_user_ban_expire[id], "", g_user_ban_add[id], "", g_user_ban_minutes[id], MENU_BAN_STEAMID, unixtime);    
                        reset_vars_string(id);
                    }
                }
            }        
        }
        case 6:
        {
            if(!strlen(g_user_ban_reason[id]))
            {
                chat_color(id, "%s !yTenés que introducir la razón del ban.", SZPREFIX);
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            
            if(!g_user_ban_minutes[id])
            {
                chat_color(id, "%s !yTenés que introducir los minutos del ban.", SZPREFIX);
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            
            if(!is_user_connected(g_user_ban_selection[id]))
            {
                chat_color(id, "%s !yEl usuario seleccionado se desconectó del servidor.", SZPREFIX);
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            
            new Handle:query, time[32], mapname[64], unixtime, name[32], myname[32], query_result[35];
            
            switch(g_user_ban_type[id])
            {
                case BAN_IP: copy(query_result, 16, g_user_ip[g_user_ban_selection[id]]);
                case BAN_STEAMID: copy(query_result, 35, g_user_authid[g_user_ban_selection[id]]);
                
            }
            
            if (TrieKeyExists(g_trie_ban_stats, query_result))
            {
                chat_color(id, "%s !yYa existe un registro insertado de este tipo.", SZPREFIX);
                return PLUGIN_HANDLED;
            }
            
            unixtime = (get_systime() + (g_user_ban_minutes[id] * 60));
            get_time("%d/%m/%Y - %H:%M:%S", time, 31);
            format_time(g_user_ban_expire[g_user_ban_selection[id]], 31, "%d/%m/%Y - %H:%M:%S", unixtime);
            
            get_mapname(mapname, 63);
            get_user_name(id, myname, 31);
            get_user_name(g_user_ban_selection[id], name, 31);
            
            remove_quotes(g_user_ban_reason[id]);
            trim(g_user_ban_reason[id]);
            
            console_print(g_user_ban_selection[id], "");
            console_print(g_user_ban_selection[id], "");
            console_print(g_user_ban_selection[id], "****** BANEADO ******");
            console_print(g_user_ban_selection[id], "");
            console_print(g_user_ban_selection[id], "* Fuiste baneado del servidor");
            console_print(g_user_ban_selection[id], "* Administrador: %s", g_user_name[id]);
            console_print(g_user_ban_selection[id], "* Razón del ban: %s", g_user_ban_reason[id]);
            console_print(g_user_ban_selection[id], "* Mapa: %s", mapname);
            console_print(g_user_ban_selection[id], "* Tipo de ban: %s", BAN_TYPES[g_user_ban_type[id]]);
            console_print(g_user_ban_selection[id], "* Minutos: %d minuto%s", g_user_ban_minutes[id], (g_user_ban_minutes[id] == 1) ? "" : "s");
            console_print(g_user_ban_selection[id], "* Tiempo calculado: %s", check_time_calculated(g_user_ban_minutes[id]));
            console_print(g_user_ban_selection[id], "* Fecha del ban: %s", time);
            console_print(g_user_ban_selection[id], "* Expira en la fecha: %s", g_user_ban_expire[g_user_ban_selection[id]]);
            console_print(g_user_ban_selection[id], "");
            console_print(g_user_ban_selection[id], "* Fuiste baneado del servidor");
            console_print(g_user_ban_selection[id], "");
            console_print(g_user_ban_selection[id], "****** BANEADO ******");
            console_print(g_user_ban_selection[id], "");
            console_print(g_user_ban_selection[id], "");
            
            query = SQL_PrepareQuery(g_sql_connection, "INSERT INTO `%s` (`ban_name`, `ban_admin_name`, `ban_reason`, `ban_user`, `ban_time`, `ban_map`, `ban_register`, `ban_expire`, `ban_type`, `ban_minutes`, `ban_page`) VALUES (^"%s^", ^"%s^", ^"%s^", ^"%s^", '%d', ^"%s^", ^"%s^", ^"%s^", ^"%s^", '%d', '%d');", SQL_TABLE, name, myname, g_user_ban_reason[id], query_result, unixtime, mapname, time, g_user_ban_expire[g_user_ban_selection[id]], BAN_TYPES[g_user_ban_type[id]], g_user_ban_minutes[id], g_user_page_selection[id]);
            
            if(!SQL_Execute(query))
            {
                sql_query_error(query);
            }
            else
            {
                SQL_FreeHandle(query);
                reset_vars_string(id);
            }
            
            check_copy_stats(g_user_name[id], g_user_ban_reason[id], mapname, time, g_user_ban_expire[g_user_ban_selection[id]], BAN_TYPES[g_user_ban_type[id]], query_result, g_user_name[g_user_ban_selection[id]], g_user_ban_minutes[id], g_user_page_selection[id], unixtime);
            
            server_cmd("kick #%d ^"Te banearon del servidor, mirá tu consola^"", get_user_userid(g_user_ban_selection[id]));
            chat_color(0, "%s !g%s!y baneó a !g%s!y. Razón: !g%s!y.", SZPREFIX, g_user_name[id], g_user_name[g_user_ban_selection[id]], g_user_ban_reason[id]);
            chat_color(0, "%s !yMinutos: !g%d minuto%s !t(%s)!y.", SZPREFIX, g_user_ban_minutes[id], (g_user_ban_minutes[id] == 1) ? "" : "s", check_time_calculated(g_user_ban_minutes[id]), (g_user_ban_minutes[id] == 1) ? "" : "s");
            log_to_file("ban_systime_ban.txt", "<%s> baneó a <%s>", g_user_name[id], g_user_name[g_user_ban_selection[id]]);
        }
        case 9: show_menu_ban(id);
    }
    return PLUGIN_HANDLED;
}

public clcmd_messagemode(id)
{
    if(!is_user_admin(id))
    {
        return PLUGIN_HANDLED;
    }
    
    if(g_user_ban_status[id])
    {
        return PLUGIN_HANDLED;
    }
    
    static args[28];
    read_args(args, 27);
    remove_quotes(args);
    trim(args);
    
    switch(g_messagemode[id])
    {
        case CALCULAR_DIAS_EN_MINUTOS:
        {
            if (!isdigit(args[0]))
            {
                chat_color(id, "%s !ySolo están permitidos números.", SZPREFIX);
                client_cmd(id, "messagemode CALCULAR_DIAS_EN_MINUTOS");
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            g_user_ban_minutes_per_day_calculation[id] = str_to_num(args);
            show_option_ban(id, g_user_page_selection[id]);
        }
        case CALCULAR_HORAS_EN_MINUTOS:
        {
            if(!isdigit(args[0]))
            {
                chat_color(id, "%s !ySolo están permitidos números.", SZPREFIX);
                client_cmd(id, "messagemode CALCULAR_HORAS_EN_MINUTOS");
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            g_user_ban_minutes_per_hour_calculation[id] = str_to_num(args);
            show_option_ban(id, g_user_page_selection[id]);
        }
        case INTRODUCIR_MINUTOS:
        {
            if(!isdigit(args[0]))
            {
                chat_color(id, "%s !ySolo están permitidos números.", SZPREFIX);
                client_cmd(id, "messagemode INTRODUCIR_MINUTOS");
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            g_user_ban_minutes[id] = str_to_num(args);
            show_option_ban(id, g_user_page_selection[id]);
        }
        case INTRODUCIR_RAZON:
        {
            if(strlen(args) < 4)
            {
                chat_color(id, "%s !yLa razón del ban debe tener más de 4 carácteres.", SZPREFIX);
                client_cmd(id, "messagemode INTRODUCIR_RAZON");
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            if (strlen(args) > REASON_MAX_LENGTH)
            {
                chat_color(id, "%s !yLa razón del ban no puede tener más de %d carácteres.", SZPREFIX, REASON_MAX_LENGTH);
                client_cmd(id, "messagemode INTRODUCIR_RAZON");
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            copy(g_user_ban_reason[id], 127, args);
            show_option_ban(id, g_user_page_selection[id]);
        }
        case INTRODUCIR_IP:
        {
            if (strlen(args) < 5)
            {
                chat_color(id, "%s !yLa IP debe tener más de 5 carácteres.", SZPREFIX);
                client_cmd(id, "messagemode INTRODUCIR_IP");
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }

            if (!(contain(args, ".") != -1))
            {
                chat_color(id, "%s !yTenés que introducir una IP.", SZPREFIX);
                client_cmd(id, "messagemode INTRODUCIR_IP");
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            copy(g_user_ban_add[id], 16, args);
            show_option_ban(id, g_user_page_selection[id]);
        }
        case INTRODUCIR_STEAMID:
        {
            if(strlen(args) < 5)
            {
                chat_color(id, "%s !yEl SteamID debe tener más de 5 carácteres.", SZPREFIX);
                client_cmd(id, "messagemode INTRODUCIR_STEAMID");
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            
            if(!(contain(args, "STEAM_") != -1))
            {
                chat_color(id, "%s !yTenés que introducir una SteamID.", SZPREFIX);
                client_cmd(id, "messagemode INTRODUCIR_STEAMID");
                show_option_ban(id, g_user_page_selection[id]);
                return PLUGIN_HANDLED;
            }
            copy(g_user_ban_add[id], 16, args);
            show_option_ban(id, g_user_page_selection[id]);
        }
    }
    return PLUGIN_HANDLED;
}

public clcmd_changeteam(id)
{
    if(g_user_ban_status[id])
    {
        show_menu_banned(id);
        return PLUGIN_HANDLED;
    }
    return PLUGIN_CONTINUE;
}

show_menu_banned(id)
{
    static menu[400];
    
    switch(g_user_page_selection[id])
    {
        case MENU_BAN: formatex(menu, charsmax(menu), "\yMenú de ban SQL desarrollado por \r%s^n^n\r* \yEstás baneado del servidor^n\r* \wAdministrador: \y%s^n\r* \wRazón: \y%s^n\r* \wMapa: \y%s^n\r* \wTipo de ban: \y%s^n\r* \wMinutos: \y%d minuto%s^n\r* \wTiempo calculado: \y%s^n\r* \wFecha del ban: \y%s^n\r* \wEl ban expira en la fecha: \y%s", PLUGIN_AUTHOR, g_user_ban_admin[id], g_user_ban_reason[id], g_user_ban_map[id], g_user_ban_type_name[id], g_user_ban_minutes[id], (g_user_ban_minutes[id] == 1) ? "" : "s", check_time_calculated(g_user_ban_minutes[id]), g_user_ban_register[id], g_user_ban_expire[id]);
        case MENU_BAN_IP: formatex(menu, charsmax(menu), "\yMenú de ban SQL desarrollado por \r%s^n^n\r* \wTu IP fue baneada^n\r* \wAdministrador: \y%s^n\r* \wRazón: \y%s^n\r* \wTu IP fue agregada en el mapa: \y%s^n\r* \wMinutos: \y%d minuto%s^n\r* \wTiempo calculado: \y%s^n\r* \wFecha del ban: \y%s^n\r* \wEl ban expira en la fecha: \y%s", PLUGIN_AUTHOR, g_user_ban_admin[id], g_user_ban_reason[id], g_user_ban_map[id], g_user_ban_minutes[id], (g_user_ban_minutes[id] == 1) ? "" : "s", check_time_calculated(g_user_ban_minutes[id]), g_user_ban_register[id], g_user_ban_expire[id]);
        case MENU_BAN_STEAMID: formatex(menu, charsmax(menu), "\yMenú de ban SQL desarrollado por \r%s^n^n\r* \yTu SteamID fue baneado^n\r* \wAdministrador: \y%s^n\r* \wRazón: \y%s^n\r* \wTu SteamID fue agregado en el mapa: \y%s^n\r* \wMinutos: \y%d minuto%s^n\r* \wTiempo calculado: \y%s^n\r* \wFecha del ban: \y%s^n\r* \wEl ban expira en la fecha: \y%s", PLUGIN_AUTHOR, g_user_ban_admin[id], g_user_ban_reason[id], g_user_ban_map[id], g_user_ban_minutes[id], (g_user_ban_minutes[id] == 1) ? "" : "s", check_time_calculated(g_user_ban_minutes[id]), g_user_ban_register[id], g_user_ban_expire[id]);
    }
    show_menu(id, FM_NULLENT, menu, FM_NULLENT, "Show Menu Banned");
}

check_time_calculated(user_minutes)
{
    new hours, minutes, days, time_calculated[40];
    minutes = user_minutes;
    
    days = 0;
    hours = 0;
    
    while(minutes >= 1440)
    {
        days++;
        minutes -= 1440;
    }
    
    while(minutes >= 60)
    {
        hours++;
        minutes -= 60;
    }
    format(time_calculated, charsmax(time_calculated), "%d día%s, %d hora%s, %d minuto%s", days, (days == 1) ? "" : "s", hours, (hours == 1) ? "" : "s", minutes, (minutes == 1) ? "" : "s");
    return time_calculated;
}

chat_color(id, const input[], any:...)
{
    static message[191];
    vformat(message, 190, input, 3);
    
    replace_all(message, 190, "!g", "^4");
    replace_all(message, 190, "!t", "^3");
    replace_all(message, 190, "!y", "^1");
    
    message_begin((id) ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, get_user_msgid("SayText"), .player = id);
    write_byte((id) ? id : 33);
    write_string(message);
    message_end();
}
tambien tengo este problema para conectarme via mysql, mi base de datos esta bien ya que funcione perfectamente con otros plugins

L 07/26/2022 - 00:49:43: Access denied for user 'MGHGrL'@'%' to database 'sql_ban_databasee'
L 07/26/2022 - 00:49:43: [AMXX] Plugin ("ban_system.amxx") is setting itself as failed.
L 07/26/2022 - 00:49:43: [AMXX] Plugin says: Access denied for user 'MGHGrL'@'%' to database 'sql_ban_databasee'
L 07/26/2022 - 00:49:43: [AMXX] Displaying debug trace (plugin "ban_system.amxx", version "v2.0")
L 07/26/2022 - 00:49:43: [AMXX] Run time error 1: forced exit
L 07/26/2022 - 00:49:43: [AMXX]    [0] ban_system.sma::plugin_init (line 187)
Código PHP:
crear_tablas()
{
    new 
tabla[512];

    
format(tablacharsmax(tabla), "CREATE TABLE IF NOT EXISTS `sql_ban` \
    (\
    ban_name varchar(32) NOT NULL DEFAULT '', \
    ban_admin_name varchar(32) NOT NULL DEFAULT '', \
    ban_reason varchar(21) NOT NULL DEFAULT '', \
    ban_user varchar(32) NOT NULL DEFAULT '', \
    ban_time int NOT NULL DEFAULT '0', \
    ban_map varchar(21) NOT NULL DEFAULT '', \
    ban_register varchar(21) NOT NULL DEFAULT '', \
    ban_expire varchar(21) NOT NULL DEFAULT '', \
    ban_type varchar(8) NOT NULL DEFAULT '', \
    ban_minutes int NOT NULL DEFAULT '0', \
    ban_page int NOT NULL DEFAULT '0')"
);

    new 
Handlequery;
    
query SQL_PrepareQuery(g_sql_connectiontabla);

    if (
SQL_Execute(query)) SQL_FreeHandle(query); // Se crean las tablas correctamente
    
else
    {
        
SQL_FreeHandle(query);

        
log_to_file("SQL_ERROR_TABLAS.txt""No se pudo crear las tablas por un error en la consulta.");
    }


arriba de
Código PHP:
g_trie_ban_stats TrieCreate(); 
pones
Código PHP:
crear_tablas(); 
Quedaria...

Código PHP:
if(g_sql_connection == Empty_Handle)
    {
        
log_to_file("SQL_Connection.log""%s"szerror);
        
set_fail_state(szerror);
        return;
    }

    
crear_tablas();

    
g_trie_ban_stats TrieCreate();
    
g_array_ban_stats ArrayCreate(STATS_BAN_STRUCT); 
Respecto a este error
Código PHP:
Access denied for user 'MGHGrL'@'%' to database 'sql_ban_databasee' 

Generalmente me sucedia porque estaba mal configurado la contraseña o ponia mal los datos al hacer la conexion.
Pregunta, esto está comentado no?
#define USE_SQLITE
(26/07/2022, 12:45 PM)alexiways escribió: [ -> ]Pregunta, esto está comentado no?
Código:
#define USE_SQLITE
(26/07/2022, 07:52 AM)[E]manuelitop15 escribió: [ -> ]
Código PHP:
crear_tablas()
{
    new 
tabla[512];

    
format(tablacharsmax(tabla), "CREATE TABLE IF NOT EXISTS `sql_ban` \
    (\
    ban_name varchar(32) NOT NULL DEFAULT '', \
    ban_admin_name varchar(32) NOT NULL DEFAULT '', \
    ban_reason varchar(21) NOT NULL DEFAULT '', \
    ban_user varchar(32) NOT NULL DEFAULT '', \
    ban_time int NOT NULL DEFAULT '0', \
    ban_map varchar(21) NOT NULL DEFAULT '', \
    ban_register varchar(21) NOT NULL DEFAULT '', \
    ban_expire varchar(21) NOT NULL DEFAULT '', \
    ban_type varchar(8) NOT NULL DEFAULT '', \
    ban_minutes int NOT NULL DEFAULT '0', \
    ban_page int NOT NULL DEFAULT '0')"
);

    new Handlequery;
    query SQL_PrepareQuery(g_sql_connectiontabla);

    if (SQL_Execute(query)) SQL_FreeHandle(query); // Se crean las tablas correctamente
    else
    {
        SQL_FreeHandle(query);

        log_to_file("SQL_ERROR_TABLAS.txt""No se pudo crear las tablas por un error en la consulta.");
    }


arriba de
Código PHP:
g_trie_ban_stats TrieCreate(); 
pones
Código PHP:
crear_tablas(); 
Quedaria...

Código PHP:
    if(g_sql_connection == Empty_Handle)
    {
        log_to_file("SQL_Connection.log""%s"szerror);
        set_fail_state(szerror);
        return;
    }

    crear_tablas();

    g_trie_ban_stats TrieCreate();
    g_array_ban_stats ArrayCreate(STATS_BAN_STRUCT); 
Respecto a este error
Código PHP:
Access denied for user 'MGHGrL'@'%' to database 'sql_ban_databasee' 

Generalmente me sucedia porque estaba mal configurado la contraseña o ponia mal los datos al hacer la conexion.

Gracias, pero me sigue dando el mismo problema, coloco otro plugin con mysql y si conecta perfectamente no entiendo porque con este no quiere conectar
Código PHP:
L 07/26/2022 13:25:41Access denied for user 'MGHGrL'@'%' to database 'sql_ban_database'
L 07/26/2022 13:25:41: [AMXXPlugin ("ban_system.amxx"is setting itself as failed.
L 07/26/2022 13:25:41: [AMXXPlugin saysAccess denied for user 'MGHGrL'@'%' to database 'sql_ban_database'
L 07/26/2022 13:25:41: [AMXXDisplaying debug trace (plugin "ban_system.amxx"version "v2.0")
L 07/26/2022 13:25:41: [AMXXRun time error 1forced exit 
L 07/26/2022 13:25:41: [AMXX]    [0ban_system.sma::plugin_init (line 196
(26/07/2022, 02:28 PM)Meliodas escribió: [ -> ]Gracias, pero me sigue dando el mismo problema, coloco otro plugin con mysql y si conecta perfectamente no entiendo porque con este no quiere conectar
Código PHP:
L 07/26/2022 13:25:41Access denied for user 'MGHGrL'@'%' to database 'sql_ban_database'
L 07/26/2022 13:25:41: [AMXXPlugin ("ban_system.amxx"is setting itself as failed.
L 07/26/2022 13:25:41: [AMXXPlugin saysAccess denied for user 'MGHGrL'@'%' to database 'sql_ban_database'
L 07/26/2022 13:25:41: [AMXXDisplaying debug trace (plugin "ban_system.amxx"version "v2.0")
L 07/26/2022 13:25:41: [AMXXRun time error 1forced exit 
L 07/26/2022 13:25:41: [AMXX]    [0ban_system.sma::plugin_init (line 196

Comenta esa linea
Código:
//#define USE_SQLITE
Muchas gracias a todos, ya me funciona perfectamente Gran sonrisa.