plugins/admin-base/admin-groups.sp
author David Anderson <dvander@alliedmods.net>
Tue Jan 30 05:42:57 2007 +0000 (2007-01-30)
changeset 420 bffaab713028
child 421 81aa2cce0002
permissions -rw-r--r--
initial import of group reader (unfinished)
     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
     7 
     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
    12 
    13 static LevelGroupError(const String:buffer[], {Handle,String,Float,_}:...)
    14 {
    15 	decl String:buffer[512];
    16 	
    17 	if (!g_LoggedFileName)
    18 	{
    19 		LogError("Error(s) detected parsing admin_groups.cfg:");
    20 		g_LoggedFileName = true;
    21 	}
    22 	
    23 	VFormat(buffer, sizeof(buffer), format, 2);
    24 	
    25 	LogError(" (%d) %s", ++g_ErrorCount, buffer);
    26 }
    27 
    28 public SMCResult:ReadGroups_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
    29 {
    30 	if (g_GroupState == GROUP_STATE_NONE)
    31 	{
    32 		if (StrEqual(name, "Groups"))
    33 		{
    34 			g_GroupState = GROUP_STATE_GROUPS;
    35 		}
    36 	} else if (g_GroupState == GROUP_STATE_GROUPS) {
    37 		if ((g_CurGrp = CreateAdmGroup(name)) == INVALID_GROUP_ID)
    38 		{
    39 			g_CurGrp = FindAdmGroup(name);
    40 		}
    41 		g_GroupState = GROUP_STATE_INGROUP;
    42 	} else if (g_GroupState == GROUP_STATE_INGROUP) {
    43 		if (StrEqual(name, "Overrides"))
    44 		{
    45 			g_GroupState = GROUP_STATE_OVERRIDES;
    46 		}
    47 	}
    48 	
    49 	return SMCParse_Continue;
    50 }
    51 
    52 public SMCResult:ReadGroups_KeyValue(Handle:smc, 
    53 										const String:key[], 
    54 										const String:value[], 
    55 										bool:key_quotes, 
    56 										bool:value_quotes)
    57 {
    58 	if (g_CurGrp == INVALID_GROUP_ID)
    59 	{
    60 		return SMCParse_Continue;
    61 	}
    62 	
    63 	new AdminFlag:flag;
    64 	
    65 	if (StrEqual(key, "flags"))
    66 	{
    67 		new len = strlen(value);
    68 		for (new i=0; i<len; i++)
    69 		{
    70 			if (value[i] < 'a' || value[i] > 'z')
    71 			{
    72 				continue;
    73 			}
    74 			flag = g_FlagLetters[value[i] - 'a'];
    75 			if (flag == Admin_None)
    76 			{
    77 				continue;
    78 			}
    79 			SetAdmGroupAddFlag(g_CurGrp, flag, true);
    80 		}
    81 	} else if (StrEqual(key, "immunity")) {
    82 		if (StrEqual(value, "*"))
    83 		{
    84 			SetAdmGroupImmunity(g_CurGrp, Immunity_Global, true);
    85 		} else if (StrEqual(value, "$")) {
    86 			SetAdmGroupImmunity(g_CurGrp, Immunity_Default, true);
    87 		}
    88 	}
    89 	
    90 	return SMCParse_Continue;
    91 }
    92 
    93 public SMCResult:ReadGroups_EndSection(Handle:smc)
    94 {
    95 	if (g_GroupState == GROUP_STATE_OVERRIDES)
    96 	{
    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;
   103 	}
   104 	
   105 	return SMCParse_Continue;
   106 }
   107 
   108 static InitializeGroupParser()
   109 {
   110 	if (g_hGroupParser == INVALID_HANDLE)
   111 	{
   112 		g_hGroupParser = SMC_CreateParser();
   113 		SMC_SetReaders(g_hGroupParser,
   114 					   ReadGroup_NewSection,
   115 					   ReadGroup_KeyValue,
   116 					   ReadGroup_EndSection);
   117 	}
   118 }
   119 
   120 ReadGroups()
   121 {
   122 	new String:path[PLATFORM_MAX_PATH];
   123 	
   124 	InitializeGroupParser();
   125 	
   126 	BuildPath(Path_SM, path, sizeof(path), "configs/admin_groups.cfg");
   127 	
   128 	/* Set states */
   129 	g_GroupState = GROUP_STATE_NONE;
   130 	g_LoggedFileName = false;
   131 	g_ErrorCount = 0;
   132 	g_CurGrp = INVALID_GROUP_ID;
   133 	g_GroupPass = GROUP_PASS_FIRST;
   134 		
   135 	new SMCError:err = SMC_ParseFile(g_hGroupParser, path);
   136 	if (err != SMCError_Okay)
   137 	{
   138 		decl String:buffer[64];
   139 		if (SMC_GetErrorString(err, buffer, sizeof(buffer)))
   140 		{
   141 			LogGroupError("%s", buffer);
   142 		} else {
   143 			LogGroupError("Fatal parse error");
   144 		}
   145 	}
   146 }
   147