mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-22 20:16:36 -04:00
Allow using @number as a shortcut for the rule by that number in [reason] for /kick /warn /ban (thanks yorkiebarz).
This commit is contained in:
parent
0436384446
commit
1d98b8703e
@ -18,11 +18,9 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace MCGalaxy.Commands.Moderation {
|
namespace MCGalaxy.Commands.Moderation {
|
||||||
public sealed class CmdBan : Command {
|
public sealed class CmdBan : ModActionCmd {
|
||||||
public override string name { get { return "ban"; } }
|
public override string name { get { return "ban"; } }
|
||||||
public override string shortcut { get { return ""; } }
|
public override string shortcut { get { return ""; } }
|
||||||
public override string type { get { return CommandTypes.Moderation; } }
|
|
||||||
public override bool museumUsable { get { return true; } }
|
|
||||||
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
|
public override LevelPermission defaultRank { get { return LevelPermission.Operator; } }
|
||||||
public CmdBan() { }
|
public CmdBan() { }
|
||||||
|
|
||||||
@ -37,11 +35,13 @@ namespace MCGalaxy.Commands.Moderation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
string[] args = message.SplitSpaces(2);
|
string[] args = message.SplitSpaces(2);
|
||||||
string reason = args.Length > 1 ? args[1] : Server.defaultBanMessage;
|
string reason = args.Length > 1 ? args[1] : Server.defaultBanMessage;
|
||||||
|
if (reason == "-") reason = "&c-";
|
||||||
|
reason = GetReason(p, reason);
|
||||||
|
if (reason == null) return;
|
||||||
string banReason = reason == "-" ? "" : " (" + reason + ")";
|
string banReason = reason == "-" ? "" : " (" + reason + ")";
|
||||||
if (reason == "-") reason = "&c-";
|
|
||||||
Player who = PlayerInfo.Find(args[0]);
|
|
||||||
|
|
||||||
|
Player who = PlayerInfo.Find(args[0]);
|
||||||
string target = who == null ? args[0] : who.name;
|
string target = who == null ? args[0] : who.name;
|
||||||
if (!ValidName(p, target, "player")) return;
|
if (!ValidName(p, target, "player")) return;
|
||||||
Group group = who == null ? Group.findPlayerGroup(args[0]) : who.group;
|
Group group = who == null ? Group.findPlayerGroup(args[0]) : who.group;
|
||||||
@ -87,6 +87,7 @@ namespace MCGalaxy.Commands.Moderation {
|
|||||||
Player.Message(p, "%T/ban <player> [reason]");
|
Player.Message(p, "%T/ban <player> [reason]");
|
||||||
Player.Message(p, "%HBans a player without kicking them.");
|
Player.Message(p, "%HBans a player without kicking them.");
|
||||||
Player.Message(p, "%HAdd # before name to stealth ban.");
|
Player.Message(p, "%HAdd # before name to stealth ban.");
|
||||||
|
Player.Message(p, "%HFor [reason], @number can be used as a shortcut for that rule.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,11 +18,9 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace MCGalaxy.Commands {
|
namespace MCGalaxy.Commands {
|
||||||
public sealed class CmdKick : Command {
|
public sealed class CmdKick : ModActionCmd {
|
||||||
public override string name { get { return "kick"; } }
|
public override string name { get { return "kick"; } }
|
||||||
public override string shortcut { get { return "k"; } }
|
public override string shortcut { get { return "k"; } }
|
||||||
public override string type { get { return CommandTypes.Moderation; } }
|
|
||||||
public override bool museumUsable { get { return true; } }
|
|
||||||
public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } }
|
public override LevelPermission defaultRank { get { return LevelPermission.AdvBuilder; } }
|
||||||
|
|
||||||
public override void Use(Player p, string message) {
|
public override void Use(Player p, string message) {
|
||||||
@ -34,6 +32,9 @@ namespace MCGalaxy.Commands {
|
|||||||
if (args.Length > 1) message = args[1];
|
if (args.Length > 1) message = args[1];
|
||||||
else if (p == null) message = "You were kicked by the console.";
|
else if (p == null) message = "You were kicked by the console.";
|
||||||
else message = "You were kicked by " + p.DisplayName + ".";
|
else message = "You were kicked by " + p.DisplayName + ".";
|
||||||
|
|
||||||
|
message = GetReason(p, message);
|
||||||
|
if (message == null) return;
|
||||||
|
|
||||||
if (p != null && p == who) { Player.Message(p, "You cannot kick yourself."); return; }
|
if (p != null && p == who) { Player.Message(p, "You cannot kick yourself."); return; }
|
||||||
if (p != null && who.Rank >= p.Rank) {
|
if (p != null && who.Rank >= p.Rank) {
|
||||||
@ -48,8 +49,9 @@ namespace MCGalaxy.Commands {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override void Help(Player p) {
|
public override void Help(Player p) {
|
||||||
Player.Message(p, "%T/kick <player> [message]");
|
Player.Message(p, "%T/kick <player> [reason]");
|
||||||
Player.Message(p, "%HKicks a player.");
|
Player.Message(p, "%HKicks a player.");
|
||||||
|
Player.Message(p, "%HFor [reason], @number can be used as a shortcut for that rule.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,11 +16,9 @@
|
|||||||
permissions and limitations under the Licenses.
|
permissions and limitations under the Licenses.
|
||||||
*/
|
*/
|
||||||
namespace MCGalaxy.Commands.Moderation {
|
namespace MCGalaxy.Commands.Moderation {
|
||||||
public sealed class CmdWarn : Command {
|
public sealed class CmdWarn : ModActionCmd {
|
||||||
public override string name { get { return "warn"; } }
|
public override string name { get { return "warn"; } }
|
||||||
public override string shortcut { get { return ""; } }
|
public override string shortcut { get { return ""; } }
|
||||||
public override string type { get { return CommandTypes.Moderation; } }
|
|
||||||
public override bool museumUsable { get { return true; } }
|
|
||||||
public override LevelPermission defaultRank { get { return LevelPermission.Builder; } }
|
public override LevelPermission defaultRank { get { return LevelPermission.Builder; } }
|
||||||
|
|
||||||
public override void Use(Player p, string message) {
|
public override void Use(Player p, string message) {
|
||||||
@ -28,6 +26,8 @@ namespace MCGalaxy.Commands.Moderation {
|
|||||||
string[] args = message.SplitSpaces(2);
|
string[] args = message.SplitSpaces(2);
|
||||||
Player who = PlayerInfo.FindMatches(p, args[0]);
|
Player who = PlayerInfo.FindMatches(p, args[0]);
|
||||||
string reason = args.Length == 1 ? "you know why." : args[1];
|
string reason = args.Length == 1 ? "you know why." : args[1];
|
||||||
|
reason = GetReason(p, reason);
|
||||||
|
if (reason == null) return;
|
||||||
|
|
||||||
if (who == null) { WarnOffline(p, args); return; }
|
if (who == null) { WarnOffline(p, args); return; }
|
||||||
if (who == p) { Player.Message(p, "you can't warn yourself"); return; }
|
if (who == p) { Player.Message(p, "you can't warn yourself"); return; }
|
||||||
@ -70,8 +70,9 @@ namespace MCGalaxy.Commands.Moderation {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override void Help(Player p) {
|
public override void Help(Player p) {
|
||||||
Player.Message(p, "%T/warn <player> <reason>");
|
Player.Message(p, "%T/warn [player] [reason]");
|
||||||
Player.Message(p, "%HWarns a player. Players are kicked after 3 warnings.");
|
Player.Message(p, "%HWarns a player. Players are kicked after 3 warnings.");
|
||||||
|
Player.Message(p, "%HFor [reason], @number can be used as a shortcut for that rule.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
75
Commands/Moderation/ModActionCmd.cs
Normal file
75
Commands/Moderation/ModActionCmd.cs
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015 MCGalaxy
|
||||||
|
|
||||||
|
Dual-licensed under the Educational Community License, Version 2.0 and
|
||||||
|
the GNU General Public License, Version 3 (the "Licenses"); you may
|
||||||
|
not use this file except in compliance with the Licenses. You may
|
||||||
|
obtain a copy of the Licenses at
|
||||||
|
|
||||||
|
http://www.opensource.org/licenses/ecl2.php
|
||||||
|
http://www.gnu.org/licenses/gpl-3.0.html
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the Licenses are distributed on an "AS IS"
|
||||||
|
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.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace MCGalaxy.Commands {
|
||||||
|
public abstract class ModActionCmd : Command {
|
||||||
|
public override string type { get { return CommandTypes.Moderation; } }
|
||||||
|
public override bool museumUsable { get { return true; } }
|
||||||
|
|
||||||
|
protected string GetReason(Player p, string reason) {
|
||||||
|
if (reason.Length == 0 || reason[0] != '@') return reason;
|
||||||
|
reason = reason.Substring(1);
|
||||||
|
int num;
|
||||||
|
if (!int.TryParse(reason, out num)) return "@" + reason;
|
||||||
|
|
||||||
|
// Treat @num as a shortcut for rule #num
|
||||||
|
Dictionary<int, string> sections = GetRuleSections();
|
||||||
|
string rule;
|
||||||
|
if (sections.TryGetValue(num, out rule)) return rule;
|
||||||
|
|
||||||
|
Player.Message(p, "No rule has number \"{0}\". Current rule numbers are: {1}",
|
||||||
|
num, sections.Keys.Join(n => n.ToString()));
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Dictionary<int, string> GetRuleSections() {
|
||||||
|
Dictionary<int, string> sections = new Dictionary<int, string>();
|
||||||
|
if (!File.Exists("text/rules.txt")) return sections;
|
||||||
|
|
||||||
|
List<string> rules = CP437Reader.ReadAllLines("text/rules.txt");
|
||||||
|
foreach (string rule in rules)
|
||||||
|
AddRule(rule, sections);
|
||||||
|
return sections;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void AddRule(string rule, Dictionary<int, string> sections) {
|
||||||
|
int num = -1;
|
||||||
|
rule = Colors.StripColors(rule);
|
||||||
|
|
||||||
|
for (int i = 0; i < rule.Length; i++) {
|
||||||
|
char c = rule[i];
|
||||||
|
bool isNumber = c >= '0' && c <= '9';
|
||||||
|
bool isLetter = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
|
||||||
|
if (!isNumber && !isLetter) continue;
|
||||||
|
// Found start of a word, but didn't find a number - assume this is a non-numbered rule
|
||||||
|
if (isLetter && num == -1) return;
|
||||||
|
|
||||||
|
if (isNumber) { // 1) Do not do X
|
||||||
|
if (num == -1) num = 0;
|
||||||
|
num *= 10; num += (c - '0');
|
||||||
|
} else {
|
||||||
|
sections[num] = rule.Substring(i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -333,6 +333,7 @@
|
|||||||
<Compile Include="Commands\Moderation\CmdXJail.cs" />
|
<Compile Include="Commands\Moderation\CmdXJail.cs" />
|
||||||
<Compile Include="Commands\Moderation\CmdXmute.cs" />
|
<Compile Include="Commands\Moderation\CmdXmute.cs" />
|
||||||
<Compile Include="Commands\Moderation\CmdZone.cs" />
|
<Compile Include="Commands\Moderation\CmdZone.cs" />
|
||||||
|
<Compile Include="Commands\Moderation\ModActionCmd.cs" />
|
||||||
<Compile Include="Commands\Moderation\RankCmd.cs" />
|
<Compile Include="Commands\Moderation\RankCmd.cs" />
|
||||||
<Compile Include="Commands\other\CmdAgree.cs" />
|
<Compile Include="Commands\other\CmdAgree.cs" />
|
||||||
<Compile Include="Commands\other\CmdAscend.cs" />
|
<Compile Include="Commands\other\CmdAscend.cs" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user