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 (
+
+ );
+};
+
+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 (
+
+
+
+
+
+
+
+ );
+};