plugins/admin-flatfile/admin-levels.sp
author David Anderson <dvander@alliedmods.net>
Tue Feb 06 05:13:24 2007 +0000 (2007-02-06)
changeset 438 e6e11c82d87e
parent 437 cc8dcd9f8099
child 439 0f0e53f49f5a
permissions -rw-r--r--
changed how the admin cache is rebuilt
renamed the plugin and fixed compilation errors
dvander@437
     1
#define LEVEL_STATE_NONE		0
dvander@437
     2
#define LEVEL_STATE_LEVELS		1
dvander@437
     3
#define LEVEL_STATE_FLAGS		2
dvander@437
     4
dvander@437
     5
static Handle:g_hLevelParser = INVALID_HANDLE;
dvander@437
     6
static g_LevelState = LEVEL_STATE_NONE;
dvander@437
     7
dvander@437
     8
/* :TODO: log line numbers? */
dvander@437
     9
dvander@437
    10
LoadDefaultLetters()
dvander@437
    11
{
dvander@437
    12
	g_FlagLetters['a'-'a'] = Admin_Reservation;
dvander@437
    13
	g_FlagLetters['b'-'a'] = Admin_Kick;
dvander@437
    14
	g_FlagLetters['c'-'a'] = Admin_Ban;
dvander@437
    15
	g_FlagLetters['d'-'a'] = Admin_Unban;
dvander@437
    16
	g_FlagLetters['e'-'a'] = Admin_Slay;
dvander@437
    17
	g_FlagLetters['f'-'a'] = Admin_Changemap;
dvander@437
    18
	g_FlagLetters['g'-'a'] = Admin_Convars;
dvander@438
    19
	g_FlagLetters['h'-'a'] = Admin_Config;
dvander@437
    20
	g_FlagLetters['i'-'a'] = Admin_Chat;
dvander@437
    21
	g_FlagLetters['j'-'a'] = Admin_Vote;
dvander@437
    22
	g_FlagLetters['h'-'a'] = Admin_Password;
dvander@437
    23
	g_FlagLetters['i'-'a'] = Admin_RCON;
dvander@437
    24
	g_FlagLetters['j'-'a'] = Admin_Cheats;
dvander@437
    25
	g_FlagLetters['z'-'a'] = Admin_Root;
dvander@437
    26
}
dvander@437
    27
dvander@437
    28
static LogLevelError(const String:format[], {Handle,String,Float,_}:...)
dvander@437
    29
{
dvander@437
    30
	decl String:buffer[512];
dvander@437
    31
	
dvander@437
    32
	if (!g_LoggedFileName)
dvander@437
    33
	{
dvander@437
    34
		LogError("Error(s) detected parsing admin_levels.cfg:");
dvander@437
    35
		g_LoggedFileName = true;
dvander@437
    36
	}
dvander@437
    37
	
dvander@437
    38
	VFormat(buffer, sizeof(buffer), format, 2);
dvander@437
    39
	
dvander@437
    40
	LogError(" (%d) %s", ++g_ErrorCount, buffer);
dvander@437
    41
}
dvander@437
    42
dvander@437
    43
public SMCResult:ReadLevels_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
dvander@437
    44
{
dvander@437
    45
	if (g_LevelState == LEVEL_STATE_NONE)
dvander@437
    46
	{
dvander@437
    47
		if (StrEqual(name, "Levels"))
dvander@437
    48
		{
dvander@437
    49
			g_LevelState = LEVEL_STATE_LEVELS;
dvander@437
    50
		}
dvander@437
    51
	} else if (g_LevelState == LEVEL_STATE_LEVELS) {
dvander@437
    52
		if (StrEqual(name, "Flags"))
dvander@437
    53
		{
dvander@437
    54
			g_LevelState = LEVEL_STATE_FLAGS;
dvander@437
    55
		}
dvander@437
    56
	}
dvander@437
    57
	
dvander@437
    58
	return SMCParse_Continue;
dvander@437
    59
}
dvander@437
    60
dvander@437
    61
public SMCResult:ReadLevels_KeyValue(Handle:smc, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes)
dvander@437
    62
{
dvander@437
    63
	if (g_LevelState == LEVEL_STATE_FLAGS)
dvander@437
    64
	{
dvander@437
    65
		new chr = value[0];
dvander@437
    66
		
dvander@437
    67
		if (chr < 'a' || chr > 'z')
dvander@437
    68
		{
dvander@437
    69
			LogLevelError("Unrecognized character: \"%s\"", value);
dvander@437
    70
			return SMCParse_Continue;
dvander@437
    71
		}
dvander@437
    72
		
dvander@437
    73
		chr -= 'a';
dvander@437
    74
		
dvander@438
    75
		new AdminFlag:flag;
dvander@437
    76
		
dvander@437
    77
		if (StrEqual(key, "reservation"))
dvander@437
    78
		{
dvander@437
    79
			flag = Admin_Reservation;
dvander@437
    80
		} else if (StrEqual(key, "kick")) {
dvander@437
    81
			flag = Admin_Kick;
dvander@437
    82
		} else if (StrEqual(key, "ban")) {
dvander@437
    83
			flag = Admin_Ban;
dvander@437
    84
		} else if (StrEqual(key, "unban")) {
dvander@437
    85
			flag = Admin_Unban;
dvander@437
    86
		} else if (StrEqual(key, "slay")) {
dvander@437
    87
			flag = Admin_Slay;
dvander@437
    88
		} else if (StrEqual(key, "changemap")) {
dvander@437
    89
			flag = Admin_Changemap;
dvander@437
    90
		} else if (StrEqual(key, "cvars")) {
dvander@437
    91
			flag = Admin_Convars;
dvander@438
    92
		} else if (StrEqual(key, "config")) {
dvander@438
    93
			flag = Admin_Config;
dvander@437
    94
		} else if (StrEqual(key, "chat")) {
dvander@437
    95
			flag = Admin_Chat;
dvander@437
    96
		} else if (StrEqual(key, "vote")) {
dvander@437
    97
			flag = Admin_Vote;
dvander@437
    98
		} else if (StrEqual(key, "password")) {
dvander@437
    99
			flag = Admin_Password;
dvander@437
   100
		} else if (StrEqual(key, "rcon")) {
dvander@437
   101
			flag = Admin_RCON;
dvander@437
   102
		} else if (StrEqual(key, "cheats")) {
dvander@437
   103
			flag = Admin_Cheats;
dvander@437
   104
		} else if (StrEqual(key, "root")) {
dvander@437
   105
			flag = Admin_Root;
dvander@437
   106
		} else {
dvander@437
   107
			LogLevelError("Unrecognized flag type: %s", key);
dvander@437
   108
		}
dvander@437
   109
		
dvander@437
   110
		g_FlagLetters[chr] = flag;
dvander@437
   111
	}
dvander@437
   112
	
dvander@437
   113
	return SMCParse_Continue;
dvander@437
   114
}
dvander@437
   115
dvander@437
   116
public SMCResult:ReadLevels_EndSection(Handle:smc)
dvander@437
   117
{
dvander@437
   118
	if (g_LevelState == LEVEL_STATE_FLAGS)
dvander@437
   119
	{
dvander@437
   120
		/* We're totally done parsing */
dvander@437
   121
		g_LevelState = LEVEL_STATE_LEVELS;
dvander@437
   122
		return SMCParse_Halt;
dvander@437
   123
	} else if (g_LevelState == LEVEL_STATE_LEVELS) {
dvander@437
   124
		g_LevelState = LEVEL_STATE_NONE;
dvander@437
   125
	}
dvander@437
   126
	
dvander@437
   127
	return SMCParse_Continue;
dvander@437
   128
}
dvander@437
   129
dvander@437
   130
static InitializeLevelParser()
dvander@437
   131
{
dvander@437
   132
	if (g_hLevelParser == INVALID_HANDLE)
dvander@437
   133
	{
dvander@437
   134
		g_hLevelParser = SMC_CreateParser();
dvander@437
   135
		SMC_SetReaders(g_hLevelParser, 
dvander@437
   136
				   	ReadLevels_NewSection,
dvander@437
   137
				   	ReadLevels_KeyValue,
dvander@437
   138
				   	ReadLevels_EndSection);
dvander@437
   139
	}
dvander@437
   140
}
dvander@437
   141
dvander@437
   142
RefreshLevels()
dvander@437
   143
{
dvander@437
   144
	new String:path[PLATFORM_MAX_PATH];
dvander@437
   145
	
dvander@437
   146
	LoadDefaultLetters();
dvander@437
   147
	InitializeLevelParser();
dvander@437
   148
	
dvander@437
   149
	BuildPath(Path_SM, path, sizeof(path), "configs/admin_levels.cfg");
dvander@437
   150
	
dvander@437
   151
	/* Set states */
dvander@437
   152
	g_LevelState = LEVEL_STATE_NONE;
dvander@437
   153
	g_LoggedFileName = false;
dvander@437
   154
	g_ErrorCount = 0;
dvander@437
   155
		
dvander@437
   156
	new SMCError:err = SMC_ParseFile(g_hLevelParser, path);
dvander@437
   157
	if (err != SMCError_Okay)
dvander@437
   158
	{
dvander@437
   159
		decl String:buffer[64];
dvander@437
   160
		if (SMC_GetErrorString(err, buffer, sizeof(buffer)))
dvander@437
   161
		{
dvander@437
   162
			LogLevelError("%s", buffer);
dvander@437
   163
		} else {
dvander@437
   164
			LogLevelError("Fatal parse error");
dvander@437
   165
		}
dvander@437
   166
	}
dvander@437
   167
}