/** 
* Created by AMXX-Stuido
* User: ITenGriTR
* Date: 12.02.2019
* Time 22.00
*/
#include <amxmodx>
#include <nvault>
#include <regex> 

#pragma semicolon 1

/************************************************************************
-= Defines =-
************************************************************************/

/************************************************************************
-= Datas =-
************************************************************************/
new iG_Vault,iG_ForwardLogin,iG_ForwardRegister,iG_ForwardMulti,iG_ForwardExit,iG_ForwardChangeLanguage,iG_Return,iG_UID[33];
new bool:bG_Safety[33];
new sG_UserName[33][22],sG_UserPass[33][22];

/************************************************************************
-= Registers =-
************************************************************************/
public plugin_init(){
	register_plugin
	("WA - Hesap Sistemi",
	"9.8",
	"Berk");
	
	register_clcmd("Giris_KullaniciAdi","Giris_KullaniciAdiX");
	register_clcmd("Giris_Sifre","Giris_SifreX");
	register_clcmd("Kayit_KullaniciAdi","Kayit_KullaniciAdiX");
	register_clcmd("Kayit_Sifre","Kayit_SifreX");
	register_clcmd("Yeni_Sifre","Yeni_SifreX");
	
	iG_ForwardLogin = CreateMultiForward("pUserLogged",ET_IGNORE,FP_CELL);
	iG_ForwardRegister = CreateMultiForward("pUserRegistered",ET_IGNORE,FP_CELL);
	iG_ForwardMulti = CreateMultiForward("pUserLoggedMulti",ET_IGNORE,FP_CELL);
	iG_ForwardExit = CreateMultiForward("pUserExit",ET_IGNORE,FP_CELL);
	iG_ForwardChangeLanguage = CreateMultiForward("pUserChangedLanguage",ET_IGNORE,FP_CELL,FP_CELL);
}
public plugin_natives(){
	register_native("nForwardLogin","nForwardLoginX");
	register_native("nForwardRegister","nForwardRegisterX");
	register_native("nSetLoginUserByID","nSetLoginUserByIDX");
	register_native("nSetLoginUIDByID","nSetLoginUIDByIDX");
	register_native("nGetUidByID","nGetUidByIDX");
	register_native("nIsUidOnline","nIsUidOnlineX");
	register_native("nGetUidByName","nGetUidByNameX");
	register_native("nIsValidUid","nIsValidUidX");
	register_native("nUidOnlineTime","nUidOnlineTimeX");
	register_native("nUidLastLogin","nUidLastLoginX");
	register_native("nUidLastName","nUidLastNameX");
	register_native("nUidLastSteam","nUidLastSteamX");
	register_native("nGetLastUid","nGetLastUidX");
	register_native("nSetUidStatus","nSetUidStatusX");
	register_native("nGetUidStatus","nGetUidStatusX");
	register_native("nSetUidLanguage","nSetUidLanguageX");
	register_native("nGetUidLanguage","nGetUidLanguageX");
	register_native("nGetLoginFlag","nGetLoginFlagX");
	register_native("nSetLoginFlag","nSetLoginFlagX");
	register_native("nForwardExit","nForwardExitX");
	register_native("nUidGetUName","nUidGetUNameX");
	register_native("nUidGetUPass","nUidGetUPassX");
	register_native("nChangePassword","nChangePasswordX");
	register_native("nCreateAccount","nCreateAccountX");
}
public plugin_cfg(){
	//newAccount
	iG_Vault = nvault_open("newAccount");
}
public plugin_end(){
	for(new i; i < 33; i++){
		if(iG_UID[i]){
			new iL_TimeDiff,iL_OnlineTime,iL_UID = iG_UID[i];
			iL_TimeDiff = get_systime();
			iL_TimeDiff -= sGetIntData("uid>%i>lastlogin",iL_UID);
			iL_OnlineTime = sGetIntData("uid>%i>onlinetime",iL_UID);
			sSetIntData("uid>%i>onlinetime",iL_TimeDiff+iL_OnlineTime,iL_UID);
			iG_UID[i] = 0;
		}
	}
	nvault_close(iG_Vault);
}
public client_disconnected(iP_ID){
	if(iG_UID[iP_ID]){
		new iL_TimeDiff,iL_OnlineTime,iL_UID = iG_UID[iP_ID];
		iL_TimeDiff = get_systime();
		iL_TimeDiff -= sGetIntData("uid>%i>lastlogin",iL_UID);
		iL_OnlineTime = sGetIntData("uid>%i>onlinetime",iL_UID);
		sSetIntData("uid>%i>onlinetime",iL_TimeDiff+iL_OnlineTime,iL_UID);
		iG_UID[iP_ID] = 0;
	}
}
public client_putinserver(iP_ID){
	iG_UID[iP_ID] = 0;
	set_task(2.0,"pTryToLogin",iP_ID);
}
/************************************************************************
-= System =-
************************************************************************/
public pTryToLogin(iP_ID){
	new sL_UserName[22],sL_PassWord[22];
	get_user_info(iP_ID,"_un",sL_UserName,21);
	get_user_info(iP_ID,"_up",sL_PassWord,21);
	if(strlen(sL_UserName) > 2 && strlen(sL_PassWord) > 2){
		sG_UserName[iP_ID] = sL_UserName;
		sG_UserPass[iP_ID] = sL_PassWord;
		pP_GoLogin(iP_ID,2);
	}
}
public nForwardLoginX(){
	new iL_ID = get_param(1);
	bG_Safety[iL_ID] = true;
	client_cmd(iL_ID,"messagemode Giris_KullaniciAdi");
}
public nForwardRegisterX(){
	new iL_ID = get_param(1);
	bG_Safety[iL_ID] = true;
	client_cmd(iL_ID,"messagemode Kayit_KullaniciAdi");
}
public nSetLoginUserByIDX(){
	new iL_ID = get_param(1);
	new sL_Name[22],sL_UserPass[22];
	get_string(2,sL_Name,21);
	get_string(3,sL_UserPass,21);
	new iL_AltUID = iG_UID[iL_ID];
	if(iL_AltUID){
		new iL_TimeDiff,iL_OnlineTime;
		iL_TimeDiff = get_systime();
		iL_TimeDiff -= sGetIntData("uid>%i>lastlogin",iL_AltUID);
		iL_OnlineTime = sGetIntData("uid>%i>onlinetime",iL_AltUID);
		sSetIntData("uid>%i>onlinetime",iL_TimeDiff+iL_OnlineTime,iL_AltUID);
		ExecuteForward(iG_ForwardExit,iG_Return,iL_ID);
		iG_UID[iL_ID] = 0;
	}
	copy(sG_UserName[iL_ID],21,sL_Name);
	copy(sG_UserPass[iL_ID],21,sL_UserPass);
	pP_GoLogin(iL_ID,2);
}
public nSetLoginUIDByIDX(){
	new iL_ID = get_param(1);
	new iL_UID = get_param(2);
	if(1000 <= iL_UID <= nGetLastUidX()){
		new iL_AltUID = iG_UID[iL_ID];
		if(iL_AltUID){
			new iL_TimeDiff,iL_OnlineTime;
			iL_TimeDiff = get_systime();
			iL_TimeDiff -= sGetIntData("uid>%i>lastlogin",iL_AltUID);
			iL_OnlineTime = sGetIntData("uid>%i>onlinetime",iL_AltUID);
			sSetIntData("uid>%i>onlinetime",iL_TimeDiff+iL_OnlineTime,iL_AltUID);
			ExecuteForward(iG_ForwardExit,iG_Return,iL_ID);
			iG_UID[iL_ID] = 0;
		}
		copy(sG_UserName[iL_ID],21,sGetStrData("uid>%i>username",iL_UID));
		copy(sG_UserPass[iL_ID],21,sGetStrData("uid>%i>userpass",iL_UID));
		pP_GoLogin(iL_ID,2);
	}
}
public nForwardExitX(){
	new iL_ID = get_param(1),iL_TimeDiff,iL_OnlineTime,iL_UID = iG_UID[iL_ID];
	iL_TimeDiff = get_systime();
	iL_TimeDiff -= sGetIntData("uid>%i>lastlogin",iL_UID);
	iL_OnlineTime = sGetIntData("uid>%i>onlinetime",iL_UID);
	sSetIntData("uid>%i>onlinetime",iL_TimeDiff+iL_OnlineTime,iL_UID);
	ExecuteForward(iG_ForwardExit,iG_Return,iL_ID);
	iG_UID[iL_ID] = 0;
}
public nGetUidByIDX(){
	new iL_ID = get_param(1);
	return iG_UID[iL_ID];
}
public nIsUidOnlineX(){
	new iL_UID = get_param(1);
	for(new i; i < 33; i++){
		if(iG_UID[i] == iL_UID){
			return i;
		}
	}
	return 0;
}
public nGetUidByNameX(){
	new sL_Name[26];
	get_string(1,sL_Name,25);
	return sGetIntData("lastname>%s>uid",sL_Name);
}
public nIsValidUidX(){
	new iL_UID = get_param(1);
	if(1000 <= iL_UID <= nGetLastUidX()){
		return 1;
	}
	return 0;
}
public nUidOnlineTimeX(){
	new iL_UID = get_param(1);
	return sGetIntData("uid>%i>onlinetime",iL_UID);
}
public nUidLastLoginX(){
	new iL_UID = get_param(1);
	return sGetIntData("uid>%i>lastlogin",iL_UID);
}
public nUidLastNameX(){
	new iL_UID = get_param(1);
	new iL_Len = get_param(2);
	set_string(2,sGetStrData("uid>%i>lastname",iL_UID),iL_Len);	
}
public nUidLastSteamX(){
	new iL_UID = get_param(1);
	new iL_Len = get_param(2);
	set_string(2,sGetStrData("uid>%i>lastauthid",iL_UID),iL_Len);	
}
public nUidGetUNameX(){
	new iL_UID = get_param(1);
	new iL_Len = get_param(2);
	set_string(2,sGetStrData("uid>%i>username",iL_UID),iL_Len);	
}
public nUidGetUPassX(){
	new iL_UID = get_param(1);
	new iL_Len = get_param(2);
	set_string(2,sGetStrData("uid>%i>userpass",iL_UID),iL_Len);	
}
public nGetLastUidX(){
	new iL_UID =  sGetIntData("mthr>lastuid");
	if(!iL_UID){
		iL_UID = 1000;
	}
	return iL_UID;
}
public nSetUidStatusX(){
	new iL_UID = get_param(1);
	new iL_Status = get_param(2);
	sSetIntData("uid>%i>status",iL_Status,iL_UID);
}
public nGetUidStatusX(){
	new iL_UID = get_param(1);
	return sGetIntData("uid>%i>status",iL_UID);	
}
public nSetUidLanguageX(){
	new iL_UID = get_param(1);
	new iL_Language = get_param(2);
	if(iL_UID < 33){
		sSetIntData("uid>%i>language",iL_Language,iG_UID[iL_UID]);
		ExecuteForward(iG_ForwardChangeLanguage,iG_Return,iL_UID,iL_Language);	
	}
	else{
		sSetIntData("uid>%i>language",iL_Language,iL_UID);
	}
}
public nGetUidLanguageX(){
	new iL_UID = get_param(1);
	if(iL_UID < 33){
		iL_UID = iG_UID[iL_UID];		
	}
	if(iL_UID > 999){
		return sGetIntData("uid>%i>language",iL_UID);	
	}
	else{
		return 0;
	}
}
public nGetLoginFlagX(){
	new iL_UID = get_param(1);
	return sGetIntData("uid>%i>loginflag",iL_UID);
}
public nSetLoginFlagX(){
	new iL_UID = get_param(1);
	new iL_Flags = get_param(2);
	sSetIntData("uid>%i>loginflag",iL_Flags,iL_UID);	
}
public nCreateAccountX(){
	new sL_UserName[22],sL_UserPass[22];
	new iL_ID = get_param(1);
	get_string(2,sL_UserName,21);
	get_string(3,sL_UserPass,21);
	copy(sG_UserName[iL_ID],21,sL_UserName);
	copy(sG_UserPass[iL_ID],21,sL_UserPass);
	pP_GoRegister(iL_ID);
}
public nChangePasswordX(){
	new iL_ID = get_param(1);
	bG_Safety[iL_ID] = true;
	client_cmd(iL_ID,"messagemode Yeni_Sifre");
}
public Yeni_SifreX(iP_ID){
	if(!bG_Safety[iP_ID]){
		sColoredChat(iP_ID,"!gHey!n, !gbir seyler yanlis gitti ha !t?");
		return PLUGIN_HANDLED;
	}	
	new iL_UID = iG_UID[iP_ID];
	new sL_Arg[22];
	read_args(sL_Arg,21);
	remove_quotes(sL_Arg);
	new iL_Return,sL_Error[64];
	new Regex:cL_Regex = regex_match(sL_Arg,"^^[a-zA-Z0-9]+$",iL_Return,sL_Error,63);
	if(cL_Regex <= REGEX_NO_MATCH || !( 2 <= strlen(sL_Arg) <= 20)){	    
		sColoredChat(iP_ID,"!gHey!n, !gbir seyler yanlis gitti ha !t?");
		return PLUGIN_HANDLED;
	}
	sRemoveData("%s|%s>uid",sGetStrData("uid>%i>username",iL_UID),sGetStrData("uid>%i>userpass",iL_UID));
	sSetStrData("uid>%i>userpass",sL_Arg,iL_UID);
	sSetIntData("%s|%s>uid",iL_UID,sGetStrData("uid>%i>username",iL_UID),sL_Arg);
	sColoredChat(iP_ID,"!gBasarili bir sekilde sifren !n[ !t%s !n] !gyapildi!n.",sL_Arg);
	return PLUGIN_HANDLED;
}
public Giris_KullaniciAdiX(iP_ID){
	if(!bG_Safety[iP_ID]){
		sColoredChat(iP_ID,"!gHey!n, !gbir seyler yanlis gitti ha !t?");
		return PLUGIN_HANDLED;
	}
	new sL_Arg[22];
	read_args(sL_Arg,21);
	remove_quotes(sL_Arg);	
	new iL_Return,sL_Error[64];
	new Regex:cL_Regex = regex_match(sL_Arg,"^^[a-zA-Z0-9]+$",iL_Return,sL_Error,63);
	if(cL_Regex <= REGEX_NO_MATCH || !(2 <= strlen(sL_Arg) <= 20)){	    
		sColoredChat(iP_ID,"!gHey!n, !gbir seyler yanlis gitti ha !t?");
		return PLUGIN_HANDLED;
	}
	copy(sG_UserName[iP_ID],21,sL_Arg);
	client_cmd(iP_ID,"messagemode Giris_Sifre");
	return PLUGIN_HANDLED;
}
public Giris_SifreX(iP_ID){
	if(!bG_Safety[iP_ID]){
		sColoredChat(iP_ID,"!gHey!n, !gbir seyler yanlis gitti ha !t?");
		return PLUGIN_HANDLED;
	}
	new sL_Arg[22];
	read_args(sL_Arg,21);
	remove_quotes(sL_Arg);	
	new iL_Return,sL_Error[64];
	new Regex:cL_Regex = regex_match(sL_Arg,"^^[a-zA-Z0-9]+$",iL_Return,sL_Error,63);
	if(cL_Regex <= REGEX_NO_MATCH || !(2 <= strlen(sL_Arg) <= 20)){	    
		sColoredChat(iP_ID,"!gHey!n, !gbir seyler yanlis gitti ha !t?");
		return PLUGIN_HANDLED;
	}
	copy(sG_UserPass[iP_ID],21,sL_Arg);
	pP_GoLogin(iP_ID,1);
	return PLUGIN_HANDLED;
}
public Kayit_KullaniciAdiX(iP_ID){
	if(!bG_Safety[iP_ID]){
		sColoredChat(iP_ID,"!gHey!n, !gbir seyler yanlis gitti ha !t?");
		return PLUGIN_HANDLED;
	}
	new sL_Arg[22];
	read_args(sL_Arg,21);
	remove_quotes(sL_Arg);	
	new iL_Return,sL_Error[64];
	new Regex:cL_Regex = regex_match(sL_Arg,"^^[a-zA-Z0-9]+$",iL_Return,sL_Error,63);
	if(cL_Regex <= REGEX_NO_MATCH || !(2 <= strlen(sL_Arg) <= 20)){	    
		sColoredChat(iP_ID,"!gHey!n, !gbir seyler yanlis gitti ha !t?");
		return PLUGIN_HANDLED;
	}
	copy(sG_UserName[iP_ID],21,sL_Arg);
	client_cmd(iP_ID,"messagemode Kayit_Sifre");
	return PLUGIN_HANDLED;
}
public Kayit_SifreX(iP_ID){
	if(!bG_Safety[iP_ID]){
		sColoredChat(iP_ID,"!gHey!n, !gbir seyler yanlis gitti ha !t?");
		return PLUGIN_HANDLED;
	}
	new sL_Arg[22];
	read_args(sL_Arg,21);
	remove_quotes(sL_Arg);	
	new iL_Return,sL_Error[64];
	new Regex:cL_Regex = regex_match(sL_Arg,"^^[a-zA-Z0-9]+$",iL_Return,sL_Error,63);
	if(cL_Regex <= REGEX_NO_MATCH || !( 2 <= strlen(sL_Arg) <= 20)){	    
		sColoredChat(iP_ID,"!gHey!n, !gbir seyler yanlis gitti ha !t?");
		return PLUGIN_HANDLED;
	}
	copy(sG_UserPass[iP_ID],21,sL_Arg);
	pP_GoRegister(iP_ID);
	return PLUGIN_HANDLED;
}
public pP_GoLogin(iP_ID,iP_MessageType){
	new iL_UID = sGetIntData("%s|%s>uid",sG_UserName[iP_ID],sG_UserPass[iP_ID]);
	if(!iL_UID){
		if(iP_MessageType != 2){
			sColoredChat(iP_ID,"!gBoyle bir hesap bulunamadi!n!");
		}
		return PLUGIN_HANDLED;
	}
	new iL_Status = sGetIntData("uid>%i>status",iL_UID);
	if(!iL_Status){
		sColoredChat(iP_ID,"!gBu hesap yasaklanmis durumda!n!");
		return PLUGIN_HANDLED;		
	}
	new iL_ReqiredFlag = sGetIntData("uid>%i>loginflag",iL_UID);
	if(iL_ReqiredFlag){
		new iL_Flags = get_user_flags(iP_ID);
		if(~iL_Flags & iL_ReqiredFlag){
			sColoredChat(iP_ID,"!gBu hesaba girebilmek icin yetkiniz yetersiz!n!");
			return PLUGIN_HANDLED;		
		}
	}
	new sL_Name[28],sL_Authid[28];
	get_user_name(iP_ID,sL_Name,27);
	for(new i; i < 33; i++){
		if(iG_UID[i] == iL_UID){
			sColoredChat(i,"!gCoklu hesap kullanimi malesefki yasak!n!");
			sColoredChat(iP_ID,"!gCoklu hesap kullanimi malesefki yasak!n!");
			iG_UID[i] = 0;
			ExecuteForward(iG_ForwardMulti,iG_Return,i);
			break;
		}
	}
	get_user_authid(iP_ID,sL_Authid,27);
	sSetIntData("uid>%i>lastlogin",get_systime(),iL_UID);
	sSetStrData("uid>%i>lastname",sL_Name,iL_UID);
	sSetIntData("lastname>%s>uid",iL_UID,sL_Name);
	sSetStrData("uid>%i>lastauthid",sL_Authid,iL_UID);
	sG_UserName[iP_ID] = "";
	sG_UserPass[iP_ID] = "";
	iG_UID[iP_ID] = iL_UID;
	ExecuteForward(iG_ForwardLogin,iG_Return,iP_ID);
	sColoredChat(iP_ID,"!gBasarili bir sekilde giris yapildi!n, !gHOSGELDIN!n!");
	return PLUGIN_CONTINUE;
}
public pP_GoRegister(iP_ID){
	new iL_UID = sGetIntData("%s|%s>uid",sG_UserName[iP_ID],sG_UserPass[iP_ID]);
	if(iL_UID){
		sColoredChat(iP_ID,"!gBoyle bir hesap zaten mevcut!n!");
		return PLUGIN_HANDLED;
	}	
	iL_UID = sGetIntData("mthr>lastuid");
	if(!iL_UID){
		iL_UID = 1000;
	}
	sSetIntData("%s|%s>uid",iL_UID,sG_UserName[iP_ID],sG_UserPass[iP_ID]);
	sSetIntData("uid>%i>status",1,iL_UID);
	sSetIntData("uid>%i>language",0,iL_UID);
	sSetStrData("uid>%i>username",sG_UserName[iP_ID],iL_UID);
	sSetStrData("uid>%i>userpass",sG_UserPass[iP_ID],iL_UID);
	iL_UID += 1;
	sSetIntData("mthr>lastuid",iL_UID);
	ExecuteForward(iG_ForwardRegister,iG_Return,iP_ID);
	sColoredChat(iP_ID,"!gBasarili bir sekilde kayit !n[ !t%s!g|!t%s !n] !golundu!n, !gHOSGELDIN!n!",sG_UserName[iP_ID],sG_UserPass[iP_ID]);
	pP_GoLogin(iP_ID,1);
	return PLUGIN_CONTINUE;
}
/************************************************************************
-= Stocks =-
************************************************************************/
stock sGetIntData(const sS_Key[],any:...){
	new sL_FixedData[128];
	vformat(sL_FixedData,charsmax(sL_FixedData),sS_Key,2);
	return nvault_get(iG_Vault,sL_FixedData);
}
stock sSetIntData(const sS_Key[],const iS_Data,any:...){
	new sL_FixedData[128],sL_NumToStr[48];
	vformat(sL_FixedData,charsmax(sL_FixedData),sS_Key,3);
	num_to_str(iS_Data,sL_NumToStr,charsmax(sL_NumToStr));
	nvault_set(iG_Vault,sL_FixedData,sL_NumToStr);
}
stock sGetStrData(const sS_Key[],any:...){
	new sL_FixedData[128],sL_ReturnedData[256];
	vformat(sL_FixedData,charsmax(sL_FixedData),sS_Key,2);
	nvault_get(iG_Vault,sL_FixedData,sL_ReturnedData,charsmax(sL_ReturnedData));
	return sL_ReturnedData;
}
stock sSetStrData(const sS_Key[],const sS_Data[],any:...){
	new sL_FixedData[128];
	vformat(sL_FixedData,charsmax(sL_FixedData),sS_Key,3);
	nvault_set(iG_Vault,sL_FixedData,sS_Data);
}
stock sRemoveData(const sS_Key[],any:...){
	new sL_FixedData[128];
	vformat(sL_FixedData,charsmax(sL_FixedData),sS_Key,2);
	nvault_remove(iG_Vault,sL_FixedData);
}
#if AMXX_VERSION_NUM < 183
stock sColoredChat(const id, const input[], any:...){
	new count = 1, players[32];
	static msg[191];
	vformat(msg, 255, input, 3);
	
	replace_all(msg, 255, "!n", "^x01"); // Default Renk(Sary)
	replace_all(msg, 255, "!g", "^x04"); // Ye?il Renk
	replace_all(msg, 255, "!t", "^x03"); // Takym Renk( CT mavi , T kyrmyzy )
	
	if (id) players[0] = id; else get_players(players, count, "ch");{
		for (new i = 0; i < count; i++)
		{
			if (is_user_connected(players[i]))
			{
				
				message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
				write_byte(players[i]);
				write_string(msg);
				message_end();
			}
			
		}
	}
	
}
#else
stock sColoredChat(const id, const input[], any:...){
	static msg[191];
	vformat(msg, 255, input, 3);
	
	replace_all(msg, 255, "!n", "^x01"); 
	replace_all(msg, 255, "!g", "^x04"); 
	replace_all(msg, 255, "!t", "^x03"); 
	
	client_print_color(id, id, msg);
}
#endif