static void SayHandler(Player player, CommandReader cmd) { if (player.Info.IsMuted) { player.MessageMuted(); return; } if (player.DetectChatSpam()) return; if (player.Can(Permission.Say)) { string msg = cmd.NextAll().Trim(); if (msg.Length > 0) { Chat.SendSay(player, msg); } else { CdSay.PrintUsage(player); } } else { player.MessageNoAccess(Permission.Say); } }
static void BanHandler( Player player, CommandReader cmd ) { string targetName = cmd.Next(); if( targetName == null ) { CdBan.PrintUsage( player ); return; } PlayerInfo target = PlayerDB.FindPlayerInfoOrPrintMatches( player, targetName, SearchOptions.ReturnSelfIfOnlyMatch ); if( target == null ) return; if( target == player.Info ) { player.Message( "You cannot &H/Ban&S yourself." ); return; } string reason = cmd.NextAll(); try { Player targetPlayer = target.PlayerObject; target.Ban( player, reason, true, true ); WarnIfOtherPlayersOnIP( player, target, targetPlayer ); } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); if( ex.ErrorCode == PlayerOpExceptionCode.ReasonRequired ) { FreezeIfAllowed( player, target ); } } }
static void SayHandler([NotNull] Player player, [NotNull] CommandReader cmd) { if (player.Info.IsMuted) { player.MessageMuted(); return; } if (player.DetectChatSpam()) { return; } if (player.Can(Permission.Say)) { string msg = cmd.NextAll().Trim(' '); if (msg.Length > 0) { Chat.SendSay(player, msg); } else { CdSay.PrintUsage(player); } } else { player.MessageNoAccess(Permission.Say); } }
private static void TrollHandler( Player player, CommandReader cmd ) { string Name = cmd.Next(); if ( Name == null ) { player.Message( "Player not found. Please specify valid name." ); return; } if ( !Player.IsValidPlayerName( Name ) ) return; Player target = Server.FindPlayerOrPrintMatches( player, Name, SearchOptions.Default ); if ( target == null ) return; string options = cmd.Next(); if ( options == null ) { CdTroll.PrintUsage( player ); return; } string Message = cmd.NextAll(); if ( Message.Length < 1 && options.ToLower() != "leave" ) { player.Message( "&WError: Please enter a message for {0}.", target.ClassyName ); return; } switch ( options.ToLower() ) { case "pm": if ( player.Can( Permission.UseColorCodes ) && Message.Contains( "%" ) ) { Message = Chat.ReplacePercentColorCodes( Message, false ); } Server.Players.Message( "&Pfrom {0}: {1}", target.Name, Message ); break; case "st": case "staff": Chat.SendStaff( target, Message ); break; case "i": case "impersonate": case "msg": case "message": case "m": Server.Message( "{0}&S&F: {1}", target.ClassyName, Message ); break; case "leave": case "disconnect": case "gtfo": Server.Players.Message( "&SPlayer {0}&S left the server.", target.ClassyName ); break; default: player.Message( "Invalid option. Please choose st, ac, pm, message or leave" ); break; } }
static void ReplyHandler([NotNull] Player player, [NotNull] CommandReader cmd) { string messageText = cmd.NextAll(); if (messageText.Length == 0) { player.Message("Reply: No message to send!"); return; } string targetName = player.LastPrivateMessageSender; if (targetName != null) { Player targetPlayer = Server.FindPlayerExact(player, targetName, SearchOptions.IncludeHidden); if (targetPlayer != null) { if (player.CanSee(targetPlayer)) { if (targetPlayer.IsDeaf) { player.Message("Cannot PM {0}&S: they are currently deaf.", targetPlayer.ClassyName); } else if (targetPlayer.IsIgnoring(player.Info)) { player.Message("&WCannot PM {0}&W: you are ignored.", targetPlayer.ClassyName); } else { Chat.SendPM(player, targetPlayer, messageText); player.MessageNow("&Pto {0}: {1}", targetPlayer.Name, messageText); } } else { player.Message("Reply: Cannot send message; player {0}&S is offline.", PlayerDB.FindExactClassyName(targetName)); if (targetPlayer.CanHear(player)) { Chat.SendPM(player, targetPlayer, messageText); player.Info.DecrementMessageWritten(); } } } else { player.Message("Reply: Cannot send message; player {0}&S is offline.", PlayerDB.FindExactClassyName(targetName)); } } else { player.Message("Reply: You have not sent any messages yet."); } }
static void MassRankHandler(Player player, CommandReader cmd) { string fromRankName = cmd.Next(); string toRankName = cmd.Next(); string reason = cmd.NextAll(); if (fromRankName == null || toRankName == null) { CdMassRank.PrintUsage(player); return; } Rank fromRank = RankManager.FindRank(fromRankName); if (fromRank == null) { player.MessageNoRank(fromRankName); return; } Rank toRank = RankManager.FindRank(toRankName); if (toRank == null) { player.MessageNoRank(toRankName); return; } if (fromRank == toRank) { player.Message("Ranks must be different"); return; } int playerCount; using (PlayerDB.GetReadLock()) { playerCount = PlayerDB.List.Count(t => t.Rank == fromRank); } string verb = (fromRank > toRank ? "demot" : "promot"); if (!cmd.IsConfirmed) { player.Confirm(cmd, "MassRank: {0}e {1} players?", verb.UppercaseFirst(), playerCount); return; } player.Message("MassRank: {0}ing {1} players...", verb, playerCount); int affected = PlayerDB.MassRankChange(player, fromRank, toRank, reason); player.Message("MassRank: done, {0} records affected.", affected); }
static void MassRankHandler( Player player, CommandReader cmd ) { string fromRankName = cmd.Next(); string toRankName = cmd.Next(); string reason = cmd.NextAll(); if( fromRankName == null || toRankName == null ) { CdMassRank.PrintUsage( player ); return; } Rank fromRank = RankManager.FindRank( fromRankName ); if( fromRank == null ) { player.MessageNoRank( fromRankName ); return; } Rank toRank = RankManager.FindRank( toRankName ); if( toRank == null ) { player.MessageNoRank( toRankName ); return; } if( fromRank == toRank ) { player.Message( "Ranks must be different" ); return; } int playerCount; using( PlayerDB.GetReadLock() ) { playerCount = PlayerDB.List.Count( t => t.Rank == fromRank ); } string verb = (fromRank > toRank ? "demot" : "promot"); if( !cmd.IsConfirmed ) { player.Confirm( cmd, "MassRank: {0}e {1} players?", verb.UppercaseFirst(), playerCount ); return; } player.Message( "MassRank: {0}ing {1} players...", verb, playerCount ); int affected = PlayerDB.MassRankChange( player, fromRank, toRank, reason ); player.Message( "MassRank: done, {0} records affected.", affected ); }
static void StaffHandler([NotNull] Player player, [NotNull] CommandReader cmd) { if (player.Info.IsMuted) { player.MessageMuted(); return; } if (player.DetectChatSpam()) { return; } string message = cmd.NextAll().Trim(' '); if (message.Length > 0) { Chat.SendStaff(player, message); } }
static void BanHandler( Player player, CommandReader cmd ) { string targetName = cmd.Next(); if( targetName == null ) { CdBan.PrintUsage( player ); return; } PlayerInfo target = PlayerDB.FindByPartialNameOrPrintMatches( player, targetName ); if( target == null ) return; string reason = cmd.NextAll(); try { Player targetPlayer = target.PlayerObject; target.Ban( player, reason, true, true ); WarnIfOtherPlayersOnIP( player, target, targetPlayer ); } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); if( ex.ErrorCode == PlayerOpExceptionCode.ReasonRequired ) { FreezeIfAllowed( player, target ); } } }
static void ReplyHandler( Player player, CommandReader cmd ) { string messageText = cmd.NextAll(); if( messageText.Length == 0 ) { player.Message( "Reply: No message to send!" ); return; } string targetName = player.lastPrivateMessageSender; if( targetName != null ) { Player targetPlayer = Server.FindPlayerExact( player, targetName, SearchOptions.IncludeHidden ); if( targetPlayer != null ) { if( player.CanSee( targetPlayer ) ) { if( targetPlayer.IsDeaf ) { player.Message( "Cannot PM {0}&S: they are currently deaf.", targetPlayer.ClassyName ); } else if( targetPlayer.IsIgnoring( player.Info ) ) { player.Message( "&WCannot PM {0}&W: you are ignored.", targetPlayer.ClassyName ); } else { Chat.SendPM( player, targetPlayer, messageText ); player.MessageNow( "&Pto {0}: {1}", targetPlayer.Name, messageText ); } } else { player.Message( "Reply: Cannot send message; player {0}&S is offline.", PlayerDB.FindExactClassyName( targetName ) ); if( targetPlayer.CanHear( player ) ) { Chat.SendPM( player, targetPlayer, messageText ); player.Info.DecrementMessageWritten(); } } } else { player.Message( "Reply: Cannot send message; player {0}&S is offline.", PlayerDB.FindExactClassyName( targetName ) ); } } else { player.Message( "Reply: You have not sent any messages yet." ); } }
static void MeHandler([NotNull] Player player, [NotNull] CommandReader cmd) { if (player.Info.IsMuted) { player.MessageMuted(); return; } if (player.DetectChatSpam()) { return; } string msg = cmd.NextAll().Trim(' '); if (msg.Length > 0) { Chat.SendMe(player, msg); } else { CdMe.PrintUsage(player); } }
static void UnbanIPHandler(Player player, CommandReader cmd) { string targetNameOrIP = cmd.Next(); if (targetNameOrIP == null) { CdUnbanIP.PrintUsage(player); return; } string reason = cmd.NextAll(); try { IPAddress targetAddress; if (IPAddressUtil.IsIP(targetNameOrIP) && IPAddress.TryParse(targetNameOrIP, out targetAddress)) { targetAddress.UnbanIP(player, reason, true, true); } else { PlayerInfo target = PlayerDB.FindPlayerInfoOrPrintMatches(player, targetNameOrIP, SearchOptions.ReturnSelfIfOnlyMatch); if (target == null) return; if (target == player.Info) { player.Message("You cannot &H/UnbanIP&S yourself."); return; } if (target.LastIP.Equals(IPAddress.Any) || target.LastIP.Equals(IPAddress.None)) { target.Unban(player, reason, true, true); } else { target.UnbanIP(player, reason, true, true); } } } catch (PlayerOpException ex) { player.Message(ex.MessageColored); } }
static void UnbanHandler(Player player, CommandReader cmd) { string targetName = cmd.Next(); if (targetName == null) { CdUnban.PrintUsage(player); return; } PlayerInfo target = PlayerDB.FindPlayerInfoOrPrintMatches(player, targetName, SearchOptions.ReturnSelfIfOnlyMatch); if (target == null) return; if (target == player.Info) { player.Message("You cannot &H/Unban&S yourself."); return; } string reason = cmd.NextAll(); try { target.Unban(player, reason, true, true); } catch (PlayerOpException ex) { player.Message(ex.MessageColored); } }
static void SudoHandler(Player player, CommandReader cmd) { string ply = cmd.Next(); if (!cmd.HasNext) { CdSudo.PrintUsage(player); return; } string sudocmd = cmd.NextAll(); PlayerInfo p = PlayerDB.FindPlayerInfoOrPrintMatches(player, ply, SearchOptions.IncludeSelf); if (p == null) { return; } if (p.PlayerObject == null) { player.Message("This player is offline!"); return; } try { p.PlayerObject.ParseMessage(sudocmd, false); player.Message("Forced {0} to type in \"{1}\"", p.Name, sudocmd); } catch { player.Message("Cannot use that command with /sudo"); } }
static void WorldSetHandler( Player player, CommandReader cmd ) { string worldName = cmd.Next(); string varName = cmd.Next(); string value = cmd.NextAll(); if( worldName == null || varName == null ) { CdWorldSet.PrintUsage( player ); return; } World world = WorldManager.FindWorldOrPrintMatches( player, worldName ); if( world == null ) return; switch( varName.ToLower() ) { case "hide": case "hidden": if( String.IsNullOrEmpty( value ) ) { player.Message( "World {0}&S is current {1}hidden.", world.ClassyName, world.IsHidden ? "" : "NOT " ); } else if( value.Equals( "on", StringComparison.OrdinalIgnoreCase ) || value.Equals( "true", StringComparison.OrdinalIgnoreCase ) || value == "1" ) { if( world.IsHidden ) { player.Message( "World {0}&S is already hidden.", world.ClassyName ); } else { player.Message( "World {0}&S is now hidden.", world.ClassyName ); world.IsHidden = true; WorldManager.SaveWorldList(); } } else if( value.Equals( "off", StringComparison.OrdinalIgnoreCase ) || value.Equals( "false", StringComparison.OrdinalIgnoreCase ) || value == "0" ) { if( world.IsHidden ) { player.Message( "World {0}&S is no longer hidden.", world.ClassyName ); world.IsHidden = false; WorldManager.SaveWorldList(); } else { player.Message( "World {0}&S is not hidden.", world.ClassyName ); } } else { CdWorldSet.PrintUsage( player ); } break; case "backup": case "backups": TimeSpan backupInterval; string oldDescription = world.BackupSettingDescription; if( String.IsNullOrEmpty( value ) ) { player.Message( GetBackupSettingsString( world ) ); return; } else if( value.Equals( "off", StringComparison.OrdinalIgnoreCase ) || value.StartsWith( "disable", StringComparison.OrdinalIgnoreCase ) ) { // Disable backups on the world if( world.BackupEnabledState == YesNoAuto.No ) { MessageSameBackupSettings( player, world ); return; } else { world.BackupEnabledState = YesNoAuto.No; } } else if( value.Equals( "default", StringComparison.OrdinalIgnoreCase ) || value.Equals( "auto", StringComparison.OrdinalIgnoreCase ) ) { // Set world to use default settings if( world.BackupEnabledState == YesNoAuto.Auto ) { MessageSameBackupSettings( player, world ); return; } else { world.BackupEnabledState = YesNoAuto.Auto; } } else if( value.TryParseMiniTimeSpan( out backupInterval ) ) { if( backupInterval == TimeSpan.Zero ) { // Set world's backup interval to 0, which is equivalent to disabled if( world.BackupEnabledState == YesNoAuto.No ) { MessageSameBackupSettings( player, world ); return; } else { world.BackupEnabledState = YesNoAuto.No; } } else if( world.BackupEnabledState != YesNoAuto.Yes || world.BackupInterval != backupInterval ) { // Alter world's backup interval world.BackupInterval = backupInterval; } else { MessageSameBackupSettings( player, world ); return; } } else { CdWorldSet.PrintUsage( player ); return; } player.Message( "Backup setting for world {0}&S changed from \"{1}\" to \"{2}\"", world.ClassyName, oldDescription, world.BackupSettingDescription ); WorldManager.SaveWorldList(); break; case "description": case "greeting": if( String.IsNullOrEmpty( value ) ) { if( world.Greeting == null ) { player.Message( "No greeting message is set for world {0}", world.ClassyName ); } else { player.Message( "Greeting message removed for world {0}", world.ClassyName ); world.Greeting = null; } } else { world.Greeting = value; player.Message( "Greeting message for world {0}&S set to: &R{1}", world.ClassyName, value ); } break; default: CdWorldSet.PrintUsage( player ); break; } }
static void RestartHandler(Player player, CommandReader cmd) { string delayString = cmd.Next(); TimeSpan delayTime = DefaultShutdownTime; string reason = ""; if (delayString != null) { if (delayString.Equals("abort", StringComparison.OrdinalIgnoreCase)) { if (Server.CancelShutdown()) { Logger.Log(LogType.UserActivity, "Restart aborted by {0}.", player.Name); Server.Message("&WRestart aborted by {0}", player.ClassyName); } else { player.MessageNow("Cannot abort restart - too late."); } return; } else if (!delayString.TryParseMiniTimespan(out delayTime)) { CdShutdown.PrintUsage(player); return; } if (delayTime > DateTimeUtil.MaxTimeSpan) { player.MessageMaxTimeSpan(); return; } reason = cmd.NextAll(); } if (delayTime.TotalMilliseconds > Int32.MaxValue - 1) { player.Message("Restart: Delay is too long, maximum is {0}", TimeSpan.FromMilliseconds(Int32.MaxValue - 1).ToMiniString()); return; } Server.Message("&WServer restarting in {0}", delayTime.ToMiniString()); if (String.IsNullOrEmpty(reason)) { Logger.Log(LogType.UserActivity, "{0} scheduled a restart ({1} delay).", player.Name, delayTime.ToCompactString()); ShutdownParams sp = new ShutdownParams(ShutdownReason.Restarting, delayTime, true, true); Server.Shutdown(sp, false); } else { Server.Message("&WRestart reason: {0}", reason); Logger.Log(LogType.UserActivity, "{0} scheduled a restart ({1} delay). Reason: {2}", player.Name, delayTime.ToCompactString(), reason); ShutdownParams sp = new ShutdownParams(ShutdownReason.Restarting, delayTime, true, true, reason, player); Server.Shutdown(sp, false); } }
static void RestartHandler( Player player, CommandReader cmd ) { string delayString = cmd.Next(); TimeSpan delayTime = DefaultShutdownTime; string reason = ""; if( delayString != null ) { if( delayString.Equals( "abort", StringComparison.OrdinalIgnoreCase ) ) { if( Server.CancelShutdown() ) { Logger.Log( LogType.UserActivity, "Restart aborted by {0}.", player.Name ); Server.Message( "&WRestart aborted by {0}", player.ClassyName ); } else { player.MessageNow( "Cannot abort restart - too late." ); } return; } else if( !delayString.TryParseMiniTimespan( out delayTime ) ) { CdShutdown.PrintUsage( player ); return; } if( delayTime > DateTimeUtil.MaxTimeSpan ) { player.MessageMaxTimeSpan(); return; } reason = cmd.NextAll(); } if( delayTime.TotalMilliseconds > Int32.MaxValue - 1 ) { player.Message( "Restart: Delay is too long, maximum is {0}", TimeSpan.FromMilliseconds( Int32.MaxValue - 1 ).ToMiniString() ); return; } Server.Message( "&WServer restarting in {0}", delayTime.ToMiniString() ); if( String.IsNullOrEmpty( reason ) ) { Logger.Log( LogType.UserActivity, "{0} scheduled a restart ({1} delay).", player.Name, delayTime.ToCompactString() ); ShutdownParams sp = new ShutdownParams( ShutdownReason.Restarting, delayTime, true, true ); Server.Shutdown( sp, false ); } else { Server.Message( "&WRestart reason: {0}", reason ); Logger.Log( LogType.UserActivity, "{0} scheduled a restart ({1} delay). Reason: {2}", player.Name, delayTime.ToCompactString(), reason ); ShutdownParams sp = new ShutdownParams( ShutdownReason.Restarting, delayTime, true, true, reason, player ); Server.Shutdown( sp, false ); } }
static void TimerHandler([NotNull] Player player, [NotNull] CommandReader cmd) { string param = cmd.Next(); // List timers if (param == null) { ChatTimer[] list = ChatTimer.TimerList.OrderBy(timer => timer.TimeLeft).ToArray(); if (list.Length == 0) { player.Message("No timers running."); } else { player.Message("There are {0} timers running:", list.Length); foreach (ChatTimer timer in list) { player.Message(" #{0} \"{1}&S\" (started by {2}, {3} left)", timer.Id, timer.Message, timer.StartedBy, timer.TimeLeft.ToMiniString()); } } return; } // Abort a timer if (param.Equals("abort", StringComparison.OrdinalIgnoreCase)) { int timerId; if (cmd.NextInt(out timerId)) { ChatTimer timer = ChatTimer.FindTimerById(timerId); if (timer == null || !timer.IsRunning) { player.Message("Given timer (#{0}) does not exist.", timerId); } else { timer.Abort(); string abortMsg = String.Format("&Y(Timer) {0}&Y aborted a timer with {1} left: {2}", player.ClassyName, timer.TimeLeft.ToMiniString(), timer.Message); Chat.SendSay(player, abortMsg); } } else { CdTimer.PrintUsage(player); } return; } // Start a timer if (player.Info.IsMuted) { player.MessageMuted(); return; } if (player.DetectChatSpam()) { return; } TimeSpan duration; if (!param.TryParseMiniTimeSpan(out duration)) { CdTimer.PrintUsage(player); return; } if (duration > DateTimeUtil.MaxTimeSpan) { player.MessageMaxTimeSpan(); return; } if (duration < ChatTimer.MinDuration) { player.Message("Timer: Must be at least 1 second."); return; } string sayMessage; string message = cmd.NextAll(); if (String.IsNullOrWhiteSpace(message)) { sayMessage = String.Format("&Y(Timer) {0}&Y started a {1} timer", player.ClassyName, duration.ToMiniString()); } else { sayMessage = String.Format("&Y(Timer) {0}&Y started a {1} timer: {2}", player.ClassyName, duration.ToMiniString(), message); } Chat.SendSay(player, sayMessage); ChatTimer.Start(duration, message, player.Name); }
static void SetInfoHandler( Player player, CommandReader cmd ) { string targetName = cmd.Next(); string propertyName = cmd.Next(); string valName = cmd.NextAll(); if( targetName == null || propertyName == null ) { CdSetInfo.PrintUsage( player ); return; } PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches( player, targetName ); if( info == null ) return; switch( propertyName.ToLower() ) { case "timeskicked": case "tk": int oldTimesKicked = info.TimesKicked; if( ValidateInt( valName, 0, 9999 ) ) { info.TimesKicked = Int32.Parse( valName ); player.Message( "SetInfo: TimesKicked for {0}&S changed from {1} to {2}", info.ClassyName, oldTimesKicked, info.TimesKicked ); break; } else { player.Message( "SetInfo: TimesKicked value out of range (acceptable: 0-9999)" ); return; } case "previousrank": case "pr": Rank newPreviousRank; if( valName.Length > 0 ) { newPreviousRank = RankManager.FindRank( valName ); if( newPreviousRank == null ) { player.MessageNoRank( valName ); return; } } else { newPreviousRank = null; } Rank oldPreviousRank = info.PreviousRank; if( newPreviousRank == null && oldPreviousRank == null ) { player.Message( "SetInfo: PreviousRank for {0}&S is not set.", info.ClassyName ); return; } else if( newPreviousRank == oldPreviousRank ) { player.Message( "SetInfo: PreviousRank for {0}&S is already set to {1}", info.ClassyName, newPreviousRank.ClassyName ); return; } info.PreviousRank = newPreviousRank; if( oldPreviousRank == null ) { player.Message( "SetInfo: PreviousRank for {0}&S set to {1}&", info.ClassyName, newPreviousRank.ClassyName ); } else if( newPreviousRank == null ) { player.Message( "SetInfo: PreviousRank for {0}&S was reset (was {1}&S)", info.ClassyName, oldPreviousRank.ClassyName ); } else { player.Message( "SetInfo: PreviousRank for {0}&S changed from {1}&S to {2}", info.ClassyName, oldPreviousRank.ClassyName, newPreviousRank.ClassyName ); } break; case "totaltime": case "tt": TimeSpan newTotalTime; TimeSpan oldTotalTime = info.TotalTime; if( valName.TryParseMiniTimespan( out newTotalTime ) ) { if( newTotalTime > DateTimeUtil.MaxTimeSpan ) { player.MessageMaxTimeSpan(); return; } info.TotalTime = newTotalTime; player.Message( "SetInfo: TotalTime for {0}&S changed from {1} ({2}) to {3} ({4})", info.ClassyName, oldTotalTime.ToMiniString(), oldTotalTime.ToCompactString(), info.TotalTime.ToMiniString(), info.TotalTime.ToCompactString() ); break; } else { player.Message( "SetInfo: Could not parse value given for TotalTime." ); return; } case "rankchangetype": case "rct": RankChangeType oldType = info.RankChangeType; try { info.RankChangeType = (RankChangeType)Enum.Parse( typeof( RankChangeType ), valName, true ); } catch( ArgumentException ) { player.Message( "SetInfo: Could not parse RankChangeType. Allowed values: {0}", String.Join( ", ", Enum.GetNames( typeof( RankChangeType ) ) ) ); return; } player.Message( "SetInfo: RankChangeType for {0}&S changed from {1} to {2}", info.ClassyName, oldType, info.RankChangeType ); break; case "banreason": case "br": if( valName.Length == 0 ) valName = null; if( SetPlayerInfoField( player, "BanReason", info, info.BanReason, valName ) ) { info.BanReason = valName; break; } else { return; } case "unbanreason": case "ur": if( valName.Length == 0 ) valName = null; if( SetPlayerInfoField( player, "UnbanReason", info, info.UnbanReason, valName ) ) { info.UnbanReason = valName; break; } else { return; } case "rankreason": case "rr": if( valName.Length == 0 ) valName = null; if( SetPlayerInfoField( player, "RankReason", info, info.RankChangeReason, valName ) ) { info.RankChangeReason = valName; break; } else { return; } case "kickreason": case "kr": if( valName.Length == 0 ) valName = null; if( SetPlayerInfoField( player, "KickReason", info, info.LastKickReason, valName ) ) { info.LastKickReason = valName; break; } else { return; } case "displayedname": case "dn": string oldDisplayedName = info.DisplayedName; if( valName.Length == 0 ) valName = null; if( valName != null && ( valName.Contains( '\n' ) || valName.Contains( "&n" ) || valName.Contains( "&N" ) ) ) { player.Message( "SetInfo: DisplayedName may not contain line breaks." ); return; } if( valName == info.DisplayedName ) { if( valName == null ) { player.Message( "SetInfo: DisplayedName for {0} is not set.", info.Name ); } else { player.Message( "SetInfo: DisplayedName for {0} is already set to \"{1}&S\"", info.Name, valName ); } return; } info.DisplayedName = valName; if( oldDisplayedName == null ) { player.Message( "SetInfo: DisplayedName for {0} set to \"{1}&S\"", info.Name, valName ); } else if( valName == null ) { player.Message( "SetInfo: DisplayedName for {0} was reset (was \"{1}&S\")", info.Name, oldDisplayedName ); } else { player.Message( "SetInfo: DisplayedName for {0} changed from \"{1}&S\" to \"{2}&S\"", info.Name, oldDisplayedName, valName ); } break; default: player.Message( "Only the following properties are editable: " + "TimesKicked, PreviousRank, TotalTime, RankChangeType, " + "BanReason, UnbanReason, RankReason, KickReason, DisplayedName" ); return; } info.LastModified = DateTime.UtcNow; }
static void WriteHandler(Player player, CommandReader cmd) { string sentence = cmd.NextAll(); if (sentence.Length < 1) { CdWrite.PrintUsage(player); return; } else { player.Message("Write: Click 2 blocks or use &H/Mark&S to set direction."); player.SelectionStart(2, WriteCallback, sentence, Permission.DrawAdvanced); } }
static void SetFontHandler(Player player, CommandReader cmd) { string Param = cmd.Next(); if (Param == null) { CdSetFont.PrintUsage(player); return; } if (Param.ToLower() == "reset") { player.font = new Font("Times New Roman", 20, FontStyle.Regular); player.Message("SetFont: Font reverted back to default ({0} size {1})", player.font.FontFamily.Name, player.font.Size); return; } if (Param.ToLower() == "font") { string sectionName = cmd.NextAll(); if (!Directory.Exists(Paths.FontsPath)) { Directory.CreateDirectory(Paths.FontsPath); player.Message("There are no fonts available for this server. Font is set to default: {0}", player.font.FontFamily.Name); return; } string fontFileName = null; string[] sectionFiles = Directory.GetFiles(Paths.FontsPath, "*.ttf", SearchOption.TopDirectoryOnly); if (sectionName.Length < 1) { var sectionList = GetFontSectionList(); player.Message("{0} fonts Available: {1}", sectionList.Length, sectionList.JoinToString()); //print the folder contents return; } for (int i = 0; i < sectionFiles.Length; i++) { string sectionFullName = System.IO.Path.GetFileNameWithoutExtension(sectionFiles[i]); if (sectionFullName == null) continue; if (sectionFullName.StartsWith(sectionName, StringComparison.OrdinalIgnoreCase)) { if (sectionFullName.Equals(sectionName, StringComparison.OrdinalIgnoreCase)) { fontFileName = sectionFiles[i]; break; } else if (fontFileName == null) { fontFileName = sectionFiles[i]; } else { var matches = sectionFiles.Select(f => System.IO.Path.GetFileNameWithoutExtension(f)) .Where(sn => sn != null && sn.StartsWith(sectionName, StringComparison.OrdinalIgnoreCase)); player.Message("Multiple font files matched \"{0}\": {1}", sectionName, matches.JoinToString()); return; } } } if (fontFileName != null) { string sectionFullName = System.IO.Path.GetFileNameWithoutExtension(fontFileName); player.Message("Your font has changed to \"{0}\":", sectionFullName); //change font here player.font = new System.Drawing.Font(player.LoadFontFamily(fontFileName), player.font.Size); return; } else { var sectionList = GetFontSectionList(); if (sectionList == null) { player.Message("No fonts have been found."); } else { player.Message("No fonts found for \"{0}\". Available fonts: {1}", sectionName, sectionList.JoinToString()); } } } if (Param.ToLower() == "size") { int Size = -1; if (cmd.NextInt(out Size)) { if (Size < 5) { player.Message("&WIncorrect font size ({0}): Size needs to be at least 5(which is ideal for minecraft font, not the others)", Size); return; } player.Message("SetFont: Size changed from {0} to {1} ({2})", player.font.Size, Size, player.font.FontFamily.Name); player.font = new System.Drawing.Font(player.font.FontFamily, Size); } else { player.Message("&WInvalid size, use /SetFont Size FontSize. Example: /SetFont Size 14"); return; } return; } else { CdSetFont.PrintUsage(player); return; } }
static void WorldSetHandler( Player player, CommandReader cmd ) { string worldName = cmd.Next(); string varName = cmd.Next(); string value = cmd.NextAll(); if( worldName == null || varName == null ) { CdWorldSet.PrintUsage( player ); return; } World world = WorldManager.FindWorldOrPrintMatches( player, worldName ); if( world == null ) return; switch( varName.ToLower() ) { case "hide": case "hidden": if( String.IsNullOrEmpty( value ) ) { player.Message( "World {0}&S is current {1}hidden.", world.ClassyName, world.IsHidden ? "" : "NOT " ); } else if( value.Equals( "on", StringComparison.OrdinalIgnoreCase ) || value.Equals( "true", StringComparison.OrdinalIgnoreCase ) || value == "1" ) { if( world.IsHidden ) { player.Message( "World {0}&S is already hidden.", world.ClassyName ); } else { player.Message( "World {0}&S is now hidden.", world.ClassyName ); world.IsHidden = true; WorldManager.SaveWorldList(); } } else if( value.Equals( "off", StringComparison.OrdinalIgnoreCase ) || value.Equals( "false", StringComparison.OrdinalIgnoreCase ) || value == "0" ) { if( world.IsHidden ) { player.Message( "World {0}&S is no longer hidden.", world.ClassyName ); world.IsHidden = false; WorldManager.SaveWorldList(); } else { player.Message( "World {0}&S is not hidden.", world.ClassyName ); } } else { CdWorldSet.PrintUsage( player ); } break; case "backup": case "backups": TimeSpan backupInterval; string oldDescription = world.BackupSettingDescription; if( String.IsNullOrEmpty( value ) ) { player.Message( GetBackupSettingsString( world ) ); return; } else if( value.Equals( "off", StringComparison.OrdinalIgnoreCase ) || value.StartsWith( "disable", StringComparison.OrdinalIgnoreCase ) ) { // Disable backups on the world if( world.BackupEnabledState == YesNoAuto.No ) { MessageSameBackupSettings( player, world ); return; } else { world.BackupEnabledState = YesNoAuto.No; } } else if( value.Equals( "default", StringComparison.OrdinalIgnoreCase ) || value.Equals( "auto", StringComparison.OrdinalIgnoreCase ) ) { // Set world to use default settings if( world.BackupEnabledState == YesNoAuto.Auto ) { MessageSameBackupSettings( player, world ); return; } else { world.BackupEnabledState = YesNoAuto.Auto; } } else if( value.TryParseMiniTimespan( out backupInterval ) ) { if( backupInterval == TimeSpan.Zero ) { // Set world's backup interval to 0, which is equivalent to disabled if( world.BackupEnabledState == YesNoAuto.No ) { MessageSameBackupSettings( player, world ); return; } else { world.BackupEnabledState = YesNoAuto.No; } } else if( world.BackupEnabledState != YesNoAuto.Yes || world.BackupInterval != backupInterval ) { // Alter world's backup interval world.BackupInterval = backupInterval; } else { MessageSameBackupSettings( player, world ); return; } } else { CdWorldSet.PrintUsage( player ); return; } player.Message( "Backup setting for world {0}&S changed from \"{1}\" to \"{2}\"", world.ClassyName, oldDescription, world.BackupSettingDescription ); WorldManager.SaveWorldList(); break; case "description": case "greeting": if( String.IsNullOrEmpty( value ) ) { if (world.Greeting == null) { if (!Directory.Exists("./WorldGreeting/")) Directory.CreateDirectory("./WorldGreeting/"); if (File.Exists("./WorldGreeting/" + player.World.Name + ".txt")) { world.Greeting = File.ReadAllText("./WorldGreeting/" + player.World.Name + ".txt"); if (world.Greeting.Length == 0) player.Message("No greeting message is set for world {0}", world.ClassyName); else player.Message("&SGreeting message for world {0}&s is: {1}", world.ClassyName, world.Greeting); world.Greeting = null; } else player.Message("No greeting message is set for world {0}", world.ClassyName); } } else { if (value.ToLower() == "remove") { player.Message("Greeting message removed for world {0}", world.ClassyName); if (!Directory.Exists("./WorldGreeting/")) Directory.CreateDirectory("./WorldGreeting/"); if (File.Exists("./WorldGreeting/" + player.World.Name + ".txt")) File.Delete("./WorldGreeting/" + player.World.Name + ".txt"); world.Greeting = null; } else { world.Greeting = value.Replace("%n", "/n"); player.Message("Greeting message for world {0}&S set to: {1}", world.ClassyName, world.Greeting); if (!Directory.Exists("./WorldGreeting/")) Directory.CreateDirectory("./WorldGreeting/"); File.WriteAllText("./WorldGreeting/" + player.World.Name + ".txt", world.Greeting); world.Greeting = null; } } break; case "messageoftheday": case "motd": if (string.IsNullOrEmpty(value)) { if (string.IsNullOrEmpty(world.MOTD)) { player.Message("World \"&f{0}&s\" does not have a custom MOTD", world.Name); } else { player.Message("MOTD for \"&F{0}&S\" is: ", world.Name); player.Message(" " + world.MOTD); } } else { if(value.Length > 64) { value = value.Substring(0, 64); } if (value.ToLower().Equals("remove") || value.ToLower().Equals("delete") || value.ToLower().Equals("reset")) { player.Message("MOTD for \"&F{0}&S\" has been removed", world.Name); world.MOTD = null; WorldManager.SaveWorldList(); } else { player.Message("MOTD for \"&F{0}&S\" has been set to:", world.Name); player.Message(" " + value); world.MOTD = value; WorldManager.SaveWorldList(); } } break; default: CdWorldSet.PrintUsage( player ); break; } }
static void SuicideHandler(Player player, CommandReader cmd) { string note = cmd.NextAll(); if (player.World == null) PlayerOpException.ThrowNoWorld(player); if (player.Info.TimeSinceLastServerMessage.TotalSeconds < 10) { player.Info.getLeftOverTime(10, cmd); return; } if (note.Length > 64) { player.Message("&sProbably bad timing, but your suicide note can't be {0} characters long. Max is 64.", note.Length); return; } if (player.World != null) { player.LastWorld = player.World; player.LastPosition = player.Position; } if (note == "") { Server.Message("&s{0}&s took the easy way out", player.ClassyName); player.TeleportTo(player.World.LoadMap().Spawn); player.Info.LastServerMessageDate = DateTime.Now; return; } else { Server.Message("&s{0}&s took the easy way out and left a note", player.ClassyName); Server.Message("&s[&fNote&s] {0}", note); player.TeleportTo(player.World.LoadMap().Spawn); player.Info.LastServerMessageDate = DateTime.Now; return; } }
static void RankHandler( Player player, CommandReader cmd ) { string name = cmd.Next(); string newRankName = cmd.Next(); // Check arguments if( name == null || newRankName == null ) { CdRank.PrintUsage( player ); player.Message( "See &H/Ranks&S for list of ranks." ); return; } // Parse rank name Rank newRank = RankManager.FindRank( newRankName ); if( newRank == null ) { player.MessageNoRank( newRankName ); return; } // Parse player name if( name == "-" ) { if( player.LastUsedPlayerName != null ) { name = player.LastUsedPlayerName; } else { player.Message( "Cannot repeat player name: you haven't used any names yet." ); return; } } PlayerInfo targetInfo = PlayerDB.FindPlayerInfoExact( name ); if( targetInfo == null ) { if( !player.Can( Permission.EditPlayerDB ) ) { player.MessageNoPlayer( name ); return; } if( !Player.IsValidName( name ) ) { player.MessageInvalidPlayerName( name ); CdRank.PrintUsage( player ); return; } if( cmd.IsConfirmed ) { if( newRank > RankManager.DefaultRank ) { targetInfo = PlayerDB.AddFakeEntry( name, RankChangeType.Promoted ); } else { targetInfo = PlayerDB.AddFakeEntry( name, RankChangeType.Demoted ); } } else { player.Confirm( cmd, "Warning: Player \"{0}\" is not in the database (possible typo). Type the full name or", name ); return; } } try { player.LastUsedPlayerName = targetInfo.Name; targetInfo.ChangeRank( player, newRank, cmd.NextAll(), true, true, false ); } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); } }
static void SetInfoHandler( Player player, CommandReader cmd ) { string targetName = cmd.Next(); string propertyName = cmd.Next(); string valName = cmd.NextAll(); if( targetName == null || propertyName == null ) { CdSetInfo.PrintUsage( player ); return; } PlayerInfo info = PlayerDB.FindByPartialNameOrPrintMatches( player, targetName ); if( info == null ) return; switch( propertyName.ToLower() ) { case "banreason": if( valName.Length == 0 ) valName = null; if( SetPlayerInfoField( player, "BanReason", info, info.BanReason, valName ) ) { info.BanReason = valName; } break; case "displayedname": string oldDisplayedName = info.DisplayedName; if( valName.Length == 0 ) valName = null; if( valName == info.DisplayedName ) { if( valName == null ) { player.Message( "SetInfo: DisplayedName for {0} is not set.", info.Name ); } else { player.Message( "SetInfo: DisplayedName for {0} is already set to \"{1}&S\"", info.Name, valName ); } break; } info.DisplayedName = valName; if( oldDisplayedName == null ) { player.Message( "SetInfo: DisplayedName for {0} set to \"{1}&S\"", info.Name, valName ); } else if( valName == null ) { player.Message( "SetInfo: DisplayedName for {0} was reset (was \"{1}&S\")", info.Name, oldDisplayedName ); } else { player.Message( "SetInfo: DisplayedName for {0} changed from \"{1}&S\" to \"{2}&S\"", info.Name, oldDisplayedName, valName ); } break; case "kickreason": if( valName.Length == 0 ) valName = null; if( SetPlayerInfoField( player, "KickReason", info, info.LastKickReason, valName ) ) { info.LastKickReason = valName; } break; case "name": if( valName.Equals( info.Name, StringComparison.OrdinalIgnoreCase ) ) { player.Message( "SetInfo: You may change capitalization of player's real name. " + "If you'd like to make other changes to the way player's name is displayed, " + "use &H/SetInfo <Name> DisplayedName <NewName>" ); break; } string oldName = info.Name; if( oldName != valName ) { info.Name = valName; player.Message( "Name capitalization changed from \"{0}\" to \"{1}\"", oldName, valName ); } else { player.Message( "Name capitalization is already \"{0}\"", oldName ); } break; case "previousrank": Rank newPreviousRank; if( valName.Length > 0 ) { newPreviousRank = RankManager.FindRank( valName ); if( newPreviousRank == null ) { player.MessageNoRank( valName ); break; } } else { newPreviousRank = null; } Rank oldPreviousRank = info.PreviousRank; if( newPreviousRank == oldPreviousRank ) { if( newPreviousRank == null ) { player.Message( "SetInfo: PreviousRank for {0}&S is not set.", info.ClassyName ); } else { player.Message( "SetInfo: PreviousRank for {0}&S is already set to {1}", info.ClassyName, newPreviousRank.ClassyName ); } break; } info.PreviousRank = newPreviousRank; if( oldPreviousRank == null ) { player.Message( "SetInfo: PreviousRank for {0}&S set to {1}&", info.ClassyName, newPreviousRank.ClassyName ); } else if( newPreviousRank == null ) { player.Message( "SetInfo: PreviousRank for {0}&S was reset (was {1}&S)", info.ClassyName, oldPreviousRank.ClassyName ); } else { player.Message( "SetInfo: PreviousRank for {0}&S changed from {1}&S to {2}", info.ClassyName, oldPreviousRank.ClassyName, newPreviousRank.ClassyName ); } break; case "rankchangetype": RankChangeType oldType = info.RankChangeType; try { info.RankChangeType = (RankChangeType)Enum.Parse( typeof( RankChangeType ), valName, true ); } catch( ArgumentException ) { player.Message( "SetInfo: Could not parse RankChangeType. Allowed values: {0}", String.Join( ", ", Enum.GetNames( typeof( RankChangeType ) ) ) ); break; } player.Message( "SetInfo: RankChangeType for {0}&S changed from {1} to {2}", info.ClassyName, oldType, info.RankChangeType ); break; case "rankreason": if( valName.Length == 0 ) valName = null; if( SetPlayerInfoField( player, "RankReason", info, info.RankChangeReason, valName ) ) { info.RankChangeReason = valName; } break; case "timeskicked": int oldTimesKicked = info.TimesKicked; if( ValidateInt( valName, 0, 9999 ) ) { info.TimesKicked = Int32.Parse( valName ); player.Message( "SetInfo: TimesKicked for {0}&S changed from {1} to {2}", info.ClassyName, oldTimesKicked, info.TimesKicked ); } else { player.Message( "SetInfo: TimesKicked value out of range (Acceptable value range: 0-9999)" ); } break; case "totaltime": TimeSpan newTotalTime; TimeSpan oldTotalTime = info.TotalTime; if( valName.TryParseMiniTimespan( out newTotalTime ) ) { if( newTotalTime > DateTimeUtil.MaxTimeSpan ) { player.MessageMaxTimeSpan(); break; } info.TotalTime = newTotalTime; player.Message( "SetInfo: TotalTime for {0}&S changed from {1} ({2}) to {3} ({4})", info.ClassyName, oldTotalTime.ToMiniString(), oldTotalTime.ToCompactString(), info.TotalTime.ToMiniString(), info.TotalTime.ToCompactString() ); } else { player.Message( "SetInfo: Could not parse value given for TotalTime." ); } break; case "unbanreason": if( valName.Length == 0 ) valName = null; if( SetPlayerInfoField( player, "UnbanReason", info, info.UnbanReason, valName ) ) { info.UnbanReason = valName; } break; default: player.Message( "Only the following properties are editable: " + "TimesKicked, PreviousRank, TotalTime, RankChangeType, " + "BanReason, UnbanReason, RankReason, KickReason, DisplayedName" ); return; } }
static void SignAddHandler(Player player, CommandReader cmd) { World playerWorld = player.World; if (playerWorld == null) PlayerOpException.ThrowNoWorld(player); string givenZoneName = "Sign_" + cmd.Next(); if (givenZoneName == null || !cmd.HasNext) { CdSignAdd.PrintUsage(player); return; } if (!player.Info.Rank.AllowSecurityCircumvention) { SecurityCheckResult buildCheck = playerWorld.BuildSecurity.CheckDetailed(player.Info); switch (buildCheck) { case SecurityCheckResult.BlackListed: player.Message("Cannot add zones to world {0}&S: You are barred from building here.", playerWorld.ClassyName); return; case SecurityCheckResult.RankTooLow: player.Message("Cannot add zones to world {0}&S: You are not allowed to build here.", playerWorld.ClassyName); return; } } Zone newZone = new Zone(); ZoneCollection zoneCollection = player.WorldMap.Zones; if (!canManageSpecialZone(givenZoneName.ToLower(), player)) { return; } // Adding an ordinary, rank-restricted zone. if (!World.IsValidName(givenZoneName)) { player.Message("\"{0}\" is not a valid Sign/Zone name", givenZoneName); return; } if (zoneCollection.Contains(givenZoneName)) { player.Message("A Sign/Zone with this name already exists."); return; } newZone.Name = givenZoneName; Rank minRank = RankManager.HighestRank; if (cmd.HasNext) { newZone.Sign = cmd.NextAll(); if (newZone.Sign.Length == 0) { CdSignAdd.PrintUsage(player); return; } else { if (!Directory.Exists("./Signs/")) Directory.CreateDirectory("./Signs/"); if (!Directory.Exists("./Signs/" + player.World.Name + "/")) Directory.CreateDirectory("./Signs/" + player.World.Name + "/"); File.WriteAllText("./Signs/" + player.World.Name + "/" + newZone.Name + ".txt", cmd.NextAll().Replace("%n", "/n")); player.Message("&SMessage for sign {0}&S is: {1}", newZone.ClassyName, newZone.Sign); newZone.Sign = null; } } newZone.Controller.MinRank = minRank; player.SelectionStart(1, SignAddCallback, newZone, CdSignAdd.Permissions); player.Message("SignAdd: Creating sign {0}&S. Click or &H/Mark&S 1 block.", newZone.ClassyName); }
static void ZoneEditHandler( Player player, CommandReader cmd ) { if( player.World == null ) PlayerOpException.ThrowNoWorld( player ); bool changesWereMade = false; string zoneName = cmd.Next(); if( zoneName == null ) { player.Message( "No zone name specified. See &H/Help ZEdit" ); return; } Zone zone = player.WorldMap.Zones.Find( zoneName ); if( zone == null ) { player.MessageNoZone( zoneName ); return; } if (!canManageSpecialZone(zone.Name.ToLower(), player)) { return; } if (zone.Name.ToLower().StartsWith("command_")) { if (player.Info.Rank != RankManager.HighestRank) { player.Message("You cannot affect command zones."); return; } } //player.Message(cmd.RawMessage); //player.Message(cmd.RawMessage.Substring(cmd.Offset)); if (cmd.RawMessage.Substring(cmd.Offset + 1).StartsWith("#")) { zone.Sign = cmd.NextAll().Substring(1); if (zone.Sign.Length == 0 || zone.Sign == null) { if (!Directory.Exists("./Signs/")) Directory.CreateDirectory("./Signs/"); if (!Directory.Exists("./Signs/" + player.World.Name + "/")) Directory.CreateDirectory("./Signs/" + player.World.Name + "/"); if (File.Exists("./Signs/" + player.World.Name + "/" + zone.Name + ".txt")) File.Delete("./Signs/" + player.World.Name + "/" + zone.Name + ".txt"); player.Message("&SSign Text for zone {0}&S was removed.", zone.ClassyName); zone.Sign = null; } else { if (!Directory.Exists("./Signs/")) Directory.CreateDirectory("./Signs/"); if (!Directory.Exists("./Signs/" + player.World.Name + "/")) Directory.CreateDirectory("./Signs/" + player.World.Name + "/"); File.WriteAllText("./Signs/" + player.World.Name + "/" + zone.Name + ".txt", cmd.NextAll().Substring(1).Replace("%n", "/n")); player.Message("&SSign Text for zone {0}&S changed to {1}", zone.ClassyName, zone.Sign); zone.Sign = null; } return; } string nextToken; while( (nextToken = cmd.Next()) != null ) { // Clear whitelist if( nextToken.Equals( "-*" ) ) { PlayerInfo[] oldWhitelist = zone.Controller.ExceptionList.Included; if( oldWhitelist.Length > 0 ) { zone.Controller.ResetIncludedList(); player.Message( "Whitelist of zone {0}&S cleared: {1}", zone.ClassyName, oldWhitelist.JoinToClassyString() ); Logger.Log( LogType.UserActivity, "{0} {1} &scleared whitelist of zone {2} on world {3}: {4}", player.Info.Rank.Name, player.Name, zone.Name, player.World.Name, oldWhitelist.JoinToString( pi => pi.Name ) ); } else { player.Message( "Whitelist of zone {0}&S is empty.", zone.ClassyName ); } continue; } // Clear blacklist if( nextToken.Equals( "+*" ) ) { PlayerInfo[] oldBlacklist = zone.Controller.ExceptionList.Excluded; if( oldBlacklist.Length > 0 ) { zone.Controller.ResetExcludedList(); player.Message( "Blacklist of zone {0}&S cleared: {1}", zone.ClassyName, oldBlacklist.JoinToClassyString() ); Logger.Log( LogType.UserActivity, "{0} {1} &scleared blacklist of zone {2} on world {3}: {4}", player.Info.Rank.Name, player.Name, zone.Name, player.World.Name, oldBlacklist.JoinToString( pi => pi.Name ) ); } else { player.Message( "Blacklist of zone {0}&S is empty.", zone.ClassyName ); } continue; } if( nextToken.StartsWith( "+" ) ) { PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches( player, nextToken.Substring( 1 ), SearchOptions.IncludeSelf ); if( info == null ) return; // prevent players from whitelisting themselves to bypass protection if (!player.Info.Rank.AllowSecurityCircumvention && player.Info == info) { switch( zone.Controller.CheckDetailed( info ) ) { case SecurityCheckResult.BlackListed: player.Message( "You are not allowed to remove yourself from the blacklist of zone {0}", zone.ClassyName ); continue; case SecurityCheckResult.RankTooLow: player.Message( "You must be {0}+&S to add yourself to the whitelist of zone {1}", zone.Controller.MinRank.ClassyName, zone.ClassyName ); continue; } } switch( zone.Controller.Include( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is no longer excluded from zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.None: player.Message( "{0}&S is now included in zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is already included in zone {1}", info.ClassyName, zone.ClassyName ); break; } } else if( nextToken.StartsWith( "-" ) ) { PlayerInfo info = PlayerDB.FindPlayerInfoOrPrintMatches(player, nextToken.Substring(1), SearchOptions.Default); if( info == null ) return; if (!player.Info.Rank.AllowSecurityCircumvention && player.Info == info) { switch (zone.Controller.CheckDetailed(info)) { case SecurityCheckResult.WhiteListed: player.Message("You are not allowed to remove yourself from the whitelist of zone {0}", zone.ClassyName); continue; case SecurityCheckResult.RankTooLow: player.Message("You must be {0}+&S to add yourself to the blacklist of zone {1}", zone.Controller.MinRank.ClassyName, zone.ClassyName); continue; } } switch( zone.Controller.Exclude( info ) ) { case PermissionOverride.Deny: player.Message( "{0}&S is already excluded from zone {1}", info.ClassyName, zone.ClassyName ); break; case PermissionOverride.None: player.Message( "{0}&S is now excluded from zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; case PermissionOverride.Allow: player.Message( "{0}&S is no longer included in zone {1}", info.ClassyName, zone.ClassyName ); changesWereMade = true; break; } } else { Rank minRank = RankManager.FindRank( nextToken ); if( minRank != null ) { // prevent players from lowering rank so bypass protection if( !player.Info.Rank.AllowSecurityCircumvention && zone.Controller.MinRank > player.Info.Rank && minRank <= player.Info.Rank ) { player.Message( "You are not allowed to lower the zone's rank." ); continue; } if( zone.Controller.MinRank != minRank ) { zone.Controller.MinRank = minRank; player.Message( "Permission for zone \"{0}\" changed to {1}+", zone.Name, minRank.ClassyName ); changesWereMade = true; } } else { player.MessageNoRank( nextToken ); } } if( changesWereMade ) { zone.Edit( player.Info ); } else { player.Message( "No changes were made to the zone." ); } } }
static void SetInfoHandler(Player player, CommandReader cmd) { string targetName = cmd.Next(); string propertyName = cmd.Next(); string valName = cmd.NextAll(); if (targetName == null || propertyName == null) { CdSetInfo.PrintUsage(player); return; } PlayerInfo info = PlayerDB.FindByPartialNameOrPrintMatches(player, targetName); if (info == null) { return; } switch (propertyName.ToLower()) { case "banreason": if (valName.Length == 0) { valName = null; } if (SetPlayerInfoField(player, "BanReason", info, info.BanReason, valName)) { info.BanReason = valName; } break; case "displayedname": string oldDisplayedName = info.DisplayedName; if (valName.Length == 0) { valName = null; } if (valName == info.DisplayedName) { if (valName == null) { player.Message("SetInfo: DisplayedName for {0} is not set.", info.Name); } else { player.Message("SetInfo: DisplayedName for {0} is already set to \"{1}&S\"", info.Name, valName); } break; } info.DisplayedName = valName; if (oldDisplayedName == null) { player.Message("SetInfo: DisplayedName for {0} set to \"{1}&S\"", info.Name, valName); } else if (valName == null) { player.Message("SetInfo: DisplayedName for {0} was reset (was \"{1}&S\")", info.Name, oldDisplayedName); } else { player.Message("SetInfo: DisplayedName for {0} changed from \"{1}&S\" to \"{2}&S\"", info.Name, oldDisplayedName, valName); } break; case "kickreason": if (valName.Length == 0) { valName = null; } if (SetPlayerInfoField(player, "KickReason", info, info.LastKickReason, valName)) { info.LastKickReason = valName; } break; case "name": if (valName.Equals(info.Name, StringComparison.OrdinalIgnoreCase)) { player.Message("SetInfo: You may change capitalization of player's real name. " + "If you'd like to make other changes to the way player's name is displayed, " + "use &H/SetInfo <Name> DisplayedName <NewName>"); break; } string oldName = info.Name; if (oldName != valName) { info.Name = valName; player.Message("Name capitalization changed from \"{0}\" to \"{1}\"", oldName, valName); } else { player.Message("Name capitalization is already \"{0}\"", oldName); } break; case "previousrank": Rank newPreviousRank; if (valName.Length > 0) { newPreviousRank = RankManager.FindRank(valName); if (newPreviousRank == null) { player.MessageNoRank(valName); break; } } else { newPreviousRank = null; } Rank oldPreviousRank = info.PreviousRank; if (newPreviousRank == oldPreviousRank) { if (newPreviousRank == null) { player.Message("SetInfo: PreviousRank for {0}&S is not set.", info.ClassyName); } else { player.Message("SetInfo: PreviousRank for {0}&S is already set to {1}", info.ClassyName, newPreviousRank.ClassyName); } break; } info.PreviousRank = newPreviousRank; if (oldPreviousRank == null) { player.Message("SetInfo: PreviousRank for {0}&S set to {1}&", info.ClassyName, newPreviousRank.ClassyName); } else if (newPreviousRank == null) { player.Message("SetInfo: PreviousRank for {0}&S was reset (was {1}&S)", info.ClassyName, oldPreviousRank.ClassyName); } else { player.Message("SetInfo: PreviousRank for {0}&S changed from {1}&S to {2}", info.ClassyName, oldPreviousRank.ClassyName, newPreviousRank.ClassyName); } break; case "rankchangetype": RankChangeType oldType = info.RankChangeType; try { info.RankChangeType = (RankChangeType)Enum.Parse(typeof(RankChangeType), valName, true); } catch (ArgumentException) { player.Message("SetInfo: Could not parse RankChangeType. Allowed values: {0}", String.Join(", ", Enum.GetNames(typeof(RankChangeType)))); break; } player.Message("SetInfo: RankChangeType for {0}&S changed from {1} to {2}", info.ClassyName, oldType, info.RankChangeType); break; case "rankreason": if (valName.Length == 0) { valName = null; } if (SetPlayerInfoField(player, "RankReason", info, info.RankChangeReason, valName)) { info.RankChangeReason = valName; } break; case "timeskicked": int oldTimesKicked = info.TimesKicked; if (ValidateInt(valName, 0, 9999)) { info.TimesKicked = Int32.Parse(valName); player.Message("SetInfo: TimesKicked for {0}&S changed from {1} to {2}", info.ClassyName, oldTimesKicked, info.TimesKicked); } else { player.Message("SetInfo: TimesKicked value out of range (Acceptable value range: 0-9999)"); } break; case "totaltime": TimeSpan newTotalTime; TimeSpan oldTotalTime = info.TotalTime; if (valName.TryParseMiniTimespan(out newTotalTime)) { if (newTotalTime > DateTimeUtil.MaxTimeSpan) { player.MessageMaxTimeSpan(); break; } info.TotalTime = newTotalTime; player.Message("SetInfo: TotalTime for {0}&S changed from {1} ({2}) to {3} ({4})", info.ClassyName, oldTotalTime.ToMiniString(), oldTotalTime.ToCompactString(), info.TotalTime.ToMiniString(), info.TotalTime.ToCompactString()); } else { player.Message("SetInfo: Could not parse value given for TotalTime."); } break; case "unbanreason": if (valName.Length == 0) { valName = null; } if (SetPlayerInfoField(player, "UnbanReason", info, info.UnbanReason, valName)) { info.UnbanReason = valName; } break; default: player.Message("Only the following properties are editable: " + "TimesKicked, PreviousRank, TotalTime, RankChangeType, " + "BanReason, UnbanReason, RankReason, KickReason, DisplayedName"); return; } }
static void UnbanHandler( Player player, CommandReader cmd ) { string targetName = cmd.Next(); if( targetName == null ) { CdUnban.PrintUsage( player ); return; } PlayerInfo target = PlayerDB.FindPlayerInfoOrPrintMatches( player, targetName, false ); if( target == null ) return; string reason = cmd.NextAll(); try { target.Unban( player, reason, true, true ); } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); } }
// TODO: document the fact that this only promotes (unlike "/Import Ranks") static void ImportRankListHandler( Player player, CommandReader cmd ) { string fileName = cmd.Next(); string rankName = cmd.Next(); string reason = cmd.NextAll(); if( fileName == null || rankName == null ) { CdImportRankList.PrintUsage( player ); return; } // parse rank name Rank rank = RankManager.FindRank( rankName ); if( rank == null ) { player.MessageNoRank( rankName ); return; } // Make sure that the target file is legit if( !Paths.Contains( Paths.WorkingPath, fileName ) ) { Logger.Log( LogType.SuspiciousActivity, "ImportRankList: Player {0} tried to import from \"{1}\"", player.Name, fileName ); player.MessageUnsafePath(); return; } // Make sure file exists if( !File.Exists( fileName ) ) { player.Message( "Rank list file not found: " + fileName ); return; } // Read list of names from file. // Using List list to preserve capitalization and a HashSet to avoid duplicates. List<string> nameList = new List<string>(); using( StreamReader reader = new StreamReader( fileName ) ) { HashSet<string> lowerNameSet = new HashSet<string>(); while( true ) { string nextName = reader.ReadLine(); if( nextName == null ) break; if( !Player.IsValidPlayerName( nextName ) ) { player.Message( "ImportRankList: Invalid player name skipped: {0}", nextName ); continue; } string nameToLower = nextName.ToLowerInvariant(); if( lowerNameSet.Contains( nameToLower ) ) { player.Message( "ImportRankList: Skipping a duplicate name: {0}", nextName ); continue; } nameList.Add( nextName ); lowerNameSet.Add( nameToLower ); } } // Ask player to confirm before continuing if( !cmd.IsConfirmed ) { Logger.Log( LogType.UserActivity, "Import: Asked {0} to confirm importing {1} ranks from {2}", player.Name, nameList.Count, fileName ); player.Confirm( cmd, "ImportRankList: Are you sure you want to rank {0} players to {1}&S?", nameList.Count, rank.ClassyName ); return; } // Carry out the promotions int newPlayers = 0, promotedPlayers = 0, skippedPlayers = 0; foreach( string name in nameList ) { PlayerInfo info = PlayerDB.FindPlayerInfoExact( name ); if( info == null ) { // Create and promote a new record newPlayers++; PlayerInfo newInfo = PlayerDB.CreateNewPlayerInfo( name, RankChangeType.Promoted ); newInfo.ChangeRank( player, rank, reason, true, true, false ); Logger.Log( LogType.UserActivity, "ImportRankList: Created a new player record for {0}", name ); } else { // Check if an existing record needs updating if( info.Rank < rank && // don't demote anyone !info.IsBanned && // don't promote banned players info.RankChangeType != RankChangeType.Demoted && // don't re-promote demoted players info.RankChangeType != RankChangeType.AutoDemoted ) { // Promote! info.ChangeRank( player, rank, reason, true, true, false ); promotedPlayers++; } else { skippedPlayers++; } } } string successMsg = String.Format( "ImportRankList: Created {0} new records, promoted {1} players, " + "skipped {2} records from file \"{3}\"", newPlayers, promotedPlayers, skippedPlayers, Path.GetFileName( fileName ) ); Logger.Log( LogType.UserActivity, successMsg ); player.Message( successMsg ); }
static void MassRankHandler( Player player, CommandReader cmd ) { string fromRankName = cmd.Next(); string toRankName = cmd.Next(); string reason = cmd.NextAll(); if( fromRankName == null || toRankName == null ) { CdMassRank.PrintUsage( player ); return; } Rank fromRank = RankManager.FindRank( fromRankName ); if( fromRank == null ) { player.MessageNoRank( fromRankName ); return; } Rank toRank = RankManager.FindRank( toRankName ); if( toRank == null ) { player.MessageNoRank( toRankName ); return; } if( fromRank == toRank ) { player.Message( "Ranks must be different" ); return; } int playerCount = fromRank.PlayerCount; string verb = (fromRank > toRank ? "demot" : "promot"); if( !cmd.IsConfirmed ) { Logger.Log( LogType.UserActivity, "MassRank: Asked {0} to confirm {1}ion of {2} players.", player.Name, verb, playerCount ); player.Confirm( cmd, "{0}e {1} players?", verb.UppercaseFirst(), playerCount ); return; } player.Message( "MassRank: {0}ing {1} players...", verb, playerCount ); int affected = PlayerDB.MassRankChange( player, fromRank, toRank, reason ); player.Message( "MassRank: done, {0} records affected.", affected ); }
static void KickHandler( Player player, CommandReader cmd ) { string name = cmd.Next(); if( name == null ) { player.Message( "Usage: &H/Kick PlayerName [Message]" ); return; } // find the target Player target = Server.FindPlayerOrPrintMatches( player, name, false, false, true ); if( target == null ) return; string reason = cmd.NextAll(); DateTime previousKickDate = target.Info.LastKickDate; string previousKickedBy = target.Info.LastKickByClassy; string previousKickReason = target.Info.LastKickReason; // do the kick try { Player targetPlayer = target; target.Kick( player, reason, LeaveReason.Kick, true, true, true ); WarnIfOtherPlayersOnIP( player, target.Info, targetPlayer ); } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); if( ex.ErrorCode == PlayerOpExceptionCode.ReasonRequired ) { FreezeIfAllowed( player, target.Info ); } return; } // warn player if target has been kicked before if( target.Info.TimesKicked > 1 ) { player.Message( "Warning: {0}&S has been kicked {1} times before.", target.ClassyName, target.Info.TimesKicked - 1 ); if( previousKickDate != DateTime.MinValue ) { player.Message( "Most recent kick was {0} ago, by {1}", DateTime.UtcNow.Subtract( previousKickDate ).ToMiniString(), previousKickedBy ); } if( !String.IsNullOrEmpty( previousKickReason ) ) { player.Message( "Most recent kick reason was: {0}", previousKickReason ); } } }
static void BanIPHandler( Player player, CommandReader cmd ) { string targetNameOrIP = cmd.Next(); if( targetNameOrIP == null ) { CdBanIP.PrintUsage( player ); return; } string reason = cmd.NextAll(); IPAddress targetAddress; if( IPAddressUtil.IsIP( targetNameOrIP ) && IPAddress.TryParse( targetNameOrIP, out targetAddress ) ) { try { targetAddress.BanIP( player, reason, true, true ); } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); } } else { PlayerInfo target = PlayerDB.FindPlayerInfoOrPrintMatches( player, targetNameOrIP, false ); if( target == null ) return; try { if( target.LastIP.Equals( IPAddress.Any ) || target.LastIP.Equals( IPAddress.None ) ) { target.Ban( player, reason, true, true ); } else { target.BanIP( player, reason, true, true ); } } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); if( ex.ErrorCode == PlayerOpExceptionCode.ReasonRequired ) { FreezeIfAllowed( player, target ); } } } }
static void MeHandler( Player player, CommandReader cmd ) { if( player.Info.IsMuted ) { player.MessageMuted(); return; } if( player.DetectChatSpam() ) return; string msg = cmd.NextAll().Trim( ' ' ); if( msg.Length > 0 ) { Chat.SendMe( player, msg ); } else { CdMe.PrintUsage( player ); } }
static void UnbanAllHandler( Player player, CommandReader cmd ) { string targetNameOrIP = cmd.Next(); if( targetNameOrIP == null ) { CdUnbanAll.PrintUsage( player ); return; } string reason = cmd.NextAll(); try { IPAddress targetAddress; if( IPAddressUtil.IsIP( targetNameOrIP ) && IPAddress.TryParse( targetNameOrIP, out targetAddress ) ) { targetAddress.UnbanAll( player, reason, true, true ); } else { PlayerInfo target = PlayerDB.FindPlayerInfoOrPrintMatches( player, targetNameOrIP, false ); if( target == null ) return; if( target.LastIP.Equals( IPAddress.Any ) || target.LastIP.Equals( IPAddress.None ) ) { target.Unban( player, reason, true, true ); } else { target.UnbanAll( player, reason, true, true ); } } } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); } }
static void TimerHandler( Player player, CommandReader cmd ) { string param = cmd.Next(); // List timers if( param == null ) { ChatTimer[] list = ChatTimer.TimerList.OrderBy( timer => timer.TimeLeft ).ToArray(); if( list.Length == 0 ) { player.Message( "No timers running." ); } else { player.Message( "There are {0} timers running:", list.Length ); foreach( ChatTimer timer in list ) { player.Message( " #{0} \"{1}&S\" (started by {2}, {3} left)", timer.ID, timer.Message, timer.StartedBy, timer.TimeLeft.ToMiniString() ); } } return; } // Abort a timer if( param.Equals( "abort", StringComparison.OrdinalIgnoreCase ) ) { int timerId; if( cmd.NextInt( out timerId ) ) { ChatTimer timer = ChatTimer.FindTimerById( timerId ); if( timer == null || !timer.IsRunning ) { player.Message( "Given timer (#{0}) does not exist.", timerId ); } else { timer.Abort(); string abortMsg = String.Format( "&Y(Timer) {0}&Y aborted a timer with {1} left: {2}", player.ClassyName, timer.TimeLeft.ToMiniString(), timer.Message ); Chat.SendSay( player, abortMsg ); } } else { CdTimer.PrintUsage( player ); } return; } // Start a timer if( player.Info.IsMuted ) { player.MessageMuted(); return; } if( player.DetectChatSpam() ) return; TimeSpan duration; if( !param.TryParseMiniTimespan( out duration ) ) { CdTimer.PrintUsage( player ); return; } if( duration > DateTimeUtil.MaxTimeSpan ) { player.MessageMaxTimeSpan(); return; } if( duration < ChatTimer.MinDuration ) { player.Message( "Timer: Must be at least 1 second." ); return; } string sayMessage; string message = cmd.NextAll(); if( String.IsNullOrEmpty( message ) ) { sayMessage = String.Format( "&Y(Timer) {0}&Y started a {1} timer", player.ClassyName, duration.ToMiniString() ); } else { sayMessage = String.Format( "&Y(Timer) {0}&Y started a {1} timer: {2}", player.ClassyName, duration.ToMiniString(), message ); } Chat.SendSay( player, sayMessage ); ChatTimer.Start( duration, message, player.Name ); }
static void RankHandler( Player player, CommandReader cmd ) { string name = cmd.Next(); string newRankName = cmd.Next(); // Check arguments if( name == null || newRankName == null ) { CdRank.PrintUsage( player ); player.Message( "See &H/Ranks&S for list of ranks." ); return; } // Parse rank name Rank newRank = RankManager.FindRank( newRankName ); if( newRank == null ) { player.MessageNoRank( newRankName ); return; } if( name == "-" ) { if( player.LastUsedPlayerName != null ) { name = player.LastUsedPlayerName; } else { player.Message( "Cannot repeat player name: you haven't used any names yet." ); return; } } PlayerInfo targetInfo; // Find player by name if( name.StartsWith( "!" ) ) { name = name.Substring( 1 ); Player target = Server.FindPlayerExact( player, name, false ); if( target == null ) { player.MessageNoPlayer( name ); return; } targetInfo = target.Info; } else { targetInfo = PlayerDB.FindPlayerInfoExact( name ); } // Handle non-existent players if( targetInfo == null ) { if( !player.Can( Permission.EditPlayerDB ) ) { player.MessageNoPlayer( name ); return; } if( !Player.IsValidName( name ) ) { player.MessageInvalidPlayerName( name ); CdRank.PrintUsage( player ); return; } if( cmd.IsConfirmed ) { if( newRank > RankManager.DefaultRank ) { targetInfo = PlayerDB.AddFakeEntry( name, RankChangeType.Promoted ); } else { targetInfo = PlayerDB.AddFakeEntry( name, RankChangeType.Demoted ); } } else { Logger.Log( LogType.UserActivity, "Rank: Asked {0} to confirm adding unrecognized name \"{1}\" to the database.", player.Name, name ); player.Confirm( cmd, "Warning: Player \"{0}\" is not in the database (possible typo). Type the full name or", name ); return; } } try { player.LastUsedPlayerName = targetInfo.Name; targetInfo.ChangeRank( player, newRank, cmd.NextAll(), true, true, false ); } catch( PlayerOpException ex ) { player.Message( ex.MessageColored ); } }
static void StaffHandler( Player player, CommandReader cmd ) { if( player.Info.IsMuted ) { player.MessageMuted(); return; } if( player.DetectChatSpam() ) return; string message = cmd.NextAll().Trim( ' ' ); if( message.Length > 0 ) { Chat.SendStaff( player, message ); } }