// Allows you to monitor messages that passes the server. /obj/machinery/computer/message_monitor name = "messaging monitor console" desc = "Used to access and maintain data on messaging servers. Allows you to view PDA and request console messages." icon_screen = "comm_logs" light_color = "#00b000" var/hack_icon = "error" circuit = /obj/item/weapon/circuitboard/message_monitor //Server linked to. var/obj/machinery/message_server/linkedServer = null //Sparks effect - For emag var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread //Messages - Saves me time if I want to change something. var/noserver = "ALERT: No server detected." var/incorrectkey = "ALERT: Incorrect decryption key!" var/defaultmsg = "Welcome. Please select an option." var/rebootmsg = "%$&(£: Critical %$$@ Error // !RestArting! - ?pLeaSe wAit!" //Computer properties var/screen = 0 // 0 = Main menu, 1 = Message Logs, 2 = Hacked screen, 3 = Custom Message var/hacking = 0 // Is it being hacked into by the AI/Cyborg var/emag = 0 // When it is emagged. var/message = "System bootup complete. Please select an option." // The message that shows on the main menu. var/auth = 0 // Are they authenticated? var/optioncount = 8 // Custom Message Properties var/customsender = "System Administrator" var/obj/item/device/pda/customrecepient = null var/customjob = "Admin" var/custommessage = "This is a test, please ignore." /obj/machinery/computer/message_monitor/attackby(obj/item/weapon/O as obj, mob/living/user as mob) if(stat & (NOPOWER|BROKEN)) ..() return if(!istype(user)) return if(isscrewdriver(O) && emag) //Stops people from just unscrewing the monitor and putting it back to get the console working again. user << "It is too hot to mess with!" return ..() return /obj/machinery/computer/message_monitor/emag_act(var/remaining_charges, var/mob/user) // Will create sparks and print out the console's password. You will then have to wait a while for the console to be back online. // It'll take more time if there's more characters in the password.. if(!emag && operable()) if(!isnull(src.linkedServer)) emag = 1 screen = 2 spark_system.set_up(5, 0, src) src.spark_system.start() var/obj/item/weapon/paper/monitorkey/MK = new/obj/item/weapon/paper/monitorkey MK.loc = src.loc // Will help make emagging the console not so easy to get away with. MK.info += "

£%@%(*$%&(£&?*(%&£/{}" spawn(100*length(src.linkedServer.decryptkey)) UnmagConsole() message = rebootmsg update_icon() return 1 else user << "A no server error appears on the screen." /obj/machinery/computer/message_monitor/update_icon() if(emag || hacking) icon_screen = hack_icon else icon_screen = initial(icon_screen) ..() /obj/machinery/computer/message_monitor/initialize() //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/living/user as mob) if(stat & (NOPOWER|BROKEN)) return if(!istype(user)) return //If the computer is being hacked or is emagged, display the reboot message. if(hacking || emag) message = rebootmsg var/dat = "Message Monitor Console" dat += "

Message Monitor Console


" dat += "

" if(auth) dat += "

\[Authenticated\] /" dat += " Server Power: [src.linkedServer && src.linkedServer.active ? "\[On\]":"\[Off\]"]

" else dat += "

\[Unauthenticated\] /" dat += " Server Power: [src.linkedServer && src.linkedServer.active ? "\[On\]":"\[Off\]"]

" if(hacking || emag) screen = 2 else if(!auth || !linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) message = noserver screen = 0 switch(screen) //Main menu if(0) // = TAB var/i = 0 dat += "
[++i]. Link To A Server
" if(auth) if(!linkedServer || (linkedServer.stat & (NOPOWER|BROKEN))) dat += "
ERROR: Server not found!
" else dat += "
[++i]. View Message Logs
" dat += "
[++i]. View Request Console Logs
" dat += "
[++i]. Clear Message Logs
" dat += "
[++i]. Clear Request Console Logs
" dat += "
[++i]. Set Custom Key
" dat += "
[++i]. Send Admin Message
" dat += "
[++i]. Modify Spam Filter
" else for(var/n = ++i; n <= optioncount; n++) dat += "
[n]. ---------------
" if((istype(user, /mob/living/silicon/ai) || istype(user, /mob/living/silicon/robot)) && (user.mind.special_role && user.mind.original == user)) //Malf/Traitor AIs can bruteforce into the system to gain the Key. dat += "
*&@#. Bruteforce Key
" else dat += "
" //Bottom message if(!auth) dat += "

Please authenticate with the server in order to show additional options." else dat += "

Reg, #514 forbids sending messages to a Head of Staff containing Erotic Rendering Properties." //Message Logs if(1) var/index = 0 //var/recipient = "Unspecified" //name of the person //var/sender = "Unspecified" //name of the sender //var/message = "Blank" //transferred message dat += "
Back - Refresh

" dat += "" for(var/datum/data_pda_msg/pda in src.linkedServer.pda_msgs) index++ if(index > 3000) break // Del - Sender - Recepient - Message // X - Al Green - Your Mom - WHAT UP!? dat += "" dat += "
XSenderRecipientMessage
X
[pda.sender][pda.recipient][pda.message]
" //Hacking screen. if(2) if(istype(user, /mob/living/silicon/ai) || istype(user, /mob/living/silicon/robot)) dat += "Brute-forcing for server key.
It will take 20 seconds for every character that the password has." 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 += {"01000010011100100111010101110100011001010010110
10110011001101111011100100110001101101001011011100110011
10010000001100110011011110111001000100000011100110110010
10111001001110110011001010111001000100000011010110110010
10111100100101110001000000100100101110100001000000111011
10110100101101100011011000010000001110100011000010110101
10110010100100000001100100011000000100000011100110110010
10110001101101111011011100110010001110011001000000110011
00110111101110010001000000110010101110110011001010111001
00111100100100000011000110110100001100001011100100110000
10110001101110100011001010111001000100000011101000110100
00110000101110100001000000111010001101000011001010010000
00111000001100001011100110111001101110111011011110111001
00110010000100000011010000110000101110011001011100010000
00100100101101110001000000111010001101000011001010010000
00110110101100101011000010110111001110100011010010110110
10110010100101100001000000111010001101000011010010111001
10010000001100011011011110110111001110011011011110110110
00110010100100000011000110110000101101110001000000111001
00110010101110110011001010110000101101100001000000111100
10110111101110101011100100010000001110100011100100111010
10110010100100000011010010110111001110100011001010110111
00111010001101001011011110110111001110011001000000110100
10110011000100000011110010110111101110101001000000110110
00110010101110100001000000111001101101111011011010110010
10110111101101110011001010010000001100001011000110110001
10110010101110011011100110010000001101001011101000010111
00010000001001101011000010110101101100101001000000111001
10111010101110010011001010010000001101110011011110010000
00110100001110101011011010110000101101110011100110010000
00110010101101110011101000110010101110010001000000111010
00110100001100101001000000111001001101111011011110110110
10010000001100100011101010111001001101001011011100110011
10010000001110100011010000110000101110100001000000111010
001101001011011010110010100101110"} //Fake messages if(3) dat += "
Back - Reset

" dat += {""} //Sender - Sender's Job - Recepient - Message //Al Green- Your Dad - Your Mom - WHAT UP!? dat += {""} dat += "
Sender Sender's Job Recipient Message
[customsender] [customjob] [customrecepient ? customrecepient.owner : "NONE"] [custommessage]

Send
" //Request Console Logs if(4) var/index = 0 /* data_rc_msg X - 5% var/rec_dpt = "Unspecified" //name of the person - 15% var/send_dpt = "Unspecified" //name of the sender- 15% var/message = "Blank" //transferred message - 300px var/stamp = "Unstamped" - 15% var/id_auth = "Unauthenticated" - 15% var/priority = "Normal" - 10% */ dat += "
Back - Refresh

" dat += {""} for(var/datum/data_rc_msg/rc in src.linkedServer.rc_msgs) index++ if(index > 3000) break // Del - Sender - Recepient - Message // X - Al Green - Your Mom - WHAT UP!? dat += {""} dat += "
XSending Dep.Receiving Dep. MessageStampID Auth.Priority.
X
[rc.send_dpt] [rc.rec_dpt][rc.message][rc.stamp][rc.id_auth][rc.priority]
" //Spam filter modification if(5) dat += "
Back - Refresh

" var/index = 0 for(var/token in src.linkedServer.spamfilter) index++ if(index > 3000) break dat += "
[index] \[[token]\]
" dat += "
" if (linkedServer.spamfilter.len < linkedServer.spamfilter_limit) dat += "Add token
" dat += "" message = defaultmsg user << browse(dat, "window=message;size=700x700") 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) if(isnull(linkedServer)) user << "Could not complete brute-force: Linked Server Disconnected!" else var/currentKey = src.linkedServer.decryptkey user << "Brute-force completed! The key is '[currentKey]'." src.hacking = 0 update_icon() src.screen = 0 // Return the screen back to normal /obj/machinery/computer/message_monitor/proc/UnmagConsole() src.emag = 0 update_icon() /obj/machinery/computer/message_monitor/proc/ResetMessage() customsender = "System Administrator" customrecepient = null custommessage = "This is a test, please ignore." customjob = "Admin" /obj/machinery/computer/message_monitor/Topic(href, href_list) if(..()) return 1 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))) //Authenticate if (href_list["auth"]) if(auth) auth = 0 screen = 0 else var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) if(dkey && dkey != "") if(src.linkedServer.decryptkey == dkey) auth = 1 else message = incorrectkey //Turn the server on/off. if (href_list["active"]) if(auth) linkedServer.active = !linkedServer.active //Find a server 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 message = "NOTICE: Server selected." else if(message_servers && message_servers.len > 0) linkedServer = message_servers[1] message = "NOTICE: Only Single Server Detected - Server selected." else message = noserver //View the logs - KEY REQUIRED if (href_list["view"]) if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else if(auth) src.screen = 1 //Clears the logs - KEY REQUIRED if (href_list["clear"]) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else if(auth) src.linkedServer.pda_msgs = list() message = "NOTICE: Logs cleared." //Clears the request console logs - KEY REQUIRED if (href_list["clearr"]) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else if(auth) src.linkedServer.rc_msgs = list() message = "NOTICE: Logs cleared." //Change the password - KEY REQUIRED if (href_list["pass"]) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else if(auth) var/dkey = trim(input(usr, "Please enter the decryption key.") as text|null) if(dkey && dkey != "") if(src.linkedServer.decryptkey == dkey) var/newkey = trim(input(usr,"Please enter the new key (3 - 16 characters max):")) if(length(newkey) <= 3) message = "NOTICE: Decryption key too short!" else if(length(newkey) > 16) message = "NOTICE: Decryption key too long!" else if(newkey && newkey != "") src.linkedServer.decryptkey = newkey message = "NOTICE: Decryption key set." else message = incorrectkey //Hack the Console to get the 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 update_icon() //Time it takes to bruteforce is dependant on the password length. spawn(100*length(src.linkedServer.decryptkey)) if(src && src.linkedServer && usr) BruteForce(usr) //Delete the log. if (href_list["delete"]) //Are they on the view logs screen? if(screen == 1) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else //if(istype(href_list["delete"], /datum/data_pda_msg)) src.linkedServer.pda_msgs -= locate(href_list["delete"]) message = "NOTICE: Log Deleted!" //Delete the request console log. if (href_list["deleter"]) //Are they on the view logs screen? if(screen == 4) if(!linkedServer || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else //if(istype(href_list["delete"], /datum/data_pda_msg)) src.linkedServer.rc_msgs -= locate(href_list["deleter"]) message = "NOTICE: Log Deleted!" //Create a custom message if (href_list["msg"]) if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else if(auth) src.screen = 3 //Fake messaging selection - KEY REQUIRED if (href_list["select"]) if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver screen = 0 else switch(href_list["select"]) //Reset if("Reset") ResetMessage() //Select Your Name if("Sender") customsender = sanitize(input(usr, "Please enter the sender's name.") as text|null) //Select Receiver if("Recepient") //Get out list of viable PDAs var/list/obj/item/device/pda/sendPDAs = list() for(var/obj/item/device/pda/P in PDAs) if(!P.owner || P.toff || P.hidden) continue sendPDAs += P if(PDAs && PDAs.len > 0) customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortAtom(sendPDAs) else customrecepient = null //Enter custom job if("RecJob") customjob = sanitize(input(usr, "Please enter the sender's job.") as text|null) //Enter message if("Message") custommessage = input(usr, "Please enter your message.") as text|null custommessage = sanitize(custommessage) //Send message if("Send") if(isnull(customsender) || customsender == "") customsender = "UNKNOWN" if(isnull(customrecepient)) message = "NOTICE: No recepient selected!" return src.attack_hand(usr) if(isnull(custommessage) || custommessage == "") message = "NOTICE: No message entered!" return src.attack_hand(usr) var/obj/item/device/pda/PDARec = null for (var/obj/item/device/pda/P in PDAs) if (!P.owner || P.toff || P.hidden) continue if(P.owner == customsender) PDARec = P //Sender isn't faking as someone who exists if(isnull(PDARec)) src.linkedServer.send_pda_message("[customrecepient.owner]", "[customsender]","[custommessage]") customrecepient.new_message(customsender, customsender, customjob, custommessage) //Sender is faking as someone who exists else src.linkedServer.send_pda_message("[customrecepient.owner]", "[PDARec.owner]","[custommessage]") customrecepient.tnote.Add(list(list("sent" = 0, "owner" = "[PDARec.owner]", "job" = "[customjob]", "message" = "[custommessage]", "target" ="\ref[PDARec]"))) if(!customrecepient.conversations.Find("\ref[PDARec]")) customrecepient.conversations.Add("\ref[PDARec]") customrecepient.new_message(PDARec, custommessage) //Finally.. ResetMessage() //Request Console Logs - KEY REQUIRED if(href_list["viewr"]) if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else if(auth) src.screen = 4 //usr << href_list["select"] if(href_list["spam"]) if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else if(auth) src.screen = 5 if(href_list["addtoken"]) if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else src.linkedServer.spamfilter += input(usr,"Enter text you want to be filtered out","Token creation") as text|null if(href_list["deltoken"]) if(src.linkedServer == null || (src.linkedServer.stat & (NOPOWER|BROKEN))) message = noserver else var/tokennum = text2num(href_list["deltoken"]) src.linkedServer.spamfilter.Cut(tokennum,tokennum+1) 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() ..() spawn(10) if(message_servers) for(var/obj/machinery/message_server/server in message_servers) if(!isnull(server)) if(!isnull(server.decryptkey)) info = "

Daily Key Reset


The new message monitor key is '[server.decryptkey]'.
Please keep this a secret and away from the clown.
If necessary, change the password to a more secure one." info_links = info icon_state = "paper_words" break