public/IAdminSystem.h
author David Anderson <dvander@alliedmods.net>
Fri Jan 26 02:04:07 2007 +0000 (2007-01-26)
changeset 373 bf3335acefdd
parent 372 47f21574db6d
child 375 a31ff1b6ae46
permissions -rw-r--r--
added license headers to extensions
dvander@372
     1
/**
dvander@372
     2
 * ===============================================================
dvander@372
     3
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@372
     4
 * ===============================================================
dvander@372
     5
 *
dvander@372
     6
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be used 
dvander@372
     7
 * or modified under the Terms and Conditions of its License Agreement, which is found 
dvander@372
     8
 * in LICENSE.txt.  The Terms and Conditions for making SourceMod extensions/plugins 
dvander@372
     9
 * may change at any time.  To view the latest information, see:
dvander@372
    10
 *   http://www.sourcemod.net/license.php
dvander@372
    11
 *
dvander@372
    12
 * Version: $Id$
dvander@372
    13
 */
dvander@372
    14
dvander@335
    15
#ifndef _INCLUDE_SOURCEMOD_ADMINISTRATION_SYSTEM_H_
dvander@335
    16
#define _INCLUDE_SOURCEMOD_ADMINISTRATION_SYSTEM_H_
dvander@335
    17
dvander@335
    18
#include <IShareSys.h>
dvander@335
    19
dvander@335
    20
#define SMINTERFACE_ADMINSYS_NAME		"IAdminSys"
dvander@335
    21
#define SMINTERFACE_ADMINSYS_VERSION	1
dvander@335
    22
dvander@335
    23
/**
dvander@372
    24
 * @file IAdminSystem.h
dvander@372
    25
 * @brief Defines the interface to manage the Admin Users/Groups and Override caches.
dvander@372
    26
 *
dvander@335
    27
 *   The administration system is more of a volatile cache than a system.  It is designed to be 
dvander@335
    28
 * temporary rather than permanent, in order to compensate for more storage methods.  For example,
dvander@335
    29
 * a flat file might be read into the cache all at once.  But a MySQL-based system might only cache
dvander@335
    30
 * admin permissions when that specific admin connects.  
dvander@335
    31
 *
dvander@335
    32
 *   The override cache is the simplest to explain.  Any time an override is added, any existing 
dvander@335
    33
 * and all future commands will gain a new access level set by the override.  If unset, the default
dvander@335
    34
 * access level is restored.  This cache is dynamically changeable.
dvander@335
    35
 *
dvander@335
    36
 *   The group cache contains, for each group:
dvander@335
    37
 *	1] A set of inherent flags - fully readable/writable.
dvander@335
    38
 *  2] An immunity table - insertion and retrieval only.
dvander@335
    39
 *  3] An override table - insertion and retrieval only.
dvander@335
    40
 *   Individual groups can be invalidated entirely.  It should be considered an expensive
dvander@335
    41
 *  operation, since each admin needs to be patched up to not reference the group.
dvander@335
    42
 */
dvander@335
    43
dvander@335
    44
namespace SourceMod
dvander@335
    45
{
dvander@372
    46
	/**
dvander@372
    47
	 * @brief Access levels (flags) for admins.
dvander@372
    48
	 */
dvander@335
    49
	enum AdminFlag
dvander@335
    50
	{
dvander@335
    51
		Admin_None = 0,
dvander@372
    52
		Admin_Reservation,		/**< Reserved slot */
dvander@372
    53
		Admin_Kick,				/**< Kick another user */
dvander@372
    54
		Admin_Ban,				/**< Ban another user */
dvander@372
    55
		Admin_Unban,			/**< Unban another user */
dvander@372
    56
		Admin_Slay,				/**< Slay/kill/damage another user */
dvander@372
    57
		Admin_Changemap,		/**< Change the map */
dvander@372
    58
		Admin_Convars,			/**< Change basic convars */
dvander@372
    59
		Admin_Configs,			/**< Change configs */
dvander@372
    60
		Admin_Chat,				/**< Special chat privileges */
dvander@372
    61
		Admin_Vote,				/**< Special vote privileges */
dvander@372
    62
		Admin_Password,			/**< Set a server password */
dvander@372
    63
		Admin_RCON,				/**< Use RCON */
dvander@372
    64
		Admin_Cheats,			/**< Change sv_cheats and use its commands */
dvander@372
    65
		Admin_Root,				/**< All access by default */
dvander@335
    66
		/* --- */
dvander@335
    67
		AdminFlags_TOTAL,
dvander@335
    68
	};
dvander@335
    69
dvander@372
    70
	/**
dvander@372
    71
	 * @brief Specifies which type of command to override (command or command group).
dvander@372
    72
	 */
dvander@335
    73
	enum OverrideType
dvander@335
    74
	{
dvander@372
    75
		Override_Command = 1,	/**< Command */
dvander@372
    76
		Override_CommandGroup,	/**< Command group */
dvander@335
    77
	};
dvander@335
    78
dvander@372
    79
	/**
dvander@372
    80
	 * @brief Specifies how a command is overridden for a user group.
dvander@372
    81
	 */
dvander@335
    82
	enum OverrideRule
dvander@335
    83
	{
dvander@372
    84
		Command_Deny = 0,		/**< Deny access */
dvander@372
    85
		Command_Allow = 1,		/**< Allow access */
dvander@335
    86
	};
dvander@335
    87
dvander@372
    88
	/**
dvander@372
    89
	 * @brief Specifies a generic immunity type.
dvander@372
    90
	 */
dvander@335
    91
	enum ImmunityType
dvander@335
    92
	{
dvander@372
    93
		Immunity_Default = 1,	/**< Immune from everyone with no immunity */
dvander@372
    94
		Immunity_Global,		/**< Immune from everyone (except root admins) */
dvander@335
    95
	};
dvander@335
    96
dvander@372
    97
	/**
dvander@372
    98
	 * @brief Represents an index to one group.
dvander@372
    99
	 */
dvander@335
   100
	typedef int		GroupId;
dvander@335
   101
dvander@336
   102
	#define ADMIN_CACHE_OVERRIDES	(1<<0)
dvander@336
   103
	#define ADMIN_CACHE_ADMINS		(1<<1)
dvander@336
   104
	#define ADMIN_CACHE_GROUPS		((1<<2)|ADMIN_CACHE_ADMINS)
dvander@336
   105
dvander@372
   106
	/**
dvander@372
   107
	 * @brief Represents an invalid/nonexistant group or an erroneous operation.
dvander@372
   108
	 */
dvander@335
   109
	#define INVALID_GROUP_ID	-1
dvander@335
   110
dvander@372
   111
	/**
dvander@372
   112
	 * @brief Provides callbacks for admin cache operations.
dvander@372
   113
	 */
dvander@336
   114
	class IAdminListener
dvander@336
   115
	{
dvander@336
   116
	public:
dvander@336
   117
		/**
dvander@336
   118
		 * Called when part of the admin cache needs to be rebuilt.  
dvander@336
   119
		 * Groups should always be rebuilt before admins.
dvander@336
   120
		 *
dvander@336
   121
		 * @param cache_flags	Flags for which cache to dump.
dvander@336
   122
		 */
dvander@336
   123
		virtual void OnRebuildAdminCache(int cache_flags) =0;
dvander@336
   124
	};
dvander@336
   125
dvander@335
   126
	/**
dvander@372
   127
	 * @brief Provides functions for manipulating the admin options cache.
dvander@335
   128
	 */
dvander@335
   129
	class IAdminSystem : public SMInterface
dvander@335
   130
	{
dvander@335
   131
	public:
dvander@335
   132
		const char *GetInterfaceName()
dvander@335
   133
		{
dvander@335
   134
			return SMINTERFACE_ADMINSYS_NAME;
dvander@335
   135
		}
dvander@335
   136
		unsigned int GetInterfaceVersion()
dvander@335
   137
		{
dvander@335
   138
			return SMINTERFACE_ADMINSYS_VERSION;
dvander@335
   139
		}
dvander@335
   140
	public:
dvander@335
   141
		/**
dvander@335
   142
		 * @brief Adds a global command flag override.  Any command registered with this name
dvander@335
   143
		 * will assume the new flag.  This is applied retroactively as well.
dvander@335
   144
		 *
dvander@335
   145
		 * @param cmd			String containing command name (case sensitive).
dvander@335
   146
		 * @param type			Override type (specific command or group).
dvander@335
   147
		 * @param flag			New admin flag.
dvander@335
   148
		 */
dvander@335
   149
		virtual void AddCommandOverride(const char *cmd, OverrideType type, AdminFlag flag) =0;
dvander@335
   150
dvander@335
   151
		/**
dvander@335
   152
		 * @brief Returns a command override.
dvander@335
   153
		 *
dvander@335
   154
		 * @param cmd			String containing command name (case sensitive).
dvander@335
   155
		 * @param type			Override type (specific command or group).
dvander@335
   156
		 * @param pFlag			Optional pointer to the set flag.
dvander@335
   157
		 * @return				True if there is an override, false otherwise.
dvander@335
   158
		 */
dvander@335
   159
		virtual bool GetCommandOverride(const char *cmd, OverrideType type, AdminFlag *pFlag) =0;
dvander@335
   160
dvander@335
   161
		/**
dvander@335
   162
		 * @brief Unsets a command override.
dvander@335
   163
		 *
dvander@335
   164
		 * @param cmd			String containing command name (case sensitive).
dvander@335
   165
		 * @param type			Override type (specific command or group).
dvander@335
   166
		 */
dvander@335
   167
		virtual void UnsetCommandOverride(const char *cmd, OverrideType type) =0;
dvander@335
   168
dvander@335
   169
		/**
dvander@335
   170
		 * @brief Adds a new group.  Name must be unique.
dvander@335
   171
		 *
dvander@335
   172
		 * @param group_name	String containing the group name.
dvander@335
   173
		 * @return				A new group id, INVALID_GROUP_ID if it already exists.
dvander@335
   174
		 */
dvander@335
   175
		virtual GroupId AddGroup(const char *group_name) =0;
dvander@335
   176
dvander@335
   177
		/**
dvander@335
   178
		 * @brief Finds a group by name.
dvander@335
   179
		 *
dvander@335
   180
		 * @param group_name	String containing the group name.
dvander@335
   181
		 * @return				A group id, or INVALID_GROUP_ID if not found.
dvander@335
   182
		 */
dvander@335
   183
		virtual GroupId FindGroupByName(const char *group_name) =0;
dvander@335
   184
dvander@335
   185
		/**
dvander@335
   186
		 * @brief Adds or removes a flag from a group's flag set.
dvander@335
   187
		 * Note: These are called "add flags" because they add to a user's flags.
dvander@335
   188
		 *
dvander@335
   189
		 * @param id			Group id.
dvander@335
   190
		 * @param flag			Admin flag to toggle.
dvander@335
   191
		 * @param enabled		True to set the flag, false to unset/disable.
dvander@335
   192
		 */
dvander@335
   193
		virtual void SetGroupAddFlag(GroupId id, AdminFlag flag, bool enabled) =0;
dvander@335
   194
dvander@335
   195
		/**
dvander@335
   196
		 * @brief Gets the set value of an add flag on a group's flag set.
dvander@335
   197
		 *
dvander@335
   198
		 * @param id			Group id.
dvander@335
   199
		 * @param flag			Admin flag to retrieve.
dvander@335
   200
		 * @return				True if enabled, false otherwise,
dvander@335
   201
		 */
dvander@335
   202
		virtual bool GetGroupAddFlag(GroupId id, AdminFlag flag) =0;
dvander@335
   203
dvander@335
   204
		/**
dvander@336
   205
		 * @brief Returns an array of flag bits that are added to a user from their group.
dvander@335
   206
		 * Note: These are called "add flags" because they add to a user's flags.
dvander@335
   207
		 *
dvander@335
   208
		 * @param id			GroupId of the group.
dvander@336
   209
		 * @param flags			Array to store flags bits in.
dvander@335
   210
		 * @param total			Total number of flags that can be stored in the array.
dvander@335
   211
		 * @return				Number of flags that were written to the array.
dvander@335
   212
		 */
dvander@336
   213
		virtual unsigned int GetGroupAddFlagBits(GroupId id, bool flags[], unsigned int total) =0;
dvander@335
   214
dvander@335
   215
		/**
dvander@335
   216
		 * @brief Toggles a generic immunity type.
dvander@335
   217
		 *
dvander@335
   218
		 * @param id			Group id.
dvander@335
   219
		 * @param type			Generic immunity type.
dvander@335
   220
		 * @param enabled		True to enable, false otherwise.
dvander@335
   221
		 */
dvander@335
   222
		virtual void SetGroupGenericImmunity(GroupId id, ImmunityType type, bool enabled) =0;
dvander@335
   223
dvander@335
   224
		/**
dvander@335
   225
		 * @brief Returns whether or not a group has global immunity.
dvander@335
   226
		 *
dvander@335
   227
		 * @param id			Group id.
dvander@335
   228
		 * @param type			Generic immunity type.
dvander@335
   229
		 * @return				True if the group has this immunity, false otherwise.
dvander@335
   230
		 */
dvander@335
   231
		virtual bool GetGroupGenericImmunity(GroupId id, ImmunityType type) =0;
dvander@335
   232
dvander@335
   233
		/**
dvander@335
   234
		 * @brief Adds immunity to a specific group.
dvander@335
   235
		 *
dvander@335
   236
		 * @param id			Group id.
dvander@335
   237
		 * @param other_id		Group id to receive immunity to.
dvander@335
   238
		 */
dvander@335
   239
		virtual void AddGroupImmunity(GroupId id, GroupId other_id) =0;
dvander@335
   240
dvander@335
   241
		/**
dvander@335
   242
		 * @brief Returns the number of specific group immunities.
dvander@335
   243
		 *
dvander@335
   244
		 * @param id			Group id.
dvander@335
   245
		 * @return				Number of group immunities.
dvander@335
   246
		 */
dvander@335
   247
		virtual unsigned int GetGroupImmunityCount(GroupId id) =0;
dvander@335
   248
dvander@335
   249
		/**
dvander@335
   250
		 * @brief Returns a group that this group is immune to given an index.
dvander@335
   251
		 *
dvander@335
   252
		 * @param id			Group id.
dvander@335
   253
		 * @param number		Index from 0 to N-1, from GetGroupImmunities().
dvander@335
   254
		 * @return				GroupId that this group is immune to.
dvander@335
   255
		 */
dvander@335
   256
		virtual GroupId GetGroupImmunity(GroupId id, unsigned int number) =0;
dvander@335
   257
dvander@335
   258
		/**
dvander@335
   259
		 * @brief Adds a group-specific override type.
dvander@335
   260
		 *
dvander@335
   261
		 * @param id			Group id.
dvander@335
   262
		 * @param name			String containing command name (case sensitive).
dvander@335
   263
		 * @param type			Override type (specific command or group).
dvander@335
   264
		 * @param rule			Override allow/deny setting.
dvander@335
   265
		 */
dvander@335
   266
		virtual void AddGroupCommandOverride(GroupId id,
dvander@335
   267
											 const char *name,
dvander@335
   268
											 OverrideType type,
dvander@335
   269
											 OverrideRule rule) =0;
dvander@335
   270
dvander@335
   271
		/**
dvander@335
   272
		 * @brief Retrieves a group-specific command override.
dvander@335
   273
		 *
dvander@335
   274
		 * @param id			Group id.
dvander@335
   275
		 * @param name			String containing command name (case sensitive).
dvander@335
   276
		 * @param type			Override type (specific command or group).
dvander@372
   277
		 * @param pRule			Optional pointer to store allow/deny setting.
dvander@335
   278
		 * @return				True if an override exists, false otherwise.
dvander@335
   279
		 */
dvander@335
   280
		virtual bool GetGroupCommandOverride(GroupId id,
dvander@335
   281
											 const char *name,
dvander@335
   282
											 OverrideType type,
dvander@335
   283
											 OverrideRule *pRule) =0;
dvander@335
   284
dvander@335
   285
		/**
dvander@335
   286
		 * @brief Invalidates and removes a group from the group cache.
dvander@335
   287
		 *
dvander@335
   288
		 * @param id			Group id.
dvander@335
   289
		 */
dvander@335
   290
		virtual void InvalidateGroup(GroupId id) =0;
dvander@335
   291
dvander@335
   292
		/**
dvander@336
   293
		 * @brief Tells the admin system to dump a portion of the cache.  
dvander@336
   294
		 * This calls into plugin forwards to rebuild the cache.
dvander@336
   295
		 *
dvander@336
   296
		 * @param cache_flags	Flags for which cache to dump.  Specifying groups also dumps admins.
dvander@336
   297
		 * @param rebuild		If true, the rebuild forwards/events will fire.
dvander@335
   298
		 */
dvander@336
   299
		virtual void DumpAdminCache(int cache_flags, bool rebuild) =0;
dvander@336
   300
dvander@336
   301
		/**
dvander@336
   302
		 * @brief Adds an admin interface listener.
dvander@336
   303
		 *
dvander@336
   304
		 * @param pListener		Pointer to an IAdminListener to add.
dvander@336
   305
		 */
dvander@336
   306
		virtual void AddAdminListener(IAdminListener *pListener) =0;
dvander@336
   307
dvander@336
   308
		/**
dvander@336
   309
		 * @brief Removes an admin interface listener.
dvander@336
   310
		 *
dvander@336
   311
		 * @param pListener		Pointer to an IAdminListener to remove.
dvander@336
   312
		 */
dvander@336
   313
		virtual void RemoveAdminListener(IAdminListener *pListener) =0;
dvander@335
   314
	};
dvander@335
   315
};
dvander@335
   316
dvander@335
   317
#endif //_INCLUDE_SOURCEMOD_ADMINISTRATION_SYSTEM_H_