Skip to content

Commit 8666b66

Browse files
Apply chat and IP filters to messages from IRC.
1 parent d836984 commit 8666b66

File tree

2 files changed

+45
-33
lines changed

2 files changed

+45
-33
lines changed

fCraft/Network/IRC.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ void HandleIrcChat(IRCMessage msg) {
373373

374374
if (ConfigKey.IRCBotForwardFromIRC.Enabled()) {
375375
if (msg.Type == IRCMessageType.ChannelAction) {
376-
TryExpandUrls(text);
376+
ProcessChatMessage(ref text);
377377

378378
foreach (Player player in Server.Players.Where(pl => pl.Info.ReadIRC)) {
379379
player.Message("&I(IRC) * {0} {1}", msg.Nick, text);
@@ -383,7 +383,7 @@ void HandleIrcChat(IRCMessage msg) {
383383
} else if (IRCHandlers.HandleCommand(ActualBotNick, msg.Nick, rawMessage)) {
384384
} else if (IRCHandlers.HandlePM(ActualBotNick, msg.Nick, rawMessage)) {
385385
} else {
386-
TryExpandUrls(text);
386+
ProcessChatMessage(ref text);
387387
string discordBotNick = ConfigKey.DiscordBotNick.GetString();
388388
string prefix = msg.Nick == discordBotNick ? "(Discord)" : "(IRC) " + msg.Nick;
389389

@@ -394,7 +394,7 @@ void HandleIrcChat(IRCMessage msg) {
394394
Logger.Log(LogType.IrcChat, "{0}: {1}: {2}", msg.Channel, msg.Nick,
395395
IRCColorsAndNonStandardCharsExceptEmotes.Replace(rawMessage, ""));
396396
} else if (msg.Message.StartsWith("#")) {
397-
TryExpandUrls(text);
397+
ProcessChatMessage(ref text);
398398
string discordBotNick = ConfigKey.DiscordBotNick.GetString();
399399
string prefix = msg.Nick == discordBotNick ? "(Discord)" : "(IRC) " + msg.Nick;
400400

@@ -406,10 +406,12 @@ void HandleIrcChat(IRCMessage msg) {
406406
}
407407
}
408408

409-
void TryExpandUrls(string msg) {
409+
void ProcessChatMessage(ref string message) {
410+
message = Chat.Filter(message, null);
410411
bool elapsed = DateTime.UtcNow.Subtract(IRCHandlers.lastUrlExpand).TotalSeconds > 5;
411412
if (elapsed) {
412-
Scheduler.NewTask(t => Chat.getUrls(msg)).RunOnce();
413+
string chatMsg = message; // cannot use message because it is ref
414+
Scheduler.NewTask(t => Chat.getUrls(chatMsg)).RunOnce();
413415
IRCHandlers.lastUrlExpand = DateTime.UtcNow;
414416
}
415417
}
@@ -937,7 +939,7 @@ static string ProcessMessageFromIRC([NotNull] string message)
937939
// strips minecraft colors and newlines
938940
message = Color.StripColors(message, false);
939941
}
940-
942+
941943
message = Chat.UnescapeBackslashes(message);
942944
return message.Trim();
943945
}

fCraft/Player/Chat.cs

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,40 @@ public static bool SendGlobal([NotNull] Player player, [NotNull] string rawMessa
2828
if (player == null) throw new ArgumentNullException("player");
2929
if (rawMessage == null) throw new ArgumentNullException("rawMessage");
3030

31-
if (!player.IsStaff) {
31+
rawMessage = Filter(rawMessage, player);
32+
if (rawMessage == null) return false;
33+
34+
var recipientList = Server.Players.NotIgnoring(player);
35+
36+
string formattedMessage = string.Format("{0}&F: {1}",
37+
player.ClassyName,
38+
rawMessage);
39+
40+
var e = new ChatSendingEventArgs(player,
41+
rawMessage,
42+
formattedMessage,
43+
ChatMessageType.Global,
44+
recipientList);
45+
46+
47+
if (!SendInternal(e)) return false;
48+
49+
Scheduler.NewTask(t => getUrls(rawMessage)).RunOnce();
50+
51+
rawMessage = Color.StripColors(rawMessage, false);
52+
checkBotResponses(player, rawMessage);
53+
54+
Logger.Log(LogType.GlobalChat,
55+
"(global){0}: {1}", player.Info.Rank.Color + player.Name + Color.White, rawMessage);
56+
return true;
57+
}
58+
59+
public static string Filter(string rawMessage, Player player) {
60+
if (player != null && !player.IsStaff) {
3261
if (player.LastMessage == new string(rawMessage.ToLower().Where(c => !char.IsWhiteSpace(c)).ToArray())) {
3362
if (player.MessageSpam >= 2) {
3463
player.Message("Please refrain from repeating yourself!");
35-
return false;
64+
return null;
3665
}
3766
player.MessageSpam++;
3867
} else {
@@ -46,16 +75,19 @@ public static bool SendGlobal([NotNull] Player player, [NotNull] string rawMessa
4675
rawMessage = rawMessage.ReplaceString(Swear.Word, Swear.Replacement, StringComparison.InvariantCultureIgnoreCase);
4776
}
4877
}
49-
if (!player.IsStaff) {
78+
if (player == null || !player.IsStaff) {
5079
rawMessage = RegexIPMatcher.Replace(rawMessage, "<Redacted IP>");
5180
}
81+
if (player == null) return rawMessage; // Checks below only work in-game
82+
5283
if (rawMessage.Length >= 10 && player.Info.Rank.MaxCaps > 0) {
5384
int caps = 0;
5485
for (int i = 0; i < rawMessage.Length; i++) {
5586
if (char.IsUpper(rawMessage[i])) {
5687
caps++;
5788
}
5889
}
90+
5991
if (player.Info.Rank.MaxCaps == 1) {
6092
if (caps > (rawMessage.Length / 2)) {
6193
rawMessage = rawMessage.ToLower().UppercaseFirst();
@@ -66,35 +98,13 @@ public static bool SendGlobal([NotNull] Player player, [NotNull] string rawMessa
6698
player.Message("Max uppercase letters reached. Message set to lowercase");
6799
}
68100
}
101+
69102
if (player.ChatRainbows) {
70103
rawMessage = Colorize(rawMessage, RainbowChars);
71104
} else if (player.ChatBWRainbows) {
72105
rawMessage = Colorize(rawMessage, BWRainbowChars);
73106
}
74-
75-
var recipientList = Server.Players.NotIgnoring(player);
76-
77-
string formattedMessage = string.Format("{0}&F: {1}",
78-
player.ClassyName,
79-
rawMessage);
80-
81-
var e = new ChatSendingEventArgs(player,
82-
rawMessage,
83-
formattedMessage,
84-
ChatMessageType.Global,
85-
recipientList);
86-
87-
88-
if (!SendInternal(e)) return false;
89-
90-
Scheduler.NewTask(t => getUrls(rawMessage)).RunOnce();
91-
92-
rawMessage = Color.StripColors(rawMessage, false);
93-
checkBotResponses(player, rawMessage);
94-
95-
Logger.Log(LogType.GlobalChat,
96-
"(global){0}: {1}", player.Info.Rank.Color + player.Name + Color.White, rawMessage);
97-
return true;
107+
return rawMessage;
98108
}
99109

100110
public static void getUrls(string rawMessage) {

0 commit comments

Comments
 (0)