From 5598144229f14bc0f0a42d10d549a98cccf34ed4 Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Mon, 11 Mar 2024 14:25:11 -0700 Subject: [PATCH] Make admin and mentor tickets actually update their info in the table view (#24519) * Make admin and mentor tickets actually update their info in the table view. * Additional ticket hardening against null mob and client. * The initial chat message on ahelp/mhelp should include the name again now. --- .../subsystem/tickets/mentor_tickets.dm | 2 +- code/controllers/subsystem/tickets/tickets.dm | 57 ++++++++++++------- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm index 16c0c3781d4..6b6af90bd7d 100644 --- a/code/controllers/subsystem/tickets/mentor_tickets.dm +++ b/code/controllers/subsystem/tickets/mentor_tickets.dm @@ -30,7 +30,7 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets message_mentorTicket(msg, important) /datum/controller/subsystem/tickets/mentor_tickets/create_other_system_ticket(datum/ticket/T) - SStickets.newTicket(get_client_by_ckey(T.client_ckey), T.first_raw_response, T.raw_title) + SStickets.newTicket(get_client_by_ckey(T.client_ckey), T.first_raw_response, T.title) /datum/controller/subsystem/tickets/mentor_tickets/autoRespond(N) return diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm index 140aa64af60..765db984e7d 100644 --- a/code/controllers/subsystem/tickets/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -120,12 +120,26 @@ SUBSYSTEM_DEF(tickets) * msg - The raw message * ticketNum - Which ticket number the ticket has */ -/datum/controller/subsystem/tickets/proc/makeUrlMessage(client/C, msg, ticketNum) +/datum/controller/subsystem/tickets/proc/makeUrlMessage(target, msg, ticketNum) + var/mob/M + var/key_and_name + if(istype(target, /datum/ticket)) + var/datum/ticket/T = target + M = get_mob_by_ckey(T.client_ckey) + key_and_name = M ? key_name(M, TRUE, ticket_help_type) : "[T.client_ckey] (DC)/(DELETED)" + msg = T.title + ticketNum = T.ticketNum + else if(isclient(target)) + var/client/C = target + M = C.mob + key_and_name = key_name(M, TRUE, ticket_help_type) + var/list/L = list() - L += "[ticket_help_type]: [key_name(C, TRUE, ticket_help_type)] " - L += "([ADMIN_QUE(C.mob,"?")]) ([ADMIN_PP(C.mob,"PP")]) ([ADMIN_VV(C.mob,"VV")]) ([ADMIN_TP(C.mob,"TP")]) ([ADMIN_SM(C.mob,"SM")]) " - L += "([admin_jump_link(C.mob)]) (TICKET) " - L += "[isAI(C.mob) ? "(CL)" : ""] (TAKE) " + L += "[ticket_help_type]: [key_and_name] " + if(M) + L += "([ADMIN_QUE(M,"?")]) ([ADMIN_PP(M,"PP")]) ([ADMIN_VV(M,"VV")]) ([ADMIN_TP(M,"TP")]) ([ADMIN_SM(M,"SM")]) ([admin_jump_link(M)])" + L += "(TICKET) " + L += "[isAI(M) ? "(CL)" : ""] (TAKE) " L += "(RESOLVE) (AUTO) " L += "(CONVERT) : [msg]" return L.Join() @@ -141,7 +155,7 @@ SUBSYSTEM_DEF(tickets) var/new_ticket_num = getTicketCounterAndInc() var/url_title = makeUrlMessage(C, title, new_ticket_num) - var/datum/ticket/T = new(url_title, title, passedContent, new_ticket_num, C.ckey) + var/datum/ticket/T = new(title, passedContent, new_ticket_num, C.ckey) allTickets += T T.locationSent = C.mob.loc.name T.mobControlled = C.mob @@ -190,10 +204,13 @@ SUBSYSTEM_DEF(tickets) return TRUE /datum/controller/subsystem/tickets/proc/convert_ticket(datum/ticket/T) - T.ticketState = TICKET_CLOSED - T.ticket_converted = TRUE var/client/C = usr.client var/client/owner = get_client_by_ckey(T.client_ckey) + if(!owner) + to_chat(C, "Can't convert the ticket of a disconnected user.") + return + T.ticketState = TICKET_CLOSED + T.ticket_converted = TRUE to_chat_safe(owner, list("[key_name_hidden(C)] has converted your ticket to a [other_ticket_name] ticket.",\ "Be sure to use the correct type of help next time!")) message_staff("[C] has converted ticket number [T.ticketNum] to a [other_ticket_name] ticket.") @@ -202,7 +219,7 @@ SUBSYSTEM_DEF(tickets) /datum/controller/subsystem/tickets/proc/create_other_system_ticket(datum/ticket/T) var/client/C = get_client_by_ckey(T.client_ckey) - SSmentor_tickets.newTicket(C, T.first_raw_response, T.raw_title) + SSmentor_tickets.newTicket(C, T.first_raw_response, T.title) /datum/controller/subsystem/tickets/proc/autoRespond(N) if(!check_rights(rights_needed)) @@ -241,6 +258,9 @@ SUBSYSTEM_DEF(tickets) var/message_key = input("Select an autoresponse. This will mark the ticket as resolved.", "Autoresponse") as null|anything in sortTim(sorted_responses, GLOBAL_PROC_REF(cmp_text_asc)) //use sortTim and cmp_text_asc to sort alphabetically var/client/ticket_owner = get_client_by_ckey(T.client_ckey) + if(!ticket_owner) + to_chat(C, "Can't respond to the ticket of a disconnected user.") + return switch(message_key) if(null) //they cancelled T.staffAssigned = null //if they cancel we dont need to hold this ticket anymore @@ -253,7 +273,7 @@ SUBSYSTEM_DEF(tickets) T.lastStaffResponse = "Autoresponse: [message_key]" resolveTicket(N) message_staff("[C] has auto responded to [ticket_owner]\'s adminhelp with: [message_key]") - log_game("[C] has auto responded to [ticket_owner]\'s adminhelp with: [response_phrases[message_key]]") + log_game("[C] has auto responded to [T.client_ckey]\'s adminhelp with: [response_phrases[message_key]]") if("Mentorhelp") convert_ticket(T) else @@ -313,10 +333,8 @@ SUBSYSTEM_DEF(tickets) var/real_time_opened /// Ingame time the ticket was opened var/ingame_time_opened - /// The initial message with links. + /// The initial message from the user. var/title - /// The title without URLs added. - var/raw_title /// Content of the staff help. var/list/datum/ticket_response/ticket_responses /// Last staff member who responded. @@ -347,9 +365,8 @@ SUBSYSTEM_DEF(tickets) var/list/adminwho_data = list() -/datum/ticket/New(tit, raw_tit, cont, num, the_ckey) +/datum/ticket/New(tit, cont, num, the_ckey) title = tit - raw_title = raw_tit client_ckey = the_ckey first_raw_response = cont ticket_responses = list() @@ -455,7 +472,7 @@ UI STUFF for(var/T in allTickets) ticket = T if(ticket.ticketState == TICKET_OPEN || ticket.ticketState == TICKET_STALE) - dat += "ResolveDetails
#[ticket.ticketNum] ([ticket.ingame_time_opened]) [ticket.ticketState == TICKET_STALE ? "STALE" : ""] [ticket.title]" + dat += "ResolveDetails
#[ticket.ticketNum] ([ticket.ingame_time_opened]) [ticket.ticketState == TICKET_STALE ? "STALE" : ""] [makeUrlMessage(ticket)]" else continue else if(tab == TICKET_RESOLVED) @@ -463,7 +480,7 @@ UI STUFF for(var/T in allTickets) ticket = T if(ticket.ticketState == TICKET_RESOLVED) - dat += "ResolveDetails
#[ticket.ticketNum] ([ticket.ingame_time_opened]) [ticket.title]" + dat += "ResolveDetails
#[ticket.ticketNum] ([ticket.ingame_time_opened]) [makeUrlMessage(ticket)]" else continue else if(tab == TICKET_CLOSED) @@ -471,7 +488,7 @@ UI STUFF for(var/T in allTickets) ticket = T if(ticket.ticketState == TICKET_CLOSED) - dat += "ResolveDetails
#[ticket.ticketNum] ([ticket.ingame_time_opened]) [ticket.title]" + dat += "ResolveDetails
#[ticket.ticketNum] ([ticket.ingame_time_opened]) [makeUrlMessage(ticket)]" else continue @@ -504,7 +521,7 @@ UI STUFF dat += "

[T.client_ckey] / [T.mobControlled] opened this [ticket_name] at [T.ingame_time_opened] at location [T.locationSent]

" dat += "

Ticket Status: [status]" dat += "" - dat += "" + dat += "" if(length(T.ticket_responses) > 1) for(var/i in 2 to length(T.ticket_responses)) @@ -710,7 +727,7 @@ UI STUFF "realt" = T.real_time_opened, "relativet" = T.ingame_time_opened, "tcreator" = T.client_ckey, - "ttopic" = T.raw_title, + "ttopic" = T.title, "ttaker" = T.staff_ckey, "ttaketime" = T.staff_take_time, "allresponses" = all_responses_txt,
[T.title]
[makeUrlMessage(T)]