From d0170a11c669bec8aca15bec229f0abcb61c4d7d Mon Sep 17 00:00:00 2001 From: Contrabang <91113370+Contrabang@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:30:00 -0400 Subject: [PATCH] Adds buttons for admins/mentors to see amount of open adminhelp/mentorhelp tickets. (#29498) * wham * fix --- code/__DEFINES/dcs/datum_signals.dm | 2 + .../subsystem/tickets/SStickets.dm | 12 +++ code/modules/admin/admin_verbs.dm | 3 + code/modules/admin/holder2.dm | 5 +- .../dead/observer/observer_admin_actions.dm | 74 ++++++++++++++++++ .../mob/dead/observer/observer_login.dm | 1 + .../mob/dead/observer/observer_logout.dm | 1 + icons/mob/actions/actions_admin.dmi | Bin 0 -> 1165 bytes paradise.dme | 1 + 9 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 code/modules/mob/dead/observer/observer_admin_actions.dm create mode 100644 icons/mob/actions/actions_admin.dmi diff --git a/code/__DEFINES/dcs/datum_signals.dm b/code/__DEFINES/dcs/datum_signals.dm index fa475cfd2a2..381204c413c 100644 --- a/code/__DEFINES/dcs/datum_signals.dm +++ b/code/__DEFINES/dcs/datum_signals.dm @@ -134,3 +134,5 @@ /// from base of /datum/ruleset/proc/can_apply() #define COMSIG_RULESET_FAILED_SPECIES "failed_species" + +#define COMSIGN_TICKET_COUNT_UPDATE "ticket_count_updated" diff --git a/code/controllers/subsystem/tickets/SStickets.dm b/code/controllers/subsystem/tickets/SStickets.dm index c7c77d18f48..2b90e822867 100644 --- a/code/controllers/subsystem/tickets/SStickets.dm +++ b/code/controllers/subsystem/tickets/SStickets.dm @@ -187,6 +187,7 @@ SUBSYSTEM_DEF(tickets) SEND_SOUND(C, sound('sound/effects/adminticketopen.ogg')) message_staff(url_title, NONE, TRUE) + open_ticket_count_updated() return T //Set ticket state with key N to open @@ -197,6 +198,7 @@ SUBSYSTEM_DEF(tickets) sendFollowupToDiscord(T, usr.client, "*Ticket reopened.*") to_chat_safe(returnClient(N), "Your [ticket_name] has been re-opened.") T.ticketState = TICKET_OPEN + open_ticket_count_updated() return TRUE //Set ticket state with key N to resolved @@ -207,6 +209,7 @@ SUBSYSTEM_DEF(tickets) message_staff("[usr.client] / ([usr]) resolved [ticket_name] number [N]") sendFollowupToDiscord(T, usr.client, "*Ticket resolved.*") to_chat_safe(returnClient(N), "Your [ticket_name] has now been resolved.") + open_ticket_count_updated() return TRUE /datum/controller/subsystem/tickets/proc/refresh_tickets(list/tickets) @@ -271,6 +274,7 @@ SUBSYSTEM_DEF(tickets) message_staff("[C] has converted ticket number [T.ticketNum] to a [other_ticket_name] ticket.") log_game("[C] has converted ticket number [T.ticketNum] to a [other_ticket_name] ticket.") create_other_system_ticket(T) + open_ticket_count_updated() /datum/controller/subsystem/tickets/proc/create_other_system_ticket(datum/ticket/T) var/client/C = get_client_by_ckey(T.client_ckey) @@ -326,6 +330,7 @@ SUBSYSTEM_DEF(tickets) sendFollowupToDiscord(T, usr.client, "*Ticket closed.*") to_chat_safe(returnClient(N), close_messages) T.ticketState = TICKET_CLOSED + open_ticket_count_updated() return TRUE //Check if the user already has a ticket open and within the cooldown period. @@ -827,6 +832,13 @@ UI STUFF return FALSE return TRUE +/datum/controller/subsystem/tickets/proc/open_ticket_count_updated() + var/ticket_count = 0 + for(var/datum/ticket/T in allTickets) + if(T.ticketState == TICKET_OPEN || T.ticketState == TICKET_STALE) + ticket_count++ + SEND_SIGNAL(src, COMSIGN_TICKET_COUNT_UPDATE, ticket_count) + #undef TICKET_STAFF_MESSAGE_ADMIN_CHANNEL #undef TICKET_STAFF_MESSAGE_PREFIX diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index d678325ce80..a98a4c73806 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -929,6 +929,9 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( log_admin("[key_name(usr)] re-adminned themselves.") GLOB.de_admins -= ckey GLOB.de_mentors -= ckey + if(istype(mob, /mob/dead/observer)) + var/mob/dead/observer/O = mob + O.update_admin_actions() SSblackbox.record_feedback("tally", "admin_verb", 1, "Re-admin") return else diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 5eb5fbb3b9c..4ecb375ecec 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -148,7 +148,10 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself. if(holder) holder.disassociate() qdel(holder) - return 1 + if(istype(mob, /mob/dead/observer)) + var/mob/dead/observer/O = mob + O.update_admin_actions() + return TRUE //This proc checks whether subject has at least ONE of the rights specified in rights_required. /proc/check_rights_for(client/subject, rights_required) diff --git a/code/modules/mob/dead/observer/observer_admin_actions.dm b/code/modules/mob/dead/observer/observer_admin_actions.dm new file mode 100644 index 00000000000..fdbef61a402 --- /dev/null +++ b/code/modules/mob/dead/observer/observer_admin_actions.dm @@ -0,0 +1,74 @@ +/mob/dead/observer/proc/update_admin_actions() + for(var/datum/action/innate/admin/action in actions) + if(!check_rights(action.rights_required, FALSE, src)) + qdel(action) + if(!client || !client.holder) + return + if(ckey && (ckey in (GLOB.de_admins + GLOB.de_mentors))) + return + + for(var/datum/action/innate/admin/action as anything in subtypesof(/datum/action/innate/admin)) + if(check_rights(action.rights_required, FALSE, src)) + var/datum/action/innate/admin/given_action = new action() + given_action.Grant(src) + +/datum/action/innate/admin + button_overlay_icon = 'icons/mob/actions/actions_admin.dmi' + var/rights_required = R_ADMIN + +/datum/action/innate/admin/Trigger() + if(!..()) + return FALSE + if(!check_rights(rights_required, TRUE, usr)) + return + admin_click(usr) + +/datum/action/innate/admin/proc/admin_click(mob/user) + return + +/datum/action/innate/admin/ticket + name = "Adminhelps" + desc = "There are 0 open tickets." + button_overlay_icon_state = "adminhelp" + var/ticket_amt = 0 + +/datum/action/innate/admin/ticket/New(Target) + button_overlay_icon_state = "nohelp" + . = ..() + register_ticket_signals() + +/datum/action/innate/admin/ticket/admin_click(mob/user) + SStickets.showUI(user) + +/datum/action/innate/admin/ticket/proc/register_ticket_signals() + RegisterSignal(SStickets, COMSIGN_TICKET_COUNT_UPDATE, PROC_REF(update_tickets)) + +/datum/action/innate/admin/ticket/proc/update_tickets(ticketsystem, _ticket_amt) + ticket_amt = _ticket_amt + desc = "There are [ticket_amt] open tickets." + if(ticket_amt > 0) + button_overlay_icon_state = initial(button_overlay_icon_state) + else + button_overlay_icon_state = "nohelp" + UpdateButtons() + +/datum/action/innate/admin/ticket/UpdateButton(atom/movable/screen/movable/action_button/button, status_only, force) + . = ..() + if(ticket_amt <= 0) + return + var/image/maptext_holder = image('icons/effects/effects.dmi', icon_state = "nothing") + maptext_holder.plane = FLOAT_PLANE + 1.1 + maptext_holder.maptext = "[ticket_amt]" + maptext_holder.maptext_x = 2 + button.add_overlay(maptext_holder) + +/datum/action/innate/admin/ticket/mentor + name = "Mentorhelps" + button_overlay_icon_state = "mentorhelp" + rights_required = R_MENTOR|R_ADMIN + +/datum/action/innate/admin/ticket/mentor/register_ticket_signals() + RegisterSignal(SSmentor_tickets, COMSIGN_TICKET_COUNT_UPDATE, PROC_REF(update_tickets)) + +/datum/action/innate/admin/ticket/mentor/admin_click(mob/user) + SSmentor_tickets.showUI(user) diff --git a/code/modules/mob/dead/observer/observer_login.dm b/code/modules/mob/dead/observer/observer_login.dm index d9212897cc8..4dd71a5677d 100644 --- a/code/modules/mob/dead/observer/observer_login.dm +++ b/code/modules/mob/dead/observer/observer_login.dm @@ -10,3 +10,4 @@ if(GLOB.non_respawnable_keys[ckey]) can_reenter_corpse = 0 REMOVE_TRAIT(src, TRAIT_RESPAWNABLE, GHOSTED) + update_admin_actions() diff --git a/code/modules/mob/dead/observer/observer_logout.dm b/code/modules/mob/dead/observer/observer_logout.dm index d6c1b6e96fb..a61d232b3c4 100644 --- a/code/modules/mob/dead/observer/observer_logout.dm +++ b/code/modules/mob/dead/observer/observer_logout.dm @@ -5,6 +5,7 @@ cleanup_observe() ..() + update_admin_actions() spawn(0) if(src && !key) //we've transferred to another mob. This ghost should be deleted. qdel(src) diff --git a/icons/mob/actions/actions_admin.dmi b/icons/mob/actions/actions_admin.dmi new file mode 100644 index 0000000000000000000000000000000000000000..032806bdcfbe9b8e232e1d29b739b9009189374c GIT binary patch literal 1165 zcmV;81akX{P)V=-0C=2@$~y|fFc3x2TC<9W-G}^IH9;n*u=gO)BpQgMAPvd(T^L-3boas; zahvXbftx*jxOJ%o7T3d(%vYi&SX|Cz63a8`HeG`r|6&whTkpM3xZgTY`hJXx%`g2VcS4*;jVJx_e*vJ6@-)75QQ zw|n3NK(l$~iO*b?LCa;j;`>qu9M&)V@y%ux07{kn5dhFb6Ey0m+6X5h&X_Eexud~0Q|Z>0szowF3X_hGTkI6@XoiqY15AV2>^gT zb6Ey0m+6X5cph65fKI0a#@e9_0F1RmSq3eqx{NWEsaX3hkNsu8?^0h zMs3!a-Q8UPz+f;4Wf`=5Fc<&;7-L$a&!JI}m3`Uh1HiMS#!%y;yy&~SEYp6(0pjRq z(TPr{gN<4nlZjI1aDCl1pxHe0t}b7U_zIqteeE?s+y=!Fn8!HPPcsFww4Z7U z$mSq55+}>*Ny94a7sMaF-GA;mZ|aqwUz^3zkB=x8izt;!^Rzo8%{F*`{=N6I_NwyE z{ayU<{!3=|7up7C7{)D1GSV)7tF#}<1jTJotR$&YF=QEIVMaN=KB^wpFMQopI7|C2 zkKx##t^wMqFc00SJj>^~tkVdc_f__1`TVrw(_CNQ2}$o~ej20+RHM-d9msW;eHx?* zRHM-d9msXXH9#5xNoRW1RyMvqs){4dov3>skaVV3-3J`|k5zHRxf8YT0~SGcoYo!r zERY?iWh2kg+6Cr;W|B1gR|U-^Y52#Hc?598X|k#a;E2;CE&>b&gTY`h7z_r3!SED` zJr3KpJp_Q;+uPUTGnZx1a+z*+P0t49rD(Za27n=v0bodE8MHjq4T4~ib}kL&g@|q2 zVP|H4dQksCftK?t>>vnoIr@O61JZul0;W#Lvjbx91heQor(7;WwQl@Nl$WAG5X63o zaU3U6ruF2N#3^ucauWI7aUAsfeWgrsU3WdF01*8aH*e>;{#s4}*&0AQ87Ir?$t#in z2XG!99zGQcg|~Nici7t6N>%wfY=c@~hUhey=bL|?7e9_N6{Z;+591&Rlp#&0jO)6g zZeF86nFx6*tR{~-`^kh`~6{FSANP;K917qlgF^9D5pSLo?O@) f3