/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."
var/screen = 0 // the screen number:
var/list/servers = 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
req_access = list(ACCESS_TCOMSAT)
circuit = /obj/item/circuitboard/computer/comm_server
/obj/machinery/computer/telecomms/server/attack_hand(mob/user)
if(..())
return
user.set_machine(src)
var/dat = "
Telecommunication Server MonitorTelecommunications Server Monitor"
switch(screen)
// --- Main Menu ---
if(0)
dat += "
[temp]
"
dat += "
Current Network: [network]
"
if(servers.len)
dat += "
Detected Telecommunication Servers:"
for(var/obj/machinery/telecomms/T in servers)
dat += "- [REF(T)] [T.name] ([T.id])
"
dat += "
"
dat += "
\[Flush Buffer\]"
else
dat += "
No servers detected. Scan for servers: \[Scan\]"
// --- Viewing Server ---
if(1)
dat += "
[temp]
"
dat += "\[Main Menu\] \[Refresh\]"
dat += "
Current Network: [network]"
dat += "
Selected Server: [SelectedServer.id]"
if(SelectedServer.totaltraffic >= 1024)
dat += "
Total recorded traffic: [round(SelectedServer.totaltraffic / 1024)] Terrabytes
"
else
dat += "
Total recorded traffic: [SelectedServer.totaltraffic] Gigabytes
"
dat += "Stored Logs: "
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 += "- [C.name] \[X\]
"
// -- Determine race of orator --
var/race // The actual race of the mob
var/language = "Human" // MMIs, pAIs, Cyborgs and humans all speak Human
var/mobtype = C.parameters["mobtype"]
var/list/humans = typesof(/mob/living/carbon/human, /mob/living/brain)
var/list/monkeys = typesof(/mob/living/carbon/monkey)
var/list/silicons = typesof(/mob/living/silicon)
var/list/slimes = typesof(/mob/living/simple_animal/slime)
var/list/animals = typesof(/mob/living/simple_animal)
if(mobtype in humans)
race = "Humanoid"
language = race
else if(mobtype in slimes) // NT knows a lot about slimes, but not aliens. Can identify slimes
race = "Slime"
language = race
else if(mobtype in monkeys)
race = "Monkey"
language = race
else if(mobtype in silicons || C.parameters["job"] == "AI") // sometimes M gets deleted prematurely for AIs... just check the job
race = "Artificial Life"
language = "Humanoid" //Ais and borgs speak human, and binary isnt picked up.
else if(isobj(mobtype))
race = "Machinery"
language = race
else if(mobtype in animals)
race = "Domestic Animal"
language = race
else
race = "Unidentifiable"
language = race
// -- If the orator is a human, or universal translate is active, OR mob has universal speech on --
if(language == "Humanoid" || universal_translate || C.parameters["uspeech"])
dat += "Data type: [C.input_type]
"
dat += "Source: [C.parameters["name"]] (Job: [C.parameters["job"]])
"
dat += "Class: [race]
"
dat += "Contents: \"[C.parameters["message"]]\"
"
// -- Orator is not human and universal translate not active --
else
dat += "Data type: Audio File
"
dat += "Source: Unidentifiable
"
dat += "Class: [race]
"
dat += "Contents: Unintelligble
"
dat += "
"
else if(C.input_type == "Execution Error")
dat += "- [C.name] \[X\]
"
dat += "Output: \"[C.parameters["message"]]\"
"
dat += "
"
dat += "
"
user << browse(dat, "window=comm_monitor;size=575x400")
onclose(user, "server_control")
temp = ""
return
/obj/machinery/computer/telecomms/server/Topic(href, href_list)
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 = "- FAILED: CANNOT PROBE WHEN BUFFER FULL -"
else
for(var/obj/machinery/telecomms/server/T in urange(25, src))
if(T.network == network)
servers.Add(T)
if(!servers.len)
temp = "- FAILED: UNABLE TO LOCATE SERVERS IN \[[network]\] -"
else
temp = "- [servers.len] SERVERS PROBED & BUFFERED -"
screen = 0
if(href_list["delete"])
if(!src.allowed(usr) && !(obj_flags & EMAGGED))
to_chat(usr, "ACCESS DENIED.")
return
if(SelectedServer)
var/datum/comm_log_entry/D = SelectedServer.log_entries[text2num(href_list["delete"])]
temp = "- DELETED ENTRY: [D.name] -"
SelectedServer.log_entries.Remove(D)
qdel(D)
else
temp = "- FAILED: NO SELECTED MACHINE -"
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 = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -"
else
network = newnet
screen = 0
servers = list()
temp = "- NEW NETWORK TAG SET IN ADDRESS \[[network]\] -"
updateUsrDialog()
return
/obj/machinery/computer/telecomms/server/attackby()
. = ..()
updateUsrDialog()