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;
}