mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-13 19:22:20 +00:00
## About The Pull Request Fixes #90694 I believe the heart of this issue is that the audio player was trying to log an error object, but logs only take strings. This should prevent the blue screen and provide admin feedback ## Why It's Good For The Game - Everyone survives your fatal attempt to play king gizzard the lizard wizard - Better admin feedback why you cannot play aforementioned song ## Changelog 🆑 fix: We're no strangers to bugs: Playing protected audio shouldn't crash the server anymore! /🆑
114 lines
2.8 KiB
Plaintext
114 lines
2.8 KiB
Plaintext
/*!
|
|
* Copyright (c) 2020 Aleksej Komarov
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
/**
|
|
* tgui_panel datum
|
|
* Hosts tgchat and other nice features.
|
|
*/
|
|
/datum/tgui_panel
|
|
var/client/client
|
|
var/datum/tgui_window/window
|
|
var/broken = FALSE
|
|
var/initialized_at
|
|
/// Each client notifies on protected playback, so this prevents spamming admins.
|
|
var/static/admins_warned = FALSE
|
|
|
|
/datum/tgui_panel/New(client/client, id)
|
|
src.client = client
|
|
window = new(client, id)
|
|
window.subscribe(src, PROC_REF(on_message))
|
|
|
|
/datum/tgui_panel/Del()
|
|
window.unsubscribe(src)
|
|
window.close()
|
|
return ..()
|
|
|
|
/**
|
|
* public
|
|
*
|
|
* TRUE if panel is initialized and ready to receive messages.
|
|
*/
|
|
/datum/tgui_panel/proc/is_ready()
|
|
return !broken && window.is_ready()
|
|
|
|
/**
|
|
* public
|
|
*
|
|
* Initializes tgui panel.
|
|
*/
|
|
/datum/tgui_panel/proc/initialize(force = FALSE)
|
|
set waitfor = FALSE
|
|
// Minimal sleep to defer initialization to after client constructor
|
|
sleep(1 TICKS)
|
|
initialized_at = world.time
|
|
// Perform a clean initialization
|
|
window.initialize(
|
|
strict_mode = TRUE,
|
|
assets = list(
|
|
get_asset_datum(/datum/asset/simple/tgui_panel),
|
|
))
|
|
window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/fontawesome))
|
|
window.send_asset(get_asset_datum(/datum/asset/simple/namespaced/tgfont))
|
|
window.send_asset(get_asset_datum(/datum/asset/spritesheet_batched/chat))
|
|
// Other setup
|
|
request_telemetry()
|
|
addtimer(CALLBACK(src, PROC_REF(on_initialize_timed_out)), 5 SECONDS)
|
|
window.send_message("testTelemetryCommand")
|
|
|
|
/**
|
|
* private
|
|
*
|
|
* Called when initialization has timed out.
|
|
*/
|
|
/datum/tgui_panel/proc/on_initialize_timed_out()
|
|
// Currently does nothing but sending a message to old chat.
|
|
SEND_TEXT(client, span_userdanger("Failed to load fancy chat, click <a href='byond://?src=[REF(src)];reload_tguipanel=1'>HERE</a> to attempt to reload it."))
|
|
|
|
/**
|
|
* private
|
|
*
|
|
* Callback for handling incoming tgui messages.
|
|
*/
|
|
/datum/tgui_panel/proc/on_message(type, payload)
|
|
if(type == "ready")
|
|
broken = FALSE
|
|
window.send_message("update", list(
|
|
"config" = list(
|
|
"client" = list(
|
|
"ckey" = client.ckey,
|
|
"address" = client.address,
|
|
"computer_id" = client.computer_id,
|
|
),
|
|
"window" = list(
|
|
"fancy" = FALSE,
|
|
"locked" = FALSE,
|
|
),
|
|
),
|
|
))
|
|
return TRUE
|
|
|
|
if(type == "audio/setAdminMusicVolume")
|
|
client.admin_music_volume = payload["volume"]
|
|
return TRUE
|
|
|
|
if(type == "audio/protected")
|
|
if(!admins_warned)
|
|
message_admins(span_notice("Audio returned a protected playback error, likely due to being copyrighted."))
|
|
admins_warned = TRUE
|
|
addtimer(VARSET_CALLBACK(src, admins_warned, FALSE), 10 SECONDS)
|
|
return TRUE
|
|
|
|
if(type == "telemetry")
|
|
analyze_telemetry(payload)
|
|
return TRUE
|
|
|
|
/**
|
|
* public
|
|
*
|
|
* Sends a round restart notification.
|
|
*/
|
|
/datum/tgui_panel/proc/send_roundrestart()
|
|
window.send_message("roundrestart")
|