mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 02:54:41 +01:00
Migrates SSinstancing to Redis from world.Export() (#17679)
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
// Like asay but global between instances!
|
||||
// *Insert changeling hivemind :g joke here*
|
||||
|
||||
// TODO - May as well fold this into regular asay. We already have it global enough with the discord integration.
|
||||
// Same with msay
|
||||
/client/proc/gsay(msg as text)
|
||||
set name = "gsay"
|
||||
set hidden = TRUE
|
||||
@@ -10,18 +12,16 @@
|
||||
|
||||
if(!msg)
|
||||
return
|
||||
|
||||
// Sanitize it all
|
||||
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
|
||||
|
||||
// To whoever says "Why dont you just topic the full message with formatting"
|
||||
// This lets us use this in other apps, like a discord bot, without HTML parsing
|
||||
// It also removes a way to put whatever HTML we want in the chat window
|
||||
var/built_topic = "gsay&msg=[url_encode(msg)]&usr=[url_encode(usr.ckey)]&src=[url_encode(GLOB.configuration.system.instance_id)]"
|
||||
var/datum/server_command/gsay/GS = SSinstancing.registered_commands["gsay"]
|
||||
GS.custom_dispatch(usr.ckey, msg)
|
||||
|
||||
// Send to peers
|
||||
SSinstancing.topic_all_peers(built_topic)
|
||||
// Send to online admins
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(R_ADMIN & C.holder.rights)
|
||||
if(C.holder.rights & R_ADMIN)
|
||||
to_chat(C, "<span class='admin_channel'>GSAY: [usr.ckey]@[GLOB.configuration.system.instance_id]: [msg]</span>")
|
||||
|
||||
SSblackbox.record_feedback("tally", "admin_verb", 1, "gsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/datum/redis_callback/server_messages
|
||||
channel = SERVER_MESSAGES_REDIS_CHANNEL
|
||||
|
||||
/datum/redis_callback/server_messages/on_message(message)
|
||||
// Decode
|
||||
var/list/data = json_decode(message)
|
||||
// And fire
|
||||
SSinstancing.execute_command(data["src"], data["cmd"], data["args"])
|
||||
@@ -0,0 +1,18 @@
|
||||
/datum/server_command/gsay
|
||||
command_name = "gsay"
|
||||
|
||||
/datum/server_command/gsay/execute(source, command_args)
|
||||
var/message = command_args["msg"]
|
||||
var/user = command_args["usr"]
|
||||
|
||||
// Send to online admins
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(C.holder.rights & R_ADMIN)
|
||||
to_chat(C, "<span class='admin_channel'>GSAY: [user]@[source]: [message]</span>")
|
||||
|
||||
/datum/server_command/gsay/custom_dispatch(ackey, message)
|
||||
var/list/cmd_args = list()
|
||||
cmd_args["usr"] = ackey
|
||||
cmd_args["msg"] = message
|
||||
|
||||
dispatch(cmd_args)
|
||||
@@ -0,0 +1,20 @@
|
||||
/datum/server_command/new_round_announce
|
||||
command_name = "new_round_announce"
|
||||
|
||||
/datum/server_command/new_round_announce/execute(source, command_args)
|
||||
var/server_name = command_args["sname"]
|
||||
var/map_name = command_args["mname"]
|
||||
var/map_fluff = command_args["mfluff"]
|
||||
|
||||
var/startup_msg = "The server <code>[server_name] ([source])</code> is now starting up. The map is [map_fluff] ([map_name]). You can connect with the <code>Switch Server</code> verb."
|
||||
|
||||
to_chat(world, "<center><span class='boldannounce'><big>Attention</big></span></center><hr>[startup_msg]<hr>")
|
||||
SEND_SOUND(world, sound('sound/misc/notice2.ogg')) // Same as captains priority announce
|
||||
|
||||
/datum/server_command/new_round_announce/custom_dispatch(sname, mname, mfluff)
|
||||
var/list/cmd_args = list()
|
||||
cmd_args["sname"] = sname
|
||||
cmd_args["mname"] = mname
|
||||
cmd_args["mfluff"] = mfluff
|
||||
|
||||
dispatch(cmd_args)
|
||||
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* # Server Command
|
||||
*
|
||||
* Datum to handle both sending and receiving of server commands
|
||||
*
|
||||
* This datum is an extension of the redis callback and is designed for tighter integration with the BYOND servers.
|
||||
* This list is registered and managed by SSintancing, not SSredis.
|
||||
* NOTE: These commands are "fire and forget". If you need specific data from each server, use world/Topic still
|
||||
*/
|
||||
/datum/server_command
|
||||
/// Does the sending server want to ignore this command? This is almost always yes unless you are doing testing stuff
|
||||
var/ignoreself = TRUE
|
||||
/// The source BYOND server for this message
|
||||
var/source = null
|
||||
/// The command name (must be unique)
|
||||
var/command_name = null
|
||||
/// Associative list of command args
|
||||
var/list/command_args = list()
|
||||
|
||||
/datum/server_command/proc/execute(source, command_args)
|
||||
CRASH("execute(source, command_args) not overriden for [type]!")
|
||||
|
||||
/datum/server_command/proc/dispatch(command_args)
|
||||
SHOULD_NOT_OVERRIDE(TRUE) // No messing with
|
||||
|
||||
// Aight get serializing
|
||||
var/list/serializeable_data = list()
|
||||
serializeable_data["src"] = GLOB.configuration.system.instance_id
|
||||
serializeable_data["cmd"] = command_name
|
||||
serializeable_data["args"] = command_args
|
||||
|
||||
var/payload = json_encode(serializeable_data)
|
||||
|
||||
SSredis.publish(SERVER_MESSAGES_REDIS_CHANNEL, payload)
|
||||
|
||||
// Override this if you want a cleaner method for putting together dispatch args
|
||||
/datum/server_command/proc/custom_dispatch()
|
||||
CRASH("custom_dispatch() not overriden for [type]!")
|
||||
@@ -1,18 +0,0 @@
|
||||
// Just dumps the text in the admin chat box
|
||||
/datum/world_topic_handler/gsay
|
||||
topic_key = "gsay"
|
||||
requires_commskey = TRUE
|
||||
|
||||
/datum/world_topic_handler/gsay/execute(list/input, key_valid)
|
||||
if(!input["msg"] || !input["usr"] || !input["src"])
|
||||
return json_encode(list("error" = "Malformed request"))
|
||||
|
||||
var/message = input["msg"]
|
||||
var/user = input["usr"]
|
||||
var/source = input["src"]
|
||||
|
||||
// Send to online admins
|
||||
for(var/client/C in GLOB.admins)
|
||||
if(R_ADMIN & C.holder.rights)
|
||||
to_chat(C, "<span class='admin_channel'>GSAY: [user]@[source]: [message]</span>")
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
/datum/world_topic_handler/instance_announce
|
||||
topic_key = "instance_announce"
|
||||
requires_commskey = TRUE
|
||||
|
||||
/datum/world_topic_handler/instance_announce/execute(list/input, key_valid)
|
||||
var/msg = input["msg"]
|
||||
to_chat(world, "<center><span class='boldannounce'><big>Attention</big></span></center><hr>[msg]<hr>")
|
||||
SEND_SOUND(world, sound('sound/misc/notice2.ogg')) // Same as captains priority announce
|
||||
Reference in New Issue
Block a user