diff --git a/code/modules/admin/tickets/admintickets.dm b/code/modules/admin/tickets/admintickets.dm index 4b431458136..7f59b5f7ec5 100644 --- a/code/modules/admin/tickets/admintickets.dm +++ b/code/modules/admin/tickets/admintickets.dm @@ -7,9 +7,9 @@ var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicke //Defines //Deciseconds until ticket becomes stale if unanswered. Alerts admins. -#define ADMIN_TICKET_TIMEOUT 3000 // 5 minutes +#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 1200 // 2 minutes +#define ADMIN_TICKET_DUPLICATE_COOLDOWN 3000 // 5 minutes //Status defines #define ADMIN_TICKET_OPEN 1 @@ -19,150 +19,165 @@ var/global/datum/adminTicketHolder/globAdminTicketHolder = new /datum/adminTicke //Datum holding all tickets /datum/adminTicketHolder - var/ticketCounter = 1 // Counts the tickets and used to assign the id number - var/list/allTickets = list() + 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 ticketCounter //Return the ticket counter and increment /datum/adminTicketHolder/proc/getTicketCounterAndInc() - . = ticketCounter - ticketCounter++ - return + . = 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) + 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) - if(!C || !passedContent) - return +/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!") - return + 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 - var/datum/admin_ticket/T = new /datum/admin_ticket - T.clientName = C - T.timeOpened = worldtime2text() - 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 + if(!title) + title = passedContent - //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!") + 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 - //Begin the stale count for this ticket. - spawn() - T.beginStaleCount() + //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() + T.beginStaleCount() //Set ticket state with key N to open /datum/adminTicketHolder/proc/openTicket(var/N as num) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] - if(T.ticketState != ADMIN_TICKET_OPEN) - T.ticketState = ADMIN_TICKET_OPEN - return TRUE + 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 as num) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] - if(T.ticketState != ADMIN_TICKET_RESOLVED) - T.ticketState = ADMIN_TICKET_RESOLVED - return TRUE + 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 as num) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] - if(T.ticketState != ADMIN_TICKET_CLOSED) - T.ticketState = ADMIN_TICKET_CLOSED - return TRUE - -//List Open Tickets in chat -/datum/adminTicketHolder/proc/listOpenTicketsToChat() - for(var/T in allTickets) - var/datum/admin_ticket/ticket = T - message_adminTicket("Ticket #[ticket.ticketNum]: Opened by [ticket.clientName] at [ticket.timeOpened]: [ticket.content]") + 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 + 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 as num) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[N] - return T.clientName + 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) - return TRUE + 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/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 - 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 + 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() - if(!src) - return - while(world.time < timeUntilStale || !lastAdminResponse || !adminAssigned) // While within the stale period OR no admin responded OR no admin assigned. - 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 + if(!src) + return + while(world.time < timeUntilStale || !lastAdminResponse || !adminAssigned) // While within the stale period OR no admin responded OR no admin assigned. + 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 + 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() + 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" + 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 as num) - if(!C) - return - adminAssigned = C - return TRUE \ No newline at end of file + 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 index 46a91e943a9..570a97469e7 100644 --- a/code/modules/admin/tickets/adminticketsUI.dm +++ b/code/modules/admin/tickets/adminticketsUI.dm @@ -1,150 +1,173 @@ /datum/adminTicketHolder/proc/returnUI(var/tab = ADMIN_TICKET_OPEN) - set name = "Open Ticket Interface" - set category = "Tickets" + 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

" + 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 +="Refresh
Open TicketsResolved TicketsClosed Tickets" + if(tab == ADMIN_TICKET_OPEN) + dat += "

Open Tickets

" + dat += "
ControlTicket
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened]) [ticket.ticketState == ADMIN_TICKET_STALE ? "STALE" : ""]
[ticket.content]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened])
[ticket.content]
ResolveDetails
#[ticket.ticketNum] ([ticket.timeOpened])
[ticket.content]
" + 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]
" + dat += "" - return dat + return dat /datum/adminTicketHolder/proc/showUI(var/client/C, var/tab) - var/dat = null - dat = returnUI(tab) - var/datum/browser/popup = new(usr, "admintickets", "Admin Tickets", 1400, 600) - popup.set_content(dat) - popup.open() + var/dat = null + dat = returnUI(tab) + var/datum/browser/popup = new(usr, "admintickets", "Admin Tickets", 1400, 600) + popup.set_content(dat) + popup.open() /datum/adminTicketHolder/proc/showDetailUI(var/client/C, var/ticketID) - var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[ticketID] - var/status = "[T.state2text()]" + var/datum/admin_ticket/T = globAdminTicketHolder.allTickets[ticketID] + var/status = "[T.state2text()]" - var/dat = "

Admin Tickets

" + var/dat = "

Admin Tickets

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

Ticket #[T.ticketNum]

" + dat += "

Ticket #[T.ticketNum]

" - dat += "

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

" - dat += "

Ticket Status: [status]" - dat += "

[T.content]

" + dat += "

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

" + dat += "

Ticket Status: [status]" + dat += "" + dat += "" - dat += "Re-OpenResolve

" + if(T.content.len > 1) + for(var/i = 2, i <= T.content.len, i++) + dat += "" - if(!T.adminAssigned) - dat += "No admin assigned to this ticket - Take Ticket
" - else - dat += "[T.adminAssigned] is assigned to this Ticket. - Take Ticket
" + dat += "
[T.title]
[T.content[i]]


" + dat += "Re-OpenResolve

" - if(T.lastAdminResponse) - dat += "Last Admin Response: [T.lastAdminResponse] at [T.lastResponseTime]" - else - dat +="No Admin Response" + if(!T.adminAssigned) + dat += "No admin assigned to this ticket - Take Ticket
" + else + dat += "[T.adminAssigned] is assigned to this Ticket. - Take Ticket
" - dat += "

" + if(T.lastAdminResponse) + dat += "Last Admin Response: [T.lastAdminResponse] at [T.lastResponseTime]" + else + dat +="No Admin Response" - dat += "Close Ticket" + dat += "

" - var/datum/browser/popup = new(usr, "adminticketsdetail", "Admin Ticket #[T.ticketNum]", 800, 600) - popup.set_content(dat) - popup.open() + dat += "Close Ticket" + + var/datum/browser/popup = new(usr, "adminticketsdetail", "Admin Ticket #[T.ticketNum]", 1000, 600) + popup.set_content(dat) + popup.open() + +/datum/adminTicketHolder/proc/userDetailUI(var/client/C) +//dat + var/tickets = checkForTicket(C) + var/dat +// tickets = checkForTicket(C) + 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(usr, "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["refresh"]) + showUI(usr) + return - if(href_list["refreshdetail"]) - var/indexNum = text2num(href_list["refreshdetail"]) - showDetailUI(usr, indexNum) - 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["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.client, indexNum) - return + if(href_list["details"]) + var/indexNum = text2num(href_list["details"]) + showDetailUI(usr.client, 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["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["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["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["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) + 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) \ No newline at end of file diff --git a/code/modules/admin/tickets/adminticketsverbs.dm b/code/modules/admin/tickets/adminticketsverbs.dm index a64dd585e3d..1b782b5047c 100644 --- a/code/modules/admin/tickets/adminticketsverbs.dm +++ b/code/modules/admin/tickets/adminticketsverbs.dm @@ -1,39 +1,46 @@ //Verbs /client/proc/startadmintickets() - set name = "Restart Admin Ticket System" - set category = "Debug" + set name = "Restart Admin Ticket System" + set category = "Debug" - if(!holder && !check_rights(R_DEBUG)) - return + 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!") + 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 = "Tickets" + set name = "Open Ticket Interface" + set category = "Admin" - if(!holder && !check_rights(R_ADMIN)) - return + if(!holder && !check_rights(R_ADMIN)) + return - globAdminTicketHolder.showUI() + globAdminTicketHolder.showUI() /client/proc/resolveAllTickets() - set name = "Resolve All Open Tickets" - set category = "Tickets" + set name = "Resolve All Open Tickets" + set category = "Admin" - if(!holder && !check_rights(R_ADMIN)) - return + 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 + if(alert("Are you sure you want to resolve ALL open tickets?","Resolve all open tickets?","Yes","No") != "Yes") + return - globAdminTicketHolder.resolveAllOpenTickets() \ No newline at end of file + globAdminTicketHolder.resolveAllOpenTickets() + +/client/verb/openUserUI() + + set name = "My Tickets" + set category = "Admin" + + globAdminTicketHolder.userDetailUI(usr.client) \ No newline at end of file diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index d796d8b9cb1..3d0d067f5b5 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -116,21 +116,22 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," to_chat(X, msg) 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 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. msg = "[selected_type]: [key_name(src, 1, 1, selected_type)] (?) (PP) (VV) (SM) ([admin_jump_link(mob)]) (CA) (TICKET) [ai_found ? " (CL)" : ""] : [msg]" + //Open a new adminticket and inform the user. + globAdminTicketHolder.newTicket(src, prunedmsg, msg) for(var/client/X in modholders + adminholders) if(X.prefs.sound & SOUND_ADMINHELP) X << 'sound/effects/adminhelp.ogg' window_flash(X) to_chat(X, msg) - //Open a new adminticket and inform the user. - globAdminTicketHolder.newTicket(src, msg) - //show it to the person adminhelping too to_chat(src, "[selected_type]: [original_msg]") diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 9976c7d10b9..4c045e193c8 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -183,6 +183,23 @@ if(check_rights(R_ADMIN|R_MOD, 0, X.mob)) to_chat(X, "[type]: [key_name(src, X, 0, type)]->[key_name(C, X, 0, type)]: [emoji_msg]") + //Check if the mob being PM'd has any open admin tickets. + var/tickets = list() + tickets = globAdminTicketHolder.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) + 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) + if(tickets) + for(var/datum/admin_ticket/i in tickets) + i.addResponse(src, msg) + return + + /client/proc/cmd_admin_irc_pm() if(prefs.muted & MUTE_ADMINHELP) to_chat(src, "Error: Private-Message: You are unable to use PM-s (muted).") diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 63002ca309a..00402f2deb6 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -73,10 +73,6 @@ //Admin PM if(href_list["priv_msg"]) var/client/C = locate(href_list["priv_msg"]) - //Check if the person has a current open admin ticket - var/datum/admin_ticket/existingTicket = globAdminTicketHolder.checkForOpenTicket(C) - if(existingTicket) - existingTicket.setLastAdminResponse(C) // IF we do then update their last admin response on the ticket. if(ismob(C)) //Old stuff can feed-in mobs instead of clients var/mob/M = C C = M.client