diff --git a/configs/admin_levels.cfg b/configs/admin_levels.cfg index 61732b94..0ddb0248 100644 --- a/configs/admin_levels.cfg +++ b/configs/admin_levels.cfg @@ -38,10 +38,10 @@ Levels * 2)Command Group Name (for example, "CSDM") * 3)Command Level (for example, "changemap") * You can override the default flags assigned to individual commands or command groups in this way. - * To override a group, use the ":" character before the name. Example: + * To override a group, use the "@" character before the name. Example: * Examples: - * ":CSDM" "i" // Override the CSDM group - * "csdm_enable" "j" // Override the csdm_enable command + * "@CSDM" "i" // Override the CSDM group + * "csdm_enable" "j" // Override the csdm_enable command * Note that for overrides, order is important. In the above example, csdm_enable overwrites * any setting that csdm_enable previously had. */ diff --git a/plugins/admin-base/admin-base.sp b/plugins/admin-base/admin-base.sp index 88083aa7..e1df3784 100644 --- a/plugins/admin-base/admin-base.sp +++ b/plugins/admin-base/admin-base.sp @@ -18,4 +18,8 @@ new g_ErrorCount = 0; public OnRebuildAdminCache(cache_flags) { RefreshLevels(); + if (cache_flags & ADMIN_CACHE_OVERRIDES) + { + ReadOverrides(); + } } diff --git a/plugins/admin-base/admin-levels.sp b/plugins/admin-base/admin-levels.sp index 996cf38c..ed23529c 100644 --- a/plugins/admin-base/admin-levels.sp +++ b/plugins/admin-base/admin-levels.sp @@ -2,25 +2,19 @@ #define LEVEL_STATE_LEVELS 1 #define LEVEL_STATE_FLAGS 2 -new Handle:g_hLevelParser = INVALID_HANDLE; -new g_LevelState = LEVEL_STATE_NONE; +static Handle:g_hLevelParser = INVALID_HANDLE; +static g_LevelState = LEVEL_STATE_NONE; /* :TODO: log line numbers? */ -InitializeLevelParser() -{ - if (g_hLevelParser == INVALID_HANDLE) - { - g_hLevelParser = SMC_CreateParser(); - SMC_SetReaders(g_hLevelParser, - ReadLevels_NewSection, - ReadLevels_KeyValue, - ReadLevels_EndSection); - } -} - LoadDefaultLetters() { + /* Clear letters first */ + for (new i='a'; i<='z'; i++) + { + g_FlagLetters[i-'a'] = Admin_None; + } + g_FlagLetters['a'-'a'] = Admin_Reservation; g_FlagLetters['b'-'a'] = Admin_Kick; g_FlagLetters['c'-'a'] = Admin_Ban; @@ -37,13 +31,13 @@ LoadDefaultLetters() g_FlagLetters['z'-'a'] = Admin_Root; } -stock LogLevelError(const String:format[], {Handle,String,Float,_}:...) +static LogLevelError(const String:format[], {Handle,String,Float,_}:...) { decl String:buffer[512]; if (!g_LoggedFileName) { - LogError("Error(s) detected parsing admin_level.cfg:"); + LogError("Error(s) detected parsing admin_levels.cfg:"); g_LoggedFileName = true; } @@ -129,10 +123,26 @@ public SMCResult:ReadLevels_EndSection(Handle:smc) { if (g_LevelState == LEVEL_STATE_FLAGS) { + /* We're totally done parsing */ g_LevelState = LEVEL_STATE_LEVELS; + return SMCParse_Halt; } else if (g_LevelState == LEVEL_STATE_LEVELS) { g_LevelState = LEVEL_STATE_NONE; } + + return SMCParse_Continue; +} + +static InitializeLevelParser() +{ + if (g_hLevelParser == INVALID_HANDLE) + { + g_hLevelParser = SMC_CreateParser(); + SMC_SetReaders(g_hLevelParser, + ReadLevels_NewSection, + ReadLevels_KeyValue, + ReadLevels_EndSection); + } } RefreshLevels() diff --git a/plugins/admin-base/admin-overrides.sp b/plugins/admin-base/admin-overrides.sp new file mode 100644 index 00000000..a56b18cc --- /dev/null +++ b/plugins/admin-base/admin-overrides.sp @@ -0,0 +1,121 @@ +#define OVERRIDE_STATE_NONE 0 +#define OVERRIDE_STATE_LEVELS 1 +#define OVERRIDE_STATE_OVERRIDES 2 + +static Handle:g_hOverrideParser = INVALID_HANDLE; +static g_OverrideState = OVERRIDE_STATE_NONE; + +LogOverrideError(const String:format[], {Handle,String,Float,_}:...) +{ + decl String:buffer[512]; + + if (!g_LoggedFileName) + { + LogError("Error(s) detected parsing admin_levels.cfg:"); + g_LoggedFileName = true; + } + + VFormat(buffer, sizeof(buffer), format, 2); + + LogError(" (%d) %s", ++g_ErrorCount, buffer); +} + + +public SMCResult:ReadOverrides_NewSection(Handle:smc, const String:name[], bool:opt_quotes) +{ + if (g_OverrideState == OVERRIDE_STATE_NONE) + { + if (StrEqual(name, "Levels")) + { + g_OverrideState = OVERRIDE_STATE_LEVELS; + } + } else if (g_OverrideState == OVERRIDE_STATE_LEVELS) { + if (StrEqual(name, "Overrides")) + { + g_OverrideState = OVERRIDE_STATE_OVERRIDES; + } + } + + return SMCParse_Continue; +} + +public SMCResult:ReadOverrides_KeyValue(Handle:smc, + const String:key[], + const String:value[], + bool:key_quotes, + bool:value_quotes) +{ + if (g_OverrideState != OVERRIDE_STATE_OVERRIDES) + { + return SMCParse_Continue; + } + + new AdminFlag:flag = Admin_None; + + if (value[0] >= 'a' && value[0] <= 'z') + { + flag = g_FlagLetters[value[0] - 'a']; + } + + if (key[0] == '@') + { + AddCommandOverride(key[1], Override_CommandGroup, flag); + } else { + AddCommandOverride(key, Override_Command, flag); + } + + return SMCParse_Continue; +} + +public SMCResult:ReadOverrides_EndSection(Handle:smc) +{ + if (g_OverrideState == OVERRIDE_STATE_LEVELS) + { + g_OverrideState = OVERRIDE_STATE_NONE; + } else if (g_OverrideState == OVERRIDE_STATE_OVERRIDES) { + /* We're totally done parsing */ + g_OverrideState = OVERRIDE_STATE_LEVELS; + return SMCParse_Halt; + } + + return SMCParse_Continue; +} + +static InitializeOverrideParser() +{ + if (g_hOverrideParser == INVALID_HANDLE) + { + g_hOverrideParser = SMC_CreateParser(); + SMC_SetReaders(g_hOverrideParser, + ReadOverrides_NewSection, + ReadOverrides_KeyValue, + ReadOverrides_EndSection); + } +} + +ReadOverrides() +{ + new String:path[PLATFORM_MAX_PATH]; + + InitializeOverrideParser(); + + BuildPath(Path_SM, path, sizeof(path), "configs/admin_levels.cfg"); + + /* Set states */ + g_OverrideState = OVERRIDE_STATE_NONE; + g_LoggedFileName = false; + g_ErrorCount = 0; + + new SMCError:err = SMC_ParseFile(g_hOverrideParser, path); + if (err != SMCError_Okay) + { + decl String:buffer[64]; + if (SMC_GetErrorString(err, buffer, sizeof(buffer))) + { + LogOverrideError("%s", buffer); + } else { + LogOverrideError("Fatal parse error"); + } + } +} +