diff --git a/code/modules/admin/tickets/admintickets.dm b/code/modules/admin/tickets/admintickets.dm index 2582aa18e98..9fbaa9241d0 100644 --- a/code/modules/admin/tickets/admintickets.dm +++ b/code/modules/admin/tickets/admintickets.dm @@ -28,9 +28,9 @@ var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicke //Return the ticket counter and increment /datum/adminTicketHolder/proc/getTicketCounterAndInc() - var/C = ticketCounter + . = ticketCounter ticketCounter++ - return C + return //Set the ticket counter to a value /datum/adminTicketHolder/proc/setTicketCounter(var/N as num) @@ -39,12 +39,12 @@ var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicke /datum/adminTicketHolder/proc/purgeAllTickets() // Delete ALL tickets QDEL_LIST(allTickets) message_adminTicket("[usr.client] purged all admin tickets!") - ticketCounter = 1 + setTicketCounter(1) /datum/adminTicketHolder/proc/closeAllOpenTickets() // Close all open tickets for(var/i in allTickets) var/datum/admin_ticket/T = i - T.ticketState = ADMIN_TICKET_CLOSED + closeTicket(T.ticketNum) //Open a new ticket and populate details then add to the list of open tickets /datum/adminTicketHolder/proc/newTicket(var/client/C, var/passedContent) @@ -115,6 +115,10 @@ var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicke var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] return T.clientName +/datum/adminTicketHolder/proc/assignAdminToTicket(var/client/C, var/N as num) + var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] + T.assignAdmin(C) + //Single admin ticket /datum/admin_ticket @@ -129,11 +133,12 @@ var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicke var/ticketState // State of the ticket, open, closed, resolved etc var/timeUntilStale // When the ticket goes stale var/ticketCooldown // Cooldown before allowing the user to open another ticket. + var/adminAssigned // Admin who has assigned themselves to this ticket /datum/admin_ticket/proc/beginStaleCount() if(!src) return - while(world.time < timeUntilStale && !lastAdminResponse) + while(world.time < timeUntilStale && !lastAdminResponse && !adminAssigned) sleep(200) if(ticketState == ADMIN_TICKET_OPEN && world.time > timeUntilStale) message_adminTicket("Ticket #[ticketNum] has been open for [ADMIN_TICKET_TIMEOUT * 0.1] seconds. Changing status to stale.") @@ -156,4 +161,9 @@ var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicke if(ADMIN_TICKET_CLOSED) return "CLOSED" if(ADMIN_TICKET_STALE) - return "STALE" \ No newline at end of file + return "STALE" + +/datum/admin_ticket/proc/assignAdmin(var/client/C) + if(!C) + return + adminAssigned = C \ No newline at end of file diff --git a/code/modules/admin/tickets/adminticketsUI.dm b/code/modules/admin/tickets/adminticketsUI.dm index 32055cd6acc..19df32767a8 100644 --- a/code/modules/admin/tickets/adminticketsUI.dm +++ b/code/modules/admin/tickets/adminticketsUI.dm @@ -3,38 +3,43 @@ set category = "Tickets" //dat - var/dat = "

Admin Tickets

" + var/trStyle = "border:3px solid;" + var/tdStyle = "border:2px solid" + var/datum/admin_ticket/ticket + var/dat + dat += "" + dat += "

Admin Tickets

" dat +="Refresh
Open TicketsResolved TicketsClosed Tickets" if(tab == ADMIN_TICKET_OPEN) dat += "

Open Tickets

" - dat += "" - dat +="" + dat += "
ControlTicketDetail
" + dat +="" if(tab == ADMIN_TICKET_OPEN) for(var/T in allTickets) - var/datum/admin_ticket/ticket = T + ticket = T if(ticket.ticketState == ADMIN_TICKET_OPEN || ticket.ticketState == ADMIN_TICKET_STALE) - dat += "" + dat += "" else continue else if(tab == ADMIN_TICKET_RESOLVED) dat += "

Resolved Tickets

" for(var/T in allTickets) - var/datum/admin_ticket/ticket = T + ticket = T if(ticket.ticketState == ADMIN_TICKET_RESOLVED) - dat += "" + dat += "" else continue else if(tab == ADMIN_TICKET_CLOSED) dat += "

Closed Tickets

" for(var/T in allTickets) - var/datum/admin_ticket/ticket = T + ticket = T if(ticket.ticketState == ADMIN_TICKET_CLOSED) - dat += "" + dat += "" else continue - dat += "
ControlTicketDetail
ResolveClose Ticket #[ticket.ticketNum]: at [ticket.timeOpened]: [ticket.content] Details
Resolve #[ticket.ticketNum]: ([ticket.timeOpened]): [ticket.content] Details
ResolveClose Ticket #[ticket.ticketNum]: at [ticket.timeOpened]: [ticket.content] Details
Re-open #[ticket.ticketNum] ([ticket.timeOpened]): [ticket.content] Details
ResolveClose Ticket #[ticket.ticketNum]: at [ticket.timeOpened]: [ticket.content] Details
Re-open Ticket #[ticket.ticketNum]: at [ticket.timeOpened]: [ticket.content] Details
" + dat += "" return dat @@ -51,7 +56,7 @@ var/dat = "

Admin Tickets

" - dat +="Refresh" + dat +="Refresh" dat += "

Ticket #[T.ticketNum]

" @@ -59,12 +64,22 @@ dat += "

Ticket Status: [status]" dat += "

[T.content]

" - dat += "Re-OpenResolveClose
" + dat += "Re-OpenResolve
" + + if(!T.adminAssigned) + dat += "No admin assigned to this ticket - Take Ticket
" + else + dat += "[T.adminAssigned] is assigned to this Ticket. - Take Ticket
" + if(T.lastAdminResponse) dat += "Last Admin Response: [T.lastAdminResponse] at [T.lastResponseTime]" else dat +="No Admin Response" + dat += "
" + + dat += "Close" + var/datum/browser/popup = new(usr, "adminticketsdetail", "Admin Ticket #[T.ticketNum]", 800, 600) popup.set_content(dat) popup.open() @@ -98,14 +113,17 @@ if(href_list["resolve"]) var/indexNum = text2num(href_list["resolve"]) if(globAdminTicketHolder.resolveTicket(indexNum)) - message_adminTicket("[usr.client] / ([usr]) resolved admin ticket number [indexNum]") + message_adminTicket("[usr.client] / ([usr]) resolved admin ticket number [indexNum]") to_chat(returnClient(indexNum), "Your admin ticket has now been resolved.") showUI(usr) if(href_list["close"]) + var/indexNum = text2num(href_list["close"]) + if(alert("Are you sure? This will send a negative message.",,"Yes","No") != "Yes") + return if(globAdminTicketHolder.closeTicket(indexNum)) - message_adminTicket("[usr.client] / ([usr]) closed admin ticket number [indexNum]") + message_adminTicket("[usr.client] / ([usr]) closed admin ticket number [indexNum]") to_chat(returnClient(indexNum), "- AdminHelp Rejected! -") to_chat(returnClient(indexNum), "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.") to_chat(returnClient(indexNum), "Your ticket has now been closed.") @@ -114,14 +132,14 @@ if(href_list["detailresolve"]) var/indexNum = text2num(href_list["detailresolve"]) if(globAdminTicketHolder.resolveTicket(indexNum)) - message_adminTicket("[usr.client] / ([usr]) resolved admin ticket number [indexNum]") + message_adminTicket("[usr.client] / ([usr]) resolved admin ticket number [indexNum]") to_chat(returnClient(indexNum), "Your admin ticket has now been resolved.") showDetailUI(usr, indexNum) if(href_list["detailclose"]) var/indexNum = text2num(href_list["detailclose"]) if(globAdminTicketHolder.closeTicket(indexNum)) - message_adminTicket("[usr.client] / ([usr]) closed admin ticket number [indexNum]") + message_adminTicket("[usr.client] / ([usr]) closed admin ticket number [indexNum]") to_chat(returnClient(indexNum), "- AdminHelp Rejected! -") to_chat(returnClient(indexNum), "Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.") to_chat(returnClient(indexNum), "Your ticket has now been closed.") @@ -130,5 +148,11 @@ if(href_list["detailreopen"]) var/indexNum = text2num(href_list["detailreopen"]) if(globAdminTicketHolder.openTicket(indexNum)) - message_adminTicket("[usr.client] / ([usr]) re-opened admin ticket number [indexNum]") - showDetailUI(usr, indexNum) \ No newline at end of file + message_adminTicket("[usr.client] / ([usr]) re-opened admin ticket number [indexNum]") + showDetailUI(usr, indexNum) + + if(href_list["assignadmin"]) + var/indexNum = text2num(href_list["assignadmin"]) + if(globAdminTicketHolder.assignAdminToTicket(usr.client, indexNum)) + message_adminTicket("[usr.client] / ([usr]) has taken ticket number [indexNum]") + to_chat(returnClient(indexNum), "Your ticket is being handled by ") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index aecf78f6bd7..c5b167f6657 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -115,7 +115,12 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," X << 'sound/effects/adminhelp.ogg' to_chat(X, msg) if("Adminhelp") - var/ticketNum = globAdminTicketHolder.getTicketCounter() + var/ticketNum + if(globAdminTicketHolder.checkForOpenTicket(usr.client)) + var/datum/admin_ticket/T = globAdminTicketHolder.checkForOpenTicket(usr.client) + ticketNum = T.ticketNum + else + ticketNum = globAdminTicketHolder.getTicketCounter() msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (TICKET) [ai_found ? " (CL)" : ""] : [msg]" for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP)