diff --git a/code/_helpers/chat.dm b/code/_helpers/chat.dm
index 976890f93a..e9ba63dc25 100644
--- a/code/_helpers/chat.dm
+++ b/code/_helpers/chat.dm
@@ -1,3 +1,69 @@
+/*
+
+Here's how to use the TGS chat system with configs
+
+send2adminchat is a simple function that broadcasts to all admin channels that are designated in TGS
+
+send2chat is a bit verbose but can be very specific
+
+In TGS3 it will always be sent to all connected designated game chats.
+
+In TGS4+ they use the new tagging system
+
+The second parameter is a string, this string should be read from a config.
+What this does is dictate which TGS channels can be sent to.
+
+For example if you have the following channels in tgs4 set up
+- Channel 1, Tag: asdf
+- Channel 2, Tag: bombay,asdf
+- Channel 3, Tag: Hello my name is asdf
+- Channel 4, No Tag
+- Channel 5, Tag: butts
+
+and you make the call:
+
+send2chat(new /datum/tgs_message_content("I sniff butts"), CONFIG_GET(string/where_to_send_sniff_butts))
+
+and the config option is set like:
+
+WHERE_TO_SEND_SNIFF_BUTTS asdf
+
+It will be sent to channels 1 and 2
+
+Alternatively if you set the config option to just:
+
+WHERE_TO_SEND_SNIFF_BUTTS
+
+it will be sent to all connected chats.
+*/
+
+/**
+ * Asynchronously sends a message to TGS chat channels.
+ *
+ * message - The [/datum/tgs_message_content] to send.
+ * channel_tag - Required. If "", the message with be sent to all connected (Game-type for TGS3) channels. Otherwise, it will be sent to TGS4 channels with that tag (Delimited by ','s).
+ * admin_only - Determines if this communication can only be sent to admin only channels.
+ */
+/proc/send2chat(datum/tgs_message_content/message, channel_tag, admin_only = FALSE)
+ set waitfor = FALSE
+ if(channel_tag == null || !world.TgsAvailable())
+ return
+
+ var/datum/tgs_version/version = world.TgsVersion()
+ if(channel_tag == "" || version.suite == 3)
+ world.TgsTargetedChatBroadcast(message, admin_only)
+ return
+
+ var/list/channels_to_use = list()
+ for(var/I in world.TgsChatChannelInfo())
+ var/datum/tgs_chat_channel/channel = I
+ var/list/applicable_tags = splittext(channel.custom_tag, ",")
+ if((!admin_only || channel.is_admin_channel) && (channel_tag in applicable_tags))
+ channels_to_use += channel
+
+ if(channels_to_use.len)
+ world.TgsChatBroadcast(message, channels_to_use)
+
/**
* Asynchronously sends a message to TGS admin chat channels.
*
diff --git a/code/_helpers/roundend.dm b/code/_helpers/roundend.dm
index eb207d7526..5222c0f07f 100644
--- a/code/_helpers/roundend.dm
+++ b/code/_helpers/roundend.dm
@@ -5,7 +5,12 @@
roundend_callbacks.InvokeAsync()
LAZYCLEARLIST(round_end_events)
- to_chat(world, span_filter_system("
A round of [mode.name] has ended!
"))
+ to_chat(world, span_filter_system("
The round has ended.
"))
+ log_game("The round has ended.")
+ for(var/channel_tag in CONFIG_GET(str_list/channel_announce_end_game))
+ send2chat(new /datum/tgs_message_content("[GLOB.round_id ? "Round [GLOB.round_id]" : "The round has"] just ended."), channel_tag)
+ send2adminchat("Server", "Round just ended.")
+
for(var/mob/Player in GLOB.player_list)
if(Player.mind && !isnewplayer(Player))
if(Player.stat != DEAD)
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index 62a083c301..0eb8659082 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -824,6 +824,16 @@
/datum/config_entry/flag/discord_ahelps_all
default = FALSE
+/datum/config_entry/str_list/channel_announce_new_game
+
+/datum/config_entry/str_list/channel_announce_end_game
+
+/datum/config_entry/str_list/chat_new_game_notifications
+
+/// validate ownership of admin flags for chat commands
+/datum/config_entry/flag/secure_chat_commands
+ default = FALSE
+
/datum/config_entry/number/mc_tick_rate/base_mc_tick_rate
integer = FALSE
default = 1
diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm
index 1fde558fb6..8b09845462 100644
--- a/code/controllers/subsystems/ticker.dm
+++ b/code/controllers/subsystems/ticker.dm
@@ -100,8 +100,8 @@ SUBSYSTEM_DEF(ticker)
for(var/client/C in GLOB.clients)
window_flash(C, ignorepref = TRUE) //let them know lobby has opened up.
to_chat(world, span_boldnotice("Welcome to [station_name()]!"))
- //for(var/channel_tag in CONFIG_GET(str_list/channel_announce_new_game))
- // send2chat(new /datum/tgs_message_content("New round starting on [SSmapping.current_map.map_name]!"), channel_tag)
+ for(var/channel_tag in CONFIG_GET(str_list/channel_announce_new_game))
+ send2chat(new /datum/tgs_message_content("New round starting on [using_map.full_name] ([using_map.name])!"), channel_tag)
current_state = GAME_STATE_PREGAME
SEND_SIGNAL(src, COMSIG_TICKER_ENTER_PREGAME)
diff --git a/config/example/config.txt b/config/example/config.txt
index a1a8da2c91..abaa7028e3 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -613,6 +613,26 @@ JUKEBOX_TRACK_FILES config/jukebox.json
#Turn this on if you want all admin-PMs to go to be sent to discord, and not only the first message of a ticket.
#DISCORD_AHELPS_ALL
+## Game Chat Message Options
+## Various messages to be sent to connected chat channels.
+## Uncommenting these will enable them, by default they will be broadcast to Game chat channels on TGS3 or non-admin channels on TGS>=4.
+## If using TGS>=4, the string option can be set as one of more chat channel tags (separated by ','s) to limit the message to channels with that tag name (case-sensitive). This will have no effect on TGS3.
+## You can also specify multiple channel tags by using the config option multiple times,
+## i.e. CHANNEL_ANNOUNCE_NEW_GAME chat_channel_tag_1
+## i.e. CHANNEL_ANNOUNCE_NEW_GAME chat_channel_tag_2
+
+## Which channels will have a message about a new game starting, message includes the station name.
+#CHANNEL_ANNOUNCE_NEW_GAME
+
+## Which channels will have a message about a new game starting, message includes the round ID of the game that has just ended.
+#CHANNEL_ANNOUNCE_END_GAME
+
+## Ping users who use the `notify` command when a new game starts.
+#CHAT_NEW_GAME_NOTIFICATIONS
+
+## Uncomment this flag to validate admin commands from discord by requiring they come from linked discord accounts and that those discord accounts link to a ckey with the right admin permissions.
+# SECURE_CHAT_COMMANDS
+
###Master Controller High Pop Mode###
##The Master Controller(MC) is the primary system controlling timed tasks and events in SS13 (lobby timer, game checks, lighting updates, atmos, etc)
@@ -665,4 +685,4 @@ TOAST_NOTIFICATION_ON_INIT
#ALLOW_TRACY_START
## Uncomment to allow admins with +DEBUG to queue the next round to run the byond-tracy profiler.
-#ALLOW_TRACY_QUEUE
\ No newline at end of file
+#ALLOW_TRACY_QUEUE