Raised This Month: $32 Target: $400
 8% 

advanced bans


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
giumbalau
Member
Join Date: Jan 2021
Old 06-17-2021 , 23:11   advanced bans
Reply With Quote #1

Does anyone know how to add this equal in advanced bans amx_addban command please...

PHP Code:
if (!(get_user_flags(id) & ADMIN_RCON))
    {
        new 
bool:canban false;
        new 
bool:isip false;
        
// Limited access to this command
        
if (equali(arg"STEAM_ID_PENDING") ||
            
equali(arg"STEAM_ID_LAN") ||
            
equali(arg"HLTV") ||
            
equali(arg"4294967295") ||
            
equali(arg"VALVE_ID_LAN") ||
            
equali(arg"VALVE_ID_PENDING"))
        {
            
// Hopefully we never get here, so ML shouldn't be needed
            
console_print(id"Cannot ban %s"arg);
            return 
PLUGIN_HANDLED;
        } 
PHP Code:
/* AMX Mod X
*   Admin Commands Plugin
*
* by the AMX Mod X Development Team
*  originally developed by OLO
*
* This file is part of AMX Mod X.
*
*
*  This program is free software; you can redistribute it and/or modify it
*  under the terms of the GNU General Public License as published by the
*  Free Software Foundation; either version 2 of the License, or (at
*  your option) any later version.
*
*  This program is distributed in the hope that it will be useful, but
*  WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
*  General Public License for more details.
*
*  You should have received a copy of the GNU General Public License
*  along with this program; if not, write to the Free Software Foundation, 
*  Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*  In addition, as a special exception, the author gives permission to
*  link the code of this program with the Half-Life Game Engine ("HL
*  Engine") and Modified Game Libraries ("MODs") developed by Valve, 
*  L.L.C ("Valve"). You must obey the GNU General Public License in all
*  respects for all of the code used other than the HL Engine and MODs
*  from Valve. If you modify this file, you may extend this exception
*  to your version of the file, but you are not obligated to do so. If
*  you do not wish to do so, delete this exception statement from your
*  version.
*/

#include <amxmodx>
#include <amxmisc>

// This is not a dynamic array because it would be bad for 24/7 map servers.
#define OLD_CONNECTION_QUEUE 10

new g_pauseCon
new Float:g_pausAble
new bool:g_Paused
new bool:g_PauseAllowed false
new g_addCvar[] = "amx_cvar add %s"

new pausable;
new 
rcon_password;

// Old connection queue
new g_Names[OLD_CONNECTION_QUEUE][32];
new 
g_SteamIDs[OLD_CONNECTION_QUEUE][32];
new 
g_IPs[OLD_CONNECTION_QUEUE][32];
new 
g_Access[OLD_CONNECTION_QUEUE];
new 
g_Tracker;
new 
g_Size;

stock InsertInfo(id)
{
    
    
// Scan to see if this entry is the last entry in the list
    // If it is, then update the name and access
    // If it is not, then insert it again.

    
if (g_Size 0)
    {
        new 
ip[32]
        new 
auth[32];

        
get_user_authid(idauthcharsmax(auth));
        
get_user_ip(idipcharsmax(ip), 1/*no port*/);

        new 
last 0;
        
        if (
g_Size sizeof(g_SteamIDs))
        {
            
last g_Size 1;
        }
        else
        {
            
last g_Tracker 1;
            
            if (
last 0)
            {
                
last g_Size 1;
            }
        }
        
        if (
equal(authg_SteamIDs[last]) &&
            
equal(ipg_IPs[last])) // need to check ip too, or all the nosteams will while it doesn't work with their illegitimate server
        
{
            
get_user_name(idg_Names[last], charsmax(g_Names[]));
            
g_Access[last] = get_user_flags(id);
            
            return;
        }
    }
    
    
// Need to insert the entry
    
    
new target 0;  // the slot to save the info at

    // Queue is not yet full
    
if (g_Size sizeof(g_SteamIDs))
    {
        
target g_Size;
        
        ++
g_Size;
        
    }
    else
    {
        
target g_Tracker;
        
        ++
g_Tracker;
        
// If we reached the end of the array, then move to the front
        
if (g_Tracker == sizeof(g_SteamIDs))
        {
            
g_Tracker 0;
        }
    }
    
    
get_user_authid(idg_SteamIDs[target], charsmax(g_SteamIDs[]));
    
get_user_name(idg_Names[target], charsmax(g_Names[]));
    
get_user_ip(idg_IPs[target], charsmax(g_IPs[]), 1/*no port*/);
    
    
g_Access[target] = get_user_flags(id);

}
stock GetInfo(iname[], namesizeauth[], authsizeip[], ipsize, &access)
{
    if (
>= g_Size)
    {
        
abort(AMX_ERR_NATIVE"GetInfo: Out of bounds (%d:%d)"ig_Size);
    }
    
    new 
target = (g_Tracker i) % sizeof(g_SteamIDs);
    
    
copy(namenamesizeg_Names[target]);
    
copy(authauthsizeg_SteamIDs[target]);
    
copy(ip,   ipsize,   g_IPs[target]);
    
access g_Access[target];
    
}
public 
client_disconnect(id)
{
    if (!
is_user_bot(id))
    {
        
InsertInfo(id);
    }
}

public 
plugin_init()
{
    
register_plugin("Admin Commands"AMXX_VERSION_STR"AMXX Dev Team")

    
register_dictionary("admincmd.txt")
    
register_dictionary("common.txt")
    
register_dictionary("adminhelp.txt")
    
    
    
register_concmd("amx_kick""cmdKick"ADMIN_KICK"<name or #userid> [reason]")
    
register_concmd("amx_ban""cmdBan"ADMIN_BAN"<name or #userid> <minutes> [reason]")
    
register_concmd("amx_banip""cmdBanIP"ADMIN_BAN"<name or #userid> <minutes> [reason]")
    
register_concmd("amx_addban""cmdAddBan"ADMIN_BAN"<^"authid^" or ip> <minutes> [reason]")
    
register_concmd("amx_unban""cmdUnban"ADMIN_BAN"<^"authid^" or ip>")
    
register_concmd("amx_slay""cmdSlay"ADMIN_SLAY"<name or #userid>")
    
register_concmd("amx_slap""cmdSlap"ADMIN_SLAY"<name or #userid> [power]")
    
register_concmd("amx_leave""cmdLeave"ADMIN_KICK"<tag> [tag] [tag] [tag]")
    
register_concmd("amx_pause""cmdPause"ADMIN_CVAR"- pause or unpause the game")
    
register_concmd("amx_who""cmdWho"ADMIN_ADMIN"- displays who is on server")
    
register_concmd("amx_cvar""cmdCvar"ADMIN_CVAR"<cvar> [value]")
    
register_concmd("amx_plugins""cmdPlugins"ADMIN_ADMIN)
    
register_concmd("amx_modules""cmdModules"ADMIN_ADMIN)
    
register_concmd("amx_map""cmdMap"ADMIN_MAP"<mapname>")
    
register_concmd("amx_cfg""cmdCfg"ADMIN_CFG"<filename>")
    
register_concmd("amx_nick""cmdNick"ADMIN_SLAY"<name or #userid> <new nick>")
    
register_concmd("amx_last""cmdLast"ADMIN_BAN"- list the last few disconnected clients info");
    
register_clcmd("amx_rcon""cmdRcon"ADMIN_RCON"<command line>")
    
register_clcmd("amx_showrcon""cmdShowRcon"ADMIN_RCON"<command line>")
    
register_clcmd("pauseAck""cmdLBack")


    
rcon_password=get_cvar_pointer("rcon_password");
    
pausable=get_cvar_pointer("pausable");
    
    
}

public 
plugin_cfg()
{
    
// Cvars which can be changed only with rcon access
    
server_cmd(g_addCvar"rcon_password")
    
server_cmd(g_addCvar"amx_show_activity")
    
server_cmd(g_addCvar"amx_mode")
    
server_cmd(g_addCvar"amx_password_field")
    
server_cmd(g_addCvar"amx_default_access")
    
server_cmd(g_addCvar"amx_reserved_slots")
    
server_cmd(g_addCvar"amx_reservation")
    
server_cmd(g_addCvar"amx_conmotd_file")
    
server_cmd(g_addCvar"amx_sql_table");
    
server_cmd(g_addCvar"amx_sql_host");
    
server_cmd(g_addCvar"amx_sql_user");
    
server_cmd(g_addCvar"amx_sql_pass");
    
server_cmd(g_addCvar"amx_sql_db");
    
server_cmd(g_addCvar"amx_sql_type");

}

public 
cmdKick(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED

    
new arg[32]
    
read_argv(1arg31)
    new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY CMDTARGET_ALLOW_SELF)
    
    if (!
player)
        return 
PLUGIN_HANDLED
    
    
new authid[32], authid2[32], name2[32], name[32], userid2reason[32]
    
    
get_user_authid(idauthid31)
    
get_user_authid(playerauthid231)
    
get_user_name(playername231)
    
get_user_name(idname31)
    
userid2 get_user_userid(player)
    
read_argv(2reason31)
    
remove_quotes(reason)
    
    
log_amx("Kick: ^"%s<%d><%s><>^" kick ^"%s<%d><%s><>^" (reason ^"%s^")"nameget_user_userid(id), authidname2userid2authid2reason)

    
show_activity_key("ADMIN_KICK_1""ADMIN_KICK_2"namename2);

    if (
is_user_bot(player))
        
server_cmd("kick #%d"userid2)
    else
    {
        if (
reason[0])
            
server_cmd("kick #%d ^"%s^""userid2reason)
        else
            
server_cmd("kick #%d"userid2)
    }
    
    
console_print(id"[AMXX] Client ^"%s^" kicked"name2)
    
    return 
PLUGIN_HANDLED
}

public 
cmdUnban(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[32], authid[32], name[32]
    
    
read_argv(1arg31)
    
    if (
contain(arg".") != -1)
    {
        
server_cmd("removeip ^"%s^";writeip"arg)
        
console_print(id"[AMXX] %L"id"IP_REMOVED"arg)
    } else {
        
server_cmd("removeid %s;writeid"arg)
        
console_print(id"[AMXX] %L"id"AUTHID_REMOVED"arg)
    }

    
get_user_name(idname31)

    
show_activity_key("ADMIN_UNBAN_1""ADMIN_UNBAN_2"namearg);

    
get_user_authid(idauthid31)
    
log_amx("Cmd: ^"%s<%d><%s><>^" unban ^"%s^""nameget_user_userid(id), authidarg)
    
    return 
PLUGIN_HANDLED
}

/* amx_addban is a special command now.
 * If a user with rcon uses it, it bans the user.  No questions asked.
 * If a user without rcon but with ADMIN_BAN uses it, it will scan the old
 * connection queue, and if it finds the info for a player in it, it will
 * check their old access.  If they have immunity, it will not ban.
 * If they do not have immunity, it will ban.  If the user is not found,
 * it will refuse to ban the target.
 */
 
public cmdAddBan(idlevelcid)
{
    if (!
cmd_access(idlevelcid3true)) // check for ADMIN_BAN access
    
{
        if (
get_user_flags(id) & level// Getting here means they didn't input enough args
        
{
            return 
PLUGIN_HANDLED;
        }
        if (!
cmd_access(idADMIN_RCONcid3)) // If somehow they have ADMIN_RCON without ADMIN_BAN, continue
        
{
            return 
PLUGIN_HANDLED;
        }
    }

    new 
arg[32], authid[32], name[32], minutes[32], reason[32]
    
    
read_argv(1arg31)
    
read_argv(2minutes31)
    
read_argv(3reason31)
    
    
    if (!(
get_user_flags(id) & ADMIN_RCON))
    {
        new 
bool:canban false;
        new 
bool:isip false;
        
// Limited access to this command
        
if (equali(arg"STEAM_ID_PENDING") ||
            
equali(arg"STEAM_ID_LAN") ||
            
equali(arg"HLTV") ||
            
equali(arg"4294967295") ||
            
equali(arg"VALVE_ID_LAN") ||
            
equali(arg"VALVE_ID_PENDING"))
        {
            
// Hopefully we never get here, so ML shouldn't be needed
            
console_print(id"Cannot ban %s"arg);
            return 
PLUGIN_HANDLED;
        }
        
        if (
contain(arg".") != -1)
        {
            
isip true;
        }
        
        
// Scan the disconnection queue
        
if (isip)
        {
            new 
IP[32];
            new 
Name[32];
            new 
dummy[1];
            new 
Access;
            for (new 
0g_Sizei++)
            {
                
GetInfo(iNamecharsmax(Name), dummy0IPcharsmax(IP), Access);
                
                if (
equal(IParg))
                {
                    if (
Access ADMIN_IMMUNITY)
                    {
                        
console_print(id"[AMXX] %s : %L"IPid"CLIENT_IMM"Name);
                        
                        return 
PLUGIN_HANDLED;
                    }
                    
// User did not have immunity
                    
canban true;
                }
            }
        }
        else
        {
            new 
Auth[32];
            new 
Name[32];
            new 
dummy[1];
            new 
Access;
            for (new 
0g_Sizei++)
            {
                
GetInfo(iNamecharsmax(Name), Authcharsmax(Auth), dummy0Access);
                
                if (
equal(Autharg))
                {
                    if (
Access ADMIN_IMMUNITY)
                    {
                        
console_print(id"[AMXX] %s : %L"Authid"CLIENT_IMM"Name);
                        
                        return 
PLUGIN_HANDLED;
                    }
                    
// User did not have immunity
                    
canban true;
                }
            }
        }
        
        if (!
canban)
        {
            
console_print(id"[AMXX] You may only ban recently disconnected clients.  Use ^"amx_last^" to view.");
            
            return 
PLUGIN_HANDLED;
        }
        
    }
    
    
// User has access to ban their target
    
if (contain(arg".") != -1)
    {
        
server_cmd("addip ^"%s^" ^"%s^";wait;writeip"minutesarg)
        
console_print(id"[AMXX] Ip ^"%s^" added to ban list"arg)
    } else {
        
server_cmd("banid ^"%s^" ^"%s^";wait;writeid"minutesarg)
        
console_print(id"[AMXX] Authid ^"%s^" added to ban list"arg)
    }

    
get_user_name(idname31)

    
show_activity_key("ADMIN_ADDBAN_1""ADMIN_ADDBAN_2"namearg);

    
get_user_authid(idauthid31)
    
log_amx("Cmd: ^"%s<%d><%s><>^" ban ^"%s^" (minutes ^"%s^") (reason ^"%s^")"nameget_user_userid(id), authidargminutesreason)

    return 
PLUGIN_HANDLED
}

public 
cmdBan(idlevelcid)
{
    if (!
cmd_access(idlevelcid3))
        return 
PLUGIN_HANDLED

    
new target[32], minutes[8], reason[64]
    
    
read_argv(1target31)
    
read_argv(2minutes7)
    
read_argv(3reason63)
    
    new 
player cmd_target(idtargetCMDTARGET_OBEY_IMMUNITY CMDTARGET_NO_BOTS CMDTARGET_ALLOW_SELF)
    
    if (!
player)
        return 
PLUGIN_HANDLED

    
new authid[32], name2[32], authid2[32], name[32]
    new 
userid2 get_user_userid(player)

    
get_user_authid(playerauthid231)
    
get_user_authid(idauthid31)
    
get_user_name(playername231)
    
get_user_name(idname31)
    
    
log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")"nameget_user_userid(id), authidname2userid2authid2minutesreason)
    
    new 
temp[64], banned[16], nNum str_to_num(minutes)
    if (
nNum)
        
format(temp63"%L"player"FOR_MIN"minutes)
    else
        
format(temp63"%L"player"PERM")

    
format(banned15"%L"player"BANNED")

    
/* CURRENT CODE
    if (reason[0])
        server_cmd("kick #%d ^"%s (%s %s)^";wait;banid ^"%s^" ^"%s^";wait;writeid", userid2, reason, banned, temp, minutes, authid2)
    else
        server_cmd("kick #%d ^"%s %s^";wait;banid ^"%s^" ^"%s^";wait;writeid", userid2, banned, temp, minutes, authid2)
    */
 
    // START OF NEW CODE
    
if (reason[0])
        
server_cmd("kick #%d ^"%(%%s)^""userid2reasonbannedtemp)
    else
        
server_cmd("kick #%d ^"%%s^""userid2bannedtemp)
 
    
server_cmd("banid %s %s"minutesauthid2)
    
server_cmd("writeid")
    
// END OF NEW CODE
    
    // Display the message to all clients

    
new msg[256];
    new 
len;
    new 
maxpl get_maxplayers();
    for (new 
1<= maxpli++)
    {
        if (
is_user_connected(i) && !is_user_bot(i))
        {
            
len formatex(msgcharsmax(msg), "%L"i"BAN");
            
len += formatex(msg[len], charsmax(msg) - len" %s "name2);
            if (
nNum)
            {
                
formatex(msg[len], charsmax(msg) - len"%L"i"FOR_MIN"minutes);
            }
            else
            {
                
formatex(msg[len], charsmax(msg) - len"%L"i"PERM");
            }
            if (
strlen(reason) > 0)
            {
                
formatex(msg[len], charsmax(msg) - len" (%L: %s)"i"REASON"reason);
            }
            
show_activity_id(iidnamemsg);
        }
    }
    
    
console_print(id"[AMXX] %L"id"CLIENT_BANNED"name2)
    
    return 
PLUGIN_HANDLED
}

public 
cmdBanIP(idlevelcid)
{
    if (!
cmd_access(idlevelcid3))
        return 
PLUGIN_HANDLED
    
    
new target[32], minutes[8], reason[64]
    
    
read_argv(1target31)
    
read_argv(2minutes7)
    
read_argv(3reason63)
    
    new 
player cmd_target(idtargetCMDTARGET_OBEY_IMMUNITY CMDTARGET_NO_BOTS CMDTARGET_ALLOW_SELF)
    
    if (!
player)
    {
        
// why is this here?
        
player cmd_target(idtarget9);
        return 
PLUGIN_HANDLED
    
}
    
    new 
authid[32], name2[32], authid2[32], name[32]
    new 
userid2 get_user_userid(player)
    
    
get_user_authid(playerauthid231)
    
get_user_authid(idauthid31)
    
get_user_name(playername231)
    
get_user_name(idname31)
    
    
log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")"nameget_user_userid(id), authidname2userid2authid2minutesreason)

    new 
temp[64], banned[16], nNum str_to_num(minutes)
    if (
nNum)
        
format(temp63"%L"player"FOR_MIN"minutes)
    else
        
format(temp63"%L"player"PERM")
    
format(banned15"%L"player"BANNED")

    new 
address[32]
    
get_user_ip(playeraddress311)

    if (
reason[0])
        
server_cmd("kick #%d ^"%(%%s)^";wait;addip ^"%s^" ^"%s^";wait;writeip"userid2reasonbannedtempminutesaddress)
    else
        
server_cmd("kick #%d ^"%%s^";wait;addip ^"%s^" ^"%s^";wait;writeip"userid2bannedtempminutesaddress)

    
// Display the message to all clients

    
new msg[256];
    new 
len;
    new 
maxpl get_maxplayers();
    for (new 
1<= maxpli++)
    {
        if (
is_user_connected(i) && !is_user_bot(i))
        {
            
len formatex(msgcharsmax(msg), "%L"i"BAN");
            
len += formatex(msg[len], charsmax(msg) - len" %s "name2);
            if (
nNum)
            {
                
formatex(msg[len], charsmax(msg) - len"%L"i"FOR_MIN"minutes);
            }
            else
            {
                
formatex(msg[len], charsmax(msg) - len"%L"i"PERM");
            }
            if (
strlen(reason) > 0)
            {
                
formatex(msg[len], charsmax(msg) - len" (%L: %s)"i"REASON"reason);
            }
            
show_activity_id(iidnamemsg);
        }
    }

    
console_print(id"[AMXX] %L"id"CLIENT_BANNED"name2)
    
    return 
PLUGIN_HANDLED
}

public 
cmdSlay(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[32]
    
    
read_argv(1arg31)
    
    new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY CMDTARGET_ALLOW_SELF CMDTARGET_ONLY_ALIVE)
    
    if (!
player)
        return 
PLUGIN_HANDLED
    
    user_kill
(player)
    
    new 
authid[32], name2[32], authid2[32], name[32]
    
    
get_user_authid(idauthid31)
    
get_user_name(idname31)
    
get_user_authid(playerauthid231)
    
get_user_name(playername231)
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" slay ^"%s<%d><%s><>^""nameget_user_userid(id), authidname2get_user_userid(player), authid2)

    
show_activity_key("ADMIN_SLAY_1""ADMIN_SLAY_2"namename2);

    
console_print(id"[AMXX] %L"id"CLIENT_SLAYED"name2)
    
    return 
PLUGIN_HANDLED
}

public 
cmdSlap(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED

    
new arg[32]
    
    
read_argv(1arg31)
    new 
player cmd_target(idargCMDTARGET_OBEY_IMMUNITY CMDTARGET_ALLOW_SELF CMDTARGET_ONLY_ALIVE)
    
    if (!
player)
        return 
PLUGIN_HANDLED

    
new spower[32], authid[32], name2[32], authid2[32], name[32]
    
    
read_argv(2spower31)
    
    new 
damage str_to_num(spower)
    
    
user_slap(playerdamage)
    
    
get_user_authid(idauthid31)
    
get_user_name(idname31)
    
get_user_authid(playerauthid231)
    
get_user_name(playername231)
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" slap with %d damage ^"%s<%d><%s><>^""nameget_user_userid(id), authiddamagename2get_user_userid(player), authid2)

    
show_activity_key("ADMIN_SLAP_1""ADMIN_SLAP_2"namename2damage);

    
console_print(id"[AMXX] %L"id"CLIENT_SLAPED"name2damage)
    
    return 
PLUGIN_HANDLED
}

public 
chMap(map[])
{
    
server_cmd("changelevel %s"map)
}

public 
cmdMap(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED

    
new arg[32]
    new 
arglen read_argv(1arg31)
    
    if (!
is_map_valid(arg))
    {
        
console_print(id"[AMXX] %L"id"MAP_NOT_FOUND")
        return 
PLUGIN_HANDLED
    
}

    new 
authid[32], name[32]
    
    
get_user_authid(idauthid31)
    
get_user_name(idname31)
    
    
show_activity_key("ADMIN_MAP_1""ADMIN_MAP_2"namearg);
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" changelevel ^"%s^""nameget_user_userid(id), authidarg)
    
    new 
_modName[10]
    
get_modname(_modName9)
    
    if (!
equal(_modName"zp"))
    {
        
message_begin(MSG_ALLSVC_INTERMISSION)
        
message_end()
    }
    
    
set_task(2.0"chMap"0argarglen 1)
    
    return 
PLUGIN_HANDLED
}

stock bool:onlyRcon(const name[])
{
    new 
ptr=get_cvar_pointer(name);
    if (
ptr && get_pcvar_flags(ptr) & FCVAR_PROTECTED)
    {
        return 
true;
    }
    return 
false;
}

public 
cmdCvar(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[32], arg2[64]
    
    
read_argv(1arg31)
    
read_argv(2arg263)
    
    new 
pointer;
    
    if (
equal(arg"add") && (get_user_flags(id) & ADMIN_RCON))
    {
        if ((
pointer=get_cvar_pointer(arg2))!=0)
        {
            new 
flags=get_pcvar_flags(pointer);
            
            if (!(
flags FCVAR_PROTECTED))
            {
                
set_pcvar_flags(pointer,flags FCVAR_PROTECTED);
            }
        }
        return 
PLUGIN_HANDLED
    
}
    
    if ((
pointer=get_cvar_pointer(arg))==0)
    {
        
console_print(id"[AMXX] %L"id"UNKNOWN_CVAR"arg)
        return 
PLUGIN_HANDLED
    
}
    
    if (
onlyRcon(arg) && !(get_user_flags(id) & ADMIN_RCON))
    {
        
// Exception for the new onlyRcon rules:
        //   sv_password is allowed to be modified by ADMIN_PASSWORD
        
if (!(equali(arg,"sv_password") && (get_user_flags(id) & ADMIN_PASSWORD)))
        {
            
console_print(id"[AMXX] %L"id"CVAR_NO_ACC")
            return 
PLUGIN_HANDLED
        
}
    }
    
    if (
read_argc() < 3)
    {
        
get_pcvar_string(pointerarg263)
        
console_print(id"[AMXX] %L"id"CVAR_IS"argarg2)
        return 
PLUGIN_HANDLED
    
}

    new 
authid[32], name[32]
    
    
get_user_authid(idauthid31)
    
get_user_name(idname31)
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" set cvar (name ^"%s^") (value ^"%s^")"nameget_user_userid(id), authidargarg2)
    
set_cvar_string(argarg2)
    
    
    
// Display the message to all clients

    
new cvar_val[64];
    new 
maxpl get_maxplayers();
    for (new 
1<= maxpli++)
    {
        if (
is_user_connected(i) && !is_user_bot(i))
        {
            if (
get_pcvar_flags(pointer) & FCVAR_PROTECTED || equali(arg"rcon_password"))
            {
                
formatex(cvar_valcharsmax(cvar_val), "*** %L ***"i"PROTECTED");
            }
            else
            {
                
copy(cvar_valcharsmax(cvar_val), arg2);
            }
            
show_activity_id(iidname"%L"i"SET_CVAR_TO"""argcvar_val);
        }
    }

    
console_print(id"[AMXX] %L"id"CVAR_CHANGED"argarg2)
    
    return 
PLUGIN_HANDLED
}

public 
cmdPlugins(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED
        
    
if (id==0// If server executes redirect this to "amxx plugins" for more in depth output
    
{
        
server_cmd("amxx plugins");
        
server_exec();
        return 
PLUGIN_HANDLED;
    }

    new 
name[32], version[32], author[32], filename[32], status[32]
    new 
lName[32], lVersion[32], lAuthor[32], lFile[32], lStatus[32]

    
format(lName31"%L"id"NAME")
    
format(lVersion31"%L"id"VERSION")
    
format(lAuthor31"%L"id"AUTHOR")
    
format(lFile31"%L"id"FILE")
    
format(lStatus31"%L"id"STATUS")

    new 
StartPLID=0;
    new 
EndPLID;

    new 
Temp[96]

    new 
num get_pluginsnum()
    
    if (
read_argc() > 1)
    {
        
read_argv(1,Temp,sizeof(Temp)-1);
        
StartPLID=str_to_num(Temp)-1// zero-based
    
}

    
EndPLID=min(StartPLID 10num);
    
    new 
running 0
    
    console_print
(id"----- %L -----"id"LOADED_PLUGINS")
    
console_print(id"%-18.17s %-11.10s %-17.16s %-16.15s %-9.8s"lNamelVersionlAuthorlFilelStatus)

    new 
i=StartPLID;
    while (
<EndPLID)
    {
        
get_plugin(i++, filename31name31version31author31status31)
        
console_print(id"%-18.17s %-11.10s %-17.16s %-16.15s %-9.8s"nameversionauthorfilenamestatus)
        
        if (
status[0]=='d' || status[0]=='r'// "debug" or "running"
            
running++
    }
    
console_print(id"%L"id"PLUGINS_RUN"EndPLID-StartPLIDrunning)
    
console_print(id"----- %L -----",id,"HELP_ENTRIES",StartPLID 1,EndPLID,num);
    
    if (
EndPLID num)
    {
        
formatex(Temp,sizeof(Temp)-1,"----- %L -----",id,"HELP_USE_MORE"EndPLID 1);
        
replace_all(Temp,sizeof(Temp)-1,"amx_help","amx_plugins");
        
console_print(id,"%s",Temp);
    }
    else
    {
        
formatex(Temp,sizeof(Temp)-1,"----- %L -----",id,"HELP_USE_BEGIN");
        
replace_all(Temp,sizeof(Temp)-1,"amx_help","amx_plugins");
        
console_print(id,"%s",Temp);
    }

    return 
PLUGIN_HANDLED
}

public 
cmdModules(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED

    
new name[32], version[32], author[32], statussStatus[16]
    new 
lName[32], lVersion[32], lAuthor[32], lStatus[32];

    
format(lName31"%L"id"NAME")
    
format(lVersion31"%L"id"VERSION")
    
format(lAuthor31"%L"id"AUTHOR")
    
format(lStatuscharsmax(lStatus), "%L"id"STATUS")

    new 
num get_modulesnum()
    
    
console_print(id"%L:"id"LOADED_MODULES")
    
console_print(id"%-23.22s %-11.10s %-20.19s %-11.10s"lNamelVersionlAuthorlStatus)
    
    for (new 
0numi++)
    {
        
get_module(iname31author31version31status)
        
        switch (
status)
        {
            case 
module_loadedcopy(sStatus15"running")
            default: 
            {
                
copy(sStatus15"bad load");
                
copy(namecharsmax(name), "unknown");
                
copy(authorcharsmax(author), "unknown");
                
copy(versioncharsmax(version), "unknown");
            }
        }
        
        
console_print(id"%-23.22s %-11.10s %-20.19s %-11.10s"nameversionauthorsStatus)
    }
    
console_print(id"%L"id"NUM_MODULES"num)

    return 
PLUGIN_HANDLED
}

public 
cmdCfg(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[128]
    
read_argv(1arg127)
    
    if (!
file_exists(arg))
    {
        
console_print(id"[AMXX] %L"id"FILE_NOT_FOUND"arg)
        return 
PLUGIN_HANDLED
    
}
    
    new 
authid[32], name[32]
    
    
get_user_authid(idauthid31)
    
get_user_name(idname31)
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" execute cfg (file ^"%s^")"nameget_user_userid(id), authidarg)
    
    
console_print(id"[AMXX] Executing file ^"%s^""arg)
    
server_cmd("exec %s"arg)

    
show_activity_key("ADMIN_CONF_1""ADMIN_CONF_2"namearg);

    return 
PLUGIN_HANDLED
}

public 
cmdLBack()
{
    if (!
g_PauseAllowed)
        return 
PLUGIN_CONTINUE    

    
new paused[25]
    
    
format(paused24"%L"g_pauseCong_Paused "UNPAUSED" "PAUSED")
    
set_cvar_float("pausable"g_pausAble)
    
console_print(g_pauseCon"[AMXX] Server %s"paused)
    
g_PauseAllowed false
    
    
if (g_Paused)
        
g_Paused false
    
else 
        
g_Paused true
    
    
return PLUGIN_HANDLED
}

public 
cmdPause(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED 
    
    
new authid[32], name[32], slayer id
    
    get_user_authid
(idauthid31
    
get_user_name(idname31
    if (
pausable!=0)
    {
        
g_pausAble get_pcvar_float(pausable)
    }
    
    if (!
slayer)
        
slayer find_player("h"
    
    if (!
slayer)
    { 
        
console_print(id"[AMXX] %L"id"UNABLE_PAUSE"
        return 
PLUGIN_HANDLED
    
}

    
set_cvar_float("pausable"1.0)
    
g_PauseAllowed true
    client_cmd
(slayer"pause;pauseAck")
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" %s server"nameget_user_userid(id), authidg_Paused "unpause" "pause")
    
    
console_print(id"[AMXX] %L"idg_Paused "UNPAUSING" "PAUSING")

    
// Display the message to all clients

    
new maxpl get_maxplayers();
    for (new 
1<= maxpli++)
    {
        if (
is_user_connected(i) && !is_user_bot(i))
        {
            
show_activity_id(iidname"%L server"ig_Paused "UNPAUSE" "PAUSE");
        }
    }

    
g_pauseCon id
    
    
return PLUGIN_HANDLED


public 
cmdShowRcon(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
        
    
new password[64]
    
    
get_pcvar_string(rcon_passwordpassword63)
    
    if (!
password[0])
    {
        
cmdRcon(idlevelcid)
    } else {
        new 
args[128]
        
        
read_args(args127)
        
client_cmd(id"rcon_password %s"password)
        
client_cmd(id"rcon %s"args)
    }
    
    return 
PLUGIN_HANDLED
}

public 
cmdRcon(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new arg[128], authid[32], name[32]
    
    
read_args(arg127)
    
get_user_authid(idauthid31)
    
get_user_name(idname31)
    
    
log_amx("Cmd: ^"%s<%d><%s><>^" server console (cmdline ^"%s^")"nameget_user_userid(id), authidarg)
    
    
console_print(id"[AMXX] %L"id"COM_SENT_SERVER"arg)
    
server_cmd("%s"arg)
    
    return 
PLUGIN_HANDLED
}

public 
cmdWho(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
        return 
PLUGIN_HANDLED

    
new players[32], inumcl_on_server[64], authid[32], name[32], flagssflags[32]
    new 
lImm[16], lRes[16], lAccess[16], lYes[16], lNo[16]
    
    
format(lImm15"%L"id"IMMU")
    
format(lRes15"%L"id"RESERV")
    
format(lAccess15"%L"id"ACCESS")
    
format(lYes15"%L"id"YES")
    
format(lNo15"%L"id"NO")
    
    
get_players(playersinum)
    
format(cl_on_server63"%L"id"CLIENTS_ON_SERVER")
    
console_print(id"^n%s:^n #  %-16.15s %-20s %-8s %-4.3s %-4.3s %s"cl_on_server"nick""authid""userid"lImmlReslAccess)
    
    for (new 
0inum; ++a)
    {
        
get_user_authid(players[a], authid31)
        
get_user_name(players[a], name31)
        
flags get_user_flags(players[a])
        
get_flags(flagssflags31)
        
console_print(id"%2d  %-16.15s %-20s %-8d %-6.5s %-6.5s %s"players[a], nameauthid
        
get_user_userid(players[a]), (flags&ADMIN_IMMUNITY) ? lYes lNo, (flags&ADMIN_RESERVATION) ? lYes lNosflags)
    }
    
    
console_print(id"%L"id"TOTAL_NUM"inum)
    
get_user_authid(idauthid31)
    
get_user_name(idname31)
    
log_amx("Cmd: ^"%s<%d><%s><>^" ask for players list"nameget_user_userid(id), authid
    
    return 
PLUGIN_HANDLED
}

hasTag(name[], tags[4][32], tagsNum)
{
    for (new 
0tagsNum; ++a)
        if (
contain(nametags[a]) != -1)
            return 
a
    
return -1
}

public 
cmdLeave(idlevelcid)
{
    if (!
cmd_access(idlevelcid2))
        return 
PLUGIN_HANDLED
    
    
new argnum read_argc()
    new 
ltags[4][32]
    new 
ltagsnum 0
    
    
for (new 15; ++a)
    {
        if (
argnum)
            
read_argv(altags[ltagsnum++], 31)
        else
            
ltags[ltagsnum++][0] = 0
    
}
    
    new 
nick[32], irespnum get_maxplayers() + 1count 0lReason[128]
    
    for (new 
1pnum; ++b)
    {
        if (!
is_user_connected(b) && !is_user_connecting(b)) continue

        
get_user_name(bnick31)
        
ires hasTag(nickltagsltagsnum)
        
        if (
ires != -1)
        {
            
console_print(id"[AMXX] %L"id"SKIP_MATCH"nickltags[ires])
            continue
        }
        
        if (
get_user_flags(b) & ADMIN_IMMUNITY)
        {
            
console_print(id"[AMXX] %L"id"SKIP_IMM"nick)
            continue
        }
        
        
console_print(id"[AMXX] %L"id"KICK_PL"nick)
        
        if (
is_user_bot(b))
            
server_cmd("kick #%d"get_user_userid(b))
        else
        {
            
format(lReason127"%L"b"YOU_DROPPED")
            
server_cmd("kick #%d ^"%s^""get_user_userid(b), lReason)
        }
        
count++
    }
    
    
console_print(id"[AMXX] %L"id"KICKED_CLIENTS"count)
    
    new 
authid[32], name[32]

    
get_user_authid(idauthid31)
    
get_user_name(idname31)
    
log_amx("Kick: ^"%s<%d><%s><>^" leave some group (tag1 ^"%s^") (tag2 ^"%s^") (tag3 ^"%s^") (tag4 ^"%s^")"nameget_user_userid(id), authidltags[0], ltags[1], ltags[2], ltags[3])

    
show_activity_key("ADMIN_LEAVE_1""ADMIN_LEAVE_2"nameltags[0], ltags[1], ltags[2], ltags[3]);

    return 
PLUGIN_HANDLED
}

public 
cmdNick(idlevelcid)
{
    if (!
cmd_access(idlevelcid3))
        return 
PLUGIN_HANDLED

    
new arg1[32], arg2[32], authid[32], name[32], authid2[32], name2[32]

    
read_argv(1arg131)
    
read_argv(2arg231)

    new 
player cmd_target(idarg1CMDTARGET_OBEY_IMMUNITY CMDTARGET_ALLOW_SELF)
    
    if (!
player)
        return 
PLUGIN_HANDLED

    get_user_authid
(idauthid31)
    
get_user_name(idname31)
    
get_user_authid(playerauthid231)
    
get_user_name(playername231)

    
client_cmd(player"name ^"%s^""arg2)

    
log_amx("Cmd: ^"%s<%d><%s><>^" change nick to ^"%s^" ^"%s<%d><%s><>^""nameget_user_userid(id), authidarg2name2get_user_userid(player), authid2)

    
show_activity_key("ADMIN_NICK_1""ADMIN_NICK_2"namename2arg2);

    
console_print(id"[AMXX] %L"id"CHANGED_NICK"name2arg2)

    return 
PLUGIN_HANDLED
}

public 
cmdLast(idlevelcid)
{
    if (!
cmd_access(idlevelcid1))
    {
        return 
PLUGIN_HANDLED;
    }
    
    new 
name[32];
    new 
authid[32];
    new 
ip[32];
    new 
flags[32];
    new 
access;
    
    
    
// This alignment is a bit weird (it should grow if the name is larger)
    // but otherwise for the more common shorter name, it'll wrap in server console
    // Steam client display is all skewed anyway because of the non fixed font.
    
console_print(id"%19s %20s %15s %s""name""authid""ip""access");
    
    for (new 
0g_Sizei++)
    {
        
GetInfo(inamecharsmax(name), authidcharsmax(authid), ipcharsmax(ip), access);
        
        
get_flags(accessflagscharsmax(flags));
        
        
console_print(id"%19s %20s %15s %s"nameauthidipflags);
    }
    
    
console_print(id"%d old connections saved."g_Size);
    
    return 
PLUGIN_HANDLED;

PHP Code:
/*
    Advanced Bans
    
    Version 0.8.1
    
    by Exolent
    
    
    
    Plugin Thread:
    
    - http://forums.alliedmods.net/showthread.php?t=80858
    
    
    
    Description:
    
    - This plugin revamps the current amx_ban, amx_banip, amx_banid, amx_unban admin commands.
    
    - It uses Real Time on the server
      (Eg. Banned for 10 minutes, you will be unbanned 10 minutes later, regardless of map changing).
    
    - It includes a list of who is banned.
    
    - It does not use the banned.cfg or listip.cfg. It uses its own file where bans are stored.
    
    - It saves what admin banned the player (name), the admin's steamid, the reason, the ban time, 
      the banned player's name, the banned player's steamid (or IP), and the estimated time of unban.
    
    - It will load your currently banned players from the banned.cfg and listip.cfg files.
      (Only if the #define below is uncommented)
    
    - If you use the menu to ban players, you will have to type a reason after you choose a player.
    
    - If you use the vote system to ban players, you will have to type a reason after you execute the amx_voteban command.
    
    - You can limit the ban time for admins based on their admin flags.
    
    - You can monitor all ban history (admins banning, unbanning, and when ban times are up) in
      the addons/amxmodx/logs/BAN_HISTORY_MMDDYYYY.log (MM = month, DD = day, YYYY = year)
    
    - If you wish to have only 1 file for ban history, uncomment the line at the top of the .sma file and recompile.
    
    - Supports SQL for banning.
    
    
    
    Commands:
    
    - amx_ban <nick, #userid, authid> <time in minutes> <reason>
    
    - amx_banip <nick, #userid, authid> <time in minutes> <reason>
    
    - amx_addban <name> <authid or ip> <time in minutes> <reason>
    
    - amx_unban <authid or ip>
    
    - amx_banlist
      - Shows a list of who is banned
    
    - amx_addbanlimit <flags> <time in minutes>
      - Adds a max ban time to the list
      - Note: Use this command in the amxx.cfg
    
    
    
    Cvars:
    
    - ab_website <website>
      - This is the website displayed to the banned player if you have an unban request section on your website.
      - Leave blank to not show a website.
      - Default: blank
    
    - ab_immunity <0|1|2>
      - 0 - Any admin can ban an immunity admin (flag 'a').
      - 1 - Immunity admins (flag 'a') cannot be banned.
      - 2 - Immunity admins (flag 'a') can only be banned by other immunity admins (flag 'a').
      - Default: 1
    
    - ab_bandelay <seconds>
      - Delay of banned players being disconnected.
      - Default: 1
    
    - ab_unbancheck <seconds>
      - Interval of checking if a player is unbanned.
      - Default: 5
    
    
    
    Requirements:
    
    - AMX Mod X version 1.8.0 or higher
    
    
    
    Changelog:

    - Version 0.1 (with updates included)
      - Initial Release
      - Changed to dynamic arrays to hold ban information
      - Added option #2 for ab_immunity
      - Added support for banning by IP
      - Added compatability for banned.cfg and listip.cfg
      - Added menu support (plmenu.amxx)
      - Added ML support

    - Version 0.2
      - Added simple max ban time feature

    - Version 0.3
      - Added more cvars for max ban times
      - Added cvar for delay of player to disconenct after being banned
      - Added cvar for interval of checking for unban time of banned players
      - Added more translations

    - Version 0.4
      - Fixed the possible infinite loop, causing servers to crash
      - Added ban history
      - Removed max ban time cvars
      - Added max ban times per admin flags
      - Added more translations

    - Version 0.5
      - Fixed information not being printed into console
      - Fixed "amx_addban" using the admin's name as the SteamID when saving the ban
      - Added option for ban history to be one file
      - Added translations

    - Version 0.5b
      - Fixed players not being unbanned
      - Added translations
    
    - Version 0.6
      - Added small optimization for unban checking
      - Changed "UnBan Time" in the logs and chat messages to "Ban Length"
      - Fixed small code error where unban time was generated was used when length was 0
      - Changed IsValidIP() method to use regex (Thanks to arkshine)
      - Added plugin information inside the .sma file
      - Added a #define option to use maximum bans for compatability for AMXX < 1.8.0
      - Changed admin messages in chat to work with amx_show_activity cvar
      - Added translations
    
    - Version 0.6b
      - Fixed a small bug
    
    - Version 0.6c
      - Fixed amx_banlist for server consoles
      - Changed IsValidAuthid() method to use regex
    
    - Version 0.6d
      - Fixed ban limit for permanent bans
    
    - Version 0.7
      - Changed the "unlimited bans" version to be faster (Thanks to joaquimandrade)
      - Added check when adding bans if the player is already banned.
    
    - Version 0.8
      - Added SQL support.
    
    - Version 0.8.1
      - Added unban logging for non-SQL version
    
    
    
    Notes:
    
    - If you plan to use this plugin, go to the plugin's thread.
    
    - The plugin's thread has more information about the plugin, along with the multilingual file.
    
    - It also has a modified plmenu.amxx plugin that adds the ban reason to the menu.
    
    - And it has a modified adminvote.amxx plugin that adds the ban reason to amx_voteban.
*/



#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <regex>

#define PLUGIN_NAME    "Advanced bans"
#define PLUGIN_VERSION    "1.9.0.5"
#define PLUGIN_AUTHOR    "Unknown"

#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 <sqlx>

#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_sql_tuple;
new 
bool:g_loading_bans true;
#endif

new ab_website;
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;

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]");
    
    
ab_website register_cvar("ab_website""");
    
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_sql_tuple SQL_MakeStdTuple();
    
PrepareTable();
    
#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");
}

#if defined USING_SQL
PrepareTable()
{
    new 
query[128];
    
formatex(querysizeof(query) - 1,\
        
"CREATE TABLE IF NOT EXISTS `%s` (`%s` varchar(32) NOT NULL, `%s` varchar(35) NOT NULL, `%s` int(10) NOT NULL, `%s` varchar(32) NOT NULL, `%s` varchar(128) NOT NULL, `%s` varchar(64) NOT NULL, `%s` varchar(35) NOT NULL);",\
        
TABLE_NAMEKEY_NAMEKEY_STEAMIDKEY_BANLENGTHKEY_UNBANTIMEKEY_REASONKEY_ADMIN_NAMEKEY_ADMIN_STEAMID
        
);
    
    
SQL_ThreadQuery(g_sql_tuple"QueryCreateTable"query);
}

public 
QueryCreateTable(failstateHandle:queryerror[], errcodedata[], datasizeFloat: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( 
errcode )
    {
        
log_amx("Error on query: %s"error);
    }
    else
    {
        
LoadBans();
    }
}
#endif

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 
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"[ADVANCED-BANS] %L"client"AB_NOT_AUTHORIZED");
        return 
PLUGIN_HANDLED;
    }
    
    
#if MAX_BANS <= 0
    
if( TrieKeyExists(g_trietarget_authid) )
    {
        
console_print(client"[ADVANCED-BANS] %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"[ADVANCED-BANS] %L"client"AB_ALREADY_BANNED_STEAMID");
            return 
PLUGIN_HANDLED;
        }
    }
    
#endif
    
    
read_argv(2argsizeof(arg) - 1);
    
    new 
length str_to_num(arg);
    new 
maxlength GetMaxBanTime(client);
    
    if( 
maxlength && (!length || length maxlength) )
    {
        
console_print(client"[ADVANCED-BANS] %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[ADVANCED-BANS]^x03 $name^x04 : banned^x03 %s Reason^x04 : %s.^x03 Ban length^x04 : %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"[ADVANCED-BANS] %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"[ADVANCED-BANS] %L"client"AB_ALREADY_BANNED_IP");
            return 
PLUGIN_HANDLED;
        }
    }
    
#endif
    
    
read_argv(2argsizeof(arg) - 1);
    
    new 
length str_to_num(arg);
    new 
maxlength GetMaxBanTime(client);
    
    if( 
maxlength && (!length || length maxlength) )
    {
        
console_print(client"[ADVANCED-BANS] %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[ADVANCED-BANS]^x03 $name^x04 : banned^x03 %s Reason^x04 : %s.^x03 Ban length^x04 : %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"[ADVANCED-BANS] %L"client"AB_INVALID_STEAMID");
        
console_print(client"[ADVANCED-BANS] %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"[ADVANCED-BANS] %L"client"AB_INVALID_IP");
            
            return 
PLUGIN_HANDLED;
        }
    }
    
    
#if MAX_BANS <= 0
    
if( TrieKeyExists(g_trietarget_authid) )
    {
        
console_print(client"[ADVANCED-BANS] %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"[ADVANCED-BANS] %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"[ADVANCED-BANS] %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[ADVANCED-BANS]^x03 $name^x04 : banned^x03 %s %s Reason^x04 : %s.^x03 Ban length^x04 : %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 
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[ADVANCED-BANS]^x03 $name^x04 : unbanned^x3 %s^x04 [%s]^x03 [Ban reason^x04 : %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[ADVANCED-BANS]^x03 $name^x04 : unbanned^x03 %s^x04 [%s]^x03 [Ban reason^x04 : %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"[ADVANCED-BANS] %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"[ADVANCED-BANS] %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[ADVANCED-BANS]^x03 %s^x04[^x04%s^x04]^x03 ban time is up^x03 [Ban reason^x04 : %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[ADVANCED-BANS]^x03 %s^x04[^x04%s^x01]^x03 ban time is up^x03 [Ban reason^x04 : %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 ^"You are banned from this serverCheck 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);
    
#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(failstateHandle:queryerror[], errcodedata[], datasizeFloat: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( 
errcode )
    {
        
log_amx("Error on query: %s"error);
    }
    else
    {
        
// Yay, ban was added! We can all rejoice!
    
}
}

public 
QueryDeleteBan(failstateHandle:queryerror[], errcodedata[], datasizeFloat: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( 
errcode )
    {
        
log_amx("Error on query: %s"error);
    }
    else
    {
        
// Yay, ban was deleted! We can all rejoice!
    
}
}

public 
QueryLoadBans(failstateHandle:queryerror[], errcodedata[], datasizeFloat: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( 
errcode )
    {
        
log_amx("Error on query: %s"error);
    }
    else
    {
        if( 
SQL_NumResults(query) )
        {
            
#if MAX_BANS <= 0
            
static data[BannedData];
            while( 
SQL_MoreResults(query) )
            
#else
            
while( SQL_MoreResults(query) && g_total_bans MAX_BANS )
            
#endif
            
{
                
#if MAX_BANS <= 0
                
SQL_ReadResult(query0data[bd_name], sizeof(data[bd_name]) - 1);
                
SQL_ReadResult(query1data[bd_steamid], sizeof(data[bd_steamid]) - 1);
                
data[bd_banlength] = SQL_ReadResult(query2);
                
SQL_ReadResult(query3data[bd_unbantime], sizeof(data[bd_unbantime]) - 1);
                
SQL_ReadResult(query4data[bd_reason], sizeof(data[bd_reason]) - 1);
                
SQL_ReadResult(query5data[bd_admin_name], sizeof(data[bd_admin_name]) - 1);
                
SQL_ReadResult(query6data[bd_admin_steamid], sizeof(data[bd_admin_steamid]) - 1);
                
                
ArrayPushArray(g_arraydata);
                
TrieSetCell(g_triedata[bd_steamid], g_total_bans);
                
#else
                
SQL_ReadResult(query0g_names[g_total_bans], sizeof(g_names[]) - 1);
                
SQL_ReadResult(query1g_steamids[g_total_bans], sizeof(g_steamids[]) - 1);
                
g_banlengths[g_total_bans] = SQL_ReadResult(query2);
                
SQL_ReadResult(query3g_unbantimes[g_total_bans], sizeof(g_unbantimes[]) - 1);
                
SQL_ReadResult(query4g_reasons[g_total_bans], sizeof(g_reasons[]) - 1);
                
SQL_ReadResult(query5g_admin_names[g_total_bans], sizeof(g_admin_names[]) - 1);
                
SQL_ReadResult(query6g_admin_steamids[g_total_bans], sizeof(g_admin_steamids[]) - 1);
                
#endif
                
                
g_total_bans++;
                
                
SQL_NextRow(query);
            }
        }
        
        
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]
        );
    
    
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);
    
    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);
    
    
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("************************************************");
        server_print("%L", client, "AB_BAN_INFORMATION");
        server_print("%L: %s", client, "AB_NAME", target_name);
        server_print("%L: %s", client, IsValidAuthid(target_authid) ? "AB_STEAMID" : "AB_IP", target_authid);
        server_print("%L: %s", client, "AB_REASON", reason);
        if( length > 0 )
        {
            GetBanTime(length, ban_length, sizeof(ban_length) - 1);
            server_print("%L: %s", client, "AB_BAN_LENGTH", ban_length);
        }
        server_print("%L: %s", client, "AB_UNBAN_TIME", unban_time);
        if( show_admin )
        {
            server_print("%L: %s", client, "AB_ADMIN_NAME", admin_name);
            server_print("%L: %s", client, "AB_ADMIN_STEAMID", admin_authid);
        }
        if( show_website )
        {
            get_pcvar_string(ab_website, website, sizeof(website) - 1);
            if( website[0] )
            {
                server_print("");
                server_print("%L", client, "AB_WEBSITE");
                server_print("%s", website);
            }
        }
        server_print("************************************************");
    }
    else
    {
        client_cmd(client, "echo ^"************************************************^"");
        client_cmd(client, "echo ^"%L^"", client, "AB_BAN_INFORMATION");
        client_cmd(client, "echo ^"%L: %s^"", client, "AB_NAME", target_name);
        client_cmd(client, "echo ^"%L: %s^"", client, IsValidAuthid(target_authid) ? "AB_STEAMID" : "AB_IP", target_authid);
        client_cmd(client, "echo ^"%L: %s^"", client, "AB_REASON", reason);
        if( length > 0 )
        {
            GetBanTime(length, ban_length, sizeof(ban_length) - 1);
            client_cmd(client, "echo ^"%L: %s^"", client, "AB_BAN_LENGTH", ban_length);
        }
        client_cmd(client, "echo ^"%L: %s^"", client, "AB_UNBAN_TIME", unban_time);
        if( show_admin )
        {
            client_cmd(client, "echo ^"%L: %s^"", client, "AB_ADMIN_NAME", admin_name);
            client_cmd(client, "echo ^"%L: %s^"", client, "AB_ADMIN_STEAMID", admin_authid);
        }
        if( show_website )
        {
            get_pcvar_string(ab_website, website, sizeof(website) - 1);
            if( website[0] )
            {
                client_cmd(client, "echo ^"^"");
                client_cmd(client, "echo ^"%L^"", client, "AB_WEBSITE");
                client_cmd(client, "echo ^"%s^"", website);
            }
        }
        client_cmd(client, "echo ^"************************************************^"");
    }
}

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);
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/ 

Last edited by giumbalau; 06-17-2021 at 23:12.
giumbalau is offline
Mordekay
Squirrel of Fortune
Join Date: Apr 2006
Location: Germany
Old 06-18-2021 , 05:31   Re: advanced bans
Reply With Quote #2

Why would anyone here try to add this? It's only usable for non-steam servers. Non-steam is not supported here, so... I guess you get the point.
__________________

Mordekay is offline
giumbalau
Member
Join Date: Jan 2021
Old 06-18-2021 , 10:16   Re: advanced bans
Reply With Quote #3

Quote:
Originally Posted by Mordekay View Post
Why would anyone here try to add this? It's only usable for non-steam servers. Non-steam is not supported here, so... I guess you get the point.
Yes open a steam on server and keep it empty play with bots you will enjoy it
giumbalau is offline
MacL
Member
Join Date: May 2021
Old 06-18-2021 , 12:06   Re: advanced bans
Reply With Quote #4

Quote:
Originally Posted by giumbalau View Post
Yes open a steam on server and keep it empty play with bots you will enjoy it
and yes im sure you can get help from those non-steam players or forums you talking about. good luck with it.
MacL is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 09:14.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode