From ee908a9554c3a667ea9e2352c47aacb90d6454ed Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Sun, 26 Aug 2018 12:37:08 +0100 Subject: [PATCH 1/6] refactors admin tickets system to subsystem --- code/__DEFINES/subsystems.dm | 2 + code/controllers/subsystem/tickets.dm | 378 ++++++++++++++++++ code/modules/admin/admin_verbs.dm | 1 - code/modules/admin/tickets/admintickets.dm | 185 --------- code/modules/admin/tickets/adminticketsUI.dm | 172 -------- .../admin/tickets/adminticketsverbs.dm | 28 +- code/modules/admin/topic.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 8 +- code/modules/admin/verbs/adminpm.dm | 6 +- paradise.dme | 3 +- 10 files changed, 395 insertions(+), 390 deletions(-) create mode 100644 code/controllers/subsystem/tickets.dm delete mode 100644 code/modules/admin/tickets/admintickets.dm delete mode 100644 code/modules/admin/tickets/adminticketsUI.dm diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index f9dbff89d76..f7c338af051 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -68,6 +68,7 @@ #define INIT_ORDER_OVERLAY -6 #define INIT_ORDER_XKEYSCORE -10 #define INIT_ORDER_STICKY_BAN -10 +#define INIT_ORDER_TICKETS -10 #define INIT_ORDER_LIGHTING -20 #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_NIGHTSHIFT -22 @@ -81,6 +82,7 @@ #define FIRE_PRIORITY_NIGHTSHIFT 10 #define FIRE_PRIORITY_IDLE_NPC 10 #define FIRE_PRIORITY_SERVER_MAINT 10 +#define FIRE_PRIORITY_TICKETS 10 #define FIRE_PRIORITY_RESEARCH 10 #define FIRE_PRIORITY_GARBAGE 15 #define FIRE_PRIORITY_WET_FLOORS 20 diff --git a/code/controllers/subsystem/tickets.dm b/code/controllers/subsystem/tickets.dm new file mode 100644 index 00000000000..ff40b19773a --- /dev/null +++ b/code/controllers/subsystem/tickets.dm @@ -0,0 +1,378 @@ +//Defines +//Deciseconds until ticket becomes stale if unanswered. Alerts admins. +#define ADMIN_TICKET_TIMEOUT 6000 // 10 minutes +//Decisecions before the user is allowed to open another ticket while their existing one is open. +#define ADMIN_TICKET_DUPLICATE_COOLDOWN 3000 // 5 minutes + +//Status defines +#define ADMIN_TICKET_OPEN 1 +#define ADMIN_TICKET_CLOSED 2 +#define ADMIN_TICKET_RESOLVED 3 +#define ADMIN_TICKET_STALE 4 + +SUBSYSTEM_DEF(tickets) + name = "Tickets" + init_order = INIT_ORDER_TICKETS + wait = 300 + priority = FIRE_PRIORITY_TICKETS + + flags = SS_BACKGROUND + + var/list/allTickets + + var/ticketCounter = 1 + +/datum/controller/subsystem/tickets/Initialize() + LAZYINITLIST(allTickets) + ..() + +/datum/controller/subsystem/tickets/fire() + var/stales = checkStaleness() + if(LAZYLEN(stales)) + var/report + for(var/num in stales) + report += "[num], " + message_adminTicket("Tickets [report] have been open for over [ADMIN_TICKET_TIMEOUT * 0.1] seconds. Changing status to stale.") + +/datum/controller/subsystem/tickets/proc/checkStaleness() + var/stales = list() + for(var/T in allTickets) + var/datum/admin_ticket/ticket = T + if(!(ticket.ticketState == ADMIN_TICKET_OPEN)) + continue + if(world.time > ticket.timeUntilStale && (!ticket.lastAdminResponse || !ticket.adminAssigned)) + var/id = ticket.makeStale() + stales += id + return stales + +/datum/controller/subsystem/tickets/proc/purgeAllTickets() + if(LAZYLEN(allTickets)) + LAZYCLEARLIST(allTickets) + +//Return the current ticket number ready to be called off. +/datum/controller/subsystem/tickets/proc/getTicketCounter() + return ticketCounter + +//Return the ticket counter and increment +/datum/controller/subsystem/tickets/proc/getTicketCounterAndInc() + . = ticketCounter + ticketCounter++ + return + +/datum/controller/subsystem/tickets/proc/resolveAllOpenTickets() // Resolve all open tickets + for(var/i in allTickets) + var/datum/admin_ticket/T = i + resolveTicket(T.ticketNum) + +//Open a new ticket and populate details then add to the list of open tickets +/datum/controller/subsystem/tickets/proc/newTicket(client/C, passedContent, title) + if(!C || !passedContent) + return + + //Check if the user has an open ticket already within the cooldown period, if so we don't create a new one and re-set the cooldown period + var/datum/admin_ticket/existingTicket = checkForOpenTicket(C) + if(existingTicket) + existingTicket.setCooldownPeriod() + to_chat(C, "Your ticket #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") + return + + if(!title) + title = passedContent + + var/datum/admin_ticket/T = new /datum/admin_ticket + T.clientName = C + T.timeOpened = worldtime2text() + T.title = title + T.content += passedContent + T.locationSent = C.mob.loc.loc.name + T.mobControlled = C.mob + T.ticketState = ADMIN_TICKET_OPEN + T.timeUntilStale = world.time + ADMIN_TICKET_TIMEOUT + T.setCooldownPeriod() + T.ticketNum = getTicketCounterAndInc() + allTickets += T + + //Inform the user that they have opened a ticket + to_chat(C, "You have opened admin ticket number #[(SStickets.getTicketCounter() - 1)]! Please be patient and we will help you soon!") + +//Set ticket state with key N to open +/datum/controller/subsystem/tickets/proc/openTicket(var/N) + var/datum/admin_ticket/T = SStickets.allTickets[N] + if(T.ticketState != ADMIN_TICKET_OPEN) + T.ticketState = ADMIN_TICKET_OPEN + return TRUE + +//Set ticket state with key N to resolved +/datum/controller/subsystem/tickets/proc/resolveTicket(var/N) + var/datum/admin_ticket/T = SStickets.allTickets[N] + if(T.ticketState != ADMIN_TICKET_RESOLVED) + T.ticketState = ADMIN_TICKET_RESOLVED + return TRUE + +//Set ticket state with key N to closed +/datum/controller/subsystem/tickets/proc/closeTicket(var/N) + var/datum/admin_ticket/T = SStickets.allTickets[N] + if(T.ticketState != ADMIN_TICKET_CLOSED) + T.ticketState = ADMIN_TICKET_CLOSED + return TRUE + +//Check if the user already has a ticket open and within the cooldown period. +/datum/controller/subsystem/tickets/proc/checkForOpenTicket(var/client/C) + for(var/datum/admin_ticket/T in allTickets) + if(T.clientName == C && T.ticketState == ADMIN_TICKET_OPEN && (T.ticketCooldown > world.time)) + return T + return FALSE + +//Check if the user has ANY ticket not resolved or closed. +/datum/controller/subsystem/tickets/proc/checkForTicket(var/client/C) + var/list/tickets = list() + for(var/datum/admin_ticket/T in allTickets) + if(T.clientName == C && (T.ticketState == ADMIN_TICKET_OPEN || T.ticketState == ADMIN_TICKET_STALE)) + tickets += T + if(tickets.len) + return tickets + return FALSE + +//return the client of a ticket number +/datum/controller/subsystem/tickets/proc/returnClient(var/N) + var/datum/admin_ticket/T = SStickets.allTickets[N] + return T.clientName + +/datum/controller/subsystem/tickets/proc/assignAdminToTicket(var/client/C, var/N) + var/datum/admin_ticket/T = SStickets.allTickets[N] + T.assignAdmin(C) + return TRUE + +//Single admin ticket + +/datum/admin_ticket + var/ticketNum // Ticket number + var/clientName // Client which opened the ticket + var/timeOpened // Time the ticket was opened + var/title //The initial message with links + var/list/content = list() // content of the admin help + var/lastAdminResponse // Last admin who responded + var/lastResponseTime // When the admin last responded + var/locationSent // Location the player was when they send the ticket + var/mobControlled // Mob they were controlling + 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 + +//Set the cooldown period for the ticket. The time when it's created plus the defined cooldown time. +/datum/admin_ticket/proc/setCooldownPeriod() + ticketCooldown = world.time + ADMIN_TICKET_DUPLICATE_COOLDOWN + +//Set the last admin who responded as the client passed as an arguement. +/datum/admin_ticket/proc/setLastAdminResponse(var/client/C) + lastAdminResponse = C + lastResponseTime = worldtime2text() + +//Return the ticket state as a colour coded text string. +/datum/admin_ticket/proc/state2text() + switch(ticketState) + if(ADMIN_TICKET_OPEN) + return "OPEN" + if(ADMIN_TICKET_RESOLVED) + return "RESOLVED" + if(ADMIN_TICKET_CLOSED) + return "CLOSED" + if(ADMIN_TICKET_STALE) + return "STALE" + +//Assign the client passed to var/adminAsssigned +/datum/admin_ticket/proc/assignAdmin(var/client/C, var/N) + if(!C) + return + adminAssigned = C + return TRUE + +/datum/admin_ticket/proc/addResponse(var/client/C, var/M as text) + if(C.holder) + setLastAdminResponse(C) + M = "[C]: [M]" + content += M + +/datum/admin_ticket/proc/makeStale() + ticketState = ADMIN_TICKET_STALE + return ticketNum + +/* + +UI STUFF + +*/ + +/datum/controller/subsystem/tickets/proc/returnUI(var/tab = ADMIN_TICKET_OPEN) + set name = "Open Ticket Interface" + set category = "Tickets" + +//dat + var/trStyle = "border-top:2px solid; border-bottom:2px solid; padding-top: 5px; padding-bottom: 5px;" + var/tdStyleleft = "border-top:2px solid; border-bottom:2px solid; width:150px; text-align:center;" + var/tdStyle = "border-top:2px solid; border-bottom: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 +="" + if(tab == ADMIN_TICKET_OPEN) + for(var/T in allTickets) + ticket = T + if(ticket.ticketState == ADMIN_TICKET_OPEN || ticket.ticketState == ADMIN_TICKET_STALE) + dat += "" + else + continue + else if(tab == ADMIN_TICKET_RESOLVED) + dat += "

Resolved Tickets

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

Closed Tickets

" + for(var/T in allTickets) + ticket = T + if(ticket.ticketState == ADMIN_TICKET_CLOSED) + dat += "" + else + continue + + dat += "
ControlTicket
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened]) [ticket.ticketState == ADMIN_TICKET_STALE ? "STALE" : ""]
[ticket.title]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened])
[ticket.title]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened])
[ticket.title]
" + + return dat + +/datum/controller/subsystem/tickets/proc/showUI(mob/user, var/tab) + var/dat = null + dat = returnUI(tab) + var/datum/browser/popup = new(user, "admintickets", "Admin Tickets", 1400, 600) + popup.set_content(dat) + popup.open() + +/datum/controller/subsystem/tickets/proc/showDetailUI(mob/user, var/ticketID) + var/datum/admin_ticket/T = SStickets.allTickets[ticketID] + var/status = "[T.state2text()]" + + var/dat = "

Admin Tickets

" + + dat +="Show AllRefresh" + + dat += "

Ticket #[T.ticketNum]

" + + dat += "

[T.clientName] / [T.mobControlled] opened this ticket at [T.timeOpened] at location [T.locationSent]

" + dat += "

Ticket Status: [status]" + dat += "" + dat += "" + + if(T.content.len > 1) + for(var/i = 2, i <= T.content.len, i++) + dat += "" + + dat += "
[T.title]
[T.content[i]]


" + 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 Ticket" + + var/datum/browser/popup = new(user, "adminticketsdetail", "Admin Ticket #[T.ticketNum]", 1000, 600) + popup.set_content(dat) + popup.open() + +/datum/controller/subsystem/tickets/proc/userDetailUI(mob/user) +//dat + var/tickets = checkForTicket(user.client) + var/dat + dat += "

Your open tickets

" + dat += "" + for(var/datum/admin_ticket/T in tickets) + dat += "" + for(var/i = 1, i <= T.content.len, i++) + dat += "" + dat += "

Ticket #[T.ticketNum]

[T.content[i]]
" + + var/datum/browser/popup = new(user, "userticketsdetail", "Tickets", 1000, 600) + popup.set_content(dat) + popup.open() + +/datum/controller/subsystem/tickets/Topic(href, href_list) + + if(href_list["refresh"]) + showUI(usr) + return + + if(href_list["refreshdetail"]) + var/indexNum = text2num(href_list["refreshdetail"]) + showDetailUI(usr, indexNum) + return + + if(href_list["showopen"]) + showUI(usr, ADMIN_TICKET_OPEN) + return + if(href_list["showresolved"]) + showUI(usr, ADMIN_TICKET_RESOLVED) + return + if(href_list["showclosed"]) + showUI(usr, ADMIN_TICKET_CLOSED) + return + + if(href_list["details"]) + var/indexNum = text2num(href_list["details"]) + showDetailUI(usr, indexNum) + return + + if(href_list["resolve"]) + var/indexNum = text2num(href_list["resolve"]) + if(SStickets.resolveTicket(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["detailresolve"]) + var/indexNum = text2num(href_list["detailresolve"]) + if(SStickets.resolveTicket(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(alert("Are you sure? This will send a negative message.",,"Yes","No") != "Yes") + return + if(SStickets.closeTicket(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.") + showDetailUI(usr, indexNum) + + if(href_list["detailreopen"]) + var/indexNum = text2num(href_list["detailreopen"]) + if(SStickets.openTicket(indexNum)) + 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(SStickets.assignAdminToTicket(usr.client, indexNum)) + message_adminTicket("[usr.client] / ([usr]) has taken ticket number [indexNum]") + to_chat(returnClient(indexNum), "Your ticket is being handled by [usr.client].") + showDetailUI(usr, indexNum) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index dae563c7e19..d76b73ae10c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -170,7 +170,6 @@ var/list/admin_verbs_debug = list( /client/proc/admin_serialize, /client/proc/jump_to_ruin, /client/proc/toggle_medal_disable, - /client/proc/startadmintickets, ) var/list/admin_verbs_possess = list( /proc/possess, diff --git a/code/modules/admin/tickets/admintickets.dm b/code/modules/admin/tickets/admintickets.dm deleted file mode 100644 index ea5f7003870..00000000000 --- a/code/modules/admin/tickets/admintickets.dm +++ /dev/null @@ -1,185 +0,0 @@ -/* -Admin ticket system by Birdtalon -*/ -//Global holder - -var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicketHolder - -//Defines -//Deciseconds until ticket becomes stale if unanswered. Alerts admins. -#define ADMIN_TICKET_TIMEOUT 6000 // 10 minutes -//Decisecions before the user is allowed to open another ticket while their existing one is open. -#define ADMIN_TICKET_DUPLICATE_COOLDOWN 3000 // 5 minutes - -//Status defines -#define ADMIN_TICKET_OPEN 1 -#define ADMIN_TICKET_CLOSED 2 -#define ADMIN_TICKET_RESOLVED 3 -#define ADMIN_TICKET_STALE 4 - -//Datum holding all tickets -/datum/adminTicketHolder - var/ticketCounter = 1 // Counts the tickets and used to assign the id number - var/list/allTickets = list() - -//Return the current ticket number ready to be called off. -/datum/adminTicketHolder/proc/getTicketCounter() - return ticketCounter - -//Return the ticket counter and increment -/datum/adminTicketHolder/proc/getTicketCounterAndInc() - . = ticketCounter - ticketCounter++ - return - -/datum/adminTicketHolder/proc/resolveAllOpenTickets() // Resolve all open tickets - for(var/i in allTickets) - var/datum/admin_ticket/T = i - resolveTicket(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, var/title) - if(!C || !passedContent) - return - - //Check if the user has an open ticket already within the cooldown period, if so we don't create a new one and re-set the cooldown period - var/datum/admin_ticket/existingTicket = checkForOpenTicket(C) - if(existingTicket) - existingTicket.setCooldownPeriod() - to_chat(C, "Your ticket #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") - return - - if(!title) - title = passedContent - - var/datum/admin_ticket/T = new /datum/admin_ticket - T.clientName = C - T.timeOpened = worldtime2text() - T.title = title - T.content += passedContent - T.locationSent = C.mob.loc.loc.name - T.mobControlled = C.mob - T.ticketState = ADMIN_TICKET_OPEN - T.timeUntilStale = world.time + ADMIN_TICKET_TIMEOUT - T.setCooldownPeriod() - T.ticketNum = getTicketCounterAndInc() - allTickets += T - - //Inform the user that they have opened a ticket - to_chat(C, "You have opened admin ticket number #[(globAdminTicketHolder.getTicketCounter() - 1)]! Please be patient and we will help you soon!") - - //Begin the stale count for this ticket. - spawn(0) - T.beginStaleCount() - -//Set ticket state with key N to open -/datum/adminTicketHolder/proc/openTicket(var/N) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] - if(T.ticketState != ADMIN_TICKET_OPEN) - T.ticketState = ADMIN_TICKET_OPEN - return TRUE - -//Set ticket state with key N to resolved -/datum/adminTicketHolder/proc/resolveTicket(var/N) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] - if(T.ticketState != ADMIN_TICKET_RESOLVED) - T.ticketState = ADMIN_TICKET_RESOLVED - return TRUE - -//Set ticket state with key N to closed -/datum/adminTicketHolder/proc/closeTicket(var/N) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] - if(T.ticketState != ADMIN_TICKET_CLOSED) - T.ticketState = ADMIN_TICKET_CLOSED - return TRUE - -//Check if the user already has a ticket open and within the cooldown period. -/datum/adminTicketHolder/proc/checkForOpenTicket(var/client/C) - for(var/datum/admin_ticket/T in allTickets) - if(T.clientName == C && T.ticketState == ADMIN_TICKET_OPEN && (T.ticketCooldown > world.time)) - return T - return FALSE - -//Check if the user has ANY ticket not resolved or closed. -/datum/adminTicketHolder/proc/checkForTicket(var/client/C) - var/list/tickets = list() - for(var/datum/admin_ticket/T in allTickets) - if(T.clientName == C && (T.ticketState == ADMIN_TICKET_OPEN || T.ticketState == ADMIN_TICKET_STALE)) - tickets += T - if(tickets.len) - return tickets - return FALSE - -//return the client of a ticket number -/datum/adminTicketHolder/proc/returnClient(var/N) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] - return T.clientName - -/datum/adminTicketHolder/proc/assignAdminToTicket(var/client/C, var/N) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] - T.assignAdmin(C) - return TRUE - -//Single admin ticket - -/datum/admin_ticket - var/ticketNum // Ticket number - var/clientName // Client which opened the ticket - var/timeOpened // Time the ticket was opened - var/title //The initial message with links - var/list/content = list() // content of the admin help - var/lastAdminResponse // Last admin who responded - var/lastResponseTime // When the admin last responded - var/locationSent // Location the player was when they send the ticket - var/mobControlled // Mob they were controlling - 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 - -//Ticker called when a ticket is created, checks for stale-ness. -/datum/admin_ticket/proc/beginStaleCount() - while(world.time < timeUntilStale || !lastAdminResponse || !adminAssigned) // While within the stale period OR no admin responded OR no admin assigned. - - if(!src) - return - - sleep(200) // Check every 20 seconds. - 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.") - ticketState = ADMIN_TICKET_STALE - break - -//Set the cooldown period for the ticket. The time when it's created plus the defined cooldown time. -/datum/admin_ticket/proc/setCooldownPeriod() - ticketCooldown = world.time + ADMIN_TICKET_DUPLICATE_COOLDOWN - -//Set the last admin who responded as the client passed as an arguement. -/datum/admin_ticket/proc/setLastAdminResponse(var/client/C) - lastAdminResponse = C - lastResponseTime = worldtime2text() - -//Return the ticket state as a colour coded text string. -/datum/admin_ticket/proc/state2text() - switch(ticketState) - if(ADMIN_TICKET_OPEN) - return "OPEN" - if(ADMIN_TICKET_RESOLVED) - return "RESOLVED" - if(ADMIN_TICKET_CLOSED) - return "CLOSED" - if(ADMIN_TICKET_STALE) - return "STALE" - -//Assign the client passed to var/adminAsssigned -/datum/admin_ticket/proc/assignAdmin(var/client/C, var/N) - if(!C) - return - adminAssigned = C - return TRUE - -/datum/admin_ticket/proc/addResponse(var/client/C, var/M as text) - if(C.holder) - setLastAdminResponse(C) - M = "[C]: [M]" - content += M \ No newline at end of file diff --git a/code/modules/admin/tickets/adminticketsUI.dm b/code/modules/admin/tickets/adminticketsUI.dm deleted file mode 100644 index b063c5cb673..00000000000 --- a/code/modules/admin/tickets/adminticketsUI.dm +++ /dev/null @@ -1,172 +0,0 @@ -/datum/adminTicketHolder/proc/returnUI(var/tab = ADMIN_TICKET_OPEN) - set name = "Open Ticket Interface" - set category = "Tickets" - -//dat - var/trStyle = "border-top:2px solid; border-bottom:2px solid; padding-top: 5px; padding-bottom: 5px;" - var/tdStyleleft = "border-top:2px solid; border-bottom:2px solid; width:150px; text-align:center;" - var/tdStyle = "border-top:2px solid; border-bottom: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 +="" - if(tab == ADMIN_TICKET_OPEN) - for(var/T in allTickets) - ticket = T - if(ticket.ticketState == ADMIN_TICKET_OPEN || ticket.ticketState == ADMIN_TICKET_STALE) - dat += "" - else - continue - else if(tab == ADMIN_TICKET_RESOLVED) - dat += "

Resolved Tickets

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

Closed Tickets

" - for(var/T in allTickets) - ticket = T - if(ticket.ticketState == ADMIN_TICKET_CLOSED) - dat += "" - else - continue - - dat += "
ControlTicket
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened]) [ticket.ticketState == ADMIN_TICKET_STALE ? "STALE" : ""]
[ticket.title]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened])
[ticket.title]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened])
[ticket.title]
" - - return dat - -/datum/adminTicketHolder/proc/showUI(mob/user, var/tab) - var/dat = null - dat = returnUI(tab) - var/datum/browser/popup = new(user, "admintickets", "Admin Tickets", 1400, 600) - popup.set_content(dat) - popup.open() - -/datum/adminTicketHolder/proc/showDetailUI(mob/user, var/ticketID) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[ticketID] - var/status = "[T.state2text()]" - - var/dat = "

Admin Tickets

" - - dat +="Show AllRefresh" - - dat += "

Ticket #[T.ticketNum]

" - - dat += "

[T.clientName] / [T.mobControlled] opened this ticket at [T.timeOpened] at location [T.locationSent]

" - dat += "

Ticket Status: [status]" - dat += "" - dat += "" - - if(T.content.len > 1) - for(var/i = 2, i <= T.content.len, i++) - dat += "" - - dat += "
[T.title]
[T.content[i]]


" - 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 Ticket" - - var/datum/browser/popup = new(user, "adminticketsdetail", "Admin Ticket #[T.ticketNum]", 1000, 600) - popup.set_content(dat) - popup.open() - -/datum/adminTicketHolder/proc/userDetailUI(mob/user) -//dat - var/tickets = checkForTicket(user.client) - var/dat - dat += "

Your open tickets

" - dat += "" - for(var/datum/admin_ticket/T in tickets) - dat += "" - for(var/i = 1, i <= T.content.len, i++) - dat += "" - dat += "

Ticket #[T.ticketNum]

[T.content[i]]
" - - var/datum/browser/popup = new(user, "userticketsdetail", "Tickets", 1000, 600) - popup.set_content(dat) - popup.open() - -/datum/adminTicketHolder/Topic(href, href_list) - - if(href_list["refresh"]) - showUI(usr) - return - - if(href_list["refreshdetail"]) - var/indexNum = text2num(href_list["refreshdetail"]) - showDetailUI(usr, indexNum) - return - - if(href_list["showopen"]) - showUI(usr, ADMIN_TICKET_OPEN) - return - if(href_list["showresolved"]) - showUI(usr, ADMIN_TICKET_RESOLVED) - return - if(href_list["showclosed"]) - showUI(usr, ADMIN_TICKET_CLOSED) - return - - if(href_list["details"]) - var/indexNum = text2num(href_list["details"]) - showDetailUI(usr, indexNum) - return - - if(href_list["resolve"]) - var/indexNum = text2num(href_list["resolve"]) - if(globAdminTicketHolder.resolveTicket(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["detailresolve"]) - var/indexNum = text2num(href_list["detailresolve"]) - if(globAdminTicketHolder.resolveTicket(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(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]") - 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.") - showDetailUI(usr, indexNum) - - 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) - - 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 [usr.client].") - showDetailUI(usr, indexNum) diff --git a/code/modules/admin/tickets/adminticketsverbs.dm b/code/modules/admin/tickets/adminticketsverbs.dm index 0cf22c5d24c..87bf422184c 100644 --- a/code/modules/admin/tickets/adminticketsverbs.dm +++ b/code/modules/admin/tickets/adminticketsverbs.dm @@ -1,42 +1,26 @@ //Verbs -/client/proc/startadmintickets() - set name = "Restart Admin Ticket System" - set category = "Debug" - - if(!holder && !check_rights(R_DEBUG)) - return - - if(!globAdminTicketHolder) - var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicketHolder - else - if(alert("Are you sure you want to reboot the admin ticket system?","Reboot Admin Tickets?","Yes","No") != "Yes") - return - message_admins("Restarting Admin Ticket System!") - globAdminTicketHolder = new /datum/adminTicketHolder - message_admins("Admin Ticket System Restarted!") - /client/proc/openTicketUI() set name = "Open Ticket Interface" set category = "Admin" - if(!holder && !check_rights(R_ADMIN)) + if(!holder || !check_rights(R_ADMIN)) return - globAdminTicketHolder.showUI(usr) + SStickets.showUI(usr) /client/proc/resolveAllTickets() set name = "Resolve All Open Tickets" set category = "Admin" - if(!holder && !check_rights(R_ADMIN)) + if(!holder || !check_rights(R_ADMIN)) return if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes") return - globAdminTicketHolder.resolveAllOpenTickets() + SStickets.resolveAllOpenTickets() @@ -45,7 +29,7 @@ set name = "My Tickets" set category = "Admin" - if(!holder && !check_rights(R_ADMIN)) + if(!holder || !check_rights(R_ADMIN)) return - globAdminTicketHolder.userDetailUI(usr) + SStickets.userDetailUI(usr) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 9a526c4a7c2..509a07f89e6 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -30,7 +30,7 @@ if(!check_rights(R_ADMIN)) return var/ticketID = text2num(href_list["openadminticket"]) - globAdminTicketHolder.showDetailUI(usr, ticketID) + SStickets.showDetailUI(usr, ticketID) if(href_list["stickyban"]) stickyban(href_list["stickyban"],href_list) diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index c38b42ad9b5..196768c4cb3 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -117,15 +117,15 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if("Adminhelp") var/ticketNum // Holder for the ticket number var/prunedmsg ="[usr.client]: [msg]" // Message without links - if(globAdminTicketHolder.checkForOpenTicket(usr.client)) // If user already has an open ticket - var/datum/admin_ticket/T = globAdminTicketHolder.checkForOpenTicket(usr.client) // Make T equal to the ticket they have open + if(SStickets.checkForOpenTicket(usr.client)) // If user already has an open ticket + var/datum/admin_ticket/T = SStickets.checkForOpenTicket(usr.client) // Make T equal to the ticket they have open ticketNum = T.ticketNum // ticketNum is the number of their ticket. T.addResponse(usr.client, msg) else - ticketNum = globAdminTicketHolder.getTicketCounter() // ticketNum is the ticket ready to be assigned. + ticketNum = SStickets.getTicketCounter() // ticketNum is the ticket ready to be assigned. msg = "[selected_type]: [key_name(src, TRUE, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (TICKET) [ai_found ? " (CL)" : ""](TAKE) : [msg]" //Open a new adminticket and inform the user. - globAdminTicketHolder.newTicket(src, prunedmsg, msg) + SStickets.newTicket(src, prunedmsg, msg) for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 600a53d81eb..6cb2d144654 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -187,15 +187,15 @@ return //Check if the mob being PM'd has any open admin tickets. var/tickets = list() - tickets = globAdminTicketHolder.checkForTicket(C) + tickets = SStickets.checkForTicket(C) if(tickets) for(var/datum/admin_ticket/i in tickets) i.addResponse(src, msg) // Add this response to their open tickets. return - tickets = globAdminTicketHolder.checkForTicket(src) + tickets = SStickets.checkForTicket(src) if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets - tickets = globAdminTicketHolder.checkForTicket(src) + tickets = SStickets.checkForTicket(src) if(tickets) for(var/datum/admin_ticket/i in tickets) i.addResponse(src, msg) diff --git a/paradise.dme b/paradise.dme index 7c4deb70dd2..0fbf141cd9b 100644 --- a/paradise.dme +++ b/paradise.dme @@ -213,6 +213,7 @@ #include "code\controllers\subsystem\spacedrift.dm" #include "code\controllers\subsystem\sun.dm" #include "code\controllers\subsystem\throwing.dm" +#include "code\controllers\subsystem\tickets.dm" #include "code\controllers\subsystem\timer.dm" #include "code\controllers\subsystem\weather.dm" #include "code\controllers\subsystem\processing\processing.dm" @@ -1092,8 +1093,6 @@ #include "code\modules\admin\watchlist.dm" #include "code\modules\admin\DB ban\functions.dm" #include "code\modules\admin\permissionverbs\permissionedit.dm" -#include "code\modules\admin\tickets\admintickets.dm" -#include "code\modules\admin\tickets\adminticketsUI.dm" #include "code\modules\admin\tickets\adminticketsverbs.dm" #include "code\modules\admin\verbs\adminhelp.dm" #include "code\modules\admin\verbs\adminjump.dm" From 39c35c07860f96dea78f99ab9ca34d08e807b331 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Sun, 26 Aug 2018 15:34:57 +0100 Subject: [PATCH 2/6] procs take mobs as arguments instead of clients --- code/controllers/subsystem/tickets.dm | 71 ++++++++++++++++----------- 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/code/controllers/subsystem/tickets.dm b/code/controllers/subsystem/tickets.dm index ff40b19773a..33b4b6ce9ae 100644 --- a/code/controllers/subsystem/tickets.dm +++ b/code/controllers/subsystem/tickets.dm @@ -32,7 +32,7 @@ SUBSYSTEM_DEF(tickets) var/report for(var/num in stales) report += "[num], " - message_adminTicket("Tickets [report] have been open for over [ADMIN_TICKET_TIMEOUT * 0.1] seconds. Changing status to stale.") + message_adminTicket("Tickets [report] have been open for over [ADMIN_TICKET_TIMEOUT MINUTES] minutes. Changing status to stale.") /datum/controller/subsystem/tickets/proc/checkStaleness() var/stales = list() @@ -65,10 +65,12 @@ SUBSYSTEM_DEF(tickets) resolveTicket(T.ticketNum) //Open a new ticket and populate details then add to the list of open tickets -/datum/controller/subsystem/tickets/proc/newTicket(client/C, passedContent, title) - if(!C || !passedContent) +/datum/controller/subsystem/tickets/proc/newTicket(mob/M, passedContent, title) + if(!M || !passedContent) return + var/client/C = M.client + //Check if the user has an open ticket already within the cooldown period, if so we don't create a new one and re-set the cooldown period var/datum/admin_ticket/existingTicket = checkForOpenTicket(C) if(existingTicket) @@ -79,52 +81,46 @@ SUBSYSTEM_DEF(tickets) if(!title) title = passedContent - var/datum/admin_ticket/T = new /datum/admin_ticket + var/datum/admin_ticket/T = new(title, passedContent) T.clientName = C - T.timeOpened = worldtime2text() - T.title = title - T.content += passedContent - T.locationSent = C.mob.loc.loc.name - T.mobControlled = C.mob - T.ticketState = ADMIN_TICKET_OPEN - T.timeUntilStale = world.time + ADMIN_TICKET_TIMEOUT - T.setCooldownPeriod() - T.ticketNum = getTicketCounterAndInc() - allTickets += T + T.locationSent = M.loc.name + T.mobControlled = M //Inform the user that they have opened a ticket to_chat(C, "You have opened admin ticket number #[(SStickets.getTicketCounter() - 1)]! Please be patient and we will help you soon!") //Set ticket state with key N to open -/datum/controller/subsystem/tickets/proc/openTicket(var/N) +/datum/controller/subsystem/tickets/proc/openTicket(N) var/datum/admin_ticket/T = SStickets.allTickets[N] if(T.ticketState != ADMIN_TICKET_OPEN) T.ticketState = ADMIN_TICKET_OPEN return TRUE //Set ticket state with key N to resolved -/datum/controller/subsystem/tickets/proc/resolveTicket(var/N) +/datum/controller/subsystem/tickets/proc/resolveTicket(N) var/datum/admin_ticket/T = SStickets.allTickets[N] if(T.ticketState != ADMIN_TICKET_RESOLVED) T.ticketState = ADMIN_TICKET_RESOLVED return TRUE //Set ticket state with key N to closed -/datum/controller/subsystem/tickets/proc/closeTicket(var/N) +/datum/controller/subsystem/tickets/proc/closeTicket(N) var/datum/admin_ticket/T = SStickets.allTickets[N] if(T.ticketState != ADMIN_TICKET_CLOSED) T.ticketState = ADMIN_TICKET_CLOSED return TRUE //Check if the user already has a ticket open and within the cooldown period. -/datum/controller/subsystem/tickets/proc/checkForOpenTicket(var/client/C) +/datum/controller/subsystem/tickets/proc/checkForOpenTicket(mob/M) + var/client/C = M.client for(var/datum/admin_ticket/T in allTickets) if(T.clientName == C && T.ticketState == ADMIN_TICKET_OPEN && (T.ticketCooldown > world.time)) return T return FALSE //Check if the user has ANY ticket not resolved or closed. -/datum/controller/subsystem/tickets/proc/checkForTicket(var/client/C) +/datum/controller/subsystem/tickets/proc/checkForTicket(mob/M) + var/client/C = M.client var/list/tickets = list() for(var/datum/admin_ticket/T in allTickets) if(T.clientName == C && (T.ticketState == ADMIN_TICKET_OPEN || T.ticketState == ADMIN_TICKET_STALE)) @@ -134,11 +130,12 @@ SUBSYSTEM_DEF(tickets) return FALSE //return the client of a ticket number -/datum/controller/subsystem/tickets/proc/returnClient(var/N) +/datum/controller/subsystem/tickets/proc/returnClient(N) var/datum/admin_ticket/T = SStickets.allTickets[N] return T.clientName -/datum/controller/subsystem/tickets/proc/assignAdminToTicket(var/client/C, var/N) +/datum/controller/subsystem/tickets/proc/assignAdminToTicket(mob/M, var/N) + var/client/C = M.client var/datum/admin_ticket/T = SStickets.allTickets[N] T.assignAdmin(C) return TRUE @@ -150,7 +147,7 @@ SUBSYSTEM_DEF(tickets) var/clientName // Client which opened the ticket var/timeOpened // Time the ticket was opened var/title //The initial message with links - var/list/content = list() // content of the admin help + var/list/content // content of the admin help var/lastAdminResponse // Last admin who responded var/lastResponseTime // When the admin last responded var/locationSent // Location the player was when they send the ticket @@ -160,12 +157,24 @@ SUBSYSTEM_DEF(tickets) var/ticketCooldown // Cooldown before allowing the user to open another ticket. var/adminAssigned // Admin who has assigned themselves to this ticket +/datum/admin_ticket/New(tit, cont) + title = tit + content = list() + content += cont + timeOpened = worldtime2text() + timeUntilStale = world.time + ADMIN_TICKET_TIMEOUT + setCooldownPeriod() + ticketNum = SStickets.getTicketCounterAndInc() + ticketState = ADMIN_TICKET_OPEN + SStickets.allTickets += src + //Set the cooldown period for the ticket. The time when it's created plus the defined cooldown time. /datum/admin_ticket/proc/setCooldownPeriod() ticketCooldown = world.time + ADMIN_TICKET_DUPLICATE_COOLDOWN //Set the last admin who responded as the client passed as an arguement. -/datum/admin_ticket/proc/setLastAdminResponse(var/client/C) +/datum/admin_ticket/proc/setLastAdminResponse(mob/M) + var/client/C = M.client lastAdminResponse = C lastResponseTime = worldtime2text() @@ -182,17 +191,19 @@ SUBSYSTEM_DEF(tickets) return "STALE" //Assign the client passed to var/adminAsssigned -/datum/admin_ticket/proc/assignAdmin(var/client/C, var/N) +/datum/admin_ticket/proc/assignAdmin(mob/M, var/N) + var/client/C = M.client if(!C) return adminAssigned = C return TRUE -/datum/admin_ticket/proc/addResponse(var/client/C, var/M as text) +/datum/admin_ticket/proc/addResponse(mob/M, msg) + var/client/C = M.client if(C.holder) setLastAdminResponse(C) - M = "[C]: [M]" - content += M + M = "[C]: [msg]" + content += msg /datum/admin_ticket/proc/makeStale() ticketState = ADMIN_TICKET_STALE @@ -204,7 +215,7 @@ UI STUFF */ -/datum/controller/subsystem/tickets/proc/returnUI(var/tab = ADMIN_TICKET_OPEN) +/datum/controller/subsystem/tickets/proc/returnUI(tab = ADMIN_TICKET_OPEN) set name = "Open Ticket Interface" set category = "Tickets" @@ -250,14 +261,14 @@ UI STUFF return dat -/datum/controller/subsystem/tickets/proc/showUI(mob/user, var/tab) +/datum/controller/subsystem/tickets/proc/showUI(mob/user, tab) var/dat = null dat = returnUI(tab) var/datum/browser/popup = new(user, "admintickets", "Admin Tickets", 1400, 600) popup.set_content(dat) popup.open() -/datum/controller/subsystem/tickets/proc/showDetailUI(mob/user, var/ticketID) +/datum/controller/subsystem/tickets/proc/showDetailUI(mob/user, ticketID) var/datum/admin_ticket/T = SStickets.allTickets[ticketID] var/status = "[T.state2text()]" From d9d48e846444395b1ce3df2bedf55b471b113d14 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Sun, 26 Aug 2018 15:50:50 +0100 Subject: [PATCH 3/6] fixes --- code/controllers/subsystem/tickets.dm | 4 ++-- code/modules/admin/verbs/adminhelp.dm | 6 +++--- code/modules/admin/verbs/adminpm.dm | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/controllers/subsystem/tickets.dm b/code/controllers/subsystem/tickets.dm index 33b4b6ce9ae..a2640ea70ed 100644 --- a/code/controllers/subsystem/tickets.dm +++ b/code/controllers/subsystem/tickets.dm @@ -72,7 +72,7 @@ SUBSYSTEM_DEF(tickets) var/client/C = M.client //Check if the user has an open ticket already within the cooldown period, if so we don't create a new one and re-set the cooldown period - var/datum/admin_ticket/existingTicket = checkForOpenTicket(C) + var/datum/admin_ticket/existingTicket = checkForOpenTicket(M) if(existingTicket) existingTicket.setCooldownPeriod() to_chat(C, "Your ticket #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") @@ -310,7 +310,7 @@ UI STUFF /datum/controller/subsystem/tickets/proc/userDetailUI(mob/user) //dat - var/tickets = checkForTicket(user.client) + var/tickets = checkForTicket(user) var/dat dat += "

Your open tickets

" dat += "" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 196768c4cb3..84695ee799c 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -117,15 +117,15 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if("Adminhelp") var/ticketNum // Holder for the ticket number var/prunedmsg ="[usr.client]: [msg]" // Message without links - if(SStickets.checkForOpenTicket(usr.client)) // If user already has an open ticket - var/datum/admin_ticket/T = SStickets.checkForOpenTicket(usr.client) // Make T equal to the ticket they have open + if(SStickets.checkForOpenTicket(usr)) // If user already has an open ticket + var/datum/admin_ticket/T = SStickets.checkForOpenTicket(usr) // Make T equal to the ticket they have open ticketNum = T.ticketNum // ticketNum is the number of their ticket. T.addResponse(usr.client, msg) else ticketNum = SStickets.getTicketCounter() // ticketNum is the ticket ready to be assigned. msg = "[selected_type]: [key_name(src, TRUE, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (TICKET) [ai_found ? " (CL)" : ""](TAKE) :[msg]" //Open a new adminticket and inform the user. - SStickets.newTicket(src, prunedmsg, msg) + SStickets.newTicket(src.mob, prunedmsg, msg) for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 6cb2d144654..fb28b6db9f2 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -187,15 +187,15 @@ return //Check if the mob being PM'd has any open admin tickets. var/tickets = list() - tickets = SStickets.checkForTicket(C) + tickets = SStickets.checkForTicket(C.mob) if(tickets) for(var/datum/admin_ticket/i in tickets) i.addResponse(src, msg) // Add this response to their open tickets. return - tickets = SStickets.checkForTicket(src) + tickets = SStickets.checkForTicket(C.mob) if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets - tickets = SStickets.checkForTicket(src) + tickets = SStickets.checkForTicket(C.mob) if(tickets) for(var/datum/admin_ticket/i in tickets) i.addResponse(src, msg) From fb14cdb6b78cba662b459880d5bb148c0110b206 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Tue, 28 Aug 2018 19:17:42 +0100 Subject: [PATCH 4/6] makes procs use clients again --- code/controllers/subsystem/tickets.dm | 34 ++++++++++----------------- code/modules/admin/verbs/adminhelp.dm | 2 +- code/modules/admin/verbs/adminpm.dm | 6 ++--- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/code/controllers/subsystem/tickets.dm b/code/controllers/subsystem/tickets.dm index a2640ea70ed..d514a285515 100644 --- a/code/controllers/subsystem/tickets.dm +++ b/code/controllers/subsystem/tickets.dm @@ -65,17 +65,15 @@ SUBSYSTEM_DEF(tickets) resolveTicket(T.ticketNum) //Open a new ticket and populate details then add to the list of open tickets -/datum/controller/subsystem/tickets/proc/newTicket(mob/M, passedContent, title) - if(!M || !passedContent) +/datum/controller/subsystem/tickets/proc/newTicket(client/C, passedContent, title) + if(!C || !passedContent) return - var/client/C = M.client - //Check if the user has an open ticket already within the cooldown period, if so we don't create a new one and re-set the cooldown period - var/datum/admin_ticket/existingTicket = checkForOpenTicket(M) + var/datum/admin_ticket/existingTicket = checkForOpenTicket(C) if(existingTicket) existingTicket.setCooldownPeriod() - to_chat(C, "Your ticket #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") + to_chat(C.mob, "Your ticket #[existingTicket.ticketNum] remains open! Visit \"My tickets\" under the Admin Tab to view it.") return if(!title) @@ -83,8 +81,8 @@ SUBSYSTEM_DEF(tickets) var/datum/admin_ticket/T = new(title, passedContent) T.clientName = C - T.locationSent = M.loc.name - T.mobControlled = M + T.locationSent = C.mob.loc.name + T.mobControlled = C.mob //Inform the user that they have opened a ticket to_chat(C, "You have opened admin ticket number #[(SStickets.getTicketCounter() - 1)]! Please be patient and we will help you soon!") @@ -111,16 +109,14 @@ SUBSYSTEM_DEF(tickets) return TRUE //Check if the user already has a ticket open and within the cooldown period. -/datum/controller/subsystem/tickets/proc/checkForOpenTicket(mob/M) - var/client/C = M.client +/datum/controller/subsystem/tickets/proc/checkForOpenTicket(client/C) for(var/datum/admin_ticket/T in allTickets) if(T.clientName == C && T.ticketState == ADMIN_TICKET_OPEN && (T.ticketCooldown > world.time)) return T return FALSE //Check if the user has ANY ticket not resolved or closed. -/datum/controller/subsystem/tickets/proc/checkForTicket(mob/M) - var/client/C = M.client +/datum/controller/subsystem/tickets/proc/checkForTicket(client/C) var/list/tickets = list() for(var/datum/admin_ticket/T in allTickets) if(T.clientName == C && (T.ticketState == ADMIN_TICKET_OPEN || T.ticketState == ADMIN_TICKET_STALE)) @@ -134,8 +130,7 @@ SUBSYSTEM_DEF(tickets) var/datum/admin_ticket/T = SStickets.allTickets[N] return T.clientName -/datum/controller/subsystem/tickets/proc/assignAdminToTicket(mob/M, var/N) - var/client/C = M.client +/datum/controller/subsystem/tickets/proc/assignAdminToTicket(client/C, var/N) var/datum/admin_ticket/T = SStickets.allTickets[N] T.assignAdmin(C) return TRUE @@ -173,8 +168,7 @@ SUBSYSTEM_DEF(tickets) ticketCooldown = world.time + ADMIN_TICKET_DUPLICATE_COOLDOWN //Set the last admin who responded as the client passed as an arguement. -/datum/admin_ticket/proc/setLastAdminResponse(mob/M) - var/client/C = M.client +/datum/admin_ticket/proc/setLastAdminResponse(client/C) lastAdminResponse = C lastResponseTime = worldtime2text() @@ -191,15 +185,13 @@ SUBSYSTEM_DEF(tickets) return "STALE" //Assign the client passed to var/adminAsssigned -/datum/admin_ticket/proc/assignAdmin(mob/M, var/N) - var/client/C = M.client +/datum/admin_ticket/proc/assignAdmin(client/C, var/N) if(!C) return adminAssigned = C return TRUE -/datum/admin_ticket/proc/addResponse(mob/M, msg) - var/client/C = M.client +/datum/admin_ticket/proc/addResponse(client/C, msg) if(C.holder) setLastAdminResponse(C) M = "[C]: [msg]" @@ -310,7 +302,7 @@ UI STUFF /datum/controller/subsystem/tickets/proc/userDetailUI(mob/user) //dat - var/tickets = checkForTicket(user) + var/tickets = checkForTicket(user.client) var/dat dat += "

Your open tickets

" dat += "
" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 84695ee799c..9d972598376 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -125,7 +125,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," ticketNum = SStickets.getTicketCounter() // ticketNum is the ticket ready to be assigned. msg = "[selected_type]: [key_name(src, TRUE, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (TICKET) [ai_found ? " (CL)" : ""](TAKE) :[msg]" //Open a new adminticket and inform the user. - SStickets.newTicket(src.mob, prunedmsg, msg) + SStickets.newTicket(src, prunedmsg, msg) for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index fb28b6db9f2..1287b96181a 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -187,15 +187,15 @@ return //Check if the mob being PM'd has any open admin tickets. var/tickets = list() - tickets = SStickets.checkForTicket(C.mob) + tickets = SStickets.checkForTicket(C) if(tickets) for(var/datum/admin_ticket/i in tickets) i.addResponse(src, msg) // Add this response to their open tickets. return - tickets = SStickets.checkForTicket(C.mob) + tickets = SStickets.checkForTicket(C) if(check_rights(R_ADMIN|R_MOD, 0, C.mob)) //Is the person being pm'd an admin? If so we check if the pm'er has open tickets - tickets = SStickets.checkForTicket(C.mob) + tickets = SStickets.checkForTicket(C) if(tickets) for(var/datum/admin_ticket/i in tickets) i.addResponse(src, msg) From f91e14c240cf74cfc5cfb4d5ad1de97f072d296b Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Tue, 28 Aug 2018 19:30:20 +0100 Subject: [PATCH 5/6] adds stat entry, removes unused proc --- code/controllers/subsystem/tickets.dm | 13 ++++++------- code/modules/admin/tickets/adminticketsverbs.dm | 2 -- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/code/controllers/subsystem/tickets.dm b/code/controllers/subsystem/tickets.dm index d514a285515..2692af931cc 100644 --- a/code/controllers/subsystem/tickets.dm +++ b/code/controllers/subsystem/tickets.dm @@ -24,7 +24,7 @@ SUBSYSTEM_DEF(tickets) /datum/controller/subsystem/tickets/Initialize() LAZYINITLIST(allTickets) - ..() + return ..() /datum/controller/subsystem/tickets/fire() var/stales = checkStaleness() @@ -34,6 +34,9 @@ SUBSYSTEM_DEF(tickets) report += "[num], " message_adminTicket("Tickets [report] have been open for over [ADMIN_TICKET_TIMEOUT MINUTES] minutes. Changing status to stale.") +/datum/controller/subsystem/tickets/stat_entry() + ..("Tickets: [allTickets.len]") + /datum/controller/subsystem/tickets/proc/checkStaleness() var/stales = list() for(var/T in allTickets) @@ -45,10 +48,6 @@ SUBSYSTEM_DEF(tickets) stales += id return stales -/datum/controller/subsystem/tickets/proc/purgeAllTickets() - if(LAZYLEN(allTickets)) - LAZYCLEARLIST(allTickets) - //Return the current ticket number ready to be called off. /datum/controller/subsystem/tickets/proc/getTicketCounter() return ticketCounter @@ -185,7 +184,7 @@ SUBSYSTEM_DEF(tickets) return "STALE" //Assign the client passed to var/adminAsssigned -/datum/admin_ticket/proc/assignAdmin(client/C, var/N) +/datum/admin_ticket/proc/assignAdmin(client/C) if(!C) return adminAssigned = C @@ -194,7 +193,7 @@ SUBSYSTEM_DEF(tickets) /datum/admin_ticket/proc/addResponse(client/C, msg) if(C.holder) setLastAdminResponse(C) - M = "[C]: [msg]" + msg = "[C]: [msg]" content += msg /datum/admin_ticket/proc/makeStale() diff --git a/code/modules/admin/tickets/adminticketsverbs.dm b/code/modules/admin/tickets/adminticketsverbs.dm index 87bf422184c..f203ef501e8 100644 --- a/code/modules/admin/tickets/adminticketsverbs.dm +++ b/code/modules/admin/tickets/adminticketsverbs.dm @@ -22,8 +22,6 @@ SStickets.resolveAllOpenTickets() - - /client/proc/openUserUI() set name = "My Tickets" From 96ef41e29d5a293db053342e9cd01cfea1da9105 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Sun, 16 Sep 2018 13:31:24 +0100 Subject: [PATCH 6/6] fixes stale display --- code/controllers/subsystem/tickets.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/tickets.dm b/code/controllers/subsystem/tickets.dm index 2692af931cc..a3fd41b50eb 100644 --- a/code/controllers/subsystem/tickets.dm +++ b/code/controllers/subsystem/tickets.dm @@ -32,7 +32,7 @@ SUBSYSTEM_DEF(tickets) var/report for(var/num in stales) report += "[num], " - message_adminTicket("Tickets [report] have been open for over [ADMIN_TICKET_TIMEOUT MINUTES] minutes. Changing status to stale.") + message_adminTicket("Tickets [report] have been open for over [ADMIN_TICKET_TIMEOUT / 600] minutes. Changing status to stale.") /datum/controller/subsystem/tickets/stat_entry() ..("Tickets: [allTickets.len]")