/*! * 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 var/oldchat = 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 HERE 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 var/list/stored_rounds = CONFIG_GET(flag/chatlog_database_backend) ? vchatlog_get_recent_roundids(client.ckey) : null window.send_message("connected", list( "round_id" = GLOB.round_id, // Sends the round ID to the chat, requires round IDs "chatlog_db_backend" = CONFIG_GET(flag/chatlog_database_backend), "chatlog_api_endpoint" = CONFIG_GET(string/chatlog_database_api_endpoint), "chatlog_stored_rounds" = islist(stored_rounds) ? list("0") + stored_rounds : list("0"), )) window.send_message("update", list( "config" = list( "client" = list( "ckey" = client.ckey, "chatlog_token" = client.chatlog_token, "address" = client.address, "computer_id" = client.computer_id, ), "server" = list( "round_id" = GLOB.round_id, ), "window" = list( "fancy" = FALSE, "locked" = FALSE, ), ), )) return TRUE if(type == "audio/setAdminMusicVolume") client.admin_music_volume = payload["volume"] 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")