ServerAdminCommon.cpp

Go to the documentation of this file.
00001 ////////////////////////////////////////////////////////////////////////////////
00002 //    Scorched3D (c) 2000-2009
00003 //
00004 //    This file is part of Scorched3D.
00005 //
00006 //    Scorched3D is free software; you can redistribute it and/or modify
00007 //    it under the terms of the GNU General Public License as published by
00008 //    the Free Software Foundation; either version 2 of the License, or
00009 //    (at your option) any later version.
00010 //
00011 //    Scorched3D is distributed in the hope that it will be useful,
00012 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 //    GNU General Public License for more details.
00015 //
00016 //    You should have received a copy of the GNU General Public License
00017 //    along with Scorched3D; if not, write to the Free Software
00018 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 ////////////////////////////////////////////////////////////////////////////////
00020 
00021 #include <server/ServerAdminCommon.h>
00022 #include <server/ServerCommon.h>
00023 #include <server/ScorchedServer.h>
00024 #include <server/ScorchedServerUtil.h>
00025 #include <server/ServerChannelManager.h>
00026 #include <tank/TankContainer.h>
00027 #include <tank/TankState.h>
00028 #include <tank/TankScore.h>
00029 #include <tankai/TankAIAdder.h>
00030 #include <target/TargetLife.h>
00031 #include <common/OptionsScorched.h>
00032 #include <common/OptionsTransient.h>
00033 #include <common/FileLogger.h>
00034 
00035 static FileLogger *serverAdminFileLogger = 0;
00036 
00037 static void adminLog(const ChannelText &message)
00038 {
00039         if (!serverAdminFileLogger) 
00040         {
00041                 char buffer[256];
00042                 snprintf(buffer, 256, "ServerAdminLog-%i-", 
00043                         ScorchedServer::instance()->getOptionsGame().getPortNo());
00044                 serverAdminFileLogger = new FileLogger(buffer);
00045         }       
00046 
00047         ServerChannelManager::instance()->sendText(message, true);
00048 
00049         LangString str = ((ChannelText &)message).getMessage();
00050         LoggerInfo info(LangStringUtil::convertFromLang(str));
00051         info.setTime();
00052         serverAdminFileLogger->logMessage(info);
00053 }
00054 
00055 static void internalBanPlayer(ServerAdminSessions::Credential &credential,  
00056         unsigned int playerId,
00057         ServerBanned::BannedType type, const char *reason)
00058 {
00059         Tank *tank = ScorchedServer::instance()->
00060                 getTankContainer().getTankById(playerId);
00061         if (tank)
00062         {
00063                 if (tank->getDestinationId() == 0)
00064                 {
00065                         return;
00066                 }
00067                 unsigned int ipAddress = tank->getIpAddress();
00068                 if (ipAddress != 0)
00069                 {       
00070                         ScorchedServerUtil::instance()->bannedPlayers.
00071                                 addBanned(ipAddress, tank->getTargetName(), 
00072                                         tank->getUniqueId(), tank->getSUI(), 
00073                                         type, credential.username.c_str(), reason);
00074                         if (type == ServerBanned::Banned)
00075                         {
00076                                 ServerCommon::kickPlayer(playerId);
00077 
00078                                 ServerAuthHandler *authHandler =
00079                                         ScorchedServerUtil::instance()->getAuthHandler();
00080                                 if (authHandler)
00081                                 {
00082                                         authHandler->banUser(tank->getUniqueId());
00083                                 }
00084                         }
00085                 }
00086         }
00087 }
00088 
00089 bool ServerAdminCommon::addPlayer(ServerAdminSessions::Credential &credential, const char *playerType)
00090 {
00091         if (!credential.hasPermission(ServerAdminSessions::PERMISSION_ADDPLAYER)) return false;
00092         TankAIAdder::addTankAI(*ScorchedServer::instance(), playerType);
00093         return true;
00094 }
00095 
00096 bool ServerAdminCommon::kickPlayer(ServerAdminSessions::Credential &credential, unsigned int playerId)
00097 {
00098         if (!credential.hasPermission(ServerAdminSessions::PERMISSION_KICKPLAYER)) return false;
00099 
00100         Tank *targetTank = ScorchedServer::instance()->
00101                 getTankContainer().getTankById(playerId);
00102         if (!targetTank) return false;
00103 
00104         adminLog(ChannelText("info",
00105                 "ADMIN_KICK",
00106                 "\"{0}\" admin kick \"{1}\"",
00107                 credential.username,
00108                 targetTank->getTargetName()));
00109         ServerCommon::kickPlayer(
00110                 targetTank->getPlayerId());
00111 
00112         return true;
00113 }
00114 
00115 bool ServerAdminCommon::poorPlayer(ServerAdminSessions::Credential &credential, unsigned int playerId)
00116 {
00117         Tank *targetTank = ScorchedServer::instance()->
00118                 getTankContainer().getTankById(playerId);
00119         if (!targetTank) return false;
00120 
00121         adminLog(ChannelText("info",
00122                 "ADMIN_POOR",
00123                 "\"{0}\" admin poor \"{1}\"",
00124                 credential.username,
00125                 targetTank->getTargetName()));
00126         targetTank->getScore().setMoney(0);
00127 
00128         return true;
00129 }
00130 
00131 bool ServerAdminCommon::banPlayer(ServerAdminSessions::Credential &credential, unsigned int playerId, const char *reason)
00132 {
00133         if (!credential.hasPermission(ServerAdminSessions::PERMISSION_BANPLAYER)) return false;
00134 
00135         Tank *targetTank = ScorchedServer::instance()->
00136                 getTankContainer().getTankById(playerId);
00137         if (!targetTank) return false;
00138 
00139         adminLog(ChannelText("info",
00140                 "ADMIN_BAN",
00141                 "\"{0}\" admin ban \"{1}\"",
00142                 credential.username,
00143                 targetTank->getTargetName()));
00144         internalBanPlayer(
00145                 credential,
00146                 targetTank->getPlayerId(), 
00147                 ServerBanned::Banned, 
00148                 reason);
00149 
00150         return true;
00151 }
00152 
00153 bool ServerAdminCommon::slapPlayer(ServerAdminSessions::Credential &credential, unsigned int playerId, float slap)
00154 {
00155         Tank *targetTank = ScorchedServer::instance()->
00156                 getTankContainer().getTankById(playerId);
00157         if (!targetTank) return false;
00158 
00159         adminLog(ChannelText("info",
00160                 "ADMIN_SLAP",
00161                 "\"{0}\" admin slap \"{1}\" {2}",
00162                 credential.username,
00163                 targetTank->getTargetName(),
00164                 slap));
00165         targetTank->getLife().setLife(
00166                 targetTank->getLife().getLife() - fixed(int(slap)));
00167 
00168         return true;
00169 }
00170 
00171 bool ServerAdminCommon::flagPlayer(ServerAdminSessions::Credential &credential, unsigned int playerId, const char *reason)
00172 {
00173         Tank *targetTank = ScorchedServer::instance()->
00174                 getTankContainer().getTankById(playerId);
00175         if (!targetTank) return false;
00176 
00177         adminLog(ChannelText("info",
00178                 "ADMIN_FLAG",
00179                 "\"{0}\" admin flag \"{1}\"",
00180                 credential.username,
00181                 targetTank->getTargetName()));
00182         internalBanPlayer(
00183                 credential,
00184                 targetTank->getPlayerId(), 
00185                 ServerBanned::Flagged, 
00186                 reason);
00187 
00188         return true;
00189 }
00190 
00191 bool ServerAdminCommon::mutePlayer(ServerAdminSessions::Credential &credential, unsigned int playerId, bool mute)
00192 {
00193         Tank *targetTank = ScorchedServer::instance()->
00194                 getTankContainer().getTankById(playerId);
00195         if (!targetTank) return false;
00196 
00197         adminLog(ChannelText("info",
00198                 mute?"ADMIN_MUTE":"ADMIN_UNMUTE",
00199                 mute?"\"{0}\" admin mute \"{0}\"":"\"{0}\" admin unmute \"{0}\"",
00200                 credential.username,
00201                 targetTank->getTargetName()));
00202         targetTank->getState().setMuted(mute); 
00203 
00204         return true;
00205 }
00206 
00207 bool ServerAdminCommon::permMutePlayer(ServerAdminSessions::Credential &credential, unsigned int playerId, const char *reason)
00208 {
00209         Tank *targetTank = ScorchedServer::instance()->
00210                 getTankContainer().getTankById(playerId);
00211         if (!targetTank) return false;
00212 
00213         adminLog(ChannelText("info",
00214                 "ADMIN_PERMMUTE",
00215                 "\"{0}\" admin permmute \"{1}\"",
00216                 credential.username,
00217                 targetTank->getTargetName()));
00218         internalBanPlayer(
00219                 credential,
00220                 targetTank->getPlayerId(),
00221                 ServerBanned::Muted, 
00222                 reason);
00223         targetTank->getState().setMuted(true);
00224 
00225         return true;
00226 }
00227 
00228 bool ServerAdminCommon::unpermMutePlayer(ServerAdminSessions::Credential &credential, unsigned int playerId)
00229 {
00230         Tank *targetTank = ScorchedServer::instance()->
00231                 getTankContainer().getTankById(playerId);
00232         if (!targetTank) return false;
00233 
00234         adminLog(ChannelText("info",
00235                 "ADMIN_UNPERMMUTE",
00236                 "\"{0}\" admin unpermmute \"{1}\"",
00237                 credential.username,
00238                 targetTank->getTargetName()));
00239         internalBanPlayer(
00240                 credential,
00241                 targetTank->getPlayerId(),
00242                 ServerBanned::NotBanned, 
00243                 "");
00244         targetTank->getState().setMuted(false);
00245 
00246         return true;
00247 }
00248 
00249 bool ServerAdminCommon::newGame(ServerAdminSessions::Credential &credential)
00250 {
00251         if (!credential.hasPermission(
00252                 ServerAdminSessions::PERMISSION_ALTERGAME)) return false;
00253 
00254         adminLog(ChannelText("info",
00255                 "ADMIN_NEW_GAME",
00256                 "\"{0}\" admin new game",
00257                 credential.username));
00258         ServerCommon::killAll();
00259         ScorchedServer::instance()->getOptionsTransient().startNewGame();       
00260 
00261         return true;
00262 }
00263 
00264 bool ServerAdminCommon::killAll(ServerAdminSessions::Credential &credential)
00265 {
00266         if (!credential.hasPermission(
00267                 ServerAdminSessions::PERMISSION_ALTERGAME)) return false;
00268 
00269         adminLog(ChannelText("info",
00270                 "ADMIN_KILL_ALL",
00271                 "\"{0}\" admin kill all",
00272                 credential.username));
00273         ServerCommon::killAll();
00274 
00275         return true;
00276 }
00277 
00278 bool ServerAdminCommon::adminSay(ServerAdminSessions::Credential &credential,
00279         const char *channel, const char *text)
00280 {
00281         LangString langString(LANG_STRING(text));
00282 
00283         ChannelText channelText(channel, langString);
00284         channelText.setAdminPlayer(credential.username.c_str());
00285         ServerChannelManager::instance()->sendText(channelText, true);
00286 
00287         return true;
00288 }

Generated on Mon Feb 16 15:14:52 2009 for Scorched3D by  doxygen 1.5.3