Код:
#include <amxmodx>
#include <amxmisc>
#include <sqlx>
#define PLUGIN "Amx Registration"
#define VERSION "1.3"
#define AUTHOR "SerejQa"
new bool:registered[33] = {false, ...}
new bool:new_password[33] = {true, ...}
new g_msgid_saytext
new Handle:db_players
new password_field[8]
new table_name[32]
new password_length
// ================================================================================
=================
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
//Commands
register_clcmd("say /register", "register_nickname", -1, "- register your nickname")
register_clcmd("say /remove", "remove_nickname", -1, "- remove your nickname's password")
register_clcmd("say /status", "db_nickname_status", -1, "- nickname's status (registered or not)")
register_clcmd("say /pwchange", "change_password", -1, "- change password for your nickname")
register_clcmd("say /regmenu", "rns_menu", -1, "- cs.proJecT Kreedz Menu") //Kreedz main menu
register_concmd("NN_password", "set_password", -1, "<password>")
//Menu
register_menucmd(register_menuid("RNS Menu"), 1023, "actionRNS_Menu")
//Cvars
register_cvar("amx_reg_password_field", "^"_nn^"")
register_cvar("amx_reg_table", "amx_players")
register_cvar("amx_reg_password_length", "16")
register_cvar("amx_reg_db_type", "mysql")
register_cvar("amx_reg_db_host", "127.0.0.1")
register_cvar("amx_reg_db_user", "root")
register_cvar("amx_reg_db_pass", "")
register_cvar("amx_reg_db_name", "amx")
//Dictionary
register_dictionary("amx_registration.txt")
g_msgid_saytext = get_user_msgid("SayText")
}
// ================================================================================
=================
// Initialize a database when all configuration files have been loaded
// ================================================================================
=================
public plugin_cfg()
{
new type[12]
SQL_GetAffinity(type, 11)
if(equali(type, "sqlite")) SQL_SetAffinity("sqlite")
set_task(0.1, "db_init")
}
// ================================================================================
=================
// Database functions
// ================================================================================
=================
public db_init()
{
static host[32], user[32], pass[32], name[32], type[12]
new query[300]
get_cvar_string("amx_reg_password_field", password_field, 7)
get_cvar_string("amx_reg_table", table_name, 31)
password_length = get_cvar_num("amx_reg_password_length")
get_cvar_string("amx_reg_db_host", host, 31)
get_cvar_string("amx_reg_db_user", user, 31)
get_cvar_string("amx_reg_db_pass", pass, 31)
get_cvar_string("amx_reg_db_name", name, 31)
get_cvar_string("amx_reg_db_type", type, 11)
db_players = SQL_MakeDbTuple(host, user, pass, name)
//Creating table (if table isn't exists)
//Structure: id (auto), username, password, registration date, userip, steamid
if(equali(type, "sqlite"))
{
formatex(query, 299, "CREATE TABLE IF NOT EXISTS %s (\
id INTEGER,\
username VARCHAR(32) NOT NULL DEFAULT '',\
password VARCHAR(32) NOT NULL DEFAULT '',\
date VARCHAR(10) NOT NULL DEFAULT '',\
ip VARCHAR(20) NOT NULL DEFAULT '',\
steamid VARCHAR(32) NOT NULL DEFAULT '',\
PRIMARY KEY (id))", table_name)
}
else
{
formatex(query, 299, "CREATE TABLE IF NOT EXISTS `%s` (\
`id` int(12) NOT NULL auto_increment,\
`username` varchar(32) default NULL,\
`password` varchar(32) default NULL,\
`date` varchar(10) default NULL,\
`ip` varchar(20) default NULL,\
`steamid` varchar(32) default NULL,\
PRIMARY KEY (`id`))", table_name)
}
SQL_ThreadQuery(db_players, "db_generic_handler", query)
}
// ================================================================================
=================
public db_generic_handler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
{
return query_failed(failstate, error, errnum)
}
// ================================================================================
=================
public query_failed(failstate, error[], errnum)
{
if(failstate == TQUERY_CONNECT_FAILED)
{
log_amx("[AMXX] Couldn't connect to database: %s", error)
return 1
}
else if(failstate == TQUERY_QUERY_FAILED)
{
log_amx("[AMXX] Query failed: %s", error)
return 1
}
if(errnum)
{
log_amx("[AMXX] Query Error: %s", error)
return 1
}
return 0
}
// ================================================================================
=================
public db_login(id)
{
new query[151]
new username[32]
new data[1]
data[0] = id
get_user_info(id, "name", username, 31)
//Finding username in database
formatex(query, 150, "SELECT id, username, password, date, ip, steamid FROM %s WHERE username=^"%s^"", table_name, username)
SQL_ThreadQuery(db_players, "db_login_handler", query, data, 2)
return PLUGIN_HANDLED
}
// ================================================================================
=================
public db_save(id, pw[])
{
new query[351]
new username[32]
new regdate[32]
new userip[20]
new authid[32]
new data[1]
new type[12]
data[0] = id
get_user_info(id, "name", username, 31)
get_time("%d.%m.%Y", regdate, 31)
get_user_ip(id, userip, 19, 1)
get_user_authid(id, authid, 31)
//Writing user info to a database
get_cvar_string("amx_reg_db_type", type, 11)
if(equali(type, "sqlite"))
{
formatex(query, 350, "INSERT INTO %s (username, password, date, ip, steamid) values (^"%s^", ^"%s^", ^"%s^", ^"%s^", ^"%s^")", table_name, username, pw, regdate, userip, authid)
}
else
{
formatex(query, 350, "INSERT INTO %s (username, password, date, ip, steamid) values (^"%s^", md5(^"%s^"), ^"%s^", ^"%s^", ^"%s^")", table_name, username, pw, regdate, userip, authid)
}
SQL_ThreadQuery(db_players, "db_check_error_handler", query, data, 2)
client_cmd(id, "setinfo ^"%s^" ^"%s^"", password_field, pw) //Prevent from kicking
client_print(id, print_chat, "[AMXX] %L", id, "NN_PW_CREATED")
console_print(id, "[AMXX] %L", id, "NN_SUCCESS_MSG", password_field, pw)
registered[id] = true
return PLUGIN_HANDLED
}
// ================================================================================
=================
public db_remove(id)
{
new query[351]
new username[32]
new data[1]
data[0] = id
get_user_info(id, "name", username, 31)
//Deleting row contains user's data from database
formatex(query, 350, "DELETE FROM %s WHERE username=^"%s^"", table_name, username)
SQL_ThreadQuery(db_players, "db_check_error_handler", query, data, 2)
client_print(id, print_chat, "[AMXX] %L", id, "NN_REMOVED")
registered[id] = false
return PLUGIN_HANDLED
}
// ================================================================================
=================
public db_change_password(id, pw[])
{
new query[101]
new username[32]
new data[1]
new type[12]
data[0] = id
get_user_info(id, "name", username, 31)
get_cvar_string("amx_reg_db_type", type, 11)
//Rewrite password
if(equali(type, "sqlite")) formatex(query, 100, "UPDATE %s SET password=^"%s^" WHERE username=^"%s^"", table_name, pw, username)
else formatex(query, 100, "UPDATE %s SET password=md5(^"%s^") WHERE username=^"%s^"", table_name, pw, username)
SQL_ThreadQuery(db_players, "db_check_error_handler", query, data, 2)
client_cmd(id, "setinfo ^"%s^" ^"%s^"", password_field, pw) //Prevent from kicking
console_print(id, "[AMXX] %L", id, "NN_SUCCESS_MSG", password_field, pw)
client_print(id, print_chat, "[AMXX] %L", id, "NN_PW_UPDATED")
return PLUGIN_HANDLED
}
// ================================================================================
=================
public db_nickname_status(id)
{
new query[151]
new username[32]
new data[1]
data[0] = id
get_user_info(id, "name", username, 31)
formatex(query, 150, "SELECT id, username, password, date, ip, steamid FROM %s WHERE username=^"%s^"", table_name, username)
SQL_ThreadQuery(db_players, "db_nickname_status_handler", query, data, 2)
return PLUGIN_HANDLED
}
// ================================================================================
=================
public db_login_handler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
{
new id = data[0]
new type[12]
if(SQL_NumResults(query) < 1) //If no results for a query
{
registered[id] = false
return PLUGIN_HANDLED
}
if(!query_failed(failstate, error, errnum)) //Success
{
new client_password[34], db_client_password[34], md5_password[34]
registered[id] = true
get_user_info(id, password_field, client_password, 33) //Reading a password saved in client's config
get_cvar_string("amx_reg_db_type", type, 11)
if(equali(type, "sqlite")) copy(md5_password, 33, client_password) //Not encrypted password for sqlite
else md5(client_password, md5_password) //Encrypting client's password :O
SQL_ReadResult(query, 2, db_client_password, 65) //Reading a password saved in database
if(!equal(md5_password, db_client_password)) //Compare two arguments
{
server_cmd("kick #%d ^"%L^"", get_user_userid(id), id, "NN_PW_INV")
}
}
return PLUGIN_HANDLED
}
// ================================================================================
=================
public db_nickname_status_handler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
{
new id = data[0]
if(SQL_NumResults(query) < 1) //If no results for a query
{
client_print(id, print_chat, "[AMXX] %L", id, "NN_NOT_REG")
return PLUGIN_HANDLED
}
if(!query_failed(failstate, error, errnum)) //Success
{
client_print(id, print_chat, "[AMXX] %L", id, "NN_REG")
}
return PLUGIN_HANDLED
}
// ================================================================================
=================
public db_check_error_handler(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
{
new id = data[0]
if(query_failed(failstate, error, errnum)) //Fail
{
client_print(id, print_chat, "[AMXX] %L", id, "NN_DB_ERROR")
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
// ================================================================================
=================
// Check player if he authorized
// ================================================================================
=================
public client_authorized(id)
{
if(is_user_bot(id) || is_user_hltv(id))
{
return PLUGIN_HANDLED
}
set_task(1.0, "db_login", id)
return PLUGIN_CONTINUE
}
// ================================================================================
=================
// Send message to unregistered player
// ================================================================================
=================
public client_putinserver(id)
{
if(is_user_bot(id) || is_user_hltv(id))
{
return PLUGIN_HANDLED
}
db_login(id)
set_task(30.0, "message_reg", id)
return PLUGIN_CONTINUE
}
// ================================================================================
=================
public message_reg(id)
{
if(registered[id]) //If is user registered - do nothing
{
remove_task(id)
return PLUGIN_HANDLED
}
new text[128]
text[0] = 0x04
formatex(text[1], 126, "[AMXX] %L", id, "NN_CON_MSG")
msg_saytext(id, text)
return PLUGIN_CONTINUE
}
// ================================================================================
=================
// Check player if he changed his info
// ================================================================================
=================
public client_infochanged(id)
{
if(is_user_bot(id) || is_user_hltv(id))
{
return PLUGIN_HANDLED
}
set_task(1.0, "db_login", id)
return PLUGIN_CONTINUE
}
// ================================================================================
=================
// Player disconnected
// ================================================================================
=================
public client_disconnect(id)
{
registered[id] = false
}
// ================================================================================
=================
// say /register
// ================================================================================
=================
public register_nickname(id)
{
//This option is only available for unregistered users
if(registered[id])
{
client_print(id, print_chat, "[AMXX] %L", id, "NN_ALR_REG")
return PLUGIN_HANDLED
}
else
{
new_password[id] = true
client_print(id, print_chat, "[AMXX] %L", id, "NN_NEW_PW")
client_cmd(id, "messagemode NN_password")
}
return PLUGIN_HANDLED
}
// ================================================================================
=================
// say /remove
// ================================================================================
=================
public remove_nickname(id)
{
//This option is only available for registered users
if(!registered[id])
{
client_print(id, print_chat, "[AMXX] %L", id, "NN_NOT_REG")
return PLUGIN_HANDLED
}
db_remove(id)
return PLUGIN_HANDLED
}
// ================================================================================
=================
// say /pwchange
// ================================================================================
=================
public change_password(id)
{
//This option is only available for registered users
if(!registered[id])
{
client_print(id, print_chat, "[AMXX] %L", id, "NN_NOT_REG")
return PLUGIN_HANDLED
}
set_task(1.0, "task_password", id) //Prevent aliases :O
return PLUGIN_HANDLED
}
// ================================================================================
=================
public task_password(id)
{
if(task_exists(id))
{
new_password[id] = false
client_print(id, print_chat, "[AMXX] %L", id, "NN_NEW_PW")
client_cmd(id, "messagemode NN_password")
}
return PLUGIN_HANDLED
}
// ================================================================================
=================
public set_password(id)
{
new pw[34]
read_args(pw, sizeof(pw) - 1) //Read argument that player typed
remove_quotes(pw)
continue_setting_password(id, pw)
return PLUGIN_HANDLED
}
// ================================================================================
=================
continue_setting_password(id, pw[])
{
if(strlen(pw) > password_length) //Maximum password length :O
{
client_print(id, print_chat, "[AMXX] %L", id, "NN_PW_MAX_LENGTH", password_length)
return PLUGIN_HANDLED
}
else if(strlen(pw) < 4) //Minimum password length :O
{
client_print(id, print_chat, "[AMXX] %L", id, "NN_PW_MIN_LENGTH")
return PLUGIN_HANDLED
}
//New registration or changing password
new_password[id] ? db_save(id, pw) : db_change_password(id, pw)
return PLUGIN_HANDLED
}
// ================================================================================
=================
// Color message
// ================================================================================
=================
msg_saytext(id, text[])
{
message_begin(MSG_ONE, g_msgid_saytext, _, id)
write_byte(id)
write_string(text)
message_end()
}
// ================================================================================
=================
// RNS Menu
// ================================================================================
=================
public actionRNS_Menu(id, key)
{
switch(key)
{
case 0:
{
register_nickname(id)
}
case 1:
{
change_password(id)
}
case 2:
{
remove_nickname(id)
}
case 9:
{
return PLUGIN_HANDLED
}
}
return PLUGIN_HANDLED
}
// ================================================================================
=================
public rns_menu(id)
{
new menu[1024]
new keys = MENU_KEY_0
new len = format(menu, 1023, "\r%L^n%L^n^n", id, "NN_MENU", id, registered[id] ? "NN_MENU_REG" : "NN_MENU_NOTREG")
if(registered[id])
{
len += format(menu[len], 1023 - len, "\d1. %L^n", id, "NN_MENU_REGISTER")
len += format(menu[len], 1023 - len, "\w2. %L^n", id, "NN_MENU_PWCHANGE")
len += format(menu[len], 1023 - len, "\w3. %L^n", id, "NN_MENU_PWREMOVE")
keys |= MENU_KEY_2 | MENU_KEY_3
}
else
{
len += format(menu[len], 1023 - len, "\w1. %L^n", id, "NN_MENU_REGISTER")
len += format(menu[len], 1023 - len, "\d2. %L^n", id, "NN_MENU_PWCHANGE")
len += format(menu[len], 1023 - len, "\d3. %L^n", id, "NN_MENU_PWREMOVE")
keys |= MENU_KEY_1
}
len += format(menu[len], 1023 - len, "^n\w0. %L", id, "EXIT")
show_menu(id, keys, menu, -1, "RNS Menu")
}