KILLS STATPANEL (#4877)

Co-authored-by: VM_USER <VM_USER>
Co-authored-by: silicons <no@you.cat>
This commit is contained in:
silicons
2023-01-11 09:12:35 -06:00
committed by GitHub
co-authored by VM_USER <VM_USER> silicons
parent 55da42c20a
commit fb429e51a4
245 changed files with 2957 additions and 1926 deletions
+2 -4
View File
@@ -11,10 +11,8 @@ SUBSYSTEM_DEF(ai)
var/list/busy_z_levels = list()
var/slept_mobs = 0
/datum/controller/subsystem/ai/stat_entry(msg_prefix)
var/list/msg = list(msg_prefix)
msg += "P:[processing.len]"
..(msg.Join())
/datum/controller/subsystem/ai/stat_entry()
return ..() + " P:[length(processing)]"
/datum/controller/subsystem/ai/fire(resumed = 0)
if (!resumed)
+20 -8
View File
@@ -35,14 +35,26 @@ SUBSYSTEM_DEF(air)
// This is used to tell Travis WHERE the edges are.
var/list/startup_active_edge_log = list()
/datum/controller/subsystem/air/stat_entry(msg_prefix)
var/list/msg = list(
msg_prefix,
"\tSt: [current_step ? part_names[current_step] : ""] Z: [zones.len] E: [edges.len] ",
"\tCost: { T: [round(cost_turfs, 1)] | E: [round(cost_edges, 1)] | F: [round(cost_firezones, 1)] | H: [round(cost_hotspots, 1)] | Z: [round(cost_zones, 1)] } ",
"\tCyc: [current_cycle] U: { T: [tiles_to_update.len] | E: [active_edges.len] | F: [active_fire_zones.len] | H: [active_hotspots.len] | Z: [zones_to_update.len] }",
)
..(msg.Join("\n"))
/datum/controller/subsystem/air/stat_entry()
var/list/msg = list()
msg += "S:[current_step ? part_names[current_step] : ""] "
msg += "C:{"
msg += "T [round(cost_turfs, 1)] | "
msg += "E [round(cost_edges, 1)] | "
msg += "F [round(cost_firezones, 1)] | "
msg += "H [round(cost_hotspots, 1)] | "
msg += "Z [round(cost_zones, 1)] "
msg += "}"
msg += "Z: [zones.len] "
msg += "E: [edges.len] "
msg += "Cycle: [current_cycle] {"
msg += "T [tiles_to_update.len] | "
msg += "E [active_edges.len] | "
msg += "F [active_fire_zones.len] | "
msg += "H [active_hotspots.len] | "
msg += "Z [zones_to_update.len] "
msg += "}"
return ..() + " [msg.Join()]"
/datum/controller/subsystem/air/PreInit(recovering)
air_master = src
+1 -1
View File
@@ -41,4 +41,4 @@ SUBSYSTEM_DEF(alarms)
return active_alarm_cache.len
/datum/controller/subsystem/alarms/stat_entry()
..("[number_of_active_alarms()] alarm\s")
return ..() + " [number_of_active_alarms()] alarm\s"
@@ -9,7 +9,7 @@ SUBSYSTEM_DEF(ambient_lighting)
var/list/queued = list()
/datum/controller/subsystem/ambient_lighting/stat_entry()
..("Queue:[length(queued)]")
return ..() + " Queue:[length(queued)]"
/datum/controller/subsystem/ambient_lighting/fire(resumed = FALSE, no_mc_tick = FALSE)
var/list/curr = queued
+1 -1
View File
@@ -10,7 +10,7 @@ SUBSYSTEM_DEF(ao)
/datum/controller/subsystem/ao/stat_entry()
..("Queue: [queue.len]")
return ..() + "Queue: [queue.len]"
/datum/controller/subsystem/ao/fire(resume = 0, no_mc_tick = FALSE)
if (!queue.len)
+1 -1
View File
@@ -17,7 +17,7 @@ SUBSYSTEM_DEF(bellies)
var/ignored_bellies = 0
/datum/controller/subsystem/bellies/stat_entry()
..("#: [belly_list.len] | P: [ignored_bellies]")
return ..() + " #: [belly_list.len] | P: [ignored_bellies]"
/datum/controller/subsystem/bellies/fire(resumed = 0)
if (!resumed)
+1 -1
View File
@@ -55,7 +55,7 @@ SUBSYSTEM_DEF(events)
EC.process(dt)
/datum/controller/subsystem/events/stat_entry()
..("E:[active_events.len]")
return ..() + " E:[active_events.len]"
/datum/controller/subsystem/events/Recover()
if(SSevents.active_events)
+3 -2
View File
@@ -38,10 +38,11 @@ SUBSYSTEM_DEF(garbage)
pass_counts[i] = 0
fail_counts[i] = 0
/datum/controller/subsystem/garbage/stat_entry(msg)
/datum/controller/subsystem/garbage/stat_entry()
var/list/counts = list()
for (var/list/L in queues)
counts += length(L)
var/list/msg = list()
msg += "Q:[counts.Join(",")]|D:[delslasttick]|G:[gcedlasttick]|"
msg += "GR:"
if (!(delslasttick+gcedlasttick))
@@ -56,7 +57,7 @@ SUBSYSTEM_DEF(garbage)
msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%"
msg += " P:[pass_counts.Join(",")]"
msg += "|F:[fail_counts.Join(",")]"
..(msg)
return ..() + " [jointext(msg, "")]"
/datum/controller/subsystem/garbage/Shutdown()
//Adds the del() log to the qdel log file
+5 -5
View File
@@ -39,13 +39,13 @@ SUBSYSTEM_DEF(lighting)
/datum/controller/subsystem/lighting/stat_entry()
var/list/out = list(
#ifdef USE_INTELLIGENT_LIGHTING_UPDATES
"IUR: [total_ss_updates ? round(total_instant_updates/(total_instant_updates+total_ss_updates)*100, 0.1) : "NaN"]% Instant: [force_queued ? "Disabled" : "Allowed"] \n",
"IUR: [total_ss_updates ? round(total_instant_updates/(total_instant_updates+total_ss_updates)*100, 0.1) : "NaN"]% Instant: [force_queued ? "Disabled" : "Allowed"] <br>",
#endif
"\tT:{L:[total_lighting_sources] C:[lighting_corners.len] O:[total_lighting_overlays]}\n",
"\tP:{L:[light_queue.len - (lq_idex - 1)]|C:[corner_queue.len - (cq_idex - 1)]|O:[overlay_queue.len - (oq_idex - 1)]}\n",
"\tL:{L:[processed_lights]|C:[processed_corners]|O:[processed_overlays]}\n"
"&emsp;T:{L:[total_lighting_sources] C:[lighting_corners.len] O:[total_lighting_overlays]}<br>",
"&emsp;P:{L:[light_queue.len - (lq_idex - 1)]|C:[corner_queue.len - (cq_idex - 1)]|O:[overlay_queue.len - (oq_idex - 1)]}<br>",
"&emsp;L:{L:[processed_lights]|C:[processed_corners]|O:[processed_overlays]}<br>"
)
..(out.Join())
return ..() + out.Join()
#ifdef USE_INTELLIGENT_LIGHTING_UPDATES
+3 -3
View File
@@ -35,10 +35,10 @@ SUBSYSTEM_DEF(machines)
/datum/controller/subsystem/machines/stat_entry()
var/msg = list(
"MC/MS: [round((cost ? global.processing_machines.len/cost_machinery : 0),0.1)]",
"\tCost: { PiNet: [round(cost_pipenets,1)] | M: [round(cost_machinery,1)] | PowNet: [round(cost_powernets,1)] | PowObj: [round(cost_power_objects,1)] }",
"\tTotal: { PiNet [global.pipe_networks.len] | M: [global.processing_machines.len] | PowNet: [global.powernets.len] | PowObj: [global.processing_power_items.len] }"
"&emsp;Cost: { PiNet: [round(cost_pipenets,1)] | M: [round(cost_machinery,1)] | PowNet: [round(cost_powernets,1)] | PowObj: [round(cost_power_objects,1)] }",
"&emsp;Total: { PiNet [global.pipe_networks.len] | M: [global.processing_machines.len] | PowNet: [global.powernets.len] | PowObj: [global.processing_power_items.len] }"
)
..(jointext(msg, "\n"))
return ..() + jointext(msg, "<br>")
/datum/controller/subsystem/machines/Initialize(timeofday)
makepowernets()
+1 -1
View File
@@ -18,7 +18,7 @@ SUBSYSTEM_DEF(mobs)
var/slept_mobs = 0
/datum/controller/subsystem/mobs/stat_entry()
..("P: [global.GLOB.mob_list.len] | S: [slept_mobs]")
return ..() + " P: [global.GLOB.mob_list.len] | S: [slept_mobs]"
/datum/controller/subsystem/mobs/fire(resumed = 0)
var/list/busy_z_levels = src.busy_z_levels
+1 -1
View File
@@ -13,7 +13,7 @@ SUBSYSTEM_DEF(nanoui)
processing_uis |= SSnanoui.processing_uis
/datum/controller/subsystem/nanoui/stat_entry()
return ..("[processing_uis.len] UIs")
return ..() + " [processing_uis.len] UIs"
/datum/controller/subsystem/nanoui/fire(resumed)
for(var/thing in processing_uis)
+1 -1
View File
@@ -22,7 +22,7 @@ SUBSYSTEM_DEF(overlays)
/datum/controller/subsystem/overlays/stat_entry()
..("Ov:[length(queue)]")
return ..() + " Ov:[length(queue)]"
/datum/controller/subsystem/overlays/Shutdown()
+1 -1
View File
@@ -13,7 +13,7 @@ SUBSYSTEM_DEF(ping)
var/list/currentrun = list()
/datum/controller/subsystem/ping/stat_entry()
..("P:[GLOB.clients.len]")
return ..() + " P:[GLOB.clients.len]"
/datum/controller/subsystem/ping/fire(resumed = FALSE)
// Prepare the new batch of clients
+1 -1
View File
@@ -30,7 +30,7 @@ SUBSYSTEM_DEF(plants)
var/list/currentrun = list()
/datum/controller/subsystem/plants/stat_entry()
..("P:[processing.len]|S:[seeds.len]")
return ..() + " P:[processing.len]|S:[seeds.len]"
/datum/controller/subsystem/plants/Initialize(timeofday)
setup()
@@ -10,9 +10,8 @@ SUBSYSTEM_DEF(processing)
var/list/processing = list()
var/list/currentrun = list()
/datum/controller/subsystem/processing/stat_entry(msg)
msg = "[stat_tag]:[length(processing)]"
return ..()
/datum/controller/subsystem/processing/stat_entry()
return ..() + " [stat_tag]:[length(processing)]"
/datum/controller/subsystem/processing/fire(resumed = FALSE)
if (!resumed)
+1 -1
View File
@@ -209,4 +209,4 @@ SUBSYSTEM_DEF(shuttle)
overmap_halted ? ship_effect.halt() : ship_effect.unhalt()
/datum/controller/subsystem/shuttle/stat_entry()
..("Shuttles:[process_shuttles.len]/[shuttles.len], Ships:[ships.len], L:[registered_shuttle_landmarks.len][overmap_halted ? ", HALT" : ""]")
return ..() + " Shuttles:[process_shuttles.len]/[shuttles.len], Ships:[ships.len], L:[registered_shuttle_landmarks.len][overmap_halted ? ", HALT" : ""]"
+1 -2
View File
@@ -9,8 +9,7 @@ SUBSYSTEM_DEF(spacedrift)
var/list/processing = list()
/datum/controller/subsystem/spacedrift/stat_entry()
..("P:[processing.len]")
return ..() + " P:[processing.len]"
/datum/controller/subsystem/spacedrift/fire(resumed = 0)
if (!resumed)
+161
View File
@@ -0,0 +1,161 @@
SUBSYSTEM_DEF(statpanels)
name = "Stat Panels"
wait = 4
init_order = INIT_ORDER_STATPANELS
priority = FIRE_PRIORITY_STATPANELS
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
//! ticking
/// current clients we're pushing to
var/list/currentrun = list()
//! caching
/// cached mc data
var/cache_mc_data
/// cached server-wide data
var/cache_server_data
/// cached tickets data
var/cache_ticket_data
/// cached sdql2 data
var/cache_sdql_data
/datum/controller/subsystem/statpanels/Initialize()
spawn()
manual_ticking()
return ..()
/datum/controller/subsystem/statpanels/fire(resumed = FALSE, no_tick_check)
if(!resumed)
// dispose / rebuild caches
cache_mc_data = null
cache_server_data = null
build_server_data()
cache_ticket_data = null
cache_sdql_data = null
// reset currentrun
src.currentrun = GLOB.clients.Copy()
// go through clients
// cache for sanic speed
var/list/currentrun = src.currentrun
while(length(currentrun))
if(!no_tick_check && MC_TICK_CHECK)
return
// grab victim
var/client/player = currentrun[length(currentrun)]
--currentrun.len
// check listed turf
if(player.statpanel_turf && !player.list_turf_check(player.statpanel_turf))
player.unlist_turf()
// check if we're even on the js one
if(player.statpanel_on_byond)
continue
// check if ready
if(!player.statpanel_ready)
continue
// are they an admin?
var/is_admin = !!player.holder
// grab their mob data
var/list/additional = player._statpanel_data()
// server data has priority
// assert primary status tab
var/server_data
if(player.statpanel_tab("Status", TRUE))
server_data = cache_server_data
// assert admin tabs - these are special and do not check for additional info
else if(player.statpanel_tab("MC", is_admin))
server_data = fetch_mc_data()
else if(player.statpanel_tab("Tickets", is_admin))
server_data = fetch_ticket_data()
else if(player.statpanel_tab("SDQL2", is_admin && length(GLOB.sdql2_queries)))
server_data = fetch_sdql2_data()
else
server_data = "%5b%5d" // "[]"
// send additional
player << output("[server_data];[url_encode(json_encode(additional))]", "statbrowser:byond_update")
//? Cache generator procs
//? Errors will cause JS panel error spam.
//? Thus, we rigidly check references, even for things like GLOB which shouldn't ever be missing.
/datum/controller/subsystem/statpanels/proc/fetch_mc_data()
if(cache_mc_data)
return cache_mc_data
. = list()
STATPANEL_DATA_ENTRY("CPU:", num2text(world.cpu))
STATPANEL_DATA_ENTRY("Instances:", num2text(world.contents.len, 10))
STATPANEL_DATA_ENTRY("World Time:", num2text(world.time))
if(GLOB)
STATPANEL_DATA_CLICK(GLOB.stat_key(), GLOB.stat_entry(), "\ref[GLOB]")
else
STATPANEL_DATA_LINE("FATAL - NO GLOB")
if(config)
STATPANEL_DATA_CLICK(config.stat_key(), config.stat_entry(), "\ref[config]")
else
STATPANEL_DATA_LINE("FATAL - NO CONFIG")
STATPANEL_DATA_ENTRY("BYOND:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%)) (Internal Tick Usage: [round(MAPTICK_LAST_INTERNAL_TICK_USAGE,0.1)]%)")
if(Master)
STATPANEL_DATA_CLICK(Master.stat_key(), Master.stat_entry(), "\ref[Master]")
else
STATPANEL_DATA_LINE("FATAL - NO MASTER CONTROLLER")
if(Failsafe)
STATPANEL_DATA_CLICK(Failsafe.stat_key(), Failsafe.stat_entry(), "\ref[Failsafe]")
else
STATPANEL_DATA_LINE("WARNING - NO FAILSAFE")
STATPANEL_DATA_LINE("")
for(var/datum/controller/subsystem/S as anything in Master.subsystems)
STATPANEL_DATA_CLICK(S.stat_key(), S.stat_entry(), "\ref[S]")
. = url_encode(json_encode(.))
cache_mc_data = .
/datum/controller/subsystem/statpanels/proc/build_server_data()
if(cache_server_data)
return cache_server_data
. = list()
//L += SSmapping.stat_map_name
STATPANEL_DATA_ENTRY("Round ID", "[GLOB?.round_id || "ERROR"]")
// VIRGO START
STATPANEL_DATA_ENTRY("Station Time", stationtime2text())
STATPANEL_DATA_ENTRY("Station Date", stationdate2text())
STATPANEL_DATA_ENTRY("Round Duration", roundduration2text())
// VIRGO END
STATPANEL_DATA_ENTRY("Time dilation", SStime_track.stat_time_text)
//L += SSshuttle.emergency_shuttle_stat_text
var/shuttle_eta = SSemergencyshuttle.get_status_panel_eta()
if(shuttle_eta)
STATPANEL_DATA_ENTRY("Shuttle", shuttle_eta)
. = url_encode(json_encode(.))
cache_server_data = .
/datum/controller/subsystem/statpanels/proc/fetch_ticket_data()
if(cache_ticket_data)
return cache_ticket_data
if(!GLOB.ahelp_tickets)
. = list()
STATPANEL_DATA_LINE("FATAL - NO GLOBAL TICKETS HOLDER")
. = url_encode(json_encode(.))
else
. = url_encode(json_encode(GLOB.ahelp_tickets.stat_data()))
cache_ticket_data = .
/datum/controller/subsystem/statpanels/proc/fetch_sdql2_data()
if(cache_sdql_data)
return cache_sdql_data
. = list()
STATPANEL_DATA_CLICK("Global SDQL2 List:", "\[Edit\]", "\ref[GLOB?.sdql2_vv_statobj]")
for(var/datum/SDQL2_query/Q in GLOB.sdql2_queries)
. += Q.generate_stat()
. = url_encode(json_encode(.))
cache_sdql_data = .
/**
* is this shitcode?
* yes it is
* if you wanna do better, do better; i'm not at the point of janking up our MC with my own
* fuckery.
*
* tl;dr this ensures we push data while MC is initializing.
*/
/datum/controller/subsystem/statpanels/proc/manual_ticking()
while(!Master.initialized)
fire(null, TRUE)
sleep(10)
+1 -1
View File
@@ -42,7 +42,7 @@ SUBSYSTEM_DEF(tgui)
*/
/datum/controller/subsystem/tgui/stat_entry()
return ..("P:[length(open_uis)]")
return ..() + " P:[length(open_uis)]"
/datum/controller/subsystem/tgui/fire(resumed = FALSE)
if(!resumed)
+1 -1
View File
@@ -9,7 +9,7 @@ SUBSYSTEM_DEF(throwing)
var/list/processing = list()
/datum/controller/subsystem/throwing/stat_entry()
..("P:[processing.len]")
return ..() + " P:[processing.len]"
/datum/controller/subsystem/throwing/fire(resumed = 0)
if (!resumed)
+2 -2
View File
@@ -19,8 +19,8 @@ SUBSYSTEM_DEF(time_track)
var/last_measurement = 0
var/measurement_delay = 60
var/stat_time_text
var/time_dilation_text
var/stat_time_text = "Calculating..."
var/time_dilation_text = "Calculating..."
/datum/controller/subsystem/time_track/fire()
if(++last_measurement == measurement_delay)
+2 -3
View File
@@ -66,9 +66,8 @@ SUBSYSTEM_DEF(timer)
head_offset = world.time
bucket_resolution = world.tick_lag
/datum/controller/subsystem/timer/stat_entry(msg)
msg = "B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)]"
return ..()
/datum/controller/subsystem/timer/stat_entry()
return ..() + " B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)]"
/datum/controller/subsystem/timer/fire(resumed = FALSE)
// Store local references to datum vars as it is faster to access them
+1 -1
View File
@@ -109,7 +109,7 @@ SUBSYSTEM_DEF(transcore)
msg += "IM:[implants.len]|"
msg += "BK:[backed_up.len]"
msg += "} "
..(jointext(msg, null))
return ..() + " [jointext(msg, null)]"
/datum/controller/subsystem/transcore/proc/m_backup(var/datum/mind/mind, var/obj/item/nif/nif, var/one_time = FALSE)
ASSERT(mind)
-5
View File
@@ -24,11 +24,6 @@ SUBSYSTEM_DEF(xenoarch)
if (istype(SSxenoarch.digsite_spawning_turfs))
digsite_spawning_turfs = SSxenoarch.digsite_spawning_turfs
/datum/controller/subsystem/xenoarch/stat_entry(msg)
if (!GLOB.Debug2)
return // Only show up in stat panel if debugging is enabled.
. = ..()
/datum/controller/subsystem/xenoarch/proc/SetupXenoarch()
var/list/faster = list()
var/start
+1 -1
View File
@@ -125,7 +125,7 @@ SUBSYSTEM_DEF(zmimic)
"T: { T: [openspace_turfs] O: [openspace_overlays] } Q: { T: [queued_turfs.len - (qt_idex - 1)] O: [queued_overlays.len - (qo_idex - 1)] } Sk: { T: [multiqueue_skips_turf] O: [multiqueue_skips_object] }",
"F: { H: [fixup_hit] M: [fixup_miss] N: [fixup_noop] FC: [fixup_cache.len] FKG: [fixup_known_good.len] }", // Fixup stats.
)
..(entries.Join("\n\t"))
return ..() + entries.Join("<br>&emsp;")
// 1, 2, 3..=7, 8
/datum/controller/subsystem/zmimic/proc/build_zstack_display()