PHP Code:
#include <amxmodx>
#include <nvault>
#include <nvault_util>
const MAXSIZE = 33 // MaxPlayers + 1
#define PRUNE_DAYS 30 // Меньше 1, - отключить (не рекомендуется)
#define VAULT_NAME "sol_online"
#define CheckBit(%0,%1) (%0 & (1 << %1))
#define SetOneBit(%0,%1) (%0 |= (1 << %1))
#define ClearBit(%0,%1) (%0 &= ~(1 << %1))
#define chx charsmax
stock const SECONDS_IN_DAY = 86400 // Количество секунд в одном дне [time.inc -> SECONDS_IN_DAY]
const AUTHID_STRLEN = 24
new g_iTime[MAXSIZE], g_iVault, g_iConnPlayers, g_iAuthPlayers, g_iCheckPlayers
new const sol_online_vault[] = "addons/amxmodx/data/vault/sol_online.vault"
new const sol_online_journal[] = "addons/amxmodx/data/vault/sol_online.journal"
public plugin_init() {
register_plugin("Simple Online Logger", "10.04.18", "mx?!")
register_clcmd("amx_sol_reset", "sol_reset")
register_concmd("amx_sol_reset", "sol_reset", ADMIN_CVAR, "<sol_reset>" )
register_srvcmd("amx_sol_reset","sol_reset")
if((g_iVault = nvault_open(VAULT_NAME)) == INVALID_HANDLE)
set_fail_state("Error opening vault!")
#if PRUNE_DAYS > 0
nvault_prune(g_iVault, 0, get_systime() - (PRUNE_DAYS * SECONDS_IN_DAY))
#endif
}
public plugin_natives() {
register_native("sol_get_user_time", "_sol_get_user_time")
}
public sol_reset(id) {
if (!(get_user_flags(id) & ADMIN_CVAR)) {
client_print(id,print_console,"[AMXX] You have no access to that command")
return PLUGIN_HANDLED
}
set_task(1.0,"sol_clear")
set_task(30.0,"sol_delete")
/* set_task(60.0,"sol_creat") */
client_print(id,print_console,"[AMXX] SOL Reseted")
nvault_prune( g_iVault , 0 , get_systime() )
return PLUGIN_CONTINUE
}
public sol_clear( g_iVault , const szVault[] ) {
nvault_prune( g_iVault , 0 , get_systime() );
new iUtilVault;
if ( ( iUtilVault = nvault_util_open( szVault ) ) ) {
new iCount , iPos , szKey[ 256 ] , szVal[ 2 ] , iTS;
if ( ( iCount = nvault_util_count( iUtilVault ) ) ) {
for ( new i = 0 ; i < iCount ; i++ )
{
iPos = nvault_util_read( iUtilVault , iPos , szKey , charsmax( szKey ) , szVal , charsmax( szVal ) , iTS );
nvault_remove( g_iVault , szKey );
}
}
nvault_util_close( iUtilVault );
}
}
public sol_delete() {
new sol_online_vault[128]
formatex(sol_online_vault, charsmax(sol_online_vault), "addons/amxmodx/data/vault/sol_online.vault")
if(file_exists(sol_online_vault))
delete_file(sol_online_vault)
new sol_online_journal[128]
formatex(sol_online_journal, charsmax(sol_online_journal), "addons/amxmodx/data/vault/sol_online.journal")
if(file_exists(sol_online_journal))
delete_file(sol_online_journal)
}
public sol_creat() {
if(!file_exists(sol_online_vault)) {
write_file(sol_online_vault, "")
}
if(!file_exists(sol_online_journal)) {
write_file(sol_online_journal, "")
}
}
public _sol_get_user_time(/*iPluginID, iParamCount*/) {
new id = get_param(1)
if(!CheckBit(g_iCheckPlayers, id)) {
if(!CheckBit(g_iAuthPlayers, id))
return INVALID_HANDLE;
SetOneBit(g_iCheckPlayers, id);
new szAuthID[AUTHID_STRLEN]
get_user_authid(id, szAuthID, chx(szAuthID))
g_iTime[id] = nvault_get(g_iVault, szAuthID)
}
return g_iTime[id] + get_user_time(id, 1)
}
public client_authorized(id) {
SetOneBit(g_iAuthPlayers, id);
}
public client_putinserver(id) {
SetOneBit(g_iConnPlayers, id);
}
public client_disconnected(id) {
if(CheckBit(g_iConnPlayers, id) && CheckBit(g_iAuthPlayers, id)) {
new szAuthID[AUTHID_STRLEN]
get_user_authid(id, szAuthID, chx(szAuthID))
if(szAuthID[0] == 'S' || szAuthID[0] == 'V') {
new iTime = !CheckBit(g_iCheckPlayers, id) ? nvault_get(g_iVault, szAuthID) : g_iTime[id];
iTime += get_user_time(id, 1)
new szTime[14]
num_to_str(iTime, szTime, chx(szTime))
nvault_set(g_iVault, szAuthID, szTime)
}
g_iTime[id] = 0
}
ClearBit(g_iConnPlayers, id);
ClearBit(g_iAuthPlayers, id);
ClearBit(g_iCheckPlayers, id);
}
public plugin_end() {
nvault_close(g_iVault)
}