/*Az eredeti plugint írta: Exolent. Módosította/újraírta: LyleChriss
The original plugin was made by Exolent. Modifyed/rewrited by: LyleChriss*/
#include <amxmodx>
#include <amxmisc>
#include <unixtime>
#define TASK_ID_REMOVE 14325
new gCaseSensitive
#define IsCaseSensitive(%1) (gCaseSensitive & (1 << (%1 & 31)))
#define SetCaseSensitive(%1) gCaseSensitive |= (1 << (%1 & 31))
#define ClearCaseSensitive(%1) gCaseSensitive &= ~(1 << (%1 & 31))
//Admin Adatok [Admin Datas]
enum _:AdminData
{
Auth[44],
Pass[32],
Access,
Flags,
Expire
}
new Array:Admins
new Trie:AdminIndex
new AdminsNum
new amx_mode
new amx_password_field
new amx_default_access
new KickCommand[32]
new AdminFile[64]
public plugin_init() {
register_plugin("Admin Custom", "1.0.3", "LyleChriss")
amx_mode = register_cvar("amx_mode", "1")
amx_password_field = register_cvar("amx_password_field", "_pw")
amx_default_access = register_cvar("amx_default_access", "")
formatex(KickCommand, charsmax(KickCommand), "amxauthcustom%c%c%c%c", random_num('A', 'Z'), random_num('A', 'Z'), random_num('A', 'Z'), random_num('A', 'Z'))
register_clcmd(KickCommand, "CmdKick")
register_clcmd("say /lejarat", "CmdLeajarat")
get_localinfo("amxx_configsdir", AdminFile, charsmax(AdminFile))
format(AdminFile, charsmax(AdminFile), "%s/custom_users.ini", AdminFile)
Admins = ArrayCreate(AdminData)
AdminIndex = TrieCreate()
LoadAdmins()
new hour, minute, second
time(hour, minute, second)
new timeleft = 86400 - (hour*3600) - (minute*60) - second + 5
set_task(float(timeleft), "TaskRefreshAdmins")
}
public client_connect(id)
{
ClearCaseSensitive(id)
}
public client_authorized(id)
{
if(get_pcvar_num(amx_mode))
checkAdmin(id)
}
public client_infochanged(id)
{
if(is_user_connected(id) && get_pcvar_num(amx_mode))
{
new oldName[32], newName[32]
get_user_name(id, oldName, charsmax(oldName))
get_user_info(id, "name", newName, charsmax(newName))
if(strcmp(oldName, newName, !IsCaseSensitive(id)) == 0)
checkAdmin(id, newName)
}
}
public CmdLejarat(id)
{
new steamID[35], ip[32], name[32], index, admin[AdminData]
new Year, Month, Day, Hour, Minute, Second
get_user_authid(id, steamID, charsmax(steamID))
get_user_ip(id, ip, charsmax(ip), 1)
get_user_name(id, name, charsmax(name))
if(TrieKeyExists(AdminIndex, steamID))
{
TrieGetCell(AdminIndex, steamID, index)
ArrayGetArray(Admins, index, admin)
if(admin[Expire] <= 0)
{
client_print(id, print_chat, "Az adminod lejárt!")
}
else
{
UnixToTime(admin[Expire], Year, Month, Day, Hour, Minute, Second)
client_print(id, print_chat, "Az adminod lejár: %d.%d.%d-án/én.", Year,Month,Day)
}
}
else if(TrieKeyExists(AdminIndex, ip))
{
TrieGetCell(AdminIndex, ip, index)
ArrayGetArray(Admins, index, admin)
if(admin[Expire] <= 0)
{
client_print(id, print_chat, "Az adminod lejárt!")
}
else
{
UnixToTime(admin[Expire], Year, Month, Day, Hour, Minute, Second)
client_print(id, print_chat, "Az adminod lejár: %d.%d.%d-án/én.", Year,Month,Day)
}
}
else if(TrieKeyExists(AdminIndex, name))
{
TrieGetCell(AdminIndex, name, index)
ArrayGetArray(Admins, index, admin)
if(admin[Expire] <= 0)
{
client_print(id, print_chat, "Az adminod lejárt!")
}
else
{
UnixToTime(admin[Expire], Year, Month, Day, Hour, Minute, Second)
client_print(id, print_chat, "Az adminod lejár: %d.%d.%d-án/én.", Year,Month,Day)
}
}
}
public CmdKick(id) {
server_cmd("kick #%d", get_user_userid(id));
return PLUGIN_HANDLED;
}
public TaskRefreshAdmins()
{
LoadAdmins()
new players[32], pnum
get_players(players, pnum)
for(new i; i<pnum;i++)
checkAdmin(players[i])
set_task(86400.0, "TaskRefreshAdmins")
}
public TaskRemoveAuth(auth[])
{
new index
if(!TrieGetCell(AdminIndex, auth, index))
return;
ArrayDeleteItem(Admins, index)
TrieDeleteKey(AdminIndex, auth)
AdminsNum--
new admin[AdminData]
while(index < AdminsNum)
{
ArrayGetArray(Admins, index, admin)
TrieSetCell(AdminIndex, admin[Auth], index)
}
new players[32], pnum
get_players(players, pnum)
for(new i; i<pnum;i++)
checkAdmin(players[i])
}
checkAdmin(id, name[32]="")
{
remove_user_flags(id)
if(!name[0])
get_user_name(id, name, charsmax(name))
new steamID[35], ip[32]
get_user_authid(id, steamID, charsmax(steamID))
get_user_ip(id, ip, charsmax(ip), 1)
new admin[AdminData]
new temp
new bool:found
for(new i = admins_num() -1; i >= 0; i--)
{
admins_lookup(i, AdminProp_Auth, admin[Auth], charsmax(admin[Auth]))
admins_lookup(i, AdminProp_Password, admin[Pass], charsmax(admin[Pass]))
admin[Access] = admins_lookup(i, AdminProp_Access)
admin[Flags] = admins_lookup(i, AdminProp_Flags)
if((found = adminMatch(id, name, steamID, ip, admin)))
break;
}
if(!found)
{
for(new i; i<AdminsNum; i++)
{
ArrayGetArray(Admins, i, admin)
if((found = adminMatch(id, name, steamID, ip, admin)))
break;
}
}
if(found)
{
if(~admin[Flags] & FLAG_NOPASS)
{
new field[32], password[32]
get_pcvar_string(amx_password_field, field, charsmax(field))
get_user_info(id, field, password, charsmax(password))
if(!equal(admin[Pass], password))
{
if(admin[Flags] & FLAG_KICK)
client_cmd(id, "%s", KickCommand)
return;
}
}
set_user_flags(id, admin[Access])
}
else if(get_pcvar_num(amx_mode) == 2)
client_cmd(id, "%s", KickCommand)
else
{
new flags[27]
get_pcvar_string(amx_default_access, flags, charsmax(flags))
temp = read_flags(flags)
if(!temp)
temp = ADMIN_USER
set_user_flags(id, temp)
}
}
LoadAdmins()
{
if(AdminsNum)
{
ArrayClear(Admins)
TrieClear(AdminIndex)
AdminsNum = 0
}
new data[256]
new admin[AdminData], accessStr[27], flagStr[27], expStr[32], Day, Month, Year, expTime, currentTime = get_systime()
new pFile = fopen(AdminFile, "rt")
if(pFile)
{
while(!feof(pFile))
{
fgets(pFile, data, charsmax(data))
trim(data)
if(!data[0] || data[0] == ';' || data[0] == '/' && data[1] == '/') continue;
parse(data, admin[Auth], charsmax(admin[Auth]), admin[Pass], charsmax(admin[Pass]), accessStr, charsmax(accessStr), flagStr, charsmax(flagStr), expStr, charsmax(expStr))
admin[Access] = read_flags(accessStr)
admin[Flags] = read_flags(flagStr)
if(expStr[0])
{
new day[8], month[8]
strtok(expStr, day, charsmax(day), expStr, charsmax(expStr), '.')
strtok(expStr, month, charsmax(month), expStr, charsmax(expStr), '.')
Day = str_to_num(day)
Month = str_to_num(month)
Year = str_to_num(expStr)
expTime = TimeToUnix(Year, Month, Day, 0, 0, 0)
expTime -= currentTime
if(expTime <= 0)
{
format(data, charsmax(data), ";%s ; Lejárt", data)
write_file(AdminFile, data, AdminsNum)
}
admin[Expire] = expTime
set_task(float(expTime), "TaskRemoveAuth", TASK_ID_REMOVE, admin[Auth], sizeof(admin[Auth]))
}
ArrayPushString(Admins, admin)
TrieSetCell(AdminIndex, admin[Auth], AdminsNum)
AdminsNum++
}
fclose(pFile)
}
}
bool:adminMatch(id, const name[], const steamID[], const ip[], const admin[AdminData])
{
new temp
new bool:found
if(admin[Flags] & FLAG_AUTHID)
{
if(equal(steamID, admin[Auth]))
found = true
}
else if(admin[Flags] & FLAG_IP)
{
temp = strlen(admin[Auth])
if(admin[Auth][temp-1] != '.')
temp = 0
if(equal(ip, admin[Auth], temp))
found=true
}
else if(admin[Flags] & FLAG_TAG)
{
temp = admin[Flags] & FLAG_CASE_SENSITIVE
if(strfind(name, admin[Auth], !temp) >= 0)
{
if(temp)
SetCaseSensitive(id)
found = true
}
}
else
{
temp = admin[Flags] & FLAG_CASE_SENSITIVE
if(strcmp(name, admin[Auth], !temp) == 0)
{
if(temp)
SetCaseSensitive(id)
found = true
}
}
return found
}
public plugin_end()
{
ArrayDestroy(Admins)
TrieDestroy(AdminIndex)
}