plugins/admin-base/admin-overrides.sp
author David Anderson <dvander@alliedmods.net>
Tue Jan 30 05:42:57 2007 +0000 (2007-01-30)
changeset 420 bffaab713028
parent 417 ae782e75d9e4
permissions -rw-r--r--
initial import of group reader (unfinished)
dvander@415
     1
#define OVERRIDE_STATE_NONE			0
dvander@415
     2
#define OVERRIDE_STATE_LEVELS		1
dvander@415
     3
#define OVERRIDE_STATE_OVERRIDES	2
dvander@415
     4
dvander@415
     5
static Handle:g_hOverrideParser = INVALID_HANDLE;
dvander@415
     6
static g_OverrideState = OVERRIDE_STATE_NONE;
dvander@415
     7
dvander@420
     8
static LogOverrideError(const String:format[], {Handle,String,Float,_}:...)
dvander@415
     9
{
dvander@415
    10
	decl String:buffer[512];
dvander@415
    11
	
dvander@415
    12
	if (!g_LoggedFileName)
dvander@415
    13
	{
dvander@415
    14
		LogError("Error(s) detected parsing admin_levels.cfg:");
dvander@415
    15
		g_LoggedFileName = true;
dvander@415
    16
	}
dvander@415
    17
	
dvander@415
    18
	VFormat(buffer, sizeof(buffer), format, 2);
dvander@415
    19
	
dvander@415
    20
	LogError(" (%d) %s", ++g_ErrorCount, buffer);
dvander@415
    21
}
dvander@415
    22
dvander@415
    23
dvander@415
    24
public SMCResult:ReadOverrides_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
dvander@415
    25
{
dvander@415
    26
	if (g_OverrideState == OVERRIDE_STATE_NONE)
dvander@415
    27
	{
dvander@415
    28
		if (StrEqual(name, "Levels"))
dvander@415
    29
		{
dvander@415
    30
			g_OverrideState = OVERRIDE_STATE_LEVELS;
dvander@415
    31
		}
dvander@415
    32
	} else if (g_OverrideState == OVERRIDE_STATE_LEVELS) {
dvander@415
    33
		if (StrEqual(name, "Overrides"))
dvander@415
    34
		{
dvander@415
    35
			g_OverrideState = OVERRIDE_STATE_OVERRIDES;
dvander@415
    36
		}
dvander@415
    37
	}
dvander@415
    38
	
dvander@415
    39
	return SMCParse_Continue;
dvander@415
    40
}
dvander@415
    41
dvander@415
    42
public SMCResult:ReadOverrides_KeyValue(Handle:smc, 
dvander@415
    43
										const String:key[], 
dvander@415
    44
										const String:value[], 
dvander@415
    45
										bool:key_quotes, 
dvander@415
    46
										bool:value_quotes)
dvander@415
    47
{
dvander@415
    48
	if (g_OverrideState != OVERRIDE_STATE_OVERRIDES)
dvander@415
    49
	{
dvander@415
    50
		return SMCParse_Continue;
dvander@415
    51
	}
dvander@415
    52
	
dvander@415
    53
	new AdminFlag:flag = Admin_None;
dvander@415
    54
	
dvander@417
    55
	if (strlen(value) > 1)
dvander@417
    56
	{
dvander@417
    57
		LogOverrideError("Unrecognized access level: %s", value);
dvander@417
    58
		return SMCParse_Continue;
dvander@417
    59
	}
dvander@417
    60
	
dvander@415
    61
	if (value[0] >= 'a' && value[0] <= 'z')
dvander@415
    62
	{
dvander@415
    63
		flag = g_FlagLetters[value[0] - 'a'];
dvander@415
    64
	}
dvander@415
    65
	
dvander@415
    66
	if (key[0] == '@')
dvander@415
    67
	{
dvander@415
    68
		AddCommandOverride(key[1], Override_CommandGroup, flag);
dvander@415
    69
	} else {
dvander@415
    70
		AddCommandOverride(key, Override_Command, flag);
dvander@415
    71
	}
dvander@415
    72
	
dvander@415
    73
	return SMCParse_Continue;
dvander@415
    74
}
dvander@415
    75
dvander@415
    76
public SMCResult:ReadOverrides_EndSection(Handle:smc)
dvander@415
    77
{
dvander@415
    78
	if (g_OverrideState == OVERRIDE_STATE_LEVELS)
dvander@415
    79
	{
dvander@415
    80
		g_OverrideState = OVERRIDE_STATE_NONE;
dvander@415
    81
	} else if (g_OverrideState == OVERRIDE_STATE_OVERRIDES) {
dvander@415
    82
		/* We're totally done parsing */
dvander@415
    83
		g_OverrideState = OVERRIDE_STATE_LEVELS;
dvander@415
    84
		return SMCParse_Halt;
dvander@415
    85
	}
dvander@415
    86
	
dvander@415
    87
	return SMCParse_Continue;
dvander@415
    88
}
dvander@415
    89
dvander@415
    90
static InitializeOverrideParser()
dvander@415
    91
{
dvander@415
    92
	if (g_hOverrideParser == INVALID_HANDLE)
dvander@415
    93
	{
dvander@415
    94
		g_hOverrideParser = SMC_CreateParser();
dvander@415
    95
		SMC_SetReaders(g_hOverrideParser,
dvander@415
    96
					   ReadOverrides_NewSection,
dvander@415
    97
					   ReadOverrides_KeyValue,
dvander@415
    98
					   ReadOverrides_EndSection);
dvander@415
    99
	}
dvander@415
   100
}
dvander@415
   101
dvander@415
   102
ReadOverrides()
dvander@415
   103
{
dvander@415
   104
	new String:path[PLATFORM_MAX_PATH];
dvander@415
   105
	
dvander@415
   106
	InitializeOverrideParser();
dvander@415
   107
	
dvander@415
   108
	BuildPath(Path_SM, path, sizeof(path), "configs/admin_levels.cfg");
dvander@415
   109
	
dvander@415
   110
	/* Set states */
dvander@415
   111
	g_OverrideState = OVERRIDE_STATE_NONE;
dvander@415
   112
	g_LoggedFileName = false;
dvander@415
   113
	g_ErrorCount = 0;
dvander@415
   114
		
dvander@415
   115
	new SMCError:err = SMC_ParseFile(g_hOverrideParser, path);
dvander@415
   116
	if (err != SMCError_Okay)
dvander@415
   117
	{
dvander@415
   118
		decl String:buffer[64];
dvander@415
   119
		if (SMC_GetErrorString(err, buffer, sizeof(buffer)))
dvander@415
   120
		{
dvander@415
   121
			LogOverrideError("%s", buffer);
dvander@415
   122
		} else {
dvander@415
   123
			LogOverrideError("Fatal parse error");
dvander@415
   124
		}
dvander@415
   125
	}
dvander@415
   126
}
dvander@415
   127