From e881c77c8f1205864df8530d3e900aa9deee0682 Mon Sep 17 00:00:00 2001 From: NullSnapshot Date: Sun, 24 Jul 2016 23:43:54 -0700 Subject: [PATCH] refactors admin faxes to allow for more simple to use fax creation and replying. Admins also gain the ability to initiate faxes. And mods can send and receive faxes now. --- code/modules/admin/admin.dm | 91 ++++++++++++ code/modules/admin/admin_verbs.dm | 7 +- code/modules/admin/topic.dm | 89 ++---------- code/modules/paperwork/adminpaper.dm | 196 ++++++++++++++++++++++++++ code/modules/paperwork/faxmachine.dm | 29 ++-- code/modules/paperwork/photocopier.dm | 10 +- polaris.dme | 1 + 7 files changed, 328 insertions(+), 95 deletions(-) create mode 100644 code/modules/paperwork/adminpaper.dm diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index dc1cbf1c8cd..c43832cd372 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1348,6 +1348,7 @@ proc/admin_notice(var/message, var/rights) H.paralysis = 0 msg = "has unparalyzed [key_name(H)]." log_and_message_admins(msg) + /datum/admins/proc/set_tcrystals(mob/living/carbon/human/H as mob) set category = "Debug" set name = "Set Telecrystals" @@ -1380,3 +1381,93 @@ proc/admin_notice(var/message, var/rights) else usr << "You do not have access to this command." + +/datum/admins/proc/sendFax() + set category = "Special Verbs" + set name = "Send Fax" + set desc = "Sends a fax to this machine" + var/department = input("Choose a fax", "Fax") as null|anything in alldepartments + for(var/obj/machinery/photocopier/faxmachine/sendto in allfaxes) + if(sendto.department == department) + + if (!istype(src,/datum/admins)) + src = usr.client.holder + if (!istype(src,/datum/admins)) + usr << "Error: you are not an admin!" + return + + var/replyorigin = input(src.owner, "Please specify who the fax is coming from", "Origin") as text|null + + var/obj/item/weapon/paper/admin/P = new /obj/item/weapon/paper/admin( null ) //hopefully the null loc won't cause trouble for us + faxreply = P + + P.admindatum = src + P.origin = replyorigin + P.destination = sendto + + P.adminbrowse() + + +datum/admins/var/obj/item/weapon/paper/admin/faxreply // var to hold fax replies in + +/datum/admins/proc/faxCallback(var/obj/item/weapon/paper/admin/P, var/obj/machinery/photocopier/faxmachine/destination) + var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null + + P.name = "[P.origin] - [customname]" + P.desc = "This is a paper titled '" + P.name + "'." + + var/shouldStamp = 1 + if(!P.sender) // admin initiated + switch(alert("Would you like the fax stamped?",, "Yes", "No")) + if("No") + shouldStamp = 0 + + if(shouldStamp) + P.stamps += "
This paper has been stamped by the [P.origin] Quantum Relay." + + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + var/{x; y;} + x = rand(-2, 0) + y = rand(-1, 2) + P.offset_x += x + P.offset_y += y + stampoverlay.pixel_x = x + stampoverlay.pixel_y = y + + if(!P.ico) + P.ico = new + P.ico += "paper_stamp-cent" + stampoverlay.icon_state = "paper_stamp-cent" + + if(!P.stamped) + P.stamped = new + P.stamped += /obj/item/weapon/stamp/centcomm + P.overlays += stampoverlay + + var/obj/item/rcvdcopy + rcvdcopy = destination.copy(P) + rcvdcopy.loc = null //hopefully this shouldn't cause trouble + adminfaxes += rcvdcopy + + + + if(destination.recievefax(P)) + src.owner << "\blue Message reply to transmitted successfully." + if(P.sender) // sent as a reply + log_admin("[key_name(src.owner)] replied to a fax message from [key_name(P.sender)]") + for(var/client/C in admins) + if((R_ADMIN | R_MOD) & C.holder.rights) + C << "FAX LOG:[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(P.sender)] (VIEW)" + else + log_admin("[key_name(src.owner)] has sent a fax message to [destination.department]") + for(var/client/C in admins) + if((R_ADMIN | R_MOD) & C.holder.rights) + C << "FAX LOG:[key_name_admin(src.owner)] has sent a fax message to [destination.department] (VIEW)" + + else + src.owner << "\red Message reply failed." + + spawn(100) + qdel(P) + faxreply = null + return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 1cb76cef8d3..b1b03a4ac4d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -96,7 +96,8 @@ var/list/admin_verbs_admin = list( /client/proc/toggle_debug_logs, /client/proc/toggle_attack_logs, /datum/admins/proc/paralyze_mob, - /client/proc/fixatmos + /client/proc/fixatmos, + /datum/admins/proc/sendFax ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, @@ -305,7 +306,9 @@ var/list/admin_verbs_mod = list( /client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head', /datum/admins/proc/paralyze_mob, /client/proc/cmd_admin_direct_narrate, - /client/proc/allow_character_respawn // Allows a ghost to respawn , + /client/proc/allow_character_respawn, // Allows a ghost to respawn , + /datum/admins/proc/sendFax + ) var/list/admin_verbs_mentor = list( diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 261c95515a7..335241d15e7 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1386,86 +1386,21 @@ H.show(src.owner) return - else if(href_list["CentcommFaxReply"]) - var/mob/sender = locate(href_list["CentcommFaxReply"]) + else if(href_list["FaxReply"]) + var/mob/sender = locate(href_list["FaxReply"]) var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) - - //todo: sanitize - var/input = input(src.owner, "Please enter a message to reply to [key_name(sender)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use
for line breaks.", "Outgoing message from Centcomm", "") as message|null - if(!input) return - - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null - - // Create the reply message - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( null ) //hopefully the null loc won't cause trouble for us - P.name = "[command_name()]- [customname]" - P.info = input - P.update_icon() - - // Stamps - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-cent" - if(!P.stamped) - P.stamped = new - P.stamped += /obj/item/weapon/stamp - P.overlays += stampoverlay - P.stamps += "
This paper has been stamped by the Central Command Quantum Relay." - - if(fax.recievefax(P)) - src.owner << "\blue Message reply to transmitted successfully." - log_admin("[key_name(src.owner)] replied to a fax message from [key_name(sender)]: [input]") - message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(sender)]", 1) - else - src.owner << "\red Message reply failed." - - spawn(100) - qdel(P) - return - - else if(href_list["SolGovFaxReply"]) - //TODO - /* - var/mob/living/carbon/human/H = locate(href_list["SolGovFaxReply"]) - var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) - - var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use
for line breaks.", "Outgoing message from Centcomm", "") as message|null - if(!input) return - - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null - - for(var/obj/machinery/photocopier/faxmachine/F in machines) - if(F == fax) - if(! (F.stat & (BROKEN|NOPOWER) ) ) - - // animate! it's alive! - flick("faxreceive", F) - - // give the sprite some time to flick - spawn(20) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( F.loc ) - P.name = "Sol Government- [customname]" - P.info = input - P.update_icon() - - playsound(F.loc, "sound/items/polaroid1.ogg", 50, 1) - - // Stamps - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-cap" - if(!P.stamped) - P.stamped = new - P.stamped += /obj/item/weapon/stamp - P.overlays += stampoverlay - P.stamps += "
This paper has been stamped and encrypted by the Sol Government Quantum Relay." - - src.owner << "Message reply to transmitted successfully." - log_admin("[key_name(src.owner)] replied to a fax message from [key_name(H)]: [input]") - message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)]", 1) - return - src.owner << "/red Unable to locate fax!" - */ + var/replyorigin = href_list["replyorigin"] + var/obj/item/weapon/paper/admin/P = new /obj/item/weapon/paper/admin( null ) //hopefully the null loc won't cause trouble for us + faxreply = P + + P.admindatum = src + P.origin = replyorigin + P.destination = fax + P.sender = sender + + P.adminbrowse() else if(href_list["jumpto"]) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm new file mode 100644 index 00000000000..ccecb16d44b --- /dev/null +++ b/code/modules/paperwork/adminpaper.dm @@ -0,0 +1,196 @@ +//Adminpaper - it's like paper, but more adminny! +/obj/item/weapon/paper/admin + name = "administrative paper" + desc = "If you see this, something has gone horribly wrong." + var/datum/admins/admindatum = null + + var/interactions = null + var/isCrayon = 0 + var/origin = null + var/mob/sender = null + var/obj/machinery/photocopier/faxmachine/destination + + var/header = null + var/headerOn = TRUE + +/obj/item/weapon/paper/admin/New() + ..() + generateInteractions() + + +/obj/item/weapon/paper/admin/proc/generateInteractions() + //clear first + interactions = null + interactions += "
" + interactions += "
Send fax " + interactions += "Pen mode: [isCrayon ? "Crayon" : "Pen"] " + interactions += "Cancel fax " + interactions += "
" + interactions += "Toggle Header " + interactions += "Clear page
" + +/obj/item/weapon/paper/admin/proc/generateHeader() + var/originhash = md5("[origin]") + var/timehash = copytext(md5("[world.time]"),1,10) + var/text = null + //TODO change logo based on who you're contacting. + text = "

" + text += "[origin] quantum uplink signed message
" + text += "Encryption key: [originhash]
" + text += "Challenge: [timehash]

" + + header = text + +/obj/item/weapon/paper/admin/proc/adminbrowse() + updateinfolinks() + generateHeader() + usr << browse("[name][header][info_links][stamps][interactions]", "window=[name];can_close=0") + +obj/item/weapon/paper/admin/proc/updateDisplay() + if (headerOn) + usr << browse("[name][header][info_links][stamps][interactions]", "window=[name];can_close=0") + else + usr << browse("[name][info_links][stamps][interactions]", "window=[name];can_close=0") + +/obj/item/weapon/paper/admin/Topic(href, href_list) + if(href_list["write"]) + var/id = href_list["write"] + if(free_space <= 0) + usr << "There isn't enough space left on \the [src] to write anything." + return + + var/t = sanitize(input("Enter what you want to write:", "Write", null, null) as message, free_space, extra = 0) + + if(!t) + return + + var last_fields_value = fields + + //t = html_encode(t) + t = replacetext(t, "\n", "
") + t = parsepencode(t, isCrayon) // Encode everything from pencode to html + + + if(fields > 50)//large amount of fields creates a heavy load on the server, see updateinfolinks() and addtofield() + usr << "Too many fields. Sorry, you can't do this." + fields = last_fields_value + return + + if(id!="end") + addtofield(text2num(id), t) // He wants to edit a field, let him. + else + info += t // Oh, he wants to edit to the end of the file, let him. + updateinfolinks() + + update_space(t) + + updateDisplay() + + update_icon() + return + + if(href_list["confirm"]) + switch(alert("Are you sure you want to send the fax as is?",, "Yes", "No")) + if("Yes") + if(headerOn) + info = header + info + updateinfolinks() + usr << browse(null, "window=[name]") + admindatum.faxCallback(src, destination) + return + + if(href_list["penmode"]) + isCrayon = !isCrayon + generateInteractions() + updateDisplay() + return + + if(href_list["cancel"]) + usr << browse(null, "window=[name]") + qdel(src) + return + + if(href_list["clear"]) + clearpaper() + updateDisplay() + return + + if(href_list["toggleheader"]) + headerOn = !headerOn + updateDisplay() + return + + + + +/obj/item/weapon/paper/admin/parsepencode(var/t, var/iscrayon = 0, var/sign = 1) +// t = copytext(sanitize(t),1,MAX_MESSAGE_LEN) + + t = replacetext(t, "\[center\]", "
") + t = replacetext(t, "\[/center\]", "
") + t = replacetext(t, "\[br\]", "
") + t = replacetext(t, "\[b\]", "") + t = replacetext(t, "\[/b\]", "") + t = replacetext(t, "\[i\]", "") + t = replacetext(t, "\[/i\]", "") + t = replacetext(t, "\[u\]", "") + t = replacetext(t, "\[/u\]", "") + t = replacetext(t, "\[time\]", "[stationtime2text()]") + t = replacetext(t, "\[date\]", "[stationdate2text()]") + t = replacetext(t, "\[large\]", "") + t = replacetext(t, "\[/large\]", "") + if(!sign) + t = replacetext(t, "\[sign\]", "[get_signature()]") + t = replacetext(t, "\[field\]", "") + + t = replacetext(t, "\[h1\]", "

") + t = replacetext(t, "\[/h1\]", "

") + t = replacetext(t, "\[h2\]", "

") + t = replacetext(t, "\[/h2\]", "

") + t = replacetext(t, "\[h3\]", "

") + t = replacetext(t, "\[/h3\]", "

") + + if(!iscrayon) + t = replacetext(t, "\[*\]", "
  • ") + t = replacetext(t, "\[hr\]", "
    ") + t = replacetext(t, "\[small\]", "") + t = replacetext(t, "\[/small\]", "") + t = replacetext(t, "\[list\]", "") + t = replacetext(t, "\[table\]", "") + t = replacetext(t, "\[/table\]", "
    ") + t = replacetext(t, "\[grid\]", "") + t = replacetext(t, "\[/grid\]", "
    ") + t = replacetext(t, "\[row\]", "") + t = replacetext(t, "\[cell\]", "") + t = replacetext(t, "\[logo\]", "") + + t = "[t]" + else // If it is a crayon, and he still tries to use these, make them empty! + t = replacetext(t, "\[*\]", "") + t = replacetext(t, "\[hr\]", "") + t = replacetext(t, "\[small\]", "") + t = replacetext(t, "\[/small\]", "") + t = replacetext(t, "\[list\]", "") + t = replacetext(t, "\[/list\]", "") + t = replacetext(t, "\[table\]", "") + t = replacetext(t, "\[/table\]", "") + t = replacetext(t, "\[row\]", "") + t = replacetext(t, "\[cell\]", "") + t = replacetext(t, "\[logo\]", "") + + t = "[t]" + +//Count the fields + var/laststart = 1 + while(1) + var/i = findtext(t, "", laststart) // + if(i==0) + break + laststart = i+1 + fields++ + + return t + +/obj/item/weapon/paper/admin/get_signature() + return input(usr, "Enter the name you wish to sign the paper with (will prompt for multiple entries, in order of entry)", "Signature") as text|null \ No newline at end of file diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 8c30f1d4863..ff489f56943 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -142,6 +142,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins flick("faxreceive", src) playsound(loc, "sound/effects/printer.ogg", 50, 1) + // give the sprite some time to flick sleep(20) @@ -163,11 +164,12 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins use_power(200) + //recieved copies should not use toner since it's being used by admins only. var/obj/item/rcvdcopy if (istype(copyitem, /obj/item/weapon/paper)) - rcvdcopy = copy(copyitem) + rcvdcopy = copy(copyitem, 0) else if (istype(copyitem, /obj/item/weapon/photo)) - rcvdcopy = photocopy(copyitem) + rcvdcopy = photocopy(copyitem, 0) else if (istype(copyitem, /obj/item/weapon/paper_bundle)) rcvdcopy = bundlecopy(copyitem, 0) else @@ -178,14 +180,15 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins adminfaxes += rcvdcopy //message badmins that a fax has arrived - switch(destination) - if (boss_name) - message_admins(sender, "[uppertext(boss_short)] FAX", rcvdcopy, "CentcommFaxReply", "#006100") - if ("Sif Governmental Authority") - message_admins(sender, "SIF GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0") - //message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "SolGovFaxReply", "#1F66A0") - if ("Supply") - message_admins(sender, "[uppertext(boss_short)] SUPPLY FAX", rcvdcopy, "CentcommFaxReply", "#5F4519") + if (destination == boss_name) + message_admins(sender, "[uppertext(boss_short)] FAX", rcvdcopy, "CentcommFaxReply", "#006100") + else if ("Sif Governmental Authority") + message_admins(sender, "SIF GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0") + else if ("Supply") + message_admins(sender, "[uppertext(boss_short)] SUPPLY FAX", rcvdcopy, "CentcommFaxReply", "#5F4519") + else + message_admins(sender, "[uppertext(destination)] FAX", rcvdcopy, "UNKNOWN") + sendcooldown = 1800 sleep(50) @@ -193,9 +196,11 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins /obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/obj/item/sent, var/reply_type, font_colour="#006100") - var/msg = "\blue [faxname]: [key_name(sender, 1)] (PP) (VV) (SM) ([admin_jump_link(sender, src)]) (CA) (REPLY): Receiving '[sent.name]' via secure connection ... view message" + var/msg = "\blue [faxname]: [get_options_bar(sender, 2,1,1)]" + msg += "(REPLY): " + msg += "Receiving '[sent.name]' via secure connection ... view message" for(var/client/C in admins) - if(R_ADMIN & C.holder.rights) + if((R_ADMIN | R_MOD) & C.holder.rights) C << msg C << 'sound/effects/printer.ogg' diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index ec0d7acf19f..4d0e22f1860 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -165,7 +165,7 @@ toner = 0 return -/obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy) +/obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy, var/need_toner=1) var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc) if(toner > 10) //lots of toner, make it dark c.info = "" @@ -196,13 +196,14 @@ img.pixel_y = copy.offset_y[j] c.overlays += img c.updateinfolinks() - toner-- + if(need_toner) + toner-- if(toner == 0) visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") return c -/obj/machinery/photocopier/proc/photocopy(var/obj/item/weapon/photo/photocopy) +/obj/machinery/photocopier/proc/photocopy(var/obj/item/weapon/photo/photocopy, var/need_toner=1) var/obj/item/weapon/photo/p = photocopy.copy() p.loc = src.loc @@ -216,7 +217,8 @@ p.img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) p.tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) p.icon = I - toner -= 5 //photos use a lot of ink! + if(need_toner) + toner -= 5 //photos use a lot of ink! if(toner < 0) toner = 0 visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") diff --git a/polaris.dme b/polaris.dme index 1ef2cb70fa1..3309a393081 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1704,6 +1704,7 @@ #include "code\modules\overmap\ships\computers\shuttle.dm" #include "code\modules\overmap\ships\engines\engine.dm" #include "code\modules\overmap\ships\engines\thermal.dm" +#include "code\modules\paperwork\adminpaper.dm" #include "code\modules\paperwork\carbonpaper.dm" #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\faxmachine.dm"