var/list/obj/machinery/photocopier/faxmachine/allfaxes = list() var/list/arrived_faxes = list() //cache for faxes that have been sent to the admins var/list/sent_faxes = list() //cache for faxes that have been sent by the admins var/list/alldepartments = list() var/list/admin_departments /obj/machinery/photocopier/faxmachine name = "fax machine" icon = 'icons/obj/library.dmi' icon_state = "fax" insert_anim = "faxsend" req_one_access = list(access_lawyer, access_heads, access_armory) //Warden needs to be able to Fax tau ceti gov too. density = 0//It's a small machine that sits on a table, this allows small things to walk under that table use_power = 1 idle_power_usage = 30 active_power_usage = 200 var/static/const/adminfax_cooldown = 1800 // in 1/10 seconds var/static/const/normalfax_cooldown = 300 var/static/const/broadcastfax_cooldown = 3000 var/static/const/broadcast_departments = "Stationwide broadcast (WARNING)" var/obj/item/weapon/card/id/scan = null // identification var/authenticated = 0 var/sendtime = 0 // Time when fax was sent var/sendcooldown = 0 // Delay, before another fax can be sent (in 1/10 second). Used by set_cooldown() and get_remaining_cooldown() var/department = "Unknown" // our department var/destination = null // the department we're sending to var/list/obj/item/device/pda/alert_pdas = list() //A list of PDAs to alert upon arrival of the fax. /obj/machinery/photocopier/faxmachine/Initialize() . = ..() allfaxes += src if(!destination) destination = "[current_map.boss_name]" if( !(("[department]" in alldepartments) || ("[department]" in admin_departments)) ) alldepartments |= department /obj/machinery/photocopier/faxmachine/attack_hand(mob/user as mob) user.set_machine(src) var/remaining_cooldown = get_remaining_cooldown() var/dat = "Fax Machine
" var/scan_name if(scan) scan_name = scan.name else scan_name = "--------" dat += "Confirm Identity: [scan_name]
" if(authenticated) dat += "{Log Out}" else dat += "{Log In}" dat += "
" if(authenticated) dat += "Logged in to: [current_map.boss_name] Quantum Entanglement Network

" if(copyitem) dat += "Remove Item

" if(remaining_cooldown > 0) dat += "Transmitter arrays realigning. Please stand by. [round(remaining_cooldown / 10)] seconds remaining.
" else dat += "Send
" dat += "Currently sending: [copyitem.name]
" dat += "Sending to: [destination]
" else if(remaining_cooldown > 0) dat += "Please insert paper to send via secure connection.

" dat += "Transmitter arrays realigning. Please stand by. [round(remaining_cooldown / 10)] seconds remaining.
" else dat += "Please insert paper to send via secure connection.

" else dat += "Proper authentication is required to use this device.

" if(copyitem) dat += "Remove Item
" dat += "
PDAs to notify:
" if (alert_pdas && alert_pdas.len) for (var/obj/item/device/pda/pda in alert_pdas) dat += "[alert_pdas[pda]] - Unlink
" dat += "
Add PDA to Notify" user << browse(dat, "window=copier") onclose(user, "copier") if (remaining_cooldown > 0) spawn(50) // Auto-refresh every 5 seconds, if cooldown is active updateUsrDialog() return /obj/machinery/photocopier/faxmachine/Topic(href, href_list) if(href_list["send"]) if (get_remaining_cooldown() > 0) // Rate-limit sending faxes usr << "The fax machine isn't ready, yet!" updateUsrDialog() return if(copyitem) if (destination in admin_departments) send_admin_fax(usr, destination) else if (destination == broadcast_departments) send_broadcast_fax() else sendfax(destination) updateUsrDialog() else if(href_list["remove"]) if(copyitem) copyitem.loc = loc if (get_dist(usr, src) < 2) usr.put_in_hands(copyitem) usr << "You take \the [copyitem] out of \the [src]." else usr << "You eject \the [copyitem] from \the [src]." copyitem = null updateUsrDialog() if(href_list["scan"]) if (scan) if(ishuman(usr)) scan.loc = usr.loc if(!usr.get_active_hand()) usr.put_in_hands(scan) scan = null else scan.loc = src.loc scan = null else var/obj/item/I = usr.get_active_hand() if (istype(I, /obj/item/weapon/card/id) && usr.unEquip(I)) I.loc = src scan = I authenticated = 0 if(href_list["dept"]) var/lastdestination = destination destination = input(usr, "Which department?", "Choose a department", "") as null|anything in (alldepartments + admin_departments + broadcast_departments) if(!destination) destination = lastdestination if(href_list["auth"]) if ( (!( authenticated ) && (scan)) ) if (check_access(scan)) authenticated = 1 if(href_list["logout"]) authenticated = 0 if(href_list["linkpda"]) var/obj/item/device/pda/pda = usr.get_active_hand() if (!pda || !istype(pda)) usr << "You need to be holding a PDA to link it." else if (pda in alert_pdas) usr << "\The [pda] appears to be already linked." //Update the name real quick. alert_pdas[pda] = pda.name else alert_pdas += pda alert_pdas[pda] = pda.name usr << "You link \the [pda] to \the [src]. It will now ping upon the arrival of a fax to this machine." if(href_list["unlink"]) var/obj/item/device/pda/pda = locate(href_list["unlink"]) if (pda && istype(pda)) if (pda in alert_pdas) usr << "You unlink [alert_pdas[pda]] from \the [src]. It will no longer be notified of new faxes." alert_pdas -= pda updateUsrDialog() /obj/machinery/photocopier/faxmachine/machinery_process() .=..() var/static/ui_update_delay = 0 if ((sendtime + sendcooldown) < world.time) sendcooldown = 0 /* * Set the send cooldown * cooldown: duration in ~1/10s */ /obj/machinery/photocopier/faxmachine/proc/set_cooldown(var/cooldown) // Reset send time sendtime = world.time // Set cooldown length sendcooldown = cooldown /* * Get remaining cooldown duration in ~1/10s */ /obj/machinery/photocopier/faxmachine/proc/get_remaining_cooldown() var/remaining_time = (sendtime + sendcooldown) - world.time if ((remaining_time < 0) || (sendcooldown == 0)) // Time is up, but Process() hasn't caught up, yet // or no cooldown has been set remaining_time = 0 return remaining_time /* * Send normal fax message to on-station fax machine * destination: (string) from /allfaxes * display_message: (bool) 1=display info text, 0="silent mode" */ /obj/machinery/photocopier/faxmachine/proc/sendfax(var/destination, var/display_message = 1) if(stat & (BROKEN|NOPOWER)) return 0 use_power(200) var/success = 0 for(var/obj/machinery/photocopier/faxmachine/F in allfaxes) if( F.department == destination ) success = F.recievefax(copyitem) if (success) set_cooldown(normalfax_cooldown) if (display_message) // Normal fax if (success) visible_message("[src] beeps, \"Message transmitted successfully.\"") else visible_message("[src] beeps, \"Error transmitting message.\"") return success /obj/machinery/photocopier/faxmachine/proc/recievefax(var/obj/item/incoming) if(stat & (BROKEN|NOPOWER)) return 0 if(department == "Unknown") return 0 //You can't send faxes to "Unknown" if (!istype(incoming, /obj/item/weapon/paper) && !istype(incoming, /obj/item/weapon/photo) && !istype(incoming, /obj/item/weapon/paper_bundle)) return 0 flick("faxreceive", src) playsound(loc, "sound/items/polaroid1.ogg", 50, 1) // give the sprite some time to flick spawn(20) if (istype(incoming, /obj/item/weapon/paper)) copy(incoming, 1, 0, 0) else if (istype(incoming, /obj/item/weapon/photo)) photocopy(incoming) else if (istype(incoming, /obj/item/weapon/paper_bundle)) bundlecopy(incoming) do_pda_alerts() use_power(active_power_usage) return 1 /obj/machinery/photocopier/faxmachine/proc/send_broadcast_fax() var success = 1 for (var/dest in (alldepartments - department)) // Send to everyone except this department delay(1) success &= sendfax(dest, 0) // 0: don't display success/error messages if(!success)// Stop on first error break if (success) visible_message("[src] beeps, \"Messages transmitted successfully.\"") set_cooldown(broadcastfax_cooldown) else visible_message("[src] beeps, \"Error transmitting messages.\"") set_cooldown(normalfax_cooldown) /obj/machinery/photocopier/faxmachine/proc/send_admin_fax(var/mob/sender, var/destination) if(stat & (BROKEN|NOPOWER)) return use_power(200) var/obj/item/rcvdcopy if (istype(copyitem, /obj/item/weapon/paper)) rcvdcopy = copy(copyitem, 0) else if (istype(copyitem, /obj/item/weapon/photo)) rcvdcopy = photocopy(copyitem) else if (istype(copyitem, /obj/item/weapon/paper_bundle)) rcvdcopy = bundlecopy(copyitem, 0) else visible_message("[src] beeps, \"Error transmitting message.\"") return rcvdcopy.forceMove(null) //hopefully this shouldn't cause trouble arrived_faxes += rcvdcopy //message badmins that a fax has arrived if (destination == current_map.boss_name) message_admins(sender, "[uppertext(current_map.boss_short)] FAX", rcvdcopy, "CentcommFaxReply", "#006100") else if (destination == "[current_map.system_name] Government") message_admins(sender, "[uppertext(current_map.system_name)] GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0") set_cooldown(adminfax_cooldown) spawn(50) visible_message("[src] beeps, \"Message transmitted successfully.\"") /obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/obj/item/sent, var/reply_type, font_colour="#006100") var/msg = " [faxname]: [key_name(sender, 1)] (PP) (VV) (SM) (JMP) (CA) (REPLY): Receiving '[sent.name]' via secure connection ... view message" var/cciaa_present = 0 var/cciaa_afk = 0 for(var/client/C in admins) var/flags = C.holder.rights & (R_ADMIN|R_CCIAA) if(flags) C << msg if (flags == R_CCIAA) // Admins sometimes get R_CCIAA, but CCIAA never get R_ADMIN cciaa_present++ if (C.is_afk()) cciaa_afk++ var/discord_msg = "New fax arrived! [faxname]: \"[sent.name]\" by [sender]. ([cciaa_present] agents online" if (cciaa_present) if ((cciaa_present - cciaa_afk) <= 0) discord_msg += ", **all AFK!**)" else discord_msg += ", [cciaa_afk] AFK.)" else discord_msg += ".)" discord_bot.send_to_cciaa(discord_msg) /obj/machinery/photocopier/faxmachine/proc/do_pda_alerts() if (!alert_pdas || !alert_pdas.len) return for (var/obj/item/device/pda/pda in alert_pdas) if (pda.toff || pda.message_silent) continue var/message = "New fax has arrived at [src.department] fax machine." pda.new_info(pda.message_silent, pda.ttone, "\icon[pda] [message]")