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