#include <amxmodx>
#include <fakemeta>
#include <sqlx>
#define PLUGIN "Registration System"
#define VERSION "1.3"
#define AUTHOR "mforce"
new const PREFIX[] = "RegSystem"
new const SQL_INFO[][] = {
"127.0.0.1", // HOST
"username", // USERNAME
"password", // PASSWORD
"database" // DATABASE
}
enum _:reginfo
{
usernamechk[32],
passwordchk[32]
}
new Handle:g_SqlTuple;
new Array:reglist
new loaded, data[reginfo];
new username[33][32], password[33][32], writepass[33][32], bool:loggedin[33], bool:registered[33];
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say /reg", "reg_menu")
register_clcmd("TYPE_PASSWORD", "Type_password")
register_clcmd("NEW_PASSWORD", "New_password")
register_cvar("reg_system", AUTHOR, FCVAR_SERVER | FCVAR_SPONLY);
register_dictionary("reg_system.txt");
reglist = ArrayCreate(reginfo)
register_forward(FM_ClientUserInfoChanged, "ClientUserInfoChanged")
set_task(60.0, "regcheck", .flags = "b");
}
public regcheck() {
new players[32], num;
get_players(players, num, "ch")
for(new i = 0; i < num; i++) {
new tempid = players[i]
if(!loggedin[tempid]) {
ChatColor(tempid, "^4[%s]^1 %L ^3/reg", PREFIX, LANG_SERVER, "HELP", LANG_SERVER, registered[tempid] ? "FOR_LOGIN":"FOR_REGISTER");
}
}
}
public client_putinserver(id) {
if(!is_user_bot(id) && !is_user_hltv(id)) {
get_user_name(id, username[id], charsmax(username[]));
for(new i = 0; i < loaded; i++) {
ArrayGetArray(reglist, i, data)
if(equal(username[id], data[usernamechk])) {
copy(password[id], charsmax(password[]), data[passwordchk])
registered[id] = true;
set_task(10.0, "reg_menu", id);
}
}
}
}
public client_disconnect(id) {
loggedin[id] = false;
registered[id] = false;
username[id] = "";
password[id] = "";
writepass[id] = "";
if(task_exists(id)) remove_task(id);
}
public reg_menu(id) {
new temp[128], loggedinmsg[32], registeredmsg[32], logoffmsg[32], notreggedname[32], exitname[32];
formatex(notreggedname, charsmax(notreggedname), "%L", LANG_SERVER, "NOTREGGED");
formatex(loggedinmsg, charsmax(loggedinmsg), "%L", LANG_SERVER, loggedin[id] ? "LOGGED_IN":"REGISTERED");
formatex(temp, charsmax(temp), "\r[\y%s\r] %L", PREFIX, LANG_SERVER, "REG_MENU_TITLE", AUTHOR, registered[id] ? loggedinmsg:notreggedname);
new menu = menu_create(temp, "reg_menu_h" )
formatex(temp, charsmax(temp), "%L", LANG_SERVER, "USERNAME", username[id])
menu_additem(menu,temp, "0",0)
formatex(temp, charsmax(temp), "%L", LANG_SERVER, "PASSWORD", writepass[id])
menu_additem(menu,temp, "1",0)
formatex(registeredmsg, charsmax(registeredmsg), "%L", LANG_SERVER, registered[id] ? "LOGIN":"REGISTER")
formatex(logoffmsg, charsmax(logoffmsg), "%L", LANG_SERVER, "LOGOFF")
formatex(temp, charsmax(temp), "%s^n", loggedin[id] ? logoffmsg:registeredmsg)
menu_additem(menu,temp, "2",0)
if(loggedin[id]) {
formatex(temp, charsmax(temp), "%L", LANG_SERVER, "CHGPASS")
menu_additem(menu,temp, "3",0)
}
menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
formatex(exitname, charsmax(exitname), "%L", LANG_SERVER, "EXIT")
menu_setprop(menu, MPROP_EXITNAME, exitname);
menu_display(id, menu, 0)
return PLUGIN_HANDLED;
}
public reg_menu_h(id, menu, item) {
if(item == MENU_EXIT) {
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new command[6], name[64], access, callback;
menu_item_getinfo(menu, item, access, command, sizeof command - 1, name, sizeof name - 1, callback);
switch(item)
{
case 0: {
reg_menu(id)
}
case 1: {
if(!loggedin[id]) {
client_cmd(id, "messagemode TYPE_PASSWORD")
}
else reg_menu(id)
}
case 2: {
if(registered[id]) {
if(!loggedin[id]) {
if(strlen(password[id]) >= 6 && equal(writepass[id], password[id])) {
ChatColor(id, "^4[%s]^1 %L ^3/reg", PREFIX, LANG_SERVER, "SUCCESS_LOGIN")
loggedin[id] = true;
}
else {
ChatColor(id, "^4[%s]^1 %L", PREFIX, LANG_SERVER, "WRONG_PASS")
writepass[id] = "";
reg_menu(id)
}
}
else {
loggedin[id] = false;
ChatColor(id, "^4[%s]^1 %L ^3/reg", PREFIX, LANG_SERVER, "SUCCESS_LOGOFF")
writepass[id] = "";
}
}
else {
if(strlen(writepass[id]) >= 6) {
ChatColor(id, "^4[%s]^1 %L", PREFIX, LANG_SERVER, "SUCCESS_REGISTER")
copy(password[id], charsmax(password[]), writepass[id]);
registered[id] = true;
save(id);
reg_menu(id)
}
else reg_menu(id)
}
}
case 3: {
if(loggedin[id]) {
client_cmd(id, "messagemode NEW_PASSWORD")
}
else reg_menu(id)
}
}
menu_destroy(menu);
return PLUGIN_HANDLED;
}
public Type_password(id) {
new adat[32]
read_args(adat, charsmax(adat))
remove_quotes(adat)
if(strlen(adat) < 6) {
ChatColor(id, "^4[%s]^1 %L", PREFIX, LANG_SERVER, "PASS_CHANGE1")
}
else {
copy(writepass[id], charsmax(writepass[]), adat)
}
reg_menu(id)
}
public New_password(id) {
if(!loggedin[id]) return;
new adat[32]
read_args(adat, charsmax(adat))
remove_quotes(adat)
if(strlen(adat) < 6) {
ChatColor(id, "^4[%s]^1 %L", PREFIX, LANG_SERVER, "PASS_CHANGE1")
}
else {
copy(writepass[id], charsmax(writepass[]), adat)
copy(password[id], charsmax(password[]), adat)
ChatColor(id, "^4[%s]^1 %L", PREFIX, LANG_SERVER, "PASS_CHANGE2")
update(id);
}
reg_menu(id)
}
public ClientUserInfoChanged(id, buffer) {
if (!is_user_connected(id))
return FMRES_IGNORED
static name[32], val[32]
get_user_name(id, name, charsmax(name))
engfunc(EngFunc_InfoKeyValue, buffer, "name", val, charsmax(val))
if (equal(val, name))
return FMRES_IGNORED
engfunc(EngFunc_SetClientKeyValue, id, buffer, "name", name)
client_cmd(id, "name ^"%s^"; setinfo name ^"%s^"", name, name)
ChatColor(id, "^4[%s]^1 %L", PREFIX, LANG_SERVER, "NAMECHANGE_BLOCK")
return FMRES_SUPERCEDE
}
public plugin_natives() {
register_native("is_user_loggedin", "native_loggedin", 1);
register_native("is_user_registered", "native_registered", 1);
}
public native_loggedin(index) {
return loggedin[index];
}
public native_registered(index) {
return registered[index];
}
stock ChatColor(const id, const szMessage[], any:...) {
static pnum, players[32], szMsg[190], IdMsg;
vformat(szMsg, charsmax(szMsg), szMessage, 3);
if(!IdMsg) IdMsg = get_user_msgid("SayText");
if(id) {
if(!is_user_connected(id)) return;
players[0] = id;
pnum = 1;
}
else get_players(players, pnum, "ch");
for(new i; i < pnum; i++) {
message_begin(MSG_ONE, IdMsg, .player = players[i]);
write_byte(players[i]);
write_string(szMsg);
message_end();
}
}
public plugin_cfg() {
new Query[512];
g_SqlTuple = SQL_MakeDbTuple(SQL_INFO[0],SQL_INFO[1],SQL_INFO[2],SQL_INFO[3])
formatex(Query, charsmax(Query), "CREATE TABLE IF NOT EXISTS registration_system (`username` varchar(32) NOT NULL,`password` varchar(32) NOT NULL,`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY)")
SQL_ThreadQuery(g_SqlTuple,"createTableThread", Query)
load()
}
public createTableThread(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
if(FailState == TQUERY_CONNECT_FAILED)
set_fail_state("Nem tudtam csatlakozni az adatbazishoz.");
else if(FailState == TQUERY_QUERY_FAILED)
set_fail_state("Query Error");
if(Errcode)
log_amx("Hibat dobtam: %s",Error);
}
public load() {
new Query[512];
formatex(Query, charsmax(Query), "SELECT * FROM `registration_system`;")
SQL_ThreadQuery(g_SqlTuple, "QuerySelectData", Query)
}
public QuerySelectData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED) {
log_amx("%s", Error)
return
}
else {
while(SQL_MoreResults(Query)) {
SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "username"), data[usernamechk], charsmax(data[usernamechk]));
SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "password"), data[passwordchk], charsmax(data[passwordchk]));
ArrayPushArray(reglist, data)
loaded++
SQL_NextRow(Query)
}
}
}
public save(id) {
copy(data[usernamechk], charsmax(data[usernamechk]), username[id])
copy(data[passwordchk], charsmax(data[passwordchk]), password[id])
ArrayPushArray(reglist, data)
loaded++
new text[512];
formatex(text, charsmax(text), "INSERT INTO `registration_system` (`username`, `password`) VALUES (^"%s^", ^"%s^");", username[id], password[id])
SQL_ThreadQuery(g_SqlTuple, "QuerySetData", text)
}
public update(id) {
for(new i = 0; i < loaded; i++) {
ArrayGetArray(reglist, i, data)
if(equal(data[usernamechk], username[id])) {
copy(data[passwordchk], charsmax(data[passwordchk]), password[id])
ArraySetArray(reglist, i, data)
}
}
new text[512];
formatex(text, charsmax(text), "UPDATE `registration_system` SET password = ^"%s^" WHERE username = ^"%s^";", password[id], username[id])
SQL_ThreadQuery(g_SqlTuple, "QuerySetData", text)
}
public QuerySetData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED) {
log_amx("%s", Error)
return
}
}
public plugin_end() {
SQL_FreeHandle(g_SqlTuple)
}