extensions/batsupport/extension.cpp
author Scott Ehlert <ds@alliedmods.net>
Sun Jul 15 08:00:26 2007 +0000 (2007-07-15)
changeset 1116 40cc5e9f0f1b
parent 758 e700da6cdea0
child 1330 ab94316bb52b
permissions -rw-r--r--
Removed strange debugging code
     1 /**
     2  * vim: set ts=4 :
     3  * ===============================================================
     4  * SourceMod BAT Support Extension
     5  * Copyright (C) 2004-2007 AlliedModders LLC. All rights reserved.
     6  * ===============================================================
     7  *
     8  * This program is free software; you can redistribute it and/or
     9  * modify it under the terms of the GNU General Public License
    10  * as published by the Free Software Foundation; either version 2
    11  * of the License, or (at your option) any later version.
    12  * This program is distributed in the hope that it will be useful,
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    15  * GNU General Public License for more details.
    16  * 
    17  * You should have received a copy of the GNU General Public License
    18  * along with this program; if not, write to the Free Software
    19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    20  *
    21  * Version: $Id$
    22  */
    23 
    24 #include <IAdminSystem.h>
    25 #include <IPlayerHelpers.h>
    26 #include "extension.h"
    27 
    28 /**
    29  * @file extension.cpp
    30  * @brief Implements BAT Support extension code.
    31  */
    32 
    33 BatSupport g_BatSupport;		/**< Global singleton for your extension's main interface */
    34 IAdminSystem *admins = NULL;
    35 IPlayerManager *players = NULL;
    36 SMEXT_LINK(&g_BatSupport);
    37 
    38 bool BatSupport::SDK_OnLoad(char *error, size_t maxlength, bool late)
    39 {
    40 	SM_GET_IFACE(ADMINSYS, admins);
    41 	SM_GET_IFACE(PLAYERMANAGER, players);
    42 
    43 	players->AddClientListener(this);
    44 
    45 	return true;
    46 }
    47 
    48 void BatSupport::SDK_OnUnload()
    49 {
    50 	players->RemoveClientListener(this);
    51 
    52 	List<AdminInterfaceListner *>::iterator iter;
    53 	AdminInterfaceListner *hook;
    54 
    55 	for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
    56 	{
    57 		hook = (*iter);
    58 		hook->OnAdminInterfaceUnload();
    59 	}
    60 
    61 	/* In case plugins don't do this */
    62 	m_hooks.clear();
    63 }
    64 
    65 bool BatSupport::SDK_OnMetamodLoad(char *error, size_t maxlength, bool late)
    66 {
    67 	g_SMAPI->AddListener(this, this);
    68 
    69 	return true;
    70 }
    71 
    72 void BatSupport::OnClientAuthorized(int client, const char *authstring)
    73 {
    74 	List<AdminInterfaceListner *>::iterator iter;
    75 	AdminInterfaceListner *hook;
    76 
    77 	for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
    78 	{
    79 		hook = (*iter);
    80 		hook->Client_Authorized(client);
    81 	}
    82 }
    83 
    84 const char *BatSupport::GetModName()
    85 {
    86 	return "SourceMod";
    87 }
    88 
    89 int BatSupport::GetInterfaceVersion()
    90 {
    91 	return ADMININTERFACE_VERSION;
    92 }
    93 
    94 void *BatSupport::OnMetamodQuery(const char *iface, int *ret)
    95 {
    96 	if (strcmp(iface, "AdminInterface") == 0)
    97 	{
    98 		AdminInterface *pThis = this;
    99 		if (ret)
   100 		{
   101 			*ret = IFACE_OK;
   102 		}
   103 		return pThis;
   104 	}
   105 
   106 	if (ret)
   107 	{
   108 		*ret = IFACE_FAILED;
   109 	}
   110 	
   111 	return NULL;
   112 }
   113 
   114 bool BatSupport::RegisterFlag(const char *Class,const char *Flag,const char *Description)
   115 {
   116 	/* No empty flags */
   117 	if (Flag[0] == '\0')
   118 	{
   119 		g_pSM->LogError(myself, "BAT AdminInterface support tried to register a blank flag");
   120 		return false;
   121 	}
   122 
   123 	/* We only support up to 6 custom flags for SourceMod */
   124 	if (m_flags.size() >= 6)
   125 	{
   126 		g_pSM->LogError(myself, "BAT AdminInterface support reached maximum number of custom flags");
   127 		return false;
   128 	}
   129 
   130 	List<CustomFlag>::iterator iter;
   131 	for (iter=m_flags.begin(); iter!=m_flags.end(); iter++)
   132 	{
   133 		CustomFlag &cf = (*iter);
   134 		/* Ignore already registered, in case plugin is reloading */
   135 		if (cf.name.compare(Flag) == 0)
   136 		{
   137 			return true;
   138 		}
   139 	}
   140 
   141 	g_pSM->LogMessage(myself, 
   142 		"BAT AdminInterface support registered Admin_Custom%d (class \"%s\") (flag \"%s\") (descr \"%s\")",
   143 		m_flags.size() + 1,
   144 		Class,
   145 		Flag,
   146 		Description);
   147 
   148 	unsigned int f = (unsigned int)Admin_Custom1;
   149 	f += m_flags.size();
   150 
   151 	CustomFlag cf;
   152 	cf.bit = (1<<f);
   153 	cf.flag = (AdminFlag)f;
   154 	cf.name.assign(Flag);
   155 
   156 	m_flags.push_back(cf);
   157 
   158 	return true;
   159 }
   160 
   161 bool BatSupport::IsClient(int id)
   162 {
   163 	IGamePlayer *pPlayer = players->GetGamePlayer(id);
   164 	
   165 	if (!pPlayer)
   166 	{
   167 		return false;
   168 	}
   169 
   170 	if (!pPlayer->IsConnected())
   171 	{
   172 		return false;
   173 	}
   174 
   175 	if (pPlayer->IsFakeClient())
   176 	{
   177 		return false;
   178 	}
   179 
   180 	return true;
   181 }
   182 
   183 void BatSupport::AddEventListner(AdminInterfaceListner *ptr)
   184 {
   185 	m_hooks.push_back(ptr);
   186 }
   187 
   188 void BatSupport::RemoveListner(AdminInterfaceListner *ptr)
   189 {
   190 	m_hooks.remove(ptr);
   191 }
   192 
   193 bool BatSupport::HasFlag(int id,const char *Flag)
   194 {
   195 	IGamePlayer *pPlayer = players->GetGamePlayer(id);
   196 
   197 	if (!pPlayer || !pPlayer->IsConnected())
   198 	{
   199 		return false;
   200 	}
   201 
   202 	AdminId admin = pPlayer->GetAdminId();
   203 	if (admin == INVALID_ADMIN_ID)
   204 	{
   205 		return false;
   206 	}
   207 
   208 	FlagBits bits = admins->GetAdminFlags(admin, Access_Effective);
   209 
   210 	/* Root has it all... except for immunity */
   211 	if ((strcmp(Flag, "immunity") != 0)
   212 	    && ((bits & ADMFLAG_ROOT) == ADMFLAG_ROOT))
   213 	{
   214 		return true;
   215 	}
   216 
   217 	if (!strcmp(Flag, "any"))
   218 	{
   219 		return ((bits & ~ADMFLAG_RESERVATION) != 0);
   220 	} else if (!strcmp(Flag, "kick")) {
   221 		return ((bits & ADMFLAG_KICK) == ADMFLAG_KICK);
   222 	} else if (!strcmp(Flag, "slap")) {
   223 		return ((bits & ADMFLAG_SLAY) == ADMFLAG_SLAY);
   224 	} else if (!strcmp(Flag, "slay")) {
   225 		return ((bits & ADMFLAG_SLAY) == ADMFLAG_SLAY);
   226 	} else if (!strcmp(Flag, "ban")) {
   227 		return ((bits & ADMFLAG_BAN) == ADMFLAG_BAN);
   228 	} else if (!strcmp(Flag, "chat")) {
   229 		return ((bits & ADMFLAG_CHAT) == ADMFLAG_CHAT);
   230 	} else if (!strcmp(Flag, "rcon")) {
   231 		return ((bits & ADMFLAG_RCON) == ADMFLAG_RCON);
   232 	} else if (!strcmp(Flag, "map")) {
   233 		return ((bits & ADMFLAG_CHANGEMAP) == ADMFLAG_CHANGEMAP);
   234 	} else if (!strcmp(Flag, "reservedslots")) {
   235 		return ((bits & ADMFLAG_RESERVATION) == ADMFLAG_RESERVATION);
   236 	} else if (!strcmp(Flag, "immunuty")) {
   237 		/* This is a bit different... */
   238 		unsigned int count = admins->GetAdminGroupCount(admin);
   239 		for (unsigned int i=0; i<count; i++)
   240 		{
   241 			GroupId gid = admins->GetAdminGroup(admin, i, NULL);
   242 			if (admins->GetGroupGenericImmunity(gid, Immunity_Default)
   243 				|| admins->GetGroupGenericImmunity(gid, Immunity_Global))
   244 			{
   245 				return true;
   246 			}
   247 		}
   248 		return false;
   249 	}
   250 
   251 	List<CustomFlag>::iterator iter;
   252 	for (iter=m_flags.begin(); iter!=m_flags.end(); iter++)
   253 	{
   254 		CustomFlag &cf = (*iter);
   255 		if (cf.name.compare(Flag) == 0)
   256 		{
   257 			return ((bits & cf.bit) == cf.bit);
   258 		}
   259 	}
   260 
   261 	return false;
   262 }