plugins/admin-base.sp
author David Anderson <dvander@alliedmods.net>
Sat Jan 27 09:25:07 2007 +0000 (2007-01-27)
changeset 401 18fc0da83775
parent 398 626ce2e591ad
permissions -rw-r--r--
fixed this using /MD in release mode
     1 #include <sourcemod>
     2 #include <textparse>
     3 
     4 public Plugin:myinfo = 
     5 {
     6 	name = "Admin Base",
     7 	author = "AlliedModders LLC",
     8 	description = "Reads admin files",
     9 	version = "1.0.0.0",
    10 	url = "http://www.sourcemod.net/"
    11 };
    12 
    13 #define LEVEL_STATE_NONE		0
    14 #define LEVEL_STATE_LEVELS		1
    15 #define LEVEL_STATE_FLAGS		2
    16 #define LEVEL_STATE_OVERRIDES	3
    17 
    18 
    19 /** Parser handles */
    20 new Handle:g_hLevelParser = INVALID_HANDLE;
    21 
    22 /** Parser states */
    23 new g_LevelState = LEVEL_STATE_NONE;
    24 
    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 */
    29 
    30 
    31 public OnPluginStart()
    32 {
    33 	g_hLevelParser = SMC_CreateParser();
    34 	SMC_SetReaders(g_hLevelParser, 
    35 				   ReadLevels_NewSection,
    36 				   ReadLevels_KeyValue,
    37 				   ReadLevels_EndSection);
    38 }
    39 
    40 LoadDefaultLetters()
    41 {
    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;
    56 }
    57 
    58 public SMCResult:ReadLevels_NewSection(Handle:smc, const String:name[], bool:opt_quotes)
    59 {
    60 	if (g_LevelState == LEVEL_STATE_NONE)
    61 	{
    62 		if (StrEqual(name, "Levels"))
    63 		{
    64 			g_LevelState = LEVEL_STATE_LEVELS;
    65 		} else {
    66 			/* :TODO: log error */
    67 		}
    68 	} else if (g_LevelState == LEVEL_STATE_LEVELS) {
    69 		if (StrEqual(name, "Flags"))
    70 		{
    71 			g_LevelState = LEVEL_STATE_FLAGS;
    72 		} else if (StrEqual(name, "Overrides")) {
    73 			g_LevelState = LEVEL_STATE_OVERRIDES;
    74 		} else {
    75 			/* :TODO: log error */
    76 		}
    77 	} else {
    78 		/* :TODO: Log error */
    79 	}
    80 	
    81 	return SMCParse_Continue;
    82 }
    83 
    84 public SMCResult:ReadLevels_KeyValue(Handle:smc, const String:key[], const String:value[], bool:key_quotes, bool:value_quotes)
    85 {
    86 	if (g_LevelState == LEVEL_STATE_FLAGS)
    87 	{
    88 		new chr = value[0];
    89 		
    90 		if (chr < 'a' || chr > 'z')
    91 		{
    92 			/* :TODO: log error */
    93 			return SMCParse_Continue;
    94 		}
    95 		
    96 		chr -= 'a';
    97 		
    98 		new AdminFlag:flag = Admin_None;
    99 		
   100 		if (StrEqual(key, "reservation"))
   101 		{
   102 			flag = Admin_Reservation;
   103 		} else if (StrEqual(key, "kick")) {
   104 			flag = Admin_Kick;
   105 		} else if (StrEqual(key, "ban")) {
   106 			flag = Admin_Ban;
   107 		} else if (StrEqual(key, "unban")) {
   108 			flag = Admin_Unban;
   109 		} else if (StrEqual(key, "slay")) {
   110 			flag = Admin_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")) {
   118 			flag = Admin_Chat;
   119 		} else if (StrEqual(key, "vote")) {
   120 			flag = Admin_Vote;
   121 		} else if (StrEqual(key, "password")) {
   122 			flag = Admin_Password;
   123 		} else if (StrEqual(key, "rcon")) {
   124 			flag = Admin_RCON;
   125 		} else if (StrEqual(key, "cheats")) {
   126 			flag = Admin_Cheats;
   127 		} else if (StrEqual(key, "root")) {
   128 			flag = Admin_Root;
   129 		} else {
   130 			/* :TODO: log error */
   131 		}
   132 		
   133 		g_FlagLetters[chr] = flag;
   134 		
   135 	
   136 	} else if (g_LevelState == LEVEL_STATE_OVERRIDES) {
   137 		if (!g_ReadOverrides)
   138 		{
   139 			return SMCParse_Continue;
   140 		}
   141 	}
   142 	
   143 	return SMCParse_Continue;
   144 }
   145 
   146 public SMCResult:ReadLevels_EndSection(Handle:smc)
   147 {
   148 	if (g_LevelState == LEVEL_STATE_FLAGS)
   149 	{
   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;
   155 	}
   156 }
   157 
   158 public OnRebuildAdminCache(cache_flags)
   159 {
   160 	if (cache_flags & ADMIN_CACHE_OVERRIDES)
   161 	{
   162 		g_ReadOverrides = true;
   163 	} else {
   164 		g_ReadOverrides = false;
   165 	}
   166 	
   167 	RefreshLevels();
   168 }
   169 
   170 RefreshLevels()
   171 {
   172 	new String:path[PLATFORM_MAX_PATH];
   173 	
   174 	LoadDefaultLetters();
   175 	
   176 	BuildPath(Path_SM, path, sizeof(path), "configs/admin_levels.cfg");
   177 	
   178 	/* Set states */
   179 	g_LevelState = LEVEL_STATE_NONE;
   180 	g_LoggedFileName = false;
   181 		
   182 	new SMCError:err = SMC_ParseFile(g_hLevelParser, path);
   183 	if (err != SMCError_Okay)
   184 	{
   185 		/* :TODO: log error */
   186 	}
   187 }