diff --git a/MCGalaxy/Commands/Moderation/CmdFreeze.cs b/MCGalaxy/Commands/Moderation/CmdFreeze.cs index 1d670bff0..69e12db76 100644 --- a/MCGalaxy/Commands/Moderation/CmdFreeze.cs +++ b/MCGalaxy/Commands/Moderation/CmdFreeze.cs @@ -34,15 +34,15 @@ namespace MCGalaxy.Commands.Moderation { Player who = PlayerInfo.FindMatches(p, args[0]); if (who == null) return; - if (p == who) { Player.Message(p, "Cannot freeze yourself."); return; } - if (p != null && who.Rank >= p.Rank) { - MessageTooHighRank(p, "freeze", false); return; - } + if (p != null && p == who) { Player.Message(p, "Cannot freeze yourself."); return; } + if (p != null && who.Rank >= p.Rank) { MessageTooHighRank(p, "freeze", false); return; } TimeSpan duration = TimeSpan.Zero; if (!CommandParser.GetTimespan(p, args[1], ref duration, "freeze for", 'm')) return; + string reason = args.Length > 2 ? args[2] : ""; reason = ModActionCmd.ExpandReason(p, reason); + if (reason == null) return; ModActionType actionType = who.frozen ? ModActionType.Unfrozen : ModActionType.Frozen; ModAction action = new ModAction(who.name, p, actionType, reason, duration); @@ -52,6 +52,7 @@ namespace MCGalaxy.Commands.Moderation { public override void Help(Player p) { Player.Message(p, "%T/freeze [name] [timespan] "); Player.Message(p, "%HStops [name] from moving for [timespan] time, or until manually unfrozen."); + Player.Message(p, "%HFor , @number can be used as a shortcut for that rule."); } } } diff --git a/MCGalaxy/Commands/Moderation/CmdMute.cs b/MCGalaxy/Commands/Moderation/CmdMute.cs index 77dc211bf..2830170b9 100644 --- a/MCGalaxy/Commands/Moderation/CmdMute.cs +++ b/MCGalaxy/Commands/Moderation/CmdMute.cs @@ -14,7 +14,7 @@ BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Licenses for the specific language governing permissions and limitations under the Licenses. -*/ + */ using System; using System.IO; using MCGalaxy.Events; @@ -28,37 +28,44 @@ namespace MCGalaxy.Commands.Moderation { public override void Use(Player p, string message) { if (message == "") { Help(p); return; } - string[] args = message.SplitSpaces(2); - - string reason = args.Length > 1 ? args[1] : ""; - reason = ModActionCmd.ExpandReason(p, reason); - if (reason == null) return; + string[] args = message.SplitSpaces(3); Player who = PlayerInfo.FindMatches(p, args[0]); if (who == null) { - if (Server.muted.Contains(args[0])) { - ModAction action = new ModAction(args[0], p, ModActionType.Unmuted, reason); - OnModActionEvent.Call(action); - } + if (Server.muted.Contains(args[0])) Unmute(p, args[0], args); return; } if (p != null && p == who) { Player.Message(p, "You cannot mute or unmute yourself."); return; } if (who.muted) { - ModAction action = new ModAction(who.name, p, ModActionType.Unmuted, reason); - OnModActionEvent.Call(action); - } else { - if (p != null && who.Rank >= p.Rank) { - MessageTooHighRank(p, "mute", false); return; - } + Unmute(p, who.name, args); + } else { + if (p != null && who.Rank >= p.Rank) { MessageTooHighRank(p, "mute", false); return; } + if (args.Length < 2) { Help(p); return; } - ModAction action = new ModAction(who.name, p, ModActionType.Muted, reason); + TimeSpan duration = TimeSpan.Zero; + if (!CommandParser.GetTimespan(p, args[1], ref duration, "mute for", 's')) return; + + string reason = args.Length > 2 ? args[2] : ""; + reason = ModActionCmd.ExpandReason(p, reason); + if (reason == null) return; + + ModAction action = new ModAction(who.name, p, ModActionType.Muted, reason, duration); OnModActionEvent.Call(action); } } + + static void Unmute(Player p, string name, string[] args) { + string reason = args.Length > 1 ? args[1] : ""; + reason = ModActionCmd.ExpandReason(p, reason); + if (reason == null) return; + + ModAction action = new ModAction(name, p, ModActionType.Unmuted, reason); + OnModActionEvent.Call(action); + } public override void Help(Player p) { - Player.Message(p, "%T/mute [player] "); + Player.Message(p, "%T/mute [player] [timespan] "); Player.Message(p, "%HMutes or unmutes that player."); Player.Message(p, "%HFor , @number can be used as a shortcut for that rule."); } diff --git a/MCGalaxy/Commands/Moderation/CmdXmute.cs b/MCGalaxy/Commands/Moderation/CmdXmute.cs deleted file mode 100644 index 2654f5afd..000000000 --- a/MCGalaxy/Commands/Moderation/CmdXmute.cs +++ /dev/null @@ -1,63 +0,0 @@ -/* - Copyright 2011 MCForge - - Written by GamezGalaxy (hypereddie10) - - Licensed under the - Educational Community License, Version 2.0 (the "License"); you may - not use this file except in compliance with the License. You may - obtain a copy of the License at - - http://www.opensource.org/licenses/ecl2.php - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an "AS IS" - BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - or implied. See the License for the specific language governing - permissions and limitations under the License. -*/ -using System; -using System.Threading; - -namespace MCGalaxy.Commands.Moderation { - public sealed class CmdXmute : Command { - public override string name { get { return "xmute"; } } - public override string type { get { return CommandTypes.Moderation; } } - public override bool museumUsable { get { return false; } } - public override LevelPermission defaultRank { get { return LevelPermission.Operator; } } - - public override void Use(Player p, string message) { - if (message == "") { Help(p); return; } - if (p == null) { - Player.Message(p, "This command can only be used in-game. Use /mute [Player] instead."); return; - } - - string[] args = message.SplitSpaces(); - Player muter = PlayerInfo.FindMatches(p, args[0]); - if (muter == null) return; - - if (p != null && muter.group.Permission > p.Rank) { - MessageTooHighRank(p, "xmute", true); return; - } - if (p == muter) { - Player.Message(p, "You cannot use xmute on yourself!"); return; - } - Command.all.Find("mute").Use(p, muter.name); - - int time = 120; - if (args.Length > 1 && !CommandParser.GetInt(p, args[1], "Time", ref time, 1)) return; - - Chat.MessageGlobal("{0} %Shas been muted for {1} seconds", muter.ColoredName, time); - Player.Message(muter, "You have been muted for " + time + " seconds"); - Thread.Sleep(time * 1000); - Command.all.Find("mute").Use(p, muter.name); - } - - public override void Help(Player p) { - Player.Message(p, "%T/xmute [player] [seconds]"); - Player.Message(p, "%HMutes [player] for [seconds] seconds"); - } - } -} - - diff --git a/MCGalaxy/CorePlugin/ModActionHandler.cs b/MCGalaxy/CorePlugin/ModActionHandler.cs index cad7336a6..32d517da7 100644 --- a/MCGalaxy/CorePlugin/ModActionHandler.cs +++ b/MCGalaxy/CorePlugin/ModActionHandler.cs @@ -61,8 +61,7 @@ namespace MCGalaxy.Core { if (who != null) who.frozen = true; LogAction(e, who, "&bfrozen"); - string data = FormatModTaskData(e); - Server.frozen.AddOrReplace(e.Target, data); + Server.frozen.AddOrReplace(e.Target, FormatModTaskData(e)); ModerationTasks.FreezeCalcNextRun(); Server.frozen.Save(); } @@ -107,21 +106,23 @@ namespace MCGalaxy.Core { static void DoMute(ModAction e) { - Player who = PlayerInfo.FindExact(e.Target); - Server.muted.AddIfNotExists(e.Target); - Server.muted.Save(); - + Player who = PlayerInfo.FindExact(e.Target); if (who != null) who.muted = true; LogAction(e, who, "&8muted"); + + Server.muted.AddOrReplace(e.Target, FormatModTaskData(e)); + ModerationTasks.MuteCalcNextRun(); + Server.muted.Save(); } static void DoUnmute(ModAction e) { Player who = PlayerInfo.FindExact(e.Target); - Server.muted.Remove(e.Target); - Server.muted.Save(); - if (who != null) who.muted = false; LogAction(e, who, "&aun-muted"); + + Server.muted.Remove(e.Target); + ModerationTasks.MuteCalcNextRun(); + Server.muted.Save(); } @@ -249,7 +250,11 @@ namespace MCGalaxy.Core { static string FormatModTaskData(ModAction e) { long assign = DateTime.UtcNow.ToUnixTime(); - long expiry = DateTime.UtcNow.Add(e.Duration).ToUnixTime(); + DateTime expiryTime = DateTime.UtcNow.Add(e.Duration); + if (e.Duration == TimeSpan.Zero) + expiryTime = DateTime.MaxValue; + + long expiry = expiryTime.ToUnixTime(); string assigner = e.Actor == null ? "(console)" : e.Actor.name; return assigner + " " + assign + " " + expiry; } diff --git a/MCGalaxy/MCGalaxy_.csproj b/MCGalaxy/MCGalaxy_.csproj index 25d402ab9..9334eee28 100644 --- a/MCGalaxy/MCGalaxy_.csproj +++ b/MCGalaxy/MCGalaxy_.csproj @@ -327,7 +327,6 @@ - diff --git a/MCGalaxy/Player/SpamChecker.cs b/MCGalaxy/Player/SpamChecker.cs index 9593d1dbe..4ea83341f 100644 --- a/MCGalaxy/Player/SpamChecker.cs +++ b/MCGalaxy/Player/SpamChecker.cs @@ -14,6 +14,7 @@ permissions and limitations under the Licenses. */ using System; using System.Collections.Generic; +using MCGalaxy.Events; using MCGalaxy.Tasks; namespace MCGalaxy { @@ -59,10 +60,9 @@ namespace MCGalaxy { if (chatLog.AddSpamEntry(Server.spamcounter, Server.spamcountreset)) return false; - Command.all.Find("mute").Use(null, p.name); - Chat.MessageGlobal("{0} %Shas been &0muted %Sfor spamming!", p.ColoredName); - Server.MainScheduler.QueueOnce(UnmuteTask, p.name, - TimeSpan.FromSeconds(Server.mutespamtime)); + TimeSpan duration = TimeSpan.FromSeconds(Server.mutespamtime); + ModAction action = new ModAction(p.name, null, ModActionType.Muted, "&0Auto mute for spamming", duration); + OnModActionEvent.Call(action); return true; } } @@ -80,19 +80,5 @@ namespace MCGalaxy { return true; } } - - - static void UnmuteTask(SchedulerTask task) { - string name = (string)task.State; - Player who = PlayerInfo.FindExact(name); - - if (who != null) { - if (who.muted) Command.all.Find("mute").Use(null, who.name); - Player.Message(who, "Remember, no &cspamming %Snext time!"); - } else { - Server.muted.Remove(name); - Server.muted.Save(); - } - } } } diff --git a/MCGalaxy/Server/Server.Fields.cs b/MCGalaxy/Server/Server.Fields.cs index 9920e12cb..6cde55344 100644 --- a/MCGalaxy/Server/Server.Fields.cs +++ b/MCGalaxy/Server/Server.Fields.cs @@ -78,10 +78,10 @@ namespace MCGalaxy { public static bool UseCTF = false; public static bool ServerSetupFinished = false; public static CTFGame ctf = null; - public static PlayerList bannedIP, whiteList, ircControllers, muted, invalidIds; + public static PlayerList bannedIP, whiteList, ircControllers, invalidIds; public static PlayerList ignored, hidden, agreed, vip, noEmotes, lockdown; public static PlayerExtList models, skins, reach, rotations; - public static PlayerExtList frozen, jailed, tempBans, tempRanks; + public static PlayerExtList frozen, muted, jailed, tempBans, tempRanks; public static readonly List Devs = new List(), Mods = new List(); diff --git a/MCGalaxy/Server/Server.Init.cs b/MCGalaxy/Server/Server.Init.cs index 1cadb307d..75181936e 100644 --- a/MCGalaxy/Server/Server.Init.cs +++ b/MCGalaxy/Server/Server.Init.cs @@ -60,7 +60,6 @@ namespace MCGalaxy { bannedIP = PlayerList.Load("banned-ip.txt"); ircControllers = PlayerList.Load("IRC_Controllers.txt"); - muted = PlayerList.Load("muted.txt"); hidden = PlayerList.Load("hidden.txt"); vip = PlayerList.Load("text/vip.txt"); noEmotes = PlayerList.Load("text/emotelist.txt"); @@ -72,6 +71,7 @@ namespace MCGalaxy { invalidIds = PlayerList.Load("extra/invalidids.txt"); rotations = PlayerExtList.Load("extra/rotations.txt"); + muted = PlayerExtList.Load("ranks/muted.txt"); frozen = PlayerExtList.Load("ranks/frozen.txt"); tempRanks = PlayerExtList.Load(Paths.TempRanksFile); tempBans = PlayerExtList.Load(Paths.TempBansFile); diff --git a/MCGalaxy/Server/Tasks/ModerationTasks.cs b/MCGalaxy/Server/Tasks/ModerationTasks.cs index e2e544d46..2e787ddd9 100644 --- a/MCGalaxy/Server/Tasks/ModerationTasks.cs +++ b/MCGalaxy/Server/Tasks/ModerationTasks.cs @@ -22,12 +22,14 @@ using MCGalaxy.Events; namespace MCGalaxy.Tasks { internal static class ModerationTasks { - static SchedulerTask temprankTask, freezeTask; + static SchedulerTask temprankTask, freezeTask, muteTask; internal static void QueueTasks() { temprankTask = Server.MainScheduler.QueueRepeat( TemprankCheckTask, null, NextRun(Server.tempRanks)); freezeTask = Server.MainScheduler.QueueRepeat( FreezeCheckTask, null, NextRun(Server.frozen)); + muteTask = Server.MainScheduler.QueueRepeat( + MuteCheckTask, null, NextRun(Server.muted)); } @@ -35,9 +37,7 @@ namespace MCGalaxy.Tasks { DoTask(task, Server.tempRanks, TemprankCallback); } - internal static void TemprankCalcNextRun() { - CalcNextRun(temprankTask, Server.tempRanks); - } + internal static void TemprankCalcNextRun() { CalcNextRun(temprankTask, Server.tempRanks); } static void TemprankCallback(string[] args) { Command.all.Find("temprank").Use(null, args[0] + " delete"); @@ -50,18 +50,28 @@ namespace MCGalaxy.Tasks { internal static void FreezeCheckTask(SchedulerTask task) { DoTask(task, Server.frozen, FreezeCallback); - } - - internal static void FreezeCalcNextRun() { - CalcNextRun(freezeTask, Server.frozen); } + internal static void FreezeCalcNextRun() { CalcNextRun(freezeTask, Server.frozen); } + static void FreezeCallback(string[] args) { ModAction action = new ModAction(args[0], null, ModActionType.Unfrozen, "auto unfreeze"); OnModActionEvent.Call(action); } + internal static void MuteCheckTask(SchedulerTask task) { + DoTask(task, Server.muted, MuteCallback); + } + + internal static void MuteCalcNextRun() { CalcNextRun(muteTask, Server.muted); } + + static void MuteCallback(string[] args) { + ModAction action = new ModAction(args[0], null, ModActionType.Unmuted, "auto unmute"); + OnModActionEvent.Call(action); + } + + static void DoTask(SchedulerTask task, PlayerExtList list, Action callback) { List lines = list.AllLines(); foreach (string line in lines) {