diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index 7207f878614a..b74275d2cee2 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -19,7 +19,7 @@
var/motd
var/policy
- var/static/regex/ic_filter_regex
+ var/static/regex/word_filter_regex
var/is_loaded = FALSE
@@ -315,21 +315,21 @@
/datum/controller/configuration/proc/LoadChatFilter()
- var/list/in_character_filter = list()
+ var/list/word_filter = list()
- if(!fexists("[directory]/in_character_filter.txt"))
+ if(!fexists("[directory]/word_filter.txt"))
return
- log_config("Loading config file in_character_filter.txt...")
+ log_config("Loading config file word_filter.txt...")
- for(var/line in file2list("[directory]/in_character_filter.txt"))
+ for(var/line in file2list("[directory]/word_filter.txt"))
if(!line)
continue
if(findtextEx(line,"#",1,2))
continue
- in_character_filter += REGEX_QUOTE(line)
+ word_filter += REGEX_QUOTE(line)
- ic_filter_regex = length(in_character_filter) ? regex("\\b([jointext(in_character_filter, "|")])\\b", "i") : null
+ word_filter_regex = length(word_filter) ? regex("\\b([jointext(word_filter, "|")])\\b", "i") : null
//Message admins when you can.
/datum/controller/configuration/proc/DelayedMessageAdmins(text)
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index a5ecea8b05a4..4d52635c6f88 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -7,6 +7,9 @@
to_chat(src, "Guests may not use OOC.")
return
+ if(!filter_message(src, msg))
+ return
+
msg = trim(strip_html(msg))
if(!msg) return
@@ -101,6 +104,9 @@
to_chat(src, "Guests may not use LOOC.")
return
+ if(!filter_message(src, msg))
+ return
+
msg = trim(strip_html(msg))
if(!msg) return
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index b9a972bda5c2..04e93095f42d 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -12,6 +12,9 @@
if (src.client.handle_spam_prevention(message, MUTE_DEADCHAT))
return
+ if(!filter_message(client, message))
+ return
+
. = src.say_dead(message)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 7f3af1449266..5bd2b4283c86 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -62,6 +62,24 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
/proc/prefix_to_channel(prefix)
return GLOB.department_radio_keys[prefix]
+/proc/filter_message(client/user, message)
+ if(!config.word_filter_regex)
+ return TRUE
+
+ if(config.word_filter_regex.Find(message))
+ to_chat(user,
+ html = "\n-- Word Filter Message --",
+ )
+ to_chat(user,
+ type = MESSAGE_TYPE_ADMINPM,
+ html = "\nYour message has been automatically filtered due to its contents. Trying to circumvent this filter will get you banned.",
+ )
+ SEND_SOUND(user, sound('sound/effects/adminhelp_new.ogg'))
+ log_admin("[user.ckey] triggered the chat filter with the following message: [message].")
+ return FALSE
+
+ return TRUE
+
///Shows custom speech bubbles for screaming, *warcry etc.
/mob/living/proc/show_speech_bubble(bubble_name, bubble_type = bubble_icon)
@@ -81,6 +99,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if(SEND_SIGNAL(src, COMSIG_LIVING_SPEAK, message, speaking, verb, alt_name, italics, message_range, speech_sound, sound_vol, nolog, message_mode) & COMPONENT_OVERRIDE_SPEAK) return
+ if(!filter_message(src, message))
+ return
+
message = process_chat_markup(message, list("~", "_"))
for(var/dst=0; dst<=1; dst++) //Will run twice if src has a clone
diff --git a/config/example/config.txt b/config/example/config.txt
index d63e6822465c..07dfe6f1b839 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -257,4 +257,4 @@ CLIENT_ERROR_VERSION 514
## GITHUB API
#GITHUB_APP_API
#REPO_NAME cmss13
-#ORG cmss13-devs
\ No newline at end of file
+#ORG cmss13-devs
diff --git a/config/example/word_filter.txt b/config/example/word_filter.txt
new file mode 100644
index 000000000000..aab5cae627fa
--- /dev/null
+++ b/config/example/word_filter.txt
@@ -0,0 +1 @@
+# Words that should be filtered from being said, both IC and OOC, should be included here, one per line. Case insensitive.