#include <amxmodx>
#include <amxmisc>
#include <sqlx>
#include <greypanel>
new const szPluginName[] = "GreyPanel_API";
new const szPluginAuthor[] = "BiZaJe";
const iMajorVersion = 1;
const iMinorVersion = 0;
const iPatchVersion = 0;
enum _:eCvars {
cvDBUserName[MAX_STRING_LEN],
cvDBPasswd[MAX_STRING_LEN],
cvDBName[MAX_STRING_LEN],
cvHostName[MAX_STRING_LEN],
cvServerAddr[MAX_STRING_LEN],
cvDbPrefix[32],
cpUseAdmins,
cpDebug,
cpUseGroupFlags,
cpSiteUrl,
cpAmxMode
}
enum _:eMForward {
AdminsLoaded = 1,
AdminConnected,
Admin_Disconnect,
MemberConnected,
PreAdminCheck,
PostAdminCheck
}
new aCvarsData[eCvars];
new g_iServerId, g_iRetFwdIgnor;
new g_szAuthIDs[MAX_PLAYERS + 1][MAX_STRING_LEN];
new g_szAuthIDs64[MAX_PLAYERS + 1][MAX_STRING_LEN];
new g_bitAPIstatus;
new g_hMForwards[eMForward];
new Trie:g_trhMemberInfo, Trie:g_trhOnlineAdminsInfo;
new Array:g_arhAllServices, Array:g_arrUserServices;
new Handle:g_hDbTuple;
new bool:bPlayerDataLoaded[MAX_PLAYERS + 1];
new g_szTables[TablePtr][64];
#pragma unused g_szAuthIDs, g_szAuthIDs64, bPlayerDataLoaded
#include "greypanel/greypanel_stocks.inl"
#include "greypanel/greypanel_db.inl"
#include "greypanel/greypanel_users.inl"
#include "greypanel/greypanel_services.inl"
public plugin_init() {
new szVersion[MAX_INT_LEN];
formatex(szVersion, charsmax(szVersion), "%d.%d.%d", iMajorVersion, iMinorVersion, iPatchVersion);
register_plugin(szPluginName, szVersion, szPluginAuthor);
register_cvar("greypanel_api", szVersion, FCVAR_SERVER|FCVAR_UNLOGGED|FCVAR_SPONLY);
aCvarsData[cpAmxMode] = register_cvar("gp_amx_mode", "1");
aCvarsData[cpUseGroupFlags] = register_cvar("gp_use_group_flags", "1");
aCvarsData[cpUseAdmins] = register_cvar("gp_use_admins", "1");
aCvarsData[cpDebug] = register_cvar("gp_debug", "0");
aCvarsData[cpSiteUrl] = register_cvar("gp_url", "site.url");
register_cvar("gp_sql_host", "");
register_cvar("gp_sql_user", "");
register_cvar("gp_sql_pass", "");
register_cvar("gp_sql_db", "");
register_cvar("gp_sql_prefix", "grey_");
register_concmd("amx_reloadadmins", "CmdReloadAdmins", ADMIN_RCON);
register_concmd("gp_reloadusers", "CmdReloadUsers", ADMIN_RCON);
FnReadIniFile();
FnMForwardsCreate();
}
public plugin_cfg() {
new Handle:hSQL_Connection;
CheckDBConnection(hSQL_Connection);
if(!hSQL_Connection) return;
log_amx("[GreyPanel API] Успешное подключение к базе данных.");
g_bitAPIstatus |= UseGreyPanel;
g_trhMemberInfo = TrieCreate();
formatex(g_szTables[TBL_users], charsmax(g_szTables[]), "%susers", aCvarsData[cvDbPrefix]);
formatex(g_szTables[TBL_user_groups], charsmax(g_szTables[]), "%suser_groups", aCvarsData[cvDbPrefix]);
formatex(g_szTables[TBL_services], charsmax(g_szTables[]), "%sservices", aCvarsData[cvDbPrefix]);
formatex(g_szTables[TBL_service_servers], charsmax(g_szTables[]), "%sservice_servers", aCvarsData[cvDbPrefix]);
formatex(g_szTables[TBL_user_services], charsmax(g_szTables[]), "%suser_services", aCvarsData[cvDbPrefix]);
formatex(g_szTables[TBL_monitor_servers], charsmax(g_szTables[]), "%smonitor_servers", aCvarsData[cvDbPrefix]);
formatex(g_szTables[TBL_forum_threads], charsmax(g_szTables[]), "%sforum_threads", aCvarsData[cvDbPrefix]);
formatex(g_szTables[TBL_forum_posts], charsmax(g_szTables[]), "%sforum_posts", aCvarsData[cvDbPrefix]);
formatex(g_szTables[TBL_forum_likes], charsmax(g_szTables[]), "%sforum_likes", aCvarsData[cvDbPrefix]);
FnGetServerId(hSQL_Connection);
new szVersion[MAX_INT_LEN];
formatex(szVersion, charsmax(szVersion), "%d.%d.%d", iMajorVersion, iMinorVersion, iPatchVersion);
new hPluginLoaded = CreateMultiForward("OnGPAPIPluginLoaded", ET_IGNORE, FP_CELL, FP_STRING, FP_CELL);
ExecuteForward(hPluginLoaded, g_iRetFwdIgnor, g_hDbTuple, szVersion, g_iServerId);
DestroyForward(hPluginLoaded);
if(g_bitAPIstatus & UseGreyPanelAdmins) {
g_trhOnlineAdminsInfo = TrieCreate();
g_arhAllServices = ArrayCreate(eAdminInfo);
g_arrUserServices = ArrayCreate(eAdminInfo);
if(g_iServerId) {
FnLoadServices(0);
}
}
}
enum _:eIniSection { Database = 1, Misc }
new iData;
FnReadIniFile() {
new szIniFile[MAX_NAME_LENGTH*2];
get_configsdir(szIniFile, charsmax(szIniFile));
add(szIniFile, charsmax(szIniFile), "/greypanel.ini");
if(!file_exists(szIniFile)) {
log_amx("[GreyPanel API] Конфиг greypanel.ini не найден, будут использоваться только cvar'ы из server.cfg");
return;
}
new SMCParser:hParser = SMC_CreateParser();
SMC_SetReaders(hParser, "OnParserKeyValue", "OnParserNewSection");
new line, col;
new SMCError:result = SMC_ParseFile(hParser, szIniFile, line, col);
SMC_DestroyParser(hParser);
if(result != SMCError_Okay) {
new error[MAX_FMT_LENGTH];
SMC_GetErrorString(result, error, sizeof(error));
log_amx("Ошибка парсинга %s на строке %d, кол %d", error, line, col);
} else {
log_amx("[GreyPanel API] Конфигурация из greypanel.ini прочитана.");
}
}
public SMCResult:OnParserNewSection(SMCParser:handle, const name[], data) {
if(!strcmp(name, "Database")) iData = Database;
else if(!strcmp(name, "Misc")) iData = Misc;
}
public SMCResult:OnParserKeyValue(SMCParser:handle, const szKey[], const szValue[], data) {
if(iData == Database) {
if(!strcmp(szKey, "host")) copy(aCvarsData[cvHostName], charsmax(aCvarsData[cvHostName]), szValue);
else if(!strcmp(szKey, "user")) copy(aCvarsData[cvDBUserName], charsmax(aCvarsData[cvDBUserName]), szValue);
else if(!strcmp(szKey, "pass")) copy(aCvarsData[cvDBPasswd], charsmax(aCvarsData[cvDBPasswd]), szValue);
else if(!strcmp(szKey, "db")) copy(aCvarsData[cvDBName], charsmax(aCvarsData[cvDBName]), szValue);
else if(!strcmp(szKey, "prefix")) copy(aCvarsData[cvDbPrefix], charsmax(aCvarsData[cvDbPrefix]), szValue);
} else if(iData == Misc) {
if(!strcmp(szKey, "server_ip")) copy(aCvarsData[cvServerAddr], charsmax(aCvarsData[cvServerAddr]), szValue);
else if(!strcmp(szKey, "site_url")) set_pcvar_string(aCvarsData[cpSiteUrl], szValue);
}
}
FnMForwardsCreate() {
g_hMForwards[MemberConnected] = CreateMultiForward("OnGPAPIMemberConnected", ET_IGNORE, FP_CELL, FP_CELL, FP_STRING);
g_hMForwards[AdminsLoaded] = CreateMultiForward("OnGPAPIAdminsLoaded", ET_IGNORE, FP_CELL, FP_CELL);
g_hMForwards[AdminConnected] = CreateMultiForward("OnGPAPIAdminConnected", ET_IGNORE, FP_CELL, FP_STRING, FP_CELL, FP_CELL);
g_hMForwards[Admin_Disconnect]= CreateMultiForward("OnGPAPIAdminDisconnected", ET_IGNORE, FP_CELL);
if(FindPluginFunction("OnGPAPIPreAdminCheck"))
g_hMForwards[PreAdminCheck] = CreateMultiForward("OnGPAPIPreAdminCheck", ET_STOP, FP_CELL, FP_VAL_BYREF, FP_VAL_BYREF);
if(FindPluginFunction("OnGPAPIPostAdminCheck"))
g_hMForwards[PostAdminCheck] = CreateMultiForward("OnGPAPIPostAdminCheck", ET_IGNORE, FP_CELL, FP_ARRAY);
}
stock bool:FindPluginFunction(const szFunction[]) {
new Num = get_pluginsnum();
for(new Index; Index < Num; Index++) {
if(get_func_id(szFunction, Index) != -1) return true;
}
return false;
}
public plugin_end() {
if(g_hDbTuple != Empty_Handle) SQL_FreeHandle(g_hDbTuple);
if(g_trhOnlineAdminsInfo) TrieDestroy(g_trhOnlineAdminsInfo);
if(g_trhMemberInfo) TrieDestroy(g_trhMemberInfo);
if(g_arhAllServices) ArrayDestroy(g_arhAllServices);
if(g_arrUserServices) ArrayDestroy(g_arrUserServices);
}
public CmdReloadAdmins(id, level, cid) {
if(cmd_access(id, level, cid, 1)) {
FnLoadServices(0);
}
return PLUGIN_HANDLED;
}
public CmdReloadUsers(id, level, cid) {
if(cmd_access(id, level, cid, 1)) {
new szArg[MAX_INT_LEN];
read_args(szArg, charsmax(szArg));
new iTarget = str_to_num(szArg);
if(is_user_connected(iTarget)) {
FnLoadMemberData(iTarget);
}
}
return PLUGIN_HANDLED;
}