7 author = "AlliedModders LLC",
8 description = "Reads admin files",
10 url = "http://www.sourcemod.net/"
13 #define LEVEL_STATE_NONE 0
14 #define LEVEL_STATE_LEVELS 1
15 #define LEVEL_STATE_FLAGS 2
16 #define LEVEL_STATE_OVERRIDES 3
20 new Handle:g_hLevelParser = INVALID_HANDLE;
23 new g_LevelState = LEVEL_STATE_NONE;
25 /** Globals for levels */
26 new AdminFlag:g_FlagLetters[26]; /* Maps the flag letters */
27 new bool:g_ReadOverrides = false; /* Whether or not to read overrides */
28 new bool:g_LoggedFileName = false; /* Whether or not the file name has been logged */
31 public OnPluginStart()
33 g_hLevelParser = SMC_CreateParser();
34 SMC_SetReaders(g_hLevelParser,
35 ReadLevels_NewSection,
37 ReadLevels_EndSection);
42 g_FlagLetters['a'-'a'] = Admin_Reservation;
43 g_FlagLetters['b'-'a'] = Admin_Kick;
44 g_FlagLetters['c'-'a'] = Admin_Ban;
45 g_FlagLetters['d'-'a'] = Admin_Unban;
46 g_FlagLetters['e'-'a'] = Admin_Slay;
47 g_FlagLetters['f'-'a'] = Admin_Changemap;
48 g_FlagLetters['g'-'a'] = Admin_Convars;
49 g_FlagLetters['h'-'a'] = Admin_Configs;
50 g_FlagLetters['i'-'a'] = Admin_Chat;
51 g_FlagLetters['j'-'a'] = Admin_Vote;
52 g_FlagLetters['h'-'a'] = Admin_Password;
53 g_FlagLetters['i'-'a'] = Admin_RCON;
54 g_FlagLetters['j'-'a'] = Admin_Cheats;
55 g_FlagLetters['z'-'a'] = Admin_Root;
58 public SMCResult:ReadLevels_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
60 if (g_LevelState == LEVEL_STATE_NONE)
62 if (StrEqual(name, "Levels"))
64 g_LevelState = LEVEL_STATE_LEVELS;
66 /* :TODO: log error */
68 } else if (g_LevelState == LEVEL_STATE_LEVELS) {
69 if (StrEqual(name, "Flags"))
71 g_LevelState = LEVEL_STATE_FLAGS;
72 } else if (StrEqual(name, "Overrides")) {
73 g_LevelState = LEVEL_STATE_OVERRIDES;
75 /* :TODO: log error */
78 /* :TODO: Log error */
81 return SMCParse_Continue;
84 public SMCResult:ReadLevels_KeyValue(Handle:smc, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes)
86 if (g_LevelState == LEVEL_STATE_FLAGS)
90 if (chr < 'a' || chr > 'z')
92 /* :TODO: log error */
93 return SMCParse_Continue;
98 new AdminFlag:flag = Admin_None;
100 if (StrEqual(key, "reservation"))
102 flag = Admin_Reservation;
103 } else if (StrEqual(key, "kick")) {
105 } else if (StrEqual(key, "ban")) {
107 } else if (StrEqual(key, "unban")) {
109 } else if (StrEqual(key, "slay")) {
111 } else if (StrEqual(key, "changemap")) {
112 flag = Admin_Changemap;
113 } else if (StrEqual(key, "cvars")) {
114 flag = Admin_Convars;
115 } else if (StrEqual(key, "configs")) {
116 flag = Admin_Configs;
117 } else if (StrEqual(key, "chat")) {
119 } else if (StrEqual(key, "vote")) {
121 } else if (StrEqual(key, "password")) {
122 flag = Admin_Password;
123 } else if (StrEqual(key, "rcon")) {
125 } else if (StrEqual(key, "cheats")) {
127 } else if (StrEqual(key, "root")) {
130 /* :TODO: log error */
133 g_FlagLetters[chr] = flag;
136 } else if (g_LevelState == LEVEL_STATE_OVERRIDES) {
137 if (!g_ReadOverrides)
139 return SMCParse_Continue;
143 return SMCParse_Continue;
146 public SMCResult:ReadLevels_EndSection(Handle:smc)
148 if (g_LevelState == LEVEL_STATE_FLAGS)
150 g_LevelState = LEVEL_STATE_LEVELS;
151 } else if (g_LevelState == LEVEL_STATE_OVERRIDES) {
152 g_LevelState = LEVEL_STATE_OVERRIDES;
153 } else if (g_LevelState == LEVEL_STATE_LEVELS) {
154 g_LevelState = LEVEL_STATE_NONE;
158 public OnRebuildAdminCache(cache_flags)
160 if (cache_flags & ADMIN_CACHE_OVERRIDES)
162 g_ReadOverrides = true;
164 g_ReadOverrides = false;
172 new String:path[PLATFORM_MAX_PATH];
174 LoadDefaultLetters();
176 BuildPath(Path_SM, path, sizeof(path), "configs/admin_levels.cfg");
179 g_LevelState = LEVEL_STATE_NONE;
180 g_LoggedFileName = false;
182 new SMCError:err = SMC_ParseFile(g_hLevelParser, path);
183 if (err != SMCError_Okay)
185 /* :TODO: log error */