diff --git a/configs/admin_levels.cfg b/configs/admin_levels.cfg index 140f2cfa..35d884b6 100644 --- a/configs/admin_levels.cfg +++ b/configs/admin_levels.cfg @@ -1,6 +1,6 @@ /** - * Use this section to tweak admin permission levels and groupings. - * You can also define admin roles in this section. + * There is no reason to edit this file. Core uses this to map each named + * access type to a given ASCII character. The names are all pre-defined. */ Levels { @@ -45,21 +45,4 @@ Levels */ "root" "z" } - - /** - * By default, commands are registered with three pieces of information: - * 1)Command Name (for example, "csdm_enable") - * 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: - * Examples: - * "@CSDM" "b" // Override the CSDM group to 'b' flag - * "csdm_enable" "bgi" // Override the csdm_enable command to 'bgi' flags - * Note that for overrides, order is important. In the above example, csdm_enable overwrites - * any setting that csdm_enable previously had. - */ - Overrides - { - } } diff --git a/configs/admin_overrides.cfg b/configs/admin_overrides.cfg new file mode 100644 index 00000000..7711099b --- /dev/null +++ b/configs/admin_overrides.cfg @@ -0,0 +1,16 @@ +Overrides +{ + /** + * By default, commands are registered with three pieces of information: + * 1)Command Name (for example, "csdm_enable") + * 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: + * Examples: + * "@CSDM" "b" // Override the CSDM group to 'b' flag + * "csdm_enable" "bgi" // Override the csdm_enable command to 'bgi' flags + * 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-flatfile/admin-overrides.sp b/plugins/admin-flatfile/admin-overrides.sp index d9f5ab56..1fe625b8 100644 --- a/plugins/admin-flatfile/admin-overrides.sp +++ b/plugins/admin-flatfile/admin-overrides.sp @@ -24,10 +24,11 @@ #define OVERRIDE_STATE_LEVELS 1 #define OVERRIDE_STATE_OVERRIDES 2 -static Handle:g_hOverrideParser = INVALID_HANDLE; +static Handle:g_hOldOverrideParser = INVALID_HANDLE; +static Handle:g_hNewOverrideParser = INVALID_HANDLE; static g_OverrideState = OVERRIDE_STATE_NONE; -public SMCResult:ReadOverrides_NewSection(Handle:smc, const String:name[], bool:opt_quotes) +public SMCResult:ReadOldOverrides_NewSection(Handle:smc, const String:name[], bool:opt_quotes) { if (g_IgnoreLevel) { @@ -57,6 +58,29 @@ public SMCResult:ReadOverrides_NewSection(Handle:smc, const String:name[], bool: return SMCParse_Continue; } +public SMCResult:ReadNewOverrides_NewSection(Handle:smc, const String:name[], bool:opt_quotes) +{ + if (g_IgnoreLevel) + { + g_IgnoreLevel++; + return SMCParse_Continue; + } + + if (g_OverrideState == OVERRIDE_STATE_NONE) + { + if (StrEqual(name, "Overrides")) + { + g_OverrideState = OVERRIDE_STATE_OVERRIDES; + } else { + g_IgnoreLevel++; + } + } else { + g_IgnoreLevel++; + } + + return SMCParse_Continue; +} + public SMCResult:ReadOverrides_KeyValue(Handle:smc, const String:key[], const String:value[], @@ -81,7 +105,7 @@ public SMCResult:ReadOverrides_KeyValue(Handle:smc, return SMCParse_Continue; } -public SMCResult:ReadOverrides_EndSection(Handle:smc) +public SMCResult:ReadOldOverrides_EndSection(Handle:smc) { /* If we're ignoring, skip out */ if (g_IgnoreLevel) @@ -102,29 +126,52 @@ public SMCResult:ReadOverrides_EndSection(Handle:smc) return SMCParse_Continue; } -static InitializeOverrideParser() +public SMCResult:ReadNewOverrides_EndSection(Handle:smc) { - if (g_hOverrideParser == INVALID_HANDLE) + /* If we're ignoring, skip out */ + if (g_IgnoreLevel) { - g_hOverrideParser = SMC_CreateParser(); - SMC_SetReaders(g_hOverrideParser, - ReadOverrides_NewSection, + g_IgnoreLevel--; + return SMCParse_Continue; + } + + if (g_OverrideState == OVERRIDE_STATE_OVERRIDES) + { + g_OverrideState = OVERRIDE_STATE_NONE; + } + + return SMCParse_Continue; +} + +static InitializeOverrideParsers() +{ + if (g_hOldOverrideParser == INVALID_HANDLE) + { + g_hOldOverrideParser = SMC_CreateParser(); + SMC_SetReaders(g_hOldOverrideParser, + ReadOldOverrides_NewSection, ReadOverrides_KeyValue, - ReadOverrides_EndSection); + ReadOldOverrides_EndSection); + } + if (g_hNewOverrideParser == INVALID_HANDLE) + { + g_hNewOverrideParser = SMC_CreateParser(); + SMC_SetReaders(g_hNewOverrideParser, + ReadNewOverrides_NewSection, + ReadOverrides_KeyValue, + ReadNewOverrides_EndSection); } } -ReadOverrides() +InternalReadOverrides(Handle:parser, const String:file[]) { - InitializeOverrideParser(); - - BuildPath(Path_SM, g_Filename, sizeof(g_Filename), "configs/admin_levels.cfg"); + BuildPath(Path_SM, g_Filename, sizeof(g_Filename), file); /* Set states */ InitGlobalStates(); g_OverrideState = OVERRIDE_STATE_NONE; - new SMCError:err = SMC_ParseFile(g_hOverrideParser, g_Filename); + new SMCError:err = SMC_ParseFile(parser, g_Filename); if (err != SMCError_Okay) { decl String:buffer[64]; @@ -136,3 +183,10 @@ ReadOverrides() } } } + +ReadOverrides() +{ + InitializeOverrideParsers(); + InternalReadOverrides(g_hOldOverrideParser, "configs/admin_levels.cfg"); + InternalReadOverrides(g_hNewOverrideParser, "configs/admin_overrides.cfg"); +}