var/global/list/tickets = list() var/global/list/ticket_panels = list() /datum/ticket var/owner var/list/assigned_admins = list() var/status = TICKET_OPEN var/list/msgs = list() var/closed_by var/id var/opened_time /datum/ticket/New(var/owner) src.owner = owner tickets |= src id = tickets.len opened_time = world.time /datum/ticket/proc/close(var/client/closed_by) if(!closed_by) return if(status == TICKET_CLOSED) return if(status == TICKET_ASSIGNED && !((closed_by.ckey in assigned_admins) || owner == closed_by.ckey) && alert(closed_by, "You are not assigned to this ticket. Are you sure you want to close it?", "Close ticket?" , "Yes" , "No") != "Yes") return if(status == TICKET_ASSIGNED && !closed_by.holder) // non-admins can only close a ticket if no admin has taken it return src.status = TICKET_CLOSED src.closed_by = closed_by.ckey to_chat(client_by_ckey(src.owner), "Your ticket has been closed by [closed_by].") message_admins("[src.owner]'s ticket has been closed by [key_name(closed_by)].") update_ticket_panels() return 1 /datum/ticket/proc/take(var/client/assigned_admin) if(!assigned_admin) return if(status == TICKET_CLOSED) return if(assigned_admin.ckey == owner) return if(status == TICKET_ASSIGNED && ((assigned_admin.ckey in assigned_admins) || alert(assigned_admin, "This ticket is already assigned. Do you want to add yourself to the ticket?", "Join ticket?" , "Yes" , "No") != "Yes")) return assigned_admins |= assigned_admin.ckey src.status = TICKET_ASSIGNED var/client/owner_client = client_by_ckey(src.owner) if(owner_client && owner_client.adminhelped == ADMINHELPED_DISCORD) discord_bot.send_to_admins("[key_name(owner_client)]'s request for help has been taken by [key_name(assigned_admin)].") owner_client.adminhelped = ADMINHELPED message_admins("[key_name(assigned_admin)] has assigned themself to [src.owner]'s ticket.") to_chat(client_by_ckey(src.owner), "[assigned_admin] has added themself to your ticket and should respond shortly. Thanks for your patience!") update_ticket_panels() return 1 proc/get_open_ticket_by_ckey(var/owner) for(var/datum/ticket/ticket in tickets) if(ticket.owner == owner && (ticket.status == TICKET_OPEN || ticket.status == TICKET_ASSIGNED)) return ticket // there should only be one open ticket by a client at a time, so no need to keep looking /datum/ticket/proc/is_active() if(status != TICKET_ASSIGNED) return 0 for(var/admin in assigned_admins) var/client/admin_client = client_by_ckey(admin) if(admin_client && !admin_client.is_afk()) return 1 return 0 /datum/ticket_msg var/msg_from var/msg_to var/msg var/time_stamp /datum/ticket_msg/New(var/msg_from, var/msg_to, var/msg) src.msg_from = msg_from src.msg_to = msg_to src.msg = msg src.time_stamp = time_stamp() /datum/ticket_panel var/datum/ticket/open_ticket = null var/datum/browser/ticket_panel_window /datum/ticket_panel/proc/get_dat() var/client/C = ticket_panel_window.user.client if(!C) return var/list/dat = list() var/valid_holder = check_rights(R_MOD|R_ADMIN, FALSE, ticket_panel_window.user) var/list/ticket_dat = list() for(var/id = tickets.len, id >= 1, id--) var/datum/ticket/ticket = tickets[id] if(valid_holder || ticket.owner == C.ckey) var/client/owner_client = client_by_ckey(ticket.owner) var/status = "Unknown status" var/color = "#6aa84f" switch(ticket.status) if(TICKET_OPEN) status = "Opened [round((world.time - ticket.opened_time) / (1 MINUTE))] minute\s ago, unassigned" if(TICKET_ASSIGNED) status = "Assigned to [english_list(ticket.assigned_admins, "no one")]" color = "#ffffff" if(TICKET_CLOSED) status = "Closed by [ticket.closed_by]" color = "#cc2222" ticket_dat += "
Available tickets:
\[X\] Messages for ticket #[open_ticket.id]:
" var/list/msg_dat = list() for(var/datum/ticket_msg/msg in open_ticket.msgs) var/msg_to = msg.msg_to ? msg.msg_to : "Adminhelp" msg_dat += "No messages to display.
" else dat += "No tickets to display.
" dat += "