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.
This commit is contained in:
Charlie Nolan
2024-03-11 14:25:11 -07:00
committed by GitHub
parent c2670cdadf
commit 5598144229
2 changed files with 38 additions and 21 deletions
@@ -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
+37 -20
View File
@@ -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 += "<span class='[ticket_help_span]'>[ticket_help_type]: </span><span class='boldnotice'>[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)]) (<a href='?_src_=holder;openticket=[ticketNum][anchor_link_extra]'>TICKET</a>) "
L += "[isAI(C.mob) ? "(<a href='?_src_=holder;adminchecklaws=[C.mob.UID()]'>CL</a>)" : ""] (<a href='?_src_=holder;take_question=[ticketNum][anchor_link_extra]'>TAKE</a>) "
L += "<span class='[ticket_help_span]'>[ticket_help_type]: </span><span class='boldnotice'>[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 += "(<a href='?_src_=holder;openticket=[ticketNum][anchor_link_extra]'>TICKET</a>) "
L += "[isAI(M) ? "(<a href='?_src_=holder;adminchecklaws=[M.UID()]'>CL</a>)" : ""] (<a href='?_src_=holder;take_question=[ticketNum][anchor_link_extra]'>TAKE</a>) "
L += "(<a href='?_src_=holder;resolve=[ticketNum][anchor_link_extra]'>RESOLVE</a>) (<a href='?_src_=holder;autorespond=[ticketNum][anchor_link_extra]'>AUTO</a>) "
L += "(<a href='?_src_=holder;convert_ticket=[ticketNum][anchor_link_extra]'>CONVERT</a>) :</span> <span class='[ticket_help_span]'>[msg]</span>"
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, "<span class='notice'>Can't convert the ticket of a disconnected user.")
return
T.ticketState = TICKET_CLOSED
T.ticket_converted = TRUE
to_chat_safe(owner, list("<span class='[span_class]'>[key_name_hidden(C)] has converted your ticket to a [other_ticket_name] ticket.</span>",\
"<span class='[span_class]'>Be sure to use the correct type of help next time!</span>"))
message_staff("<span class='[span_class]'>[C] has converted ticket number [T.ticketNum] to a [other_ticket_name] ticket.</span>")
@@ -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, "<span class='notice'>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:<span class='adminticketalt'> [message_key]</span>")
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 += "<tr style='[trStyle]'><td style ='[tdStyleleft]'><a href='?src=[UID()];resolve=[ticket.ticketNum]'>Resolve</a><a href='?src=[UID()];details=[ticket.ticketNum]'>Details</a> <br /> #[ticket.ticketNum] ([ticket.ingame_time_opened]) [ticket.ticketState == TICKET_STALE ? "<font color='red'><b>STALE</font>" : ""] </td><td style='[tdStyle]'><b>[ticket.title]</td></tr>"
dat += "<tr style='[trStyle]'><td style ='[tdStyleleft]'><a href='?src=[UID()];resolve=[ticket.ticketNum]'>Resolve</a><a href='?src=[UID()];details=[ticket.ticketNum]'>Details</a> <br /> #[ticket.ticketNum] ([ticket.ingame_time_opened]) [ticket.ticketState == TICKET_STALE ? "<font color='red'><b>STALE</font>" : ""] </td><td style='[tdStyle]'><b>[makeUrlMessage(ticket)]</td></tr>"
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 += "<tr style='[trStyle]'><td style ='[tdStyleleft]'><a href='?src=[UID()];resolve=[ticket.ticketNum]'>Resolve</a><a href='?src=[UID()];details=[ticket.ticketNum]'>Details</a> <br /> #[ticket.ticketNum] ([ticket.ingame_time_opened]) </td><td style='[tdStyle]'><b>[ticket.title]</td></tr>"
dat += "<tr style='[trStyle]'><td style ='[tdStyleleft]'><a href='?src=[UID()];resolve=[ticket.ticketNum]'>Resolve</a><a href='?src=[UID()];details=[ticket.ticketNum]'>Details</a> <br /> #[ticket.ticketNum] ([ticket.ingame_time_opened]) </td><td style='[tdStyle]'><b>[makeUrlMessage(ticket)]</td></tr>"
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 += "<tr style='[trStyle]'><td style ='[tdStyleleft]'><a href='?src=[UID()];resolve=[ticket.ticketNum]'>Resolve</a><a href='?src=[UID()];details=[ticket.ticketNum]'>Details</a> <br /> #[ticket.ticketNum] ([ticket.ingame_time_opened]) </td><td style='[tdStyle]'><b>[ticket.title]</td></tr>"
dat += "<tr style='[trStyle]'><td style ='[tdStyleleft]'><a href='?src=[UID()];resolve=[ticket.ticketNum]'>Resolve</a><a href='?src=[UID()];details=[ticket.ticketNum]'>Details</a> <br /> #[ticket.ticketNum] ([ticket.ingame_time_opened]) </td><td style='[tdStyle]'><b>[makeUrlMessage(ticket)]</td></tr>"
else
continue
@@ -504,7 +521,7 @@ UI STUFF
dat += "<h3>[T.client_ckey] / [T.mobControlled] opened this [ticket_name] at [T.ingame_time_opened] at location [T.locationSent]</h3>"
dat += "<h4>Ticket Status: [status]"
dat += "<table style='width:950px; border: 3px solid;'>"
dat += "<tr><td>[T.title]</td></tr>"
dat += "<tr><td>[makeUrlMessage(T)]</td></tr>"
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,