// Allows you to monitor messages that passes the server.
/obj/machinery/computer/message_monitor
name = "Message Monitor Console"
desc = "Used to Monitor the crew's messages, that are sent via PDA."
icon_state = "comm_monitor"
circuit = "/obj/item/weapon/circuitboard/message_monitor"
var/obj/machinery/message_server/linkedServer = null
var/screen = 0 // 0 = Main menu, 1 = Message Logs
var/hacking = 0 // Is it being hacked into by the AI/Cyborg
/obj/machinery/computer/message_monitor/attackby(obj/item/weapon/O as obj, mob/user as mob)
if(istype(O,/obj/item/weapon/card/emag/))
//Just brings up the Message Log without having to know the passcode.
if(!hacking)
usr << "BZZT.. The console beeps and brings up the Message Logs."
screen = 1
else
usr << "It looks like the console is already being hacked into."
..()
return
/obj/machinery/computer/message_monitor/process()
//Is the server isn't linked to a server, and there's a server available, default it to the first one in the list.
if(!linkedServer)
if(message_servers && message_servers.len > 0)
linkedServer = message_servers[1]
return
/obj/machinery/computer/message_monitor/attack_hand(var/mob/user as mob)
if(stat & (NOPOWER|BROKEN))
return
if(!istype(user, /mob/living))
return
var/dat = "
Message Monitor Console"
dat += "Message Monitor Console
"
switch(screen)
//Main menu
if(0)
if(hacking)
screen = 2
return src.attack_hand(user)
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
dat += "1. ERROR: Server not found
"
else
dat += "1. Toggle Power: [src.linkedServer.active ? "\[On\]":"\[Off\]"]
"
dat += "2. Link To A Server
"
dat += "3. Clear Message Logs
"
dat += " KEY REQUIRED
"
dat += "4. View Message Logs
"
dat += "5. Set Custom Key
"
//Malf/Traitor AIs can bruteforce into the system to gain the Key.
if((istype(user, /mob/living/silicon/ai) || istype(user, /mob/living/silicon/robot)) && (user.mind.special_role && user.mind.original == user))
dat += "*&@. Bruteforce Key
"
//Message Logs
if(1)
if(hacking)
screen = 2
return src.attack_hand(user)
if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN)))
usr << "No server detected."
screen = 0
return src.attack_hand(user)
var/index = 0
//var/recipient = "Unspecified" //name of the person
//var/sender = "Unspecified" //name of the sender
//var/message = "Blank" //transferred message
dat += "Return - Refresh
"
dat += "| Sender | Recipient | Message |
"
for(var/list/datum/data_pda_msg/pda in src.linkedServer.pda_msgs)
index++
if(index > 3000)
break
dat += "| [pda.sender] | [pda.recipient] | [pda.message] |
"
dat += "
"
//Hacking screen.
if(2)
if(!hacking)
screen = 0
return src.attack_hand(user)
if(istype(user, /mob/living/silicon/ai) || istype(user, /mob/living/silicon/robot))
dat += "Brute-forcing for server key.
This will take anywhere from two to five minutes."
dat += "In the meantime, this console can reveal your true intentions if you let someone access it. Make sure no humans enter the room during that time."
else
//It's the same message as the one above but in binary. Because robots understand binary and humans don't... well I thought it was clever.
dat += {"010101000110100001101001011100110010000001110111011010010110110
0011011000010000001110100011000010110101101100101001000000110000101101110
01111001011101110110100001100101011100100110010100100000011001100111001001
10111101101101001000000111010001110111011011110010000001110100011011110010
00000110011001101001011101100110010100100000011011010110100101101110011101
01011101000110010101110011001011100010000001001001011011100010000001110100
01101000011001010010000001101101011001010110000101101110001011010111010001
10100101101101011001010010110000100000011101000110100001101001011100110010
00000110001101101111011011100111001101101111011011000110010100100000011000
11011000010110111000100000011100100110010101110110011001010110000101101100
00100000011110010110111101110101011100100010000001110100011100100111010101
10010100100000011010010110111001110100011001010110111001110100011010010110
11110110111001110011001000000110100101100110001000000111100101101111011101
01001000000110110001100101011101000010000001110011011011110110110101100101
01101111011011100110010100100000011000010110001101100011011001010111001101
11001100100000011010010111010000101110001000000100110101100001011010110110
01010010000001110011011101010111001001100101001000000110111001101111001000
00011010000111010101101101011000010110111001110011001000000110010101101110
01110100011001010111001000100000011101000110100001100101001000000111001001
10111101101111011011010010000001100100011101010111001001101001011011100110
01110010000001110100011010000110000101110100001000000111010001101001011011
010110010100101110"}
dat += ""
user << browse(dat, "window=message;size=500x700")
onclose(user, "message")
return
/obj/machinery/computer/message_monitor/attack_ai(mob/user as mob)
return src.attack_hand(user)
/obj/machinery/computer/message_monitor/proc/BruteForce(mob/user as mob)
var/currentKey = src.linkedServer.decryptkey
user << "Brute-force completed! The key is '[currentKey]'."
src.hacking = 0
src.screen = 0 // Return the screen back to normal
/obj/machinery/computer/message_monitor/Topic(href, href_list)
if(..())
return
if(stat & (NOPOWER|BROKEN))
return
if(!istype(usr, /mob/living))
return
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
if (href_list["active"])
linkedServer.active = !linkedServer.active
if (href_list["find"])
if(message_servers && message_servers.len > 1)
src.linkedServer = input(usr,"Please select a server.", "Select a server.", null) as null|anything in message_servers
usr << "Server selected."
else if(message_servers && message_servers.len > 0)
linkedServer = message_servers[1]
usr << "Single Server Detected - Server selected."
else
usr << "No server detected."
if (href_list["view"])
if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN)))
usr << "No server detected."
else
var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null)
if(dkey && dkey != "")
if(src.linkedServer.decryptkey == dkey)
src.screen = 1
else
usr << "ALERT: Incorrect password!"
if (href_list["clear"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
usr << "No server detected."
else
src.linkedServer.pda_msgs = list()
usr << "Logs cleared."
if (href_list["pass"])
if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN)))
usr << "No server detected."
else
var/dkey = trim(input(usr,"Please enter the decryption key.") as text|null)
if(dkey && dkey != "")
if(dkey == src.linkedServer.decryptkey)
var/newkey = trim(input(usr,"Please enter the new key."))
if(newkey && newkey != "")
src.linkedServer.decryptkey = newkey
usr << "Password set."
else
usr << "ALERT: Incorrect password!"
if (href_list["hack"])
if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr))
src.hacking = 1
src.screen = 2
//usr << "[src.linkedServer.decryptkey]"
spawn((100*6)*rand(2, 4))
if(src && src.linkedServer && usr)
BruteForce(usr)
if (href_list["back"])
src.screen = 0
return src.attack_hand(usr)
/obj/item/weapon/paper/monitorkey
//..()
name = "Monitor Decryption Key"
var/obj/machinery/message_server/server = null
/obj/item/weapon/paper/monitorkey/New()
..()
if(message_servers && message_servers.len > 0)
server = message_servers[1]
info = "Daily Key Reset
The new message monitor key is '[server.decryptkey]'.
Please keep this a secret.
If necessary, change the password to a more secure one."
// info_links = info
overlays += "paper_words"