1 #define GROUP_STATE_NONE 0
2 #define GROUP_STATE_GROUPS 1
3 #define GROUP_STATE_INGROUP 2
4 #define GROUP_STATE_OVERRIDES 3
5 #define GROUP_PASS_FIRST 1
6 #define GROUP_PASS_SECOND 2
8 static Handle:g_hGroupParser = INVALID_HANDLE;
9 static GroupId:g_CurGrp = INVALID_GROUP_ID;
10 static g_GroupState = GROUP_STATE_NONE;
11 static g_GroupPass = 0
13 static LevelGroupError(const String:buffer[], {Handle,String,Float,_}:...)
15 decl String:buffer[512];
17 if (!g_LoggedFileName)
19 LogError("Error(s) detected parsing admin_groups.cfg:");
20 g_LoggedFileName = true;
23 VFormat(buffer, sizeof(buffer), format, 2);
25 LogError(" (%d) %s", ++g_ErrorCount, buffer);
28 public SMCResult:ReadGroups_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
30 if (g_GroupState == GROUP_STATE_NONE)
32 if (StrEqual(name, "Groups"))
34 g_GroupState = GROUP_STATE_GROUPS;
36 } else if (g_GroupState == GROUP_STATE_GROUPS) {
37 if ((g_CurGrp = CreateAdmGroup(name)) == INVALID_GROUP_ID)
39 g_CurGrp = FindAdmGroup(name);
41 g_GroupState = GROUP_STATE_INGROUP;
42 } else if (g_GroupState == GROUP_STATE_INGROUP) {
43 if (StrEqual(name, "Overrides"))
45 g_GroupState = GROUP_STATE_OVERRIDES;
49 return SMCParse_Continue;
52 public SMCResult:ReadGroups_KeyValue(Handle:smc,
58 if (g_CurGrp == INVALID_GROUP_ID)
60 return SMCParse_Continue;
65 if (StrEqual(key, "flags"))
67 new len = strlen(value);
68 for (new i=0; i<len; i++)
70 if (value[i] < 'a' || value[i] > 'z')
74 flag = g_FlagLetters[value[i] - 'a'];
75 if (flag == Admin_None)
79 SetAdmGroupAddFlag(g_CurGrp, flag, true);
81 } else if (StrEqual(key, "immunity")) {
82 if (StrEqual(value, "*"))
84 SetAdmGroupImmunity(g_CurGrp, Immunity_Global, true);
85 } else if (StrEqual(value, "$")) {
86 SetAdmGroupImmunity(g_CurGrp, Immunity_Default, true);
90 return SMCParse_Continue;
93 public SMCResult:ReadGroups_EndSection(Handle:smc)
95 if (g_GroupState == GROUP_STATE_OVERRIDES)
97 g_GroupState = GROUP_STATE_INGROUP;
98 } else if (g_GroupState == GROUP_STATE_INGROUP) {
99 g_GroupState = GROUP_STATE_GROUPS;
100 g_CurGrp = INVALID_GROUP_ID;
101 } else if (g_GroupState == GROUP_STATE_GROUPS) {
102 g_GroupState = GROUP_STATE_NONE;
105 return SMCParse_Continue;
108 static InitializeGroupParser()
110 if (g_hGroupParser == INVALID_HANDLE)
112 g_hGroupParser = SMC_CreateParser();
113 SMC_SetReaders(g_hGroupParser,
114 ReadGroup_NewSection,
116 ReadGroup_EndSection);
122 new String:path[PLATFORM_MAX_PATH];
124 InitializeGroupParser();
126 BuildPath(Path_SM, path, sizeof(path), "configs/admin_groups.cfg");
129 g_GroupState = GROUP_STATE_NONE;
130 g_LoggedFileName = false;
132 g_CurGrp = INVALID_GROUP_ID;
133 g_GroupPass = GROUP_PASS_FIRST;
135 new SMCError:err = SMC_ParseFile(g_hGroupParser, path);
136 if (err != SMCError_Okay)
138 decl String:buffer[64];
139 if (SMC_GetErrorString(err, buffer, sizeof(buffer)))
141 LogGroupError("%s", buffer);
143 LogGroupError("Fatal parse error");