Skip to content

Commit

Permalink
Refactors the Telecomms log browser computer with fancy TGUI UI (#12586)
Browse files Browse the repository at this point in the history
* Refactors the telecomm log computer's GUI

Specifically this is the computer that handles showing the radio logs, not the PDA ones.

* Adds the darn delete buttons for the log browser

Forgot to add these, christ

also cleans up the padding & margins for log entries

* Resolves all TGUI linter complaints

* Makes NTSL runtimes display a bit nicer

I could touch this up all day but I got shit to do and hoes to screw

* You didn't see that

* I hate whitespace linting so much

* Adds (mostly pointless) Refresh button to Log Browser

* The new Log Browser now respects language comprehension
  • Loading branch information
Altoids1 authored Nov 14, 2021
1 parent b4d4007 commit 456c0ac
Show file tree
Hide file tree
Showing 5 changed files with 268 additions and 199 deletions.
2 changes: 2 additions & 0 deletions code/__DEFINES/{yogs_defines}/telecomms.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#define SERVER_LOG_STORAGE_MAX 400 // Number of chat logs the telecomms servers will store before they start deleting the older ones.
#define TELECOMMS_SCAN_RANGE 25 // The range at which the telecomms computers can scan for telecomm servers.
298 changes: 100 additions & 198 deletions code/game/machinery/telecomms/computers/logbrowser.dm
Original file line number Diff line number Diff line change
@@ -1,215 +1,117 @@

#define MONITOR_MAINMENU 0
#define MONITOR_SERVERLOGS 1

/obj/machinery/computer/telecomms/server
name = "telecommunications server monitoring console"
icon_screen = "comm_logs"
desc = "Has full access to all details and record of the telecommunications network it's monitoring."
desc = "A computer dedicated to monitoring telecommuncation server logs."

var/screen = 0 // the screen number:
var/list/servers = list() // the servers located by the computer
var/screen_state = MONITOR_MAINMENU // the screen state
var/list/cached_server_list = list() // The servers located by the computer
var/obj/machinery/telecomms/server/SelectedServer

var/network = "NULL" // the network to probe
var/temp = "" // temporary feedback messages

var/universal_translate = 0 // set to 1 if it can translate nonhuman speech
var/universal_translate = FALSE // set to TRUE if it can translate nonhuman speech

req_access = list(ACCESS_TCOMSAT)
circuit = /obj/item/circuitboard/computer/comm_server
tgui_id = "LogBrowser"

/obj/machinery/computer/telecomms/server/ui_interact(mob/user)
. = ..()
var/dat = "<HTML><HEAD><meta charset='UTF-8'><TITLE>Telecommunication Server Monitor</TITLE></HEAD><BODY><center><b>Telecommunications Server Monitor</b></center>"

switch(screen)


// --- Main Menu ---

if(0)
dat += "<br>[temp]<br>"
dat += "<br>Current Network: <a href='?src=[REF(src)];network=1'>[network]</a><br>"
if(servers.len)
dat += "<br>Detected Telecommunication Servers:<ul>"
for(var/obj/machinery/telecomms/T in servers)
dat += "<li><a href='?src=[REF(src)];viewserver=[T.id]'>[REF(T)] [T.name]</a> ([T.id])</li>"
dat += "</ul>"
dat += "<br><a href='?src=[REF(src)];operation=release'>\[Flush Buffer\]</a>"

else
dat += "<br>No servers detected. Scan for servers: <a href='?src=[REF(src)];operation=scan'>\[Scan\]</a>"


// --- Viewing Server ---

if(1)
dat += "<br>[temp]<br>"
dat += "<center><a href='?src=[REF(src)];operation=mainmenu'>\[Main Menu\]</a> <a href='?src=[REF(src)];operation=refresh'>\[Refresh\]</a></center>"
dat += "<br>Current Network: [network]"
dat += "<br>Selected Server: [SelectedServer.id]"

if(SelectedServer.totaltraffic >= 1024)
dat += "<br>Total recorded traffic: [round(SelectedServer.totaltraffic / 1024)] Terrabytes<br><br>"
else
dat += "<br>Total recorded traffic: [SelectedServer.totaltraffic] Gigabytes<br><br>"

dat += "Stored Logs: <ol>"

var/i = 0
for(var/datum/comm_log_entry/C in SelectedServer.log_entries)
i++


// If the log is a speech file
if(C.input_type == "Speech File")
dat += "<li><font color = #008F00>[C.name]</font> <font color = #FF0000><a href='?src=[REF(src)];delete=[i]'>\[X\]</a></font><br>"

// -- Determine race of orator --

var/mobtype = C.parameters["mobtype"]
var/race // The actual race of the mob

if(ispath(mobtype, /mob/living/carbon/human) || ispath(mobtype, /mob/living/brain))
race = "Humanoid"

// NT knows a lot about slimes, but not aliens. Can identify slimes
else if(ispath(mobtype, /mob/living/simple_animal/slime))
race = "Slime"

else if(ispath(mobtype, /mob/living/carbon/monkey))
race = "Monkey"

// sometimes M gets deleted prematurely for AIs... just check the job
else if(ispath(mobtype, /mob/living/silicon) || C.parameters["job"] == "AI")
race = "Artificial Life"

else if(isobj(mobtype))
race = "Machinery"

else if(ispath(mobtype, /mob/living/simple_animal))
race = "Domestic Animal"

else
race = "<i>Unidentifiable</i>"

dat += "<u><font color = #18743E>Data type</font></u>: [C.input_type]<br>"
dat += "<u><font color = #18743E>Source</font></u>: [C.parameters["name"]] (Job: [C.parameters["job"]])<br>"
dat += "<u><font color = #18743E>Class</font></u>: [race]<br>"
var/message = C.parameters["message"]
var/language = C.parameters["language"]

// based on [/atom/movable/proc/lang_treat]
if (universal_translate || user.has_language(language))
message = "\"[message]\""
else if (!user.has_language(language))
var/datum/language/D = GLOB.language_datum_instances[language]
message = "\"[D.scramble(message)]\""
else if (language)
message = "<i>(unintelligible)</i>"

dat += "<u><font color = #18743E>Contents</font></u>: [message]<br>"
dat += "</li><br>"

else if(C.input_type == "Execution Error")
dat += "<li><font color = #990000>[C.name]</font> <a href='?src=[REF(src)];delete=[i]'>\[X\]</a><br>"
dat += "<u><font color = #787700>Error</font></u>: \"[C.parameters["message"]]\"<br>"
dat += "</li><br>"

else
dat += "<li><font color = #000099>[C.name]</font> <a href='?src=[REF(src)];delete=[i]'>\[X\]</a><br>"
dat += "<u><font color = #18743E>Data type</font></u>: [C.input_type]<br>"
dat += "<u><font color = #18743E>Contents</font></u>: <i>(unintelligible)</i><br>"
dat += "</li><br>"

/obj/machinery/computer/telecomms/server/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user,src,ui)
if(!ui)
ui = new(user,src,"LogBrowser")
ui.open()

dat += "</ol>"

dat += "</BODY></HTML>"

user << browse(dat, "window=comm_monitor;size=575x400")
onclose(user, "server_control")

temp = ""
return


/obj/machinery/computer/telecomms/server/Topic(href, href_list)
/obj/machinery/computer/telecomms/server/ui_act(action, list/params)
if(..())
return


add_fingerprint(usr)
usr.set_machine(src)

if(href_list["viewserver"])
screen = 1
for(var/obj/machinery/telecomms/T in servers)
if(T.id == href_list["viewserver"])
SelectedServer = T
break

if(href_list["operation"])
switch(href_list["operation"])

if("release")
servers = list()
screen = 0

if("mainmenu")
screen = 0

if("scan")
if(servers.len > 0)
temp = "<font color = #D70B00>- FAILED: CANNOT PROBE WHEN BUFFER FULL -</font color>"

else
for(var/obj/machinery/telecomms/server/T in urange(25, src))
if(T.network == network)
servers.Add(T)

if(!servers.len)
temp = "<font color = #D70B00>- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -</font color>"
else
temp = "<font color = #336699>- [servers.len] SERVERS PROBED & BUFFERED -</font color>"

screen = 0

if(href_list["delete"])

if(!src.allowed(usr) && !(obj_flags & EMAGGED))
to_chat(usr, span_danger("ACCESS DENIED."))
switch(action)
if("Back")
screen_state = MONITOR_MAINMENU
SelectedServer = null
return TRUE
if("ViewServer")
var/id = params["server_id"]
if(!id)
return
for(var/machine in cached_server_list)
var/obj/machinery/telecomms/server/m = machine
if(m.id == id)
SelectedServer = m
break
if(SelectedServer)
screen_state = MONITOR_SERVERLOGS
return TRUE
return

if(SelectedServer)

var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])]

temp = "<font color = #336699>- DELETED ENTRY: [D.name] -</font color>"

SelectedServer.log_entries.Remove(D)
qdel(D)

else
temp = "<font color = #D70B00>- FAILED: NO SELECTED MACHINE -</font color>"

if(href_list["network"])

var/newnet = stripped_input(usr, "Which network do you want to view?", "Comm Monitor", network)

if(newnet && ((usr in range(1, src)) || issilicon(usr)))
if(length(newnet) > 15)
temp = "<font color = #D70B00>- FAILED: NETWORK TAG STRING TOO LENGHTLY -</font color>"

else

network = newnet
screen = 0
servers = list()
temp = "<font color = #336699>- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -</font color>"

updateUsrDialog()
return

/obj/machinery/computer/telecomms/server/attackby()
. = ..()
updateUsrDialog()
if("DeleteLog")
if(!SelectedServer)
return
var/name = params["name"]
if(!name || !istext(name) || length(name) > 1024)
return
for(var/l in SelectedServer.log_entries)
var/datum/comm_log_entry/log = l
if(log.name == name)
SelectedServer.log_entries.Remove(log)
return TRUE
return
if("SetNetwork")
var/net = params["network"]
if(!net || !istext(net) || isnotpretty(net) || length(net) > 15)
return
network = params["network"]
return TRUE
if("Scan")
if(cached_server_list.len > 0)
cached_server_list = list()
for(var/obj/machinery/telecomms/server/T in range(TELECOMMS_SCAN_RANGE, src))
if(T.network == network)
cached_server_list.Add(T)
return TRUE
if("Refresh")
return TRUE // Welp, you asked for it

/obj/machinery/computer/telecomms/server/proc/generate_message(datum/comm_log_entry/log, mob/user)
if(!log.parameters["message"])
return "***"
var/lang = log.parameters["language"]
if(universal_translate || !lang)
return log.parameters["message"]
if(user.has_language(lang))
return log.parameters["message"]
else
var/datum/language/D = GLOB.language_datum_instances[lang]
return D.scramble(log.parameters["message"])

/obj/machinery/computer/telecomms/server/ui_data(mob/user)
var/list/data = list()
data["screen_state"] = screen_state
data["network"] = network
if(screen_state == MONITOR_MAINMENU)
var/list/servers = list()
for(var/machine in cached_server_list)
var/obj/machinery/telecomms/server/m = machine
servers.Add(m.id)
data["servers"] = servers
if(screen_state == MONITOR_SERVERLOGS)
data["selected_name"] = SelectedServer.id
data["totaltraffic"] = SelectedServer.log_entries.len
data["define_max_storage"] = SERVER_LOG_STORAGE_MAX
data["logs"] = list()
for(var/l in SelectedServer.log_entries)
var/datum/comm_log_entry/log = l
var/list/datalog = list()
datalog["is_corrupt"] = (log.input_type == "Corrupt File")
datalog["is_error"] = (log.input_type == "Execution Error")
datalog["name"] = log.parameters["name"] || "Unknown"
datalog["job"] = log.parameters["job"] || FALSE
datalog["message"] = generate_message(log,user)
datalog["packet_id"] = log.name // since this is some MD5 thing we can actually use this to ID this packet later in ui_act()
data["logs"] += list(datalog)

return data

#undef MONITOR_MAINMENU
#undef MONITOR_SERVERLOGS
2 changes: 1 addition & 1 deletion code/game/machinery/telecomms/machines/server.dm
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
totaltraffic += traffic // add current traffic to total traffic

// Delete particularly old logs
if (log_entries.len >= 400)
if (log_entries.len >= SERVER_LOG_STORAGE_MAX)
log_entries.Cut(1, 2)

signal.data["server"] = src; //Yogs
Expand Down
Loading

0 comments on commit 456c0ac

Please sign in to comment.