00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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 }