// //TICKET MANAGER // /datum/tickets/tgui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "TicketsPanel", "Tickets") ui.open() /datum/tickets/tgui_state(mob/user) return GLOB.tgui_admin_state /datum/tickets/proc/get_ticket_state(state) var/ticket_state switch(state) if(AHELP_ACTIVE) ticket_state = "open" // TODO: Mentor tickets cannot be resolved if(AHELP_RESOLVED) ticket_state = "resolved" if(AHELP_CLOSED) ticket_state = "closed" else ticket_state = "unknown" return ticket_state /datum/tickets/tgui_data(mob/user) var/list/data = list() var/list/tickets = list() var/selected_ticket = null if(user.client.selected_ticket) var/datum/ticket/T = user.client.selected_ticket selected_ticket = list( "id" = T.id, "name" = T.LinkedReplyName(), "state" = get_ticket_state(T.state), "level" = T.level, "handler" = T.handler, "opened_at" = (world.time - T.opened_at), "closed_at" = (world.time - T.closed_at), "opened_at_date" = gameTimestamp(wtime = T.opened_at), "closed_at_date" = gameTimestamp(wtime = T.closed_at), "actions" = T.FullMonty(), "log" = T._interactions, ) for(var/datum/ticket/T as anything in GLOB.tickets.active_tickets) if(user.client.holder || (has_mentor_powers(user.client) && T.level > 0)) tickets.Add(list(list( "id" = T.id, "name" = T.initiator_key_name, "state" = get_ticket_state(T.state), "level" = T.level, "handler" = T.handler, "opened_at" = (world.time - T.opened_at), "closed_at" = (world.time - T.closed_at), "opened_at_date" = gameTimestamp(wtime = T.opened_at), "closed_at_date" = gameTimestamp(wtime = T.closed_at), ))) for(var/datum/ticket/T as anything in GLOB.tickets.closed_tickets) if(user.client.holder || (has_mentor_powers(user.client) && T.level > 0)) tickets.Add(list(list( "id" = T.id, "name" = T.initiator_key_name, "state" = get_ticket_state(T.state), "level" = T.level, "handler" = T.handler, "opened_at" = (world.time - T.opened_at), "closed_at" = (world.time - T.closed_at), "opened_at_date" = gameTimestamp(wtime = T.opened_at), "closed_at_date" = gameTimestamp(wtime = T.closed_at), ))) for(var/datum/ticket/T as anything in GLOB.tickets.resolved_tickets) if(user.client.holder || (has_mentor_powers(user.client) && T.level > 0)) tickets.Add(list(list( "id" = T.id, "name" = T.initiator_key_name, "state" = get_ticket_state(T.state), "level" = T.level, "handler" = T.handler, "opened_at" = (world.time - T.opened_at), "closed_at" = (world.time - T.closed_at), "opened_at_date" = gameTimestamp(wtime = T.opened_at), "closed_at_date" = gameTimestamp(wtime = T.closed_at), ))) data["tickets"] = tickets data["selected_ticket"] = selected_ticket return data /datum/tickets/tgui_act(action, params, datum/tgui/ui) if(..()) return switch(action) if("legacy") var/choice = tgui_input_list(usr, "Which tickets do you want to list?", "Tickets", list("Active", "Closed", "Resolved")) TicketListLegacy(choice) . = TRUE if("new_ticket") var/list/ckeys = list() for(var/client/C in GLOB.clients) ckeys += C.key var/ckey = lowertext(tgui_input_list(usr, "Please select the ckey of the user.", "Select CKEY", ckeys)) if(!ckey) return var/client/player for(var/client/C in GLOB.clients) if(C.ckey == ckey) player = C if(!player) to_chat(usr, "Ckey ([ckey]) not online.") return var/ticket_text = tgui_input_text(usr, "What should the initial text be?", "New Ticket") if(!ticket_text) to_chat(usr, "Ticket message cannot be empty.") return var/level = tgui_alert(usr, "Is this ticket Admin-Level or Mentor-Level?", "Ticket Level", list("Admin", "Mentor")) if(!level) return feedback_add_details("admin_verb","Admincreatedticket") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! if(player.current_ticket) if(tgui_alert(usr, "The player already has a ticket open. Is this for the same issue?","Duplicate?",list("Yes","No")) != "No") if(player.current_ticket) player.current_ticket.MessageNoRecipient(ticket_text) to_chat(usr, "PM to-Admins: [ticket_text]") return else to_chat(usr, "Ticket not found, creating new one...") else player.current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.") player.current_ticket.Close() // Create a new ticket and handle it. You created it afterall! var/datum/ticket/T = new /datum/ticket(ticket_text, player, TRUE, level) if(level == "Admin") T.level = 0 else T.level = 1 T.HandleIssue() usr.client.cmd_admin_pm(player, ticket_text, T) . = TRUE if("pick_ticket") var/datum/ticket/T = ID2Ticket(params["ticket_id"]) usr.client.selected_ticket = T . = TRUE if("retitle_ticket") usr.client.selected_ticket.Retitle() . = TRUE if("reopen_ticket") usr.client.selected_ticket.Reopen() . = TRUE if("undock_ticket") usr.client.selected_ticket.tgui_interact(usr) usr.client.selected_ticket = null . = TRUE if("send_msg") if(!params["msg"]) return usr.client.cmd_admin_pm(usr.client.selected_ticket.initiator, sanitize(params["msg"]), usr.client.selected_ticket) . = TRUE /datum/tickets/tgui_fallback(payload) if(..()) return var/choice = tgui_input_list(usr, "Which tickets do you want to list?", "Tickets", list("Active", "Closed", "Resolved")) TicketListLegacy(choice) // //TICKET DATUM // /datum/ticket/tgui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "Ticket", "Ticket #[id] - [LinkedReplyName("\ref[src]")]") ui.open() /datum/ticket/tgui_state(mob/user) return GLOB.tgui_admin_state /datum/ticket/tgui_data(mob/user) var/list/data = list() data["id"] = id var/ref_src = "\ref[src]" data["title"] = name data["name"] = LinkedReplyName(ref_src) data["ticket_ref"] = ref_src switch(state) if(AHELP_ACTIVE) data["state"] = "open" // TODO: Mentor tickets cannot be resolved if(AHELP_RESOLVED) data["state"] = "resolved" if(AHELP_CLOSED) data["state"] = "closed" else data["state"] = "unknown" data["level"] = level data["handler"] = handler data["opened_at"] = (world.time - opened_at) data["closed_at"] = (world.time - closed_at) data["opened_at_date"] = gameTimestamp(wtime = opened_at) data["closed_at_date"] = gameTimestamp(wtime = closed_at) data["actions"] = FullMonty(ref_src) data["log"] = _interactions return data /datum/ticket/tgui_act(action, params) if(..()) return switch(action) if("retitle") Retitle() . = TRUE if("reopen") Reopen() . = TRUE if("legacy") TicketPanelLegacy() . = TRUE if("send_msg") if(!params["msg"] || !params["ticket_ref"]) return var/datum/ticket/T = locate(params["ticket_ref"]) usr.client.cmd_admin_pm(T.initiator, sanitize(params["msg"]), T) . = TRUE /datum/ticket/tgui_fallback(payload) if(..()) return TicketPanelLegacy() /* /datum/mentor_help/proc/TicketPanelLegacy() var/list/dat = list("