Plugin not doing what it supposed to be doing.
Hello,
I've got the Ban Management from Kaksi (originally for AMX Mod) but this one is ported to AMXX Mod.
(The plugin stores bans in an mysql database, when a player connects, the plugin will check if the player exists in the database, if? then disconnect him.)
The plugin compiles fine, no errors.
But, i ban a player, the plugin stores everything in the mysql database, works fine.
But when the player re-connects, the plugin removes the ban from the mysql database and lets the player join.
Now i have commented the DELETE query, so the player wont be deleted.
But the user can still join, i looked at the query etc. and everything looks fine to me.
The query will select the information from the database where the steamid or ip is equal to the player ip/steamid.
The information in the database is correct, but there is no match :s or the plugins skips this step or something.
Plugin is below.
Hope you can figure this out, i really need this plugin.
(if there is something wrong it has to be in the function check_delayed i think.)
Thanks in advance.
Code:
/*
*
* Mysql Ban Management for STEAM
*
* Author: kaksi
* Email: <a href="mailto:[email protected]">[email protected]</a>
* Web: <a href="http://www.gbgonline.net/" target="_blank" rel="nofollow noopener">http://www.gbgonline.net/</a>
*
* Thanks to:
* JustinHoMi - A lot of code comes from his MySQL Ban Management plugin
* n1ghtmr - I got a lot of inspiration from his MYSQL Ban control - By Wonid/ip and Rcon plugin
* Neurosis - Beta testing and debugging
*
* INSTALLATION
*
* ->Create the database by using the schema below
* ->Add the following line to amx.cfg with you database info:
*
* amx_sqlban_host "127.0.0.1" - Adress to the SQL server
* amx_sqlban_user "root" - SQL Server username
* amx_sqlban_pass "" - SQL server password
* amx_sqlban_db "amx" - The database where you created the table
*
* -> Compile the plugin and put in amx plugin folder
* -> Add the plugin to plugins.ini
* -> Restart you server and you are good to go
*
*
* INSTRUCTIONS
*
* You can only ban players that are on the server
*
* Ban EITHER SteamID or IP adress by typing:
* amx_ban1 <time> <name, userid, or ip> <reason>
* If ban is entered by name or userid the player is banned by steamid
* If ban is entered by IP adress the player is banned by ipaddres
*
* Ban BOTH SteamID AND IP Adress by typing:
* xban <time> <name, userid or ip> <reason>
* If ban is enterd by name, userid or IP BOTH SteamID AND IP adress will be banned
*
*/
/* SQL Schema
CREATE TABLE `AMXX` (
`player_steamid` varchar(100) NOT NULL default '',
`player_name` varchar(100) NOT NULL default '',
`player_ip` varchar(100) NOT NULL default '',
`reason` varchar(128) NOT NULL default '',
`bantype` varchar(50) NOT NULL default '',
`admin_steamid` varchar(100) NOT NULL default '',
`admin_name` varchar(100) NOT NULL default '',
`admin_ip` varchar(100) NOT NULL default '',
`length` int(10) unsigned NOT NULL default '0',
`time_created` timestamp(14) NOT NULL,
`server` varchar(25) NOT NULL default '',
PRIMARY KEY (`player_steamid`)
) TYPE=MyISAM;
*/
#include <amxmodx>
#include <amxmisc>
#include <dbi>
new Sql :mysql
new Result :ret
new merror [128]
new mhost [64]
new muser [32]
new mpass [32]
new mdb [32]
new server [128]
new time_msg [32]
//------------------------------------------------- START Plugin initilize ----------------------------------------//
public plugin_init ()
{
register_plugin("SQLBan Mgr", "0.1", "kaksi")
register_concmd("AMXX", "sql_ban",ADMIN_BAN, "<mins> <nick|userid|> [reason]")
register_cvar("amx_sql_host", "127.0.0.1")
register_cvar("amx_sql_user", "user")
register_cvar("amx_sql_pass", "pass")
register_cvar("amx_sql_db", "amx")
register_cvar("amx_sql_prefix", "")
return PLUGIN_CONTINUE
}
//------------------------------------------------- END Plugin initilize ----------------------------------------//
//------------------------------------------------- START CONNECT TO DATABASAE ----------------------------------------//
public sql_init ()
{
//Get server and database info...
get_cvar_string("hostname",server, 127)
get_cvar_string("amx_sql_host",mhost, 64)
get_cvar_string("amx_sql_user",muser, 32)
get_cvar_string("amx_sql_pass",mpass, 32)
get_cvar_string("amx_sql_db",mdb, 32)
mysql = dbi_connect (mhost,muser,mpass,mdb,merror, 128)
if(mysql < = SQL_FAILED )
server_print("[AMXX] MySQL error: could not connect : '%s'",merror )
else
server_print("[AMXX] Successfully connected to the database.")
return PLUGIN_CONTINUE
}
//------------------------------------------------- END CONNECT TO DATABASAE ----------------------------------------//
//------------------------------------------------- START Player Connects Player ----------------------------------------//
public client_connect (id )
{
new parm [1]
parm [0] = id
//Delay check, wait for steamid to be set
set_task(5.0, "check_delayed", 0,parm, 1)
return PLUGIN_HANDLED
}
//------------------------------------------------- End Player connects Player ----------------------------------------//
//------------------------------------------------- START Delayed check connecting player ----------------------------------------//
public check_delayed (parm [])
{
//Load database connection function
sql_init ()
//Get connecting clients steamid and ipadress
new client_steamid [40]
get_user_authid(parm [0],client_steamid, 50)
new client_ip [16]
get_user_ip(parm [0],client_ip, 15, 1)
new client_name [40]
get_user_name(parm [0],client_name, 40)
//Send a message to the server that a check is starting
server_print("[AMXX] Checking of %s gebanned is...",client_name )
client_print(0, print_chat, "[AMXX] Checking of %s gebanned is...",client_name )
//Format the database querry
new query [256]
format(query, 255, "SELECT player_steamid,player_ip,reason,bantype,length,now()-time_created FROM AMXX WHERE player_steamid='%s' OR player_ip='%s'",client_steamid,client_ip )
//Execute querry
dbi_query (mysql,query )
new merror [64]
dbi_error (mysql,merror, 63)
//If an error occured
if (merror [0])
{
server_print("[AMXX] MYSQL error: %s",merror )
return PLUGIN_CONTINUE
}
//If a player was found in the database, fetch data and define
if(dbi_nextrow (ret )> 0)
{
new player_steamid [40],player_ip [20],reason [128],bantype [50],ban_length_s [10],ban_time_s [32]
dbi_field (ret, 1,player_steamid, 39)
dbi_field (ret, 2,player_ip, 19)
dbi_field (ret, 3,reason, 127)
dbi_field (ret, 4,bantype, 49)
dbi_field (ret, 5,ban_length_s, 9)
dbi_field (ret, 6,ban_time_s, 31)
//Get the new ban_lengt and bantime
new ban_length = str_to_num(ban_length_s )
new ban_time = str_to_num(ban_time_s )
//If the players bantime isn't up...
if ((ban_time < ban_length ) || (ban_length == 0))
{
//If the ban_length is permanent, format the time message
if (ban_length == 0)
{
time_msg = "Permanent"
}
//If the time is not permanent, format the time message
else
{
new ban_left = (ban_length - ban_time ) / 60
format(time_msg, 31, "%i minutes",ban_left )
}
//If the player is banned by steamid, send a message and disconnect the player
if(equal(bantype, "steamid"))
{
//Check if the players SteamID is the same as in the dataase
if(equal(client_steamid,player_steamid ))
{
client_cmd(parm [0], "echo ^"[AMXX ] Your SteamID has been banned from this server. ^"")
client_cmd(parm [0], "echo ^"[AMXX ] Reason : %s. ^"",reason )
client_cmd(parm [0], "echo ^"[AMXX ] Time left : %s. ^"",time_msg )
client_cmd(parm [0], "disconnect")
client_print(0, print_chat, "[AMXX] %s banned.",client_name )
return PLUGIN_CONTINUE
}
}
}
//If the player is banned by IP, send a message and disconnect the player
if(equal(bantype, "ip"))
{
//Check if the players ip adress is the same as in the database
if(equal(client_ip,player_ip ))
{
client_cmd(parm [0], "echo ^"[AMXX ] Your IP adress has been banned from this server. ^"")
client_cmd(parm [0], "echo ^"[AMXX ] Reason : %s. ^"",reason )
client_cmd(parm [0], "echo ^"[AMXX ] Time left : %s. ^"",time_msg )
client_cmd(parm [0], "disconnect")
client_print(0, print_chat, "[AMXX] %s banned.",client_name )
return PLUGIN_CONTINUE
}
}
//If the player is banned by BOTH SteamID and IP Adress, send a message and disconnect the player
if(equal(bantype, "all"))
{
//Check if The players steamid is the same as in the database
if(equal(client_steamid,player_steamid ))
{
client_cmd(parm [0], "echo ^"[AMXX ] Your SteamID and IP Adress has been banned from this server. ^"")
client_cmd(parm [0], "echo ^"[AMXX ] Reason : %s. ^"",reason )
client_cmd(parm [0], "echo ^"[AMXX ] Time left : %s. ^"",time_msg )
client_cmd(parm [0], "disconnect")
client_print(0, print_chat, "[AMXX] %s banned.",client_name )
return PLUGIN_CONTINUE
}
//If the steamid doesnt math then check if the ip adress match
else if(equal(client_ip,player_ip ))
{
client_cmd(parm [0], "echo ^"[AMXX ] Your SteamID and IP Adress has been banned from this server. ^"")
client_cmd(parm [0], "echo ^"[AMXX ] Reason : %s. ^"",reason )
client_cmd(parm [0], "echo ^"[AMXX ] Time left : %s. ^"",time_msg )
client_cmd(parm [0], "disconnect")
client_print(0, print_chat, "[AMXX] %s banned.",client_name )
return PLUGIN_CONTINUE
}
}
}
//If the bantime has expired
else
{
//Remove the expired ban from the database
//Format the querry
format(query, 255, "DELETE from AMXX where player_steamid='%s'",client_steamid )
//Execute the querry
dbi_query (mysql,query )
dbi_error (mysql,merror, 63)
//If an error uccures
if (merror [0])
{
server_print("[AMXX] MYSQL error: %s",merror )
return PLUGIN_HANDLED
}
//If the expired ban is removed completely
else
{
console_print(parm [0], "[AMXX] Ban on steamid %s removed.",client_steamid )
}
}
//If player wasn't in the database...
server_print("[AMXX] %s wasn't in the database. Let him in...",client_name )
client_print(0, print_chat, "[AMXX] %s is niet gebanned. Veel plezier.",client_name )
return PLUGIN_CONTINUE
}
//------------------------------------------------- END Delayed check connecting player ----------------------------------------//
//------------------------------------------------- START Ban Player by SteamID OR IP Adress ----------------------------------------//
public sql_ban (id,level,cid )
{
//Load database connection function
sql_init ()
//If the player you are trying to ban has admin rights the stop
if (!cmd_access(id,level,cid, 4))
return PLUGIN_HANDLED
//Define the player identifier and read it from the given command
new player_ident [40]
read_argv(2,player_ident, 39)
//Define the bantype variable
new bantype [20]
//See if you can find a matching player by nickname
new player = find_player("bl",player_ident )
//If a player was found, check to see if there are more than one match
if (player )
{
new player2 = find_player("blj",player_ident )
//If more than one match, then stop
if (player !=player2 )
{
console_print(id, "There are more than one players matching your argument.")
return PLUGIN_CONTINUE
}
//If all went well and only one player was found, set bantype to steamid
bantype = "steamid"
}
//If no player was found by nickname, check if there is a match with userid
if (!player && player_ident [0]=='#' && player_ident [1])
player = find_player("k", str_to_num(player_ident [1]))
//If there was a player match with userid set bantype to steamid
bantype = "steamid"
//If no matching player with userid either, then check if there is a match with IP adress
if (!player )
{
player = find_player("d",player_ident )
//If there was a match with IP adress set bantype to IP
bantype = "ip"
}
//If no match was found, abort...
if (!player )
{
console_print(id, "Client with that authid, nick, userid, or ip not found.")
return PLUGIN_CONTINUE
}
//Make sure we don't ban bots
if (is_user_bot(player ))
{
new imname [32]
get_user_name(player,imname, 31)
console_print(id, "You can not ban bots.")
return PLUGIN_CONTINUE
}
//Get ban length and convert to seconds
new ban_length_s [10],ban_length_s2 [10]
read_argv(1,ban_length_s, 9)
new multiplier = 60
new carg
if(contain(ban_length_s, "h") != -1)
{
multiplier = 60 * 60
carg = 'h'
}
else if(contain(ban_length_s, "d") != -1)
{
multiplier = 60 * 60 * 24
carg = 'd'
}
else if(contain(ban_length_s, "w") != -1)
{
multiplier = 60 * 60 * 24 * 7
carg = 'w'
}
copyc(ban_length_s2, 9,ban_length_s,carg )
new ban_length = str_to_num(ban_length_s2 ) * multiplier
//Get reason and get ready to format it
new text [64],temp [10],temp2 [33]
read_args(text, 63)
parse(text,temp, 9,temp2, 32)
new length1 = strlen(temp )
new length2 = strlen(temp2 )
new length = length1 + length2
length +=2
new reason [64]
read_args(reason, 63)
//Get user and admin info to put in table
new player_steamid [40],player_name [33],player_ip [20],admin_steamid [40],admin_name [33],admin_ip [20]
get_user_authid(player,player_steamid, 39)
get_user_name(player,player_name, 32)
get_user_ip(player,player_ip, 19, 1)
get_user_authid(id,admin_steamid, 39)
get_user_name(id,admin_name, 32)
get_user_ip(id,admin_ip, 19, 1)
//Format the query
new query [512]
format(query, 511, "INSERT into AMXX (player_steamid,player_name,player_ip,reason,bantype,admin_steamid,admin_name,admin_ip,length,server) values('%s','%s','%s','%s','%s','%s','%s','%s','%i','%s')",player_steamid,player_name,player_ip,reason [length ],bantype,admin_steamid,admin_name,admin_ip,ban_length,server )
// connect to database and insert data
dbi_query (mysql,query )
new merror [64]
dbi_error (mysql,merror, 63)
//If an error uccures
if (merror [0])
{
server_print("[AMXX] MYSQL error: %s",merror )
return PLUGIN_HANDLED
}
// convert ban length back to minutes for display
ban_length = ban_length / 60
//Print ban to server
console_print(id, "[AMXX] Banning %s for %i",player_name,ban_length )
client_print(0, print_chat, "[AMXX] Player %s banned.",player_name )
//Format time message
new time_msg [32]
//If the ban length is 0 (permanent)
if (ban_length == 0)
time_msg = "Permanent"
//Else, formate the time message
else
format(time_msg, 31, "%i minutes",ban_length )
//If the user is banned by steamid, print the message to the user
if(equal(bantype, "steamid"))
{
client_cmd(player, "echo ^"[AMXX ] Your SetamID has been banned from this server. ^"")
client_cmd(player, "echo ^"[AMXX ] Reason : %s. ^"",reason )
client_cmd(player, "echo ^"[AMXX ] Time left : %s. ^"",time_msg )
client_cmd(player, "disconnect")
return PLUGIN_CONTINUE
}
//If the user is banned by IP, print the message to the user
if(equal(bantype, "ip"))
{
client_cmd(player, "echo ^"[AMXX ] Your IP adress has been banned from this server. ^"")
client_cmd(player, "echo ^"[AMXX ] Reason : %s. ^"",reason )
client_cmd(player, "echo ^"[AMXX ] Time left : %s. ^"",time_msg )
client_cmd(player, "disconnect")
return PLUGIN_CONTINUE
}
//If there is a database connection, close it
if (mysql == SQL_OK )
{
dbi_close (mysql )
return PLUGIN_HANDLED
}
return PLUGIN_HANDLED
}
//------------------------------------------------- END Ban Player by SteamID OR IP Adress ----------------------------------------//
|