Page 1 of 1

cerere modificare/extragere din plugin

Posted: 16 Nov 2019, 21:46
by @LeX
Salut, extream.
as dori daca se poare din plugin-ul ROM-Protect,

Sa se extraga functia de login ale adminilor, adica incarcarea adminilor prin tastarea comenzi "login parola".
am gasit plugin-uri similare dar nici unul nu indeplineste cerintele dorite de mine mai bine ca aceasta functie.
Nu doresc intreg plugin-ul pentru ca imi da eroare iar plugin asemanator de protectie am deja (poare un pic mai bun)

eu am incercat sa fac acest lucru dar ma depaseste :)), plugin-ul ruleaza corect dar nu merge absolut nimic (mind.exe fatal error :)) ) de aceea am apelat la voi :)
si ar mai fi o chestie dar nu am avut timp sa o testez, daca harta se schimba adminii nu vor mai trebui sa se dea login in consola, sa ramana logati numai atunci cand ies de pe server/client sau executa retry vor trebui sa dea login. (asta e optional)

Multumesc pentru timpul acordat citirii acestul mesaj. best regards.

Re: cerere modificare/extragere din plugin

Posted: 17 Nov 2019, 00:22
by levin

Code: Select all

#include <amxmodx>

//#define DEBUG
#define LOGIN_TIME 90.0

#define LT 97

#if !defined MAX_PLAYERS
	#define MAX_PLAYERS 32
#endif

#if AMXX_VERSION_NUM < 183	
	#define MAX_NAME_LENGTH 32
	new AdminNum;
#endif

new const AL_FILE[]="admins.ini"

enum _:AdminLogin
{
	LoginPass[32],
	LoginAccess[32],
	LoginFlag[6]
}
new Trie:LoginName
new bool:IsAdmin[MAX_PLAYERS+1],bool:CorrectName[MAX_PLAYERS+1],bool:AdminsReloaded
new LastPass[MAX_PLAYERS+1][32],UserName[MAX_PLAYERS+1][32]

public plugin_precache()	loadAdminLogin();
public plugin_init()
{
	register_plugin("ADMIN LOGIN","1.0","luxor")
	register_clcmd("login", "cmdPass");
	register_concmd("amx_reloadadmins", "reloadLogin");
}

public client_putinserver(id)
{
	if(is_user_bot(id)||is_user_hltv(id))	return
	get_user_name(id,UserName[id],charsmax(UserName[]))
	if ( TrieKeyExists(LoginName, UserName[id]) )	set_task(LOGIN_TIME,"VF",id+LT)
}

public VF(id)
{
	id-=LT
	if ( TrieKeyExists(LoginName, UserName[id]) )
	{
		if(!IsAdmin[id])	server_cmd("kick #%d ^"Nu te-ai logat la timp^"",get_user_userid(id))
		else	remove_task(id)
	}
}

#if AMXX_VERSION_NUM < 183
	public client_disconnect(Index)
#else
	public client_disconnected(Index)
#endif
{
	if ( IsAdmin[Index] )
	{
		IsAdmin[Index] = false;
		remove_user_flags(Index);
	}
	remove_task(Index+LT)
}

public cmdPass(Index)
{
	new Password[32]
	read_argv(1, Password, charsmax(Password));
	remove_quotes(Password);
	if (!Password[0])
	{
		console_print(Index,"Nu ai introdus nici o parola, comanda se scrie in consola astfel : login ^"parola ta^"");
		return PLUGIN_HANDLED;
	}

	loadAdminLogin();
	IsAdmin[Index] = false;
	
	if ( !getAccess(Index, Password, charsmax(Password)) )	return PLUGIN_HANDLED;
	
	if (!IsAdmin[Index])
	{
		LastPass[Index][0] = EOS;
		if (!CorrectName[Index])	console_print(Index, "Nu s-a gasit nici un admin care sa poarte acest nickname");
		else	console_print(Index, "Parola introdusa de tine este incorecta.");
	}
	else
	{
		if ( equal(LastPass[Index], Password) )	console_print(Index, "Admin-ul tau este deja incarcat.");
		else
		{
			console_print(Index, "Admin-ul tau a fost incarcat.");
			IsAdmin[Index] = true;
		}
	}
	
	return PLUGIN_HANDLED;
}
bool:getAccess(Index, UserPass[], len)
{
	if (!(get_user_flags(Index) & ADMIN_RESERVATION))
	{
		console_print(Index, "Nu iti poti incarca adminul daca nu ai slot.");
		return false;
	}
	
#if AMXX_VERSION_NUM < 183
	for (new i = 0; i < AdminNum; ++i)
#else
	for (new i = 0; i < TrieGetSize(LoginName); ++i)
#endif
	{
		if ( TrieKeyExists(LoginName, UserName[Index]) )	CorrectName[Index] = true;
		else
		{
			CorrectName[Index] = false;
			continue;
		}
		
		new TempData[AdminLogin];
		TrieGetArray(LoginName, UserName[Index], TempData, charsmax(TempData));
		if ( equal(TempData[LoginFlag], "f") && CorrectName[Index] )
		{
			if ( equal(TempData[LoginPass], UserPass) || IsAdmin[Index] )
			{
				new Access = read_flags(TempData[LoginAccess]);
				remove_user_flags(Index);
				set_user_flags(Index, Access);
				IsAdmin[Index] = true;
				set_task(0.1, "delayforSavingLastPass", Index, UserPass, len);
			}
			break;
		}
	}
	
	return true;
}
public loadAdminLogin()
{
	new Path[64]
	get_localinfo("amxx_configsdir", Path, charsmax(Path));
	format(Path, charsmax(Path), "%s/%s", Path, AL_FILE);
	
	if ( !file_exists(Path) )
	{
		new FilePointer = fopen(Path, "wt");
		if ( !FilePointer ) 	return;
		
		fputs(FilePointer, "; Aici vor fi inregistrate adminele protejate.^n");
		fputs(FilePointer, "; Exemplu de adaugare admin : ^"nume^" ^"parola^" ^"acces^" ^"f^"^n");
		
		fclose(FilePointer);
	}
	else
	{
		new FilePointer = fopen(Path, "rt");
		if ( !FilePointer ) 	return;
		
		if (LoginName == Invalid_Trie)	LoginName = TrieCreate();
		
		TrieClear(LoginName);
		
		#if AMXX_VERSION_NUM < 183
			AdminNum = 0;
		#endif
		
		new Text[121], Name[MAX_NAME_LENGTH], TempData[AdminLogin];
		while (!feof(FilePointer))
		{
			fgets(FilePointer, Text, charsmax(Text));
			trim(Text);
		
			if ( (Text[0] == ';') || !Text[0] || ((Text[0] == '/') && (Text[1] == '/')) )	continue;
		
			if (parse(Text, Name, charsmax(Name), TempData[LoginPass], charsmax(TempData[LoginPass]), 
							TempData[LoginAccess], charsmax(TempData[LoginAccess]), TempData[LoginFlag], charsmax(TempData[LoginFlag])) != 4)	continue;
			
			TrieSetArray(LoginName, Name, TempData, charsmax(TempData));
		
			#if AMXX_VERSION_NUM < 183
				++AdminNum;
			#endif
		
			#if defined DEBUG
				server_print("Nume : %s - Parola : %s - Acces : %s - Flag : %s", Name, TempData[LoginPass], TempData[LoginAccess], TempData[LoginFlag]);
			#endif
		}
		fclose(FilePointer);
	}
}
public reloadLogin(Index, level, cid) 
{
	AdminsReloaded = true;
	set_task(1.0, "reloadDelay");
}
public client_command(Index)
{
	if (AdminsReloaded)	reloadDelay();
	return PLUGIN_CONTINUE;
}
public reloadDelay()
{
	if (!AdminsReloaded)	return;
	
	new Players[MAX_PLAYERS], PlayersNum;
	get_players(Players, PlayersNum, "ch");
	
	for (new i = 0; i < PlayersNum; ++i)	if ( IsAdmin[Players[i]] )	getAccess(Players[i], LastPass[Players[i]], charsmax(LastPass[]));
	
	AdminsReloaded = false;
}
public delayforSavingLastPass(UserPass[], Index)	copy(LastPass[Index], charsmax(LastPass[]), UserPass);
public client_infochanged(Index)
{
	if ( !is_user_connected(Index) )	return;
	
	new NewName[MAX_NAME_LENGTH]
	get_user_info(Index, "name", NewName, charsmax(NewName));
		
	if (equali(NewName, UserName[Index])||!IsAdmin[Index])	return;
	
	IsAdmin[Index] = false;
	remove_user_flags(Index);
	
	return;
}

Re: cerere modificare/extragere din plugin

Posted: 17 Nov 2019, 01:08
by @LeX
Multumesc mult, este perfect
cerinta optionala este inca valida
adica daca un admin iese de pe server sa nu ii scoata accesul imediat pentru ca pentru fiecare shimbare de harta adminul va trebui incarcat de fiecare data
gen daca se deconecteaza de pe server sa ii scoata accesul in x secunde (90 de exp) iar daca intra pe server se va anula acel "task" si cand se deconecteaza la fel si tot asa, sa se evite incarcarea adminunui prin parola de prea multe ori.
Si daca se poate tot o functie optionala cei ce intra cu nick-ul din "admins.ini" vor avea un timp cat sa isi incarce admin-ul prin parola in caz contrar vor primi kick dupa x secunde daca nu au introdus parola

Multumesc inca o data L E V I N.

ps. functiile optionale nu sunt 100% necesare, daca cineva doreste sa ma ajute si in aceasta privinta este bine venit.
in orice caz daca nimeni nu va mai posta puteti da T/C cu incredere, multumesc :*

Re: cerere modificare/extragere din plugin

Posted: 17 Nov 2019, 01:33
by levin
păi dacă vrei să nu li se mai reseteze parola, ce rost mai are timpu de logare? alege 1 din 2..

Re: cerere modificare/extragere din plugin

Posted: 17 Nov 2019, 08:48
by @LeX
Adica da, ai dreptate cu timpul de logare.