Replaces panic bunker with queue server

This commit is contained in:
AffectedArc07
2021-08-13 22:24:25 +01:00
parent a3bb1c0313
commit 42ebe326a6
11 changed files with 149 additions and 23 deletions
+2 -1
View File
@@ -45,7 +45,8 @@
// Subsystems shutdown in the reverse of the order they initialize in
// The numbers just define the ordering, they are meaningless otherwise.
#define INIT_ORDER_PROFILER 101
#define INIT_ORDER_TITLE 100 // Load this quickly so people dont see a blank lobby screen
#define INIT_ORDER_QUEUE 100 // Load this quickly so people cant queue skip
#define INIT_ORDER_TITLE 99 // Load this quickly so people dont see a blank lobby screen
#define INIT_ORDER_GARBAGE 21
#define INIT_ORDER_DBCORE 20
#define INIT_ORDER_BLACKBOX 19
-2
View File
@@ -50,8 +50,6 @@ GLOBAL_VAR_INIT(copier_items_printed_logged, FALSE)
GLOBAL_DATUM_INIT(data_core, /datum/datacore, new) // Station datacore, manifest, etc
GLOBAL_VAR_INIT(panic_bunker_enabled, FALSE) // Is the panic bunker enabled
GLOBAL_LIST_EMPTY(ability_verbs) // Create-level abilities
GLOBAL_LIST_INIT(pipe_colors, list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE))
@@ -14,8 +14,6 @@
var/lobby_time = 240
/// Ban all Guest BYOND accounts
var/guest_ban = TRUE
/// Player threshold to automatically enable panic bunker
var/panic_bunker_threshold = 150
/// Allow players to use AntagHUD?
var/allow_antag_hud = TRUE
/// Forbid players from rejoining if they use AntagHUD?
@@ -121,7 +119,6 @@
// Numbers
CONFIG_LOAD_NUM(lobby_time, data["lobby_time"])
CONFIG_LOAD_NUM(panic_bunker_threshold, data["panic_bunker_threshold"])
CONFIG_LOAD_NUM(base_loadout_points, data["base_loadout_points"])
CONFIG_LOAD_NUM(cryo_penalty_period, data["cryo_penalty_period"])
CONFIG_LOAD_NUM(minimum_client_build, data["minimum_client_build"])
@@ -0,0 +1,45 @@
#define QUEUE_DATA_FILE "data/queue_data.json"
// These are defines for the sake of making sure we get the right keys
#define QUEUE_DATA_FILE_THRESHOLD_KEY "threshold"
#define QUEUE_DATA_FILE_ENABLED_KEY "enabled"
#define QUEUE_DATA_FILE_PERSISTENT_KEY "persistent"
SUBSYSTEM_DEF(queue)
name = "Server Queue"
init_order = INIT_ORDER_QUEUE // 100
flags = SS_NO_FIRE
/// Threshold of players to queue new people
var/queue_threshold = 0
/// Whether the queue is enabled or not
var/queue_enabled = FALSE
/// Whether to persist these settings over multiple rounds
var/persist_queue = FALSE
/// List of ckeys allowed to bypass queue this round
var/list/queue_bypass_list = list()
/// Last world.time we let a ckey in. 3 second delay between each letin to avoid a mass bubble
var/last_letin_time = 0
/datum/controller/subsystem/queue/Initialize(start_timeofday)
if(fexists(QUEUE_DATA_FILE))
try
var/F = file2text(QUEUE_DATA_FILE)
var/list/data = json_decode(F)
queue_threshold = data[QUEUE_DATA_FILE_THRESHOLD_KEY]
queue_enabled = data[QUEUE_DATA_FILE_ENABLED_KEY]
persist_queue = data[QUEUE_DATA_FILE_PERSISTENT_KEY]
catch
stack_trace("Failed to load [QUEUE_DATA_FILE] from disk due to malformed JSON. You may need to setup the queue again.")
return ..()
/datum/controller/subsystem/queue/Shutdown()
// Save if persistent
if(persist_queue)
if(fexists(QUEUE_DATA_FILE))
fdel(QUEUE_DATA_FILE)
var/data = list()
data[QUEUE_DATA_FILE_THRESHOLD_KEY] = queue_threshold
data[QUEUE_DATA_FILE_ENABLED_KEY] = queue_enabled
data[QUEUE_DATA_FILE_PERSISTENT_KEY] = persist_queue
var/json_data = json_encode(data)
text2file(json_data, QUEUE_DATA_FILE)
+2 -3
View File
@@ -97,10 +97,9 @@
qdel(exist_query)
else
if(!exist_query.NextRow()) // If there isnt a row, they aint been seen before
if(GLOB.panic_bunker_enabled)
if(SSqueue && SSqueue.queue_enabled && (length(GLOB.clients) > SSqueue.queue_threshold) && !(ckey in SSqueue.queue_bypass_list)) // To the person who tells me in code review "Oh you should use ?. here". No. That logic isnt appropriate here. It needs a dedicated null check due to the length comparison.
qdel(exist_query)
var/threshold = GLOB.configuration.general.panic_bunker_threshold
return list("reason" = "panic bunker", "desc" = "Server is not accepting connections from never-before-seen players until player count is less than [threshold]. Please try again later.")
return list("reason" = "server queue", "desc" = "You seem to have managed to skip the server queue, possibly due to connecting during a restart. Please reconnect in 10 minutes. If you still cant connect, please inform the server host.")
qdel(exist_query)
+3 -1
View File
@@ -137,7 +137,9 @@ GLOBAL_LIST_INIT(admin_verbs_server, list(
/client/proc/toggle_antagHUD_restrictions,
/client/proc/set_ooc,
/client/proc/reset_ooc,
/client/proc/set_next_map
/client/proc/set_next_map,
/client/proc/manage_queue,
/client/proc/add_queue_server_bypass
))
GLOBAL_LIST_INIT(admin_verbs_debug, list(
/client/proc/cmd_admin_list_open_jobs,
+58
View File
@@ -0,0 +1,58 @@
/client/proc/manage_queue()
set name = "Manage Queue Server"
set desc = "Manage the queue server and its settings"
set category = "Server"
if(!check_rights(R_SERVER))
return
var/list/choices = list("Show Status", "Toggle Queue Server", "Set Threshold", "Toggle Setting Persistence")
var/choice = input(usr, "Please, select an option", "Queue Server Manipulation") as null|anything in choices
switch(choice)
if("Show Status")
to_chat(usr, "<b>Queue Server Status</b>")
to_chat(usr, "Enabled: <b>[SSqueue.queue_enabled ? "<font color='green'>Yes</font>" : "<font color='red'>No</font>"]</b>")
to_chat(usr, "Queue Threshold: <b>[SSqueue.queue_threshold]</b>")
to_chat(usr, "Setting Persistence: <b>[SSqueue.persist_queue ? "<font color='green'>Yes</font>" : "<font color='red'>No</font>"]</b>")
if("Toggle Queue Server")
SSqueue.queue_enabled = !SSqueue.queue_enabled
to_chat(usr, "Queue server is now <b>[SSqueue.queue_enabled ? "<font color='green'>Enabled</font>" : "<font color='red'>Disabled</font>"]</b>")
message_admins("[key_name_admin(usr)] has [SSqueue.queue_enabled ? "enabled" : "disabled"] the server queue.")
log_admin("[key_name(usr)] has [SSqueue.queue_enabled ? "enabled" : "disabled"] the server queue.")
if("Set Threshold")
var/new_threshold = input(usr, "Enter new threshold", "Queue Server Manipulation", SSqueue.queue_threshold) as num|null
if(!new_threshold)
return
SSqueue.queue_threshold = new_threshold
to_chat(usr, "Queue threshold is now <b>[SSqueue.queue_threshold]</b>")
message_admins("[key_name_admin(usr)] has set the queue threshold to [SSqueue.queue_threshold].")
log_admin("[key_name(usr)] has set the queue threshold to [SSqueue.queue_threshold].")
if("Toggle Setting Persistence")
SSqueue.persist_queue = !SSqueue.persist_queue
to_chat(usr, "Queue server setting persistence is now <b>[SSqueue.persist_queue ? "<font color='green'>Enabled</font>" : "<font color='red'>Disabled</font>"]</b>")
message_admins("[key_name_admin(usr)] has [SSqueue.persist_queue ? "enabled" : "disabled"] the server queue settings persistence.")
log_admin("[key_name(usr)] has [SSqueue.persist_queue ? "enabled" : "disabled"] the server queue settings persistence.")
/client/proc/add_queue_server_bypass()
set name = "Add Queue Server Bypass"
set desc = "Allow a ckey to bypass the server queue"
set category = "Server"
if(!check_rights(R_SERVER))
return
var/bypass_ckey = input(usr, "Please, enter a ckey", "Queue Server Bypass")
if(!bypass_ckey)
return
var/clean_ckey = ckey(bypass_ckey)
if(!clean_ckey)
to_chat(usr, "Invalid ckey supplied")
return
SSqueue.queue_bypass_list.Add(clean_ckey)
message_admins("[key_name_admin(usr)] has added the ckey [clean_ckey] to the queue bypass list.")
log_admin("[key_name(usr)] has added the ckey [clean_ckey] to the queue bypass list.")
-11
View File
@@ -379,17 +379,6 @@
if(M.client)
playercount += 1
// Update the state of the panic bunker based on current playercount
var/threshold = GLOB.configuration.general.panic_bunker_threshold
if((playercount > threshold) && (GLOB.panic_bunker_enabled == FALSE))
GLOB.panic_bunker_enabled = TRUE
message_admins("Panic bunker has been automatically enabled due to playercount rising above [threshold]")
if((playercount < threshold) && (GLOB.panic_bunker_enabled == TRUE))
GLOB.panic_bunker_enabled = FALSE
message_admins("Panic bunker has been automatically disabled due to playercount dropping below [threshold]")
// Tell clients about active testmerges
if(world.TgsAvailable() && length(GLOB.revision_info.testmerges))
to_chat(src, GLOB.revision_info.get_testmerge_chatmessage(TRUE))
+36
View File
@@ -0,0 +1,36 @@
/datum/world_topic_handler/queue_status
topic_key = "queue_status"
requires_commskey = TRUE
// This topic is sent every 10 seconds from the bouncer
/datum/world_topic_handler/queue_status/execute(list/input, key_valid)
var/ckey_check = input["ckey_check"]
if(!ckey_check)
return json_encode(list("error" = "No ckey supplied"))
var/list/output_data = list()
output_data["queue_enabled"] = SSqueue.queue_enabled
// Decide whether we should hold the player in queue
// NOTE: We only queue never seen before players
if(SSqueue.queue_enabled)
// If they are in the bypass list, let em in
if(ckey_check in SSqueue.queue_bypass_list)
output_data["allow_player"] = TRUE
else // Otherwise
// If we have more than the threshold, queue
if(length(GLOB.clients) > SSqueue.queue_threshold)
output_data["allow_player"] = FALSE
else // We have less than the threshold, allow if were in the timeframe
if(world.time > (SSqueue.last_letin_time + 3 SECONDS))
output_data["allow_player"] = TRUE
SSqueue.last_letin_time = world.time
else
output_data["allow_player"] = FALSE
else
// We arent enabled. Just let them in anyway.
output_data["allow_player"] = TRUE
return json_encode(output_data)
-2
View File
@@ -301,8 +301,6 @@ allow_character_metadata = true
lobby_time = 240
# Forbid people without a BYOND account joining the server
guest_ban = true
# Player threshold before the automatic panic bunker engages
panic_bunker_threshold = 150
# Allow players to use antagHUD?
allow_antag_hud = true
# Forbid players from rejoining if they use antag hud
+3
View File
@@ -246,6 +246,7 @@
#include "code\controllers\subsystem\radiation.dm"
#include "code\controllers\subsystem\radio.dm"
#include "code\controllers\subsystem\runechat.dm"
#include "code\controllers\subsystem\server_queue.dm"
#include "code\controllers\subsystem\shuttles.dm"
#include "code\controllers\subsystem\sounds.dm"
#include "code\controllers\subsystem\spacedrift.dm"
@@ -1203,6 +1204,7 @@
#include "code\modules\admin\verbs\gimmick_team.dm"
#include "code\modules\admin\verbs\infiltratorteam_syndicate.dm"
#include "code\modules\admin\verbs\logging_view.dm"
#include "code\modules\admin\verbs\manage_queue.dm"
#include "code\modules\admin\verbs\map_template_loadverb.dm"
#include "code\modules\admin\verbs\mapping.dm"
#include "code\modules\admin\verbs\massmodvar.dm"
@@ -2508,6 +2510,7 @@
#include "code\modules\world_topic\manifest.dm"
#include "code\modules\world_topic\ping.dm"
#include "code\modules\world_topic\players.dm"
#include "code\modules\world_topic\queue_status.dm"
#include "code\modules\world_topic\status.dm"
#include "goon\code\datums\browserOutput.dm"
#include "interface\interface.dm"