diff --git a/plugins/admin-base.sma b/plugins/admin-base.sma new file mode 100644 index 00000000..c83d0bfb --- /dev/null +++ b/plugins/admin-base.sma @@ -0,0 +1,187 @@ +#include +#include + +public Plugin:myinfo = +{ + name = "Admin Base", + author = "AlliedModders LLC", + description = "Reads admin files", + version = "1.0.0.0", + url = "http://www.sourcemod.net/" +}; + +#define LEVEL_STATE_NONE 0 +#define LEVEL_STATE_LEVELS 1 +#define LEVEL_STATE_FLAGS 2 +#define LEVEL_STATE_OVERRIDES 3 + + +/** Parser handles */ +new Handle:g_hLevelParser = INVALID_HANDLE; + +/** Parser states */ +new g_LevelState = LEVEL_STATE_NONE; + +/** Globals for levels */ +new AdminFlag:g_FlagLetters[26]; /* Maps the flag letters */ +new bool:g_ReadOverrides = false; /* Whether or not to read overrides */ +new bool:g_LoggedFileName = false; /* Whether or not the file name has been logged */ + + +public OnPluginStart() +{ + g_hLevelParser = SMC_CreateParse(); + SMC_SetReaders(g_hLevelParser, + ReadLevels_NewSection, + ReadLevels_KeyValue, + ReadLevels_EndSection); +} + +LoadDefaultLetters() +{ + g_FlagLetters['a'-'a'] = Admin_Reservation; + g_FlagLetters['b'-'a'] = Admin_Kick; + g_FlagLetters['c'-'a'] = Admin_Ban; + g_FlagLetters['d'-'a'] = Admin_Unban; + g_FlagLetters['e'-'a'] = Admin_Slay; + g_FlagLetters['f'-'a'] = Admin_Changemap; + g_FlagLetters['g'-'a'] = Admin_Convars; + g_FlagLetters['h'-'a'] = Admin_Configs; + g_FlagLetters['i'-'a'] = Admin_Chat; + g_FlagLetters['j'-'a'] = Admin_Vote; + g_FlagLetters['h'-'a'] = Admin_Password; + g_FlagLetters['i'-'a'] = Admin_RCON; + g_FlagLetters['j'-'a'] = Admin_Cheats; + g_FlagLetters['z'-'a'] = Admin_Root; +} + +public SMCResult:ReadLevels_NewSection(Handle:smc, const String:name[], bool:opt_quotes) +{ + if (g_LevelState == LEVEL_STATE_NONE) + { + if (StrEqual(name, "Levels")) + { + g_LevelState = LEVEL_STATE_LEVELS; + } else { + /* :TODO: log error */ + } + } else if (g_LevelState == LEVEL_STATE_LEVELS) { + if (StrEqual(name, "Flags")) + { + g_LevelState = LEVEL_STATE_FLAGS; + } else if (StrEqual(name, "Overrides")) { + g_LevelState = LEVEL_STATE_OVERRIDES; + } else { + /* :TODO: log error */ + } + } else { + /* :TODO: Log error */ + } + + return SMCParse_Continue; +} + +public SMCResult:ReadLevels_KeyValue(Handle:smc, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes) +{ + if (g_LevelState == LEVEL_STATE_FLAGS) + { + new chr = value[0]; + + if (chr < 'a' || chr > 'z') + { + /* :TODO: log error */ + return SMCParse_Continue; + } + + chr -= 'a'; + + new AdminFlag:flag = Admin_None; + + if (StrEqual(key, "reservation")) + { + flag = Admin_Reservation; + } else if (StrEqual(key, "kick")) { + flag = Admin_Kick; + } else if (StrEqual(key, "ban")) { + flag = Admin_Ban; + } else if (StrEqual(key, "unban")) { + flag = Admin_Unban; + } else if (StrEqual(key, "slay")) { + flag = Admin_Slay; + } else if (StrEqual(key, "changemap")) { + flag = Admin_Changemap; + } else if (StrEqual(key, "cvars")) { + flag = Admin_Convars; + } else if (StrEqual(key, "configs")) { + flag = Admin_Configs; + } else if (StrEqual(key, "chat")) { + flag = Admin_Chat; + } else if (StrEqual(key, "vote")) { + flag = Admin_Vote; + } else if (StrEqual(key, "password")) { + flag = Admin_Password; + } else if (StrEqual(key, "rcon")) { + flag = Admin_RCON; + } else if (StrEqual(key, "cheats")) { + flag = Admin_Cheats; + } else if (StrEqual(key, "root")) { + flag = Admin_Root; + } else { + /* :TODO: log error */ + } + + g_FlagLetters[chr] = flag; + + + } else if (g_LevelState == LEVEL_STATE_OVERRIDES) { + if (!g_ReadOverrides) + { + return SMCParse_Continue; + } + } + + return SMCParse_Continue; +} + +public SMCResult:ReadLevels_EndSection(Handle:smc) +{ + if (g_LevelState == LEVEL_STATE_FLAGS) + { + g_LevelState = LEVEL_STATE_LEVELS; + } else if (g_LevelState == LEVEL_STATE_OVERRIDES) { + g_LevelState = LEVEL_STATE_OVERRIDES; + } else if (g_LevelState == LEVEL_STATE_LEVELS) { + g_LevelState = LEVEL_STATE_NONE; + } +} + +public OnRebuildAdminCache(cache_flags) +{ + if (cache_flags & ADMIN_CACHE_OVERRIDES) + { + g_ReadOverrides = true; + } else { + g_ReadOverrides = false; + } + + RefreshLevels(); +} + +RefreshLevels() +{ + new String:path[PLATFORM_MAX_PATH]; + + LoadDefaultLetters(); + + BuildPath(Path_SM, path, sizeof(path), "configs/admin_levels.cfg"); + + /* Set states */ + g_LevelState = LEVEL_STATE_NONE; + g_LoggedFileName = false; + + new SMCError:err = SMC_ParseFile(g_hLevelParser, path); + if (err != SMCError_Okay) + { + /* :TODO: log error */ + } +}