From 4759d84a2e245887bea8489ba4e9db0f22f57769 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Mon, 31 Oct 2022 02:46:37 +0100 Subject: [PATCH] [MIRROR] Admin verb to send message on PDA [MDB IGNORE] (#17252) * Admin verb to send message on PDA (#70790) * base * oh, oh. * uh, dots? * no hdd, only computer * kill let in UI(but not in func) * Admin verb to send message on PDA Co-authored-by: Yaroslav Nurkov <78199449+AnywayFarus@users.noreply.github.com> --- code/modules/admin/admin_pda_message.dm | 86 ++++++++++++++ code/modules/admin/admin_verbs.dm | 1 + tgstation.dme | 1 + tgui/packages/tgui/interfaces/AdminPDA.js | 131 ++++++++++++++++++++++ 4 files changed, 219 insertions(+) create mode 100644 code/modules/admin/admin_pda_message.dm create mode 100644 tgui/packages/tgui/interfaces/AdminPDA.js diff --git a/code/modules/admin/admin_pda_message.dm b/code/modules/admin/admin_pda_message.dm new file mode 100644 index 00000000000..395dfde4dbd --- /dev/null +++ b/code/modules/admin/admin_pda_message.dm @@ -0,0 +1,86 @@ +///Allows an admin to send messages on PDA +/client/proc/message_pda() + set name = "PDA Message" + set category = "Admin.Events" + + if(!holder ||!check_rights(R_ADMIN)) + return + + holder.message_pda() + +///Opens up the PDA Message Panel +/datum/admins/proc/message_pda() + if(!check_rights(R_ADMIN)) + return + + if(!length(GLOB.TabletMessengers)) + to_chat(usr, span_warning("ERROR: There are no users you can send a message to")) + return + + var/datum/admin_pda_panel/ui = new(usr) + ui.ui_interact(usr) + +/// Panel +/datum/admin_pda_panel + /// PDA which have players(and we can send them message) + var/available_pdas = list() + +/datum/admin_pda_panel/New() + for(var/obj/item/modular_computer/computer in GLOB.TabletMessengers) + for(var/datum/computer_file/program/messenger/app in computer.stored_files) + if(!computer.saved_identification || !computer.saved_job || app.monitor_hidden || app.invisible) + continue + available_pdas += list(list("tablet" = computer, "name" = computer.saved_identification)) + +/datum/admin_pda_panel/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AdminPDA") + ui.open() + +/datum/admin_pda_panel/ui_state(mob/user) + return GLOB.admin_state + +/datum/admin_pda_panel/ui_static_data(mob/user) + var/list/data = list() + data["users"] = list() + + for(var/username in available_pdas) + data["users"] += username["name"] + return data + +/datum/admin_pda_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + if(..()) + return + + if(!check_rights(R_ADMIN)) + return + + switch(action) + if("sendMessage") + var/targets = list() + var/spam = params["spam"] + for(var/target in available_pdas) + if(!spam && target["name"] != params["user"]) + continue + targets += target["tablet"] + + if(!length(targets)) + to_chat(usr, span_warning("ERROR: Target is unavaiable(or not choosed).")) + return + + var/datum/signal/subspace/messaging/tablet_msg/signal = new(targets[1], list( + "name" = params["name"], + "job" = params["job"], + "message" = html_decode(params["message"]), + "ref" = FALSE, + "targets" = targets, + "emojis" = FALSE, + "rigged" = FALSE, + "photo" = FALSE, + "automated" = FALSE, + )) + + signal.send_to_receivers() + message_admins("[key_name_admin(usr)] has send custom PDA message to [spam ? "everyone" : params["user"]].") + log_admin("[key_name(usr)] has send custom PDA message to [spam ? "everyone" : params["user"]]. Message: [params["message"]].") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 782ff6dacef..01f209e00f9 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -95,6 +95,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/show_manifest, /client/proc/list_dna, /client/proc/list_fingerprints, + /client/proc/message_pda, /*send a message to somebody on PDA*/ ) GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel, /client/proc/ban_panel, /client/proc/stickybanpanel)) GLOBAL_PROTECT(admin_verbs_ban) diff --git a/tgstation.dme b/tgstation.dme index 8968924389c..b7caf40698e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2118,6 +2118,7 @@ #include "code\modules\actionspeed\modifiers\status_effects.dm" #include "code\modules\admin\admin.dm" #include "code\modules\admin\admin_investigate.dm" +#include "code\modules\admin\admin_pda_message.dm" #include "code\modules\admin\admin_ranks.dm" #include "code\modules\admin\admin_verbs.dm" #include "code\modules\admin\adminmenu.dm" diff --git a/tgui/packages/tgui/interfaces/AdminPDA.js b/tgui/packages/tgui/interfaces/AdminPDA.js new file mode 100644 index 00000000000..9e620632607 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AdminPDA.js @@ -0,0 +1,131 @@ +import { useBackend, useLocalState } from '../backend'; +import { Section, Dropdown, Input, Box, TextArea } from '../components'; +import { Button, ButtonCheckbox } from '../components/Button'; +import { Window } from '../layouts'; + +export const AdminPDA = (props, context) => { + return ( + + + + + + + + ); +}; + +export const ReceiverChoice = (props, context) => { + const { act, data } = useBackend(context); + const receivers = Array.from(data.users).sort(); + + const [user, setUser] = useLocalState(context, 'user', ''); + const [spam, setSpam] = useLocalState(context, 'spam', false); + + return ( +
+ + { + setUser(value); + }} + /> + + + setSpam(!spam)}> + Should it be sent to everyone? + + +
+ ); +}; + +export const SenderInfo = (props, context) => { + const [name, setName] = useLocalState(context, 'name', ''); + const [job, setJob] = useLocalState(context, 'job', ''); + + return ( +
+ + { + setName(value); + }} + /> + + + { + setJob(value); + }} + /> + +
+ ); +}; + +export const MessageInput = (props, context) => { + const { act } = useBackend(context); + + const [user, setUser] = useLocalState(context, 'user', ''); + const [name, setName] = useLocalState(context, 'name', ''); + const [job, setJob] = useLocalState(context, 'job', ''); + const [messageText, setMessageText] = useLocalState(context, 'message', ''); + const [spam, setSpam] = useLocalState(context, 'spam', false); + + const tooltipText = function (name, job, message) { + let reasonList = []; + if (!name) reasonList.push('name'); + if (!job) reasonList.push('job'); + if (!message) reasonList.push('message text'); + return reasonList.join(', '); + }; + + const blocked = !name || !job || !messageText; + + return ( +
+ +