1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/extensions/batsupport/extension.cpp Tue Feb 27 08:21:01 2007 +0000
1.3 @@ -0,0 +1,235 @@
1.4 +// vim: set ts=4 :
1.5 +#include <IAdminSystem.h>
1.6 +#include <IPlayerHelpers.h>
1.7 +#include "extension.h"
1.8 +
1.9 +BatSupport g_BatSupport; /**< Global singleton for your extension's main interface */
1.10 +IAdminSystem *admins = NULL;
1.11 +IPlayerManager *players = NULL;
1.12 +SMEXT_LINK(&g_BatSupport);
1.13 +
1.14 +bool BatSupport::SDK_OnLoad(char *error, size_t err_max, bool late)
1.15 +{
1.16 + SM_GET_IFACE(ADMINSYS, admins);
1.17 + SM_GET_IFACE(PLAYERMANAGER, players);
1.18 +
1.19 + players->AddClientListener(this);
1.20 +
1.21 + return true;
1.22 +}
1.23 +
1.24 +void BatSupport::SDK_OnUnload()
1.25 +{
1.26 + players->RemoveClientListener(this);
1.27 +
1.28 + List<AdminInterfaceListner *>::iterator iter;
1.29 + AdminInterfaceListner *hook;
1.30 +
1.31 + for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
1.32 + {
1.33 + hook = (*iter);
1.34 + hook->OnAdminInterfaceUnload();
1.35 + }
1.36 +
1.37 + /* In case plugins don't do this */
1.38 + m_hooks.clear();
1.39 +}
1.40 +
1.41 +bool BatSupport::SDK_OnMetamodLoad(char *error, size_t err_max, bool late)
1.42 +{
1.43 + g_SMAPI->AddListener(this, this);
1.44 +
1.45 + return true;
1.46 +}
1.47 +
1.48 +void BatSupport::OnClientAuthorized(int client, const char *authstring)
1.49 +{
1.50 + List<AdminInterfaceListner *>::iterator iter;
1.51 + AdminInterfaceListner *hook;
1.52 +
1.53 + for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
1.54 + {
1.55 + hook = (*iter);
1.56 + hook->Client_Authorized(client);
1.57 + }
1.58 +}
1.59 +
1.60 +const char *BatSupport::GetModName()
1.61 +{
1.62 + return "SourceMod";
1.63 +}
1.64 +
1.65 +int BatSupport::GetInterfaceVersion()
1.66 +{
1.67 + return ADMININTERFACE_VERSION;
1.68 +}
1.69 +
1.70 +void *BatSupport::OnMetamodQuery(const char *iface, int *ret)
1.71 +{
1.72 + if (strcmp(iface, "AdminInterface") == 0)
1.73 + {
1.74 + AdminInterface *pThis = this;
1.75 + if (ret)
1.76 + {
1.77 + *ret = IFACE_OK;
1.78 + }
1.79 + return pThis;
1.80 + }
1.81 +
1.82 + if (ret)
1.83 + {
1.84 + *ret = IFACE_FAILED;
1.85 + }
1.86 +
1.87 + return NULL;
1.88 +}
1.89 +
1.90 +bool BatSupport::RegisterFlag(const char *Class,const char *Flag,const char *Description)
1.91 +{
1.92 + /* No empty flags */
1.93 + if (Flag[0] == '\0')
1.94 + {
1.95 + g_pSM->LogError(myself, "BAT AdminInterface support tried to register a blank flag");
1.96 + return false;
1.97 + }
1.98 +
1.99 + /* We only support up to 6 custom flags for SourceMod */
1.100 + if (m_flags.size() >= 6)
1.101 + {
1.102 + g_pSM->LogError(myself, "BAT AdminInterface support reached maximum number of custom flags");
1.103 + return false;
1.104 + }
1.105 +
1.106 + List<CustomFlag>::iterator iter;
1.107 + for (iter=m_flags.begin(); iter!=m_flags.end(); iter++)
1.108 + {
1.109 + CustomFlag &cf = (*iter);
1.110 + /* Ignore already registered, in case plugin is reloading */
1.111 + if (cf.name.compare(Flag) == 0)
1.112 + {
1.113 + return true;
1.114 + }
1.115 + }
1.116 +
1.117 + g_pSM->LogMessage(myself,
1.118 + "BAT AdminInterface support registered Admin_Custom%d (class \"%s\") (flag \"%s\") (descr \"%s\")",
1.119 + m_flags.size() + 1,
1.120 + Class,
1.121 + Flag,
1.122 + Description);
1.123 +
1.124 + unsigned int f = (unsigned int)Admin_Custom1;
1.125 + f += m_flags.size();
1.126 +
1.127 + CustomFlag cf;
1.128 + cf.bit = (1<<f);
1.129 + cf.flag = (AdminFlag)f;
1.130 + cf.name.assign(Flag);
1.131 +
1.132 + m_flags.push_back(cf);
1.133 +
1.134 + return true;
1.135 +}
1.136 +
1.137 +bool BatSupport::IsClient(int id)
1.138 +{
1.139 + IGamePlayer *pPlayer = players->GetGamePlayer(id);
1.140 +
1.141 + if (!pPlayer)
1.142 + {
1.143 + return false;
1.144 + }
1.145 +
1.146 + if (!pPlayer->IsConnected())
1.147 + {
1.148 + return false;
1.149 + }
1.150 +
1.151 + if (pPlayer->IsFakeClient())
1.152 + {
1.153 + return false;
1.154 + }
1.155 +
1.156 + return true;
1.157 +}
1.158 +
1.159 +void BatSupport::AddEventListner(AdminInterfaceListner *ptr)
1.160 +{
1.161 + m_hooks.push_back(ptr);
1.162 +}
1.163 +
1.164 +void BatSupport::RemoveListner(AdminInterfaceListner *ptr)
1.165 +{
1.166 + m_hooks.remove(ptr);
1.167 +}
1.168 +
1.169 +bool BatSupport::HasFlag(int id,const char *Flag)
1.170 +{
1.171 + IGamePlayer *pPlayer = players->GetGamePlayer(id);
1.172 +
1.173 + if (!pPlayer || !pPlayer->IsConnected())
1.174 + {
1.175 + return false;
1.176 + }
1.177 +
1.178 + AdminId admin = pPlayer->GetAdminId();
1.179 + if (admin == INVALID_ADMIN_ID)
1.180 + {
1.181 + return false;
1.182 + }
1.183 +
1.184 + FlagBits bits = admins->GetAdminFlags(admin, Access_Effective);
1.185 +
1.186 + /* Root has it all... except for immunity */
1.187 + if ((strcmp(Flag, "immunity") != 0)
1.188 + && ((bits & ADMFLAG_ROOT) == ADMFLAG_ROOT))
1.189 + {
1.190 + return true;
1.191 + }
1.192 +
1.193 + if (!strcmp(Flag, "any"))
1.194 + {
1.195 + return ((bits & ~ADMFLAG_RESERVATION) != 0);
1.196 + } else if (!strcmp(Flag, "kick")) {
1.197 + return ((bits & ADMFLAG_KICK) == ADMFLAG_KICK);
1.198 + } else if (!strcmp(Flag, "slap")) {
1.199 + return ((bits & ADMFLAG_SLAY) == ADMFLAG_SLAY);
1.200 + } else if (!strcmp(Flag, "slay")) {
1.201 + return ((bits & ADMFLAG_SLAY) == ADMFLAG_SLAY);
1.202 + } else if (!strcmp(Flag, "ban")) {
1.203 + return ((bits & ADMFLAG_BAN) == ADMFLAG_BAN);
1.204 + } else if (!strcmp(Flag, "chat")) {
1.205 + return ((bits & ADMFLAG_CHAT) == ADMFLAG_CHAT);
1.206 + } else if (!strcmp(Flag, "rcon")) {
1.207 + return ((bits & ADMFLAG_RCON) == ADMFLAG_RCON);
1.208 + } else if (!strcmp(Flag, "map")) {
1.209 + return ((bits & ADMFLAG_CHANGEMAP) == ADMFLAG_CHANGEMAP);
1.210 + } else if (!strcmp(Flag, "reservedslots")) {
1.211 + return ((bits & ADMFLAG_RESERVATION) == ADMFLAG_RESERVATION);
1.212 + } else if (!strcmp(Flag, "immunuty")) {
1.213 + /* This is a bit different... */
1.214 + unsigned int count = admins->GetAdminGroupCount(admin);
1.215 + for (unsigned int i=0; i<count; i++)
1.216 + {
1.217 + GroupId gid = admins->GetAdminGroup(admin, i, NULL);
1.218 + if (admins->GetGroupGenericImmunity(gid, Immunity_Default)
1.219 + || admins->GetGroupGenericImmunity(gid, Immunity_Global))
1.220 + {
1.221 + return true;
1.222 + }
1.223 + }
1.224 + return false;
1.225 + }
1.226 +
1.227 + List<CustomFlag>::iterator iter;
1.228 + for (iter=m_flags.begin(); iter!=m_flags.end(); iter++)
1.229 + {
1.230 + CustomFlag &cf = (*iter);
1.231 + if (cf.name.compare(Flag) == 0)
1.232 + {
1.233 + return ((bits & cf.bit) == cf.bit);
1.234 + }
1.235 + }
1.236 +
1.237 + return false;
1.238 +}