up ports a bunch of TGS commands (#17961)

* up ports a bunch of TGS commands

* .

* needing this

* ...

* Update datacore.dm

* fix that

* at least stack that

* rework all user name handling

* urg

* urg

* .

* .

* .

* up port this

* make this clearer

* .

* .

* .

* fix that

* .

* add returns

* player ticket chat

* this

* .

* .

* umm

* adjust messages

* clean smitecode up

* .

* ummm

* .

* command filter
This commit is contained in:
Kashargul
2025-07-12 12:08:14 +02:00
committed by GitHub
parent 26517b7122
commit fe5556d2dc
28 changed files with 651 additions and 226 deletions
+2 -2
View File
@@ -36,7 +36,7 @@
to_chat(src, span_warning("Ticket not found, creating new one..."))
else
current_ticket.AddInteraction("[usr.ckey] opened a new ticket.")
current_ticket.Resolve()
current_ticket.Resolve(usr)
new /datum/ticket(msg, src, FALSE, 0)
@@ -116,7 +116,7 @@ ADMIN_VERB(cmd_mentor_ticket_panel, (R_ADMIN|R_SERVER|R_MOD|R_MENTOR), "Mentor T
to_chat(src, span_warning("Ticket not found, creating new one..."))
else if(current_ticket)
current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.")
current_ticket.Close()
current_ticket.Close(usr)
new /datum/ticket(msg, src, FALSE, 1)
+60 -47
View File
@@ -162,14 +162,14 @@ GLOBAL_DATUM_INIT(tickets, /datum/tickets, new)
if(C.current_ticket)
C.current_ticket.AddInteraction("Client reconnected.")
C.current_ticket.initiator = C
// C.current_ticket.initiator.mob.throw_alert("open ticket", /obj/screen/alert/open_ticket) // Uncomment this line to enable player-side ticket ui
C.current_ticket.initiator.mob.throw_alert("open ticket", /obj/screen/alert/open_ticket)
//Dissasociate ticket
/datum/tickets/proc/ClientLogout(client/C)
if(C.current_ticket)
var/datum/ticket/T = C.current_ticket
T.AddInteraction("Client disconnected.")
// T.initiator.mob.clear_alert("open ticket") // Uncomment this line to enable player-side ticket ui
T.initiator.mob.clear_alert("open ticket")
T.initiator = null
T = null
@@ -227,6 +227,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
var/closed_at
var/client/initiator //semi-misnomer, it's the person who ahelped/was bwoinked
var/datum/weakref/handler_ref
var/handler = "/Unassigned\\" // The admin handling the ticket
var/initiator_ckey
var/initiator_key_name
@@ -287,7 +288,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
if(initiator.current_ticket) //This is a bug
log_debug("Multiple ahelp current_tickets")
initiator.current_ticket.AddInteraction("Ticket erroneously left open by code")
initiator.current_ticket.Close()
initiator.current_ticket.Close(usr)
initiator.current_ticket = src
var/parsed_message = keywords_lookup(msg)
@@ -340,12 +341,13 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
//TC.T = src
//TC.tgui_interact(C.mob)
// C.mob.throw_alert("open ticket", /obj/screen/alert/open_ticket) // Uncomment this line to enable player-side ticket ui
C.mob.throw_alert("open ticket", /obj/screen/alert/open_ticket)
/datum/ticket/Destroy()
RemoveActive()
GLOB.tickets.closed_tickets -= src
GLOB.tickets.resolved_tickets -= src
handler_ref = null
return ..()
/datum/ticket/proc/AddInteraction(formatted_message)
@@ -440,7 +442,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
*/
//Reopen a closed ticket
/datum/ticket/proc/Reopen()
/datum/ticket/proc/Reopen(user)
if(state == AHELP_ACTIVE)
to_chat(usr, span_warning("This ticket is already open."))
return
@@ -463,20 +465,22 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
if(initiator)
initiator.current_ticket = src
AddInteraction(span_purple("Reopened by [key_name_admin(usr)]"))
var/admin_reopener_name = ismob(user) ? key_name_admin(user) : user
AddInteraction(span_purple("Reopened by [admin_reopener_name]"))
if(initiator)
to_chat(initiator, span_filter_adminlog("[span_purple("Ticket [TicketHref("#[id]")] was reopened by [key_name(usr,FALSE,FALSE)].")]"))
var/msg = span_adminhelp("Ticket [TicketHref("#[id]")] reopened by [key_name_admin(usr)].")
to_chat(initiator, span_filter_adminlog("[span_purple("Ticket [TicketHref("#[id]")] was reopened by [ismob(user) ? key_name(usr,FALSE,FALSE) : user].")]"))
var/msg = span_adminhelp("Ticket [TicketHref("#[id]")] reopened by [admin_reopener_name].")
message_admins(msg)
log_admin(msg)
feedback_inc("ticket_reopen")
initiator.mob.throw_alert("open ticket", /obj/screen/alert/open_ticket)
//TicketPanel() //can only be done from here, so refresh it
SSwebhooks.send(
WEBHOOK_AHELP_SENT,
list(
"name" = "Ticket ([id]) (Round ID: [GLOB.round_id ? GLOB.round_id : "No database"]) reopened.",
"body" = "Reopened by [key_name(usr)]."
"body" = "Reopened by [ismob(user) ? key_name(user) : user]."
)
)
@@ -491,44 +495,46 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
initiator.current_ticket = null
//Mark open ticket as closed/meme
/datum/ticket/proc/Close(silent = FALSE)
/datum/ticket/proc/Close(user, silent = FALSE)
if(state != AHELP_ACTIVE)
return
RemoveActive()
state = AHELP_CLOSED
GLOB.tickets.ListInsert(src)
AddInteraction(span_filter_adminlog(span_red("Closed by [key_name_admin(usr)].")))
var/admin_closer_name = ismob(user) ? key_name_admin(user) : user
AddInteraction(span_filter_adminlog(span_red("Closed by [admin_closer_name].")))
if(initiator)
to_chat(initiator, span_filter_adminlog("[span_red("Ticket [TicketHref("#[id]")] was closed by [key_name(usr,FALSE,FALSE)].")]"))
to_chat(initiator, span_filter_adminlog("[span_red("Ticket [TicketHref("#[id]")] was closed by [ismob(user) ? key_name(usr,FALSE,FALSE) : user].")]"))
if(!silent)
feedback_inc("ahelp_close")
var/msg = "Ticket [TicketHref("#[id]")] closed by [key_name_admin(usr)]."
var/msg = "Ticket [TicketHref("#[id]")] closed by [admin_closer_name]."
message_admins(msg)
log_admin(msg)
SSwebhooks.send(
WEBHOOK_AHELP_SENT,
list(
"name" = "Ticket ([id]) (Round ID: [GLOB.round_id ? GLOB.round_id : "No database"]) closed.",
"body" = "Closed by [key_name(usr)].",
"body" = "Closed by [ismob(user) ? key_name(user) : user].",
"color" = COLOR_WEBHOOK_BAD
)
)
// initiator?.mob?.clear_alert("open ticket") // Uncomment this line to enable player-side ticket ui
initiator?.mob?.clear_alert("open ticket")
//Mark open ticket as resolved/legitimate, returns ahelp verb
/datum/ticket/proc/Resolve(silent = FALSE)
/datum/ticket/proc/Resolve(user, silent = FALSE)
if(state != AHELP_ACTIVE)
return
RemoveActive()
state = AHELP_RESOLVED
GLOB.tickets.ListInsert(src)
AddInteraction(span_filter_adminlog(span_green("Resolved by [key_name_admin(usr)].")))
var/admin_resolver_name = ismob(user) ? key_name_admin(user) : user
AddInteraction(span_filter_adminlog(span_green("Resolved by [admin_resolver_name].")))
if(initiator)
to_chat(initiator, span_filter_adminlog("[span_green("Ticket [TicketHref("#[id]")] was marked resolved by [key_name(usr,FALSE,FALSE)].")]"))
to_chat(initiator, span_filter_adminlog("[span_green("Ticket [TicketHref("#[id]")] was marked resolved by [ismob(user) ? key_name(usr,FALSE,FALSE) : user].")]"))
if(!silent)
feedback_inc("ticket_resolve")
var/msg = "Ticket [TicketHref("#[id]")] resolved by [key_name_admin(usr)]"
var/msg = "Ticket [TicketHref("#[id]")] resolved by [admin_resolver_name]"
if(type == 1)
message_mentors(msg)
else if (type == 0)
@@ -540,14 +546,14 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
WEBHOOK_AHELP_SENT,
list(
"name" = "Ticket ([id]) (Round ID: [GLOB.round_id ? GLOB.round_id : "No database"]) resolved.",
"body" = "Marked as Resolved by [key_name(usr)].",
"body" = "Marked as Resolved by [ismob(user) ? key_name(user) : user].",
"color" = COLOR_WEBHOOK_GOOD
)
)
// initiator?.mob?.clear_alert("open ticket") // Uncomment this line to enable player-side ticket ui
initiator?.mob?.clear_alert("open ticket")
//Close and return ahelp verb, use if ticket is incoherent
/datum/ticket/proc/Reject(key_name = key_name_admin(usr))
/datum/ticket/proc/Reject(mob/user)
if(state != AHELP_ACTIVE)
return
@@ -559,23 +565,24 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
[span_red(span_bold("Your admin help was rejected."))]<br>\
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."))
var/admin_rejecter_name = ismob(user) ? key_name_admin(user) : user
feedback_inc("ahelp_reject")
var/msg = "Ticket [TicketHref("#[id]")] rejected by [key_name_admin(usr)]"
var/msg = "Ticket [TicketHref("#[id]")] rejected by [admin_rejecter_name]"
message_admins(msg)
log_admin(msg)
AddInteraction("Rejected by [key_name_admin(usr)].")
Close(silent = TRUE)
AddInteraction("Rejected by [admin_rejecter_name].")
Close(user, silent = TRUE)
SSwebhooks.send(
WEBHOOK_AHELP_SENT,
list(
"name" = "Ticket ([id]) (Round ID: [GLOB.round_id ? GLOB.round_id : "No database"]) rejected.",
"body" = "Rejected by [key_name(usr)].",
"body" = "Rejected by [ismob(user) ? key_name(user) : user].",
"color" = COLOR_WEBHOOK_BAD
)
)
//Resolve ticket with IC Issue message
/datum/ticket/proc/ICIssue(key_name = key_name_admin(usr))
/datum/ticket/proc/ICIssue(user)
if(state != AHELP_ACTIVE)
return
@@ -586,51 +593,57 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
if(initiator)
to_chat(initiator, span_filter_pm(msg))
var/admin_resolve_name = ismob(user) ? key_name_admin(user) : user
feedback_inc("ahelp_icissue")
msg = "Ticket [TicketHref("#[id]")] marked as IC by [key_name_admin(usr)]"
msg = "Ticket [TicketHref("#[id]")] marked as IC by [admin_resolve_name]"
message_admins(msg)
log_admin(msg)
AddInteraction("Marked as IC issue by [key_name_admin(usr)]")
Resolve(silent = TRUE)
AddInteraction("Marked as IC issue by [admin_resolve_name]")
Resolve(user, silent = TRUE)
SSwebhooks.send(
WEBHOOK_AHELP_SENT,
list(
"name" = "Ticket ([id]) (Round ID: [GLOB.round_id ? GLOB.round_id : "No database"]) marked as IC issue.",
"body" = "Marked as IC Issue by [key_name(usr)].",
"body" = "Marked as IC Issue by [ismob(user) ? key_name(user) : user].",
"color" = COLOR_WEBHOOK_BAD
)
)
//Resolve ticket with IC Issue message
/datum/ticket/proc/HandleIssue()
//Handle ticket
/datum/ticket/proc/HandleIssue(user)
if(state != AHELP_ACTIVE)
return
if(handler == key_name(usr, FALSE, TRUE))
to_chat(usr, span_red("You are already handling this ticket."))
var/handler_name = ismob(user) ? key_name(user, FALSE, TRUE) : user
if(handler == handler_name)
to_chat(user, span_red("You are already handling this ticket."))
return
var/handler_shown_name = ismob(user) ? key_name_admin(user) : user
var/msg
switch(level)
if(0)
msg = span_green("Your MentorHelp is being handled by [key_name(usr,FALSE,FALSE)] please be patient.")
msg = span_green("Your MentorHelp is being handled by [handler_shown_name] please be patient.")
if(1)
msg = span_red("Your AdminHelp is being handled by [key_name(usr,FALSE,FALSE)] please be patient.")
msg = span_red("Your AdminHelp is being handled by [handler_shown_name] please be patient.")
if(initiator)
to_chat(initiator, msg)
feedback_inc("ahelp_handling")
msg = "Ticket [TicketHref("#[id]")] being handled by [key_name(usr,FALSE,FALSE)]"
msg = "Ticket [TicketHref("#[id]")] being handled by [handler_shown_name]"
message_admins(msg)
log_admin(msg)
AddInteraction("[key_name_admin(usr)] is now handling this ticket.")
handler = key_name(usr, FALSE, TRUE)
AddInteraction("[handler_shown_name] is now handling this ticket.")
handler = handler_name
if(ismob(user))
var/mob/our_handler_mob = user
handler_ref = WEAKREF(our_handler_mob.client)
SSwebhooks.send(
WEBHOOK_AHELP_SENT,
list(
"name" = "Ticket ([id]) (Round ID: [GLOB.round_id ? GLOB.round_id : "No database"]) being handled.",
"body" = "[key_name(usr)] is now handling the ticket."
"body" = "[ismob(user) ? key_name(user) : user] is now handling the ticket."
)
)
@@ -681,7 +694,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
if("retitle")
Retitle()
if("reject")
Reject()
Reject(usr)
if("reply")
switch(level)
if(0)
@@ -689,15 +702,15 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
if(1)
usr.client.cmd_ahelp_reply(initiator)
if("icissue")
ICIssue()
ICIssue(usr)
if("close")
Close()
Close(usr)
if("resolve")
Resolve()
Resolve(usr)
if("handleissue")
HandleIssue()
HandleIssue(usr)
if("reopen")
Reopen()
Reopen(usr)
if("escalate")
Escalate()
+29 -15
View File
@@ -6,22 +6,19 @@
var/datum/ticket/T
/datum/ticket_chat/tgui_interact(mob/user, datum/tgui/ui)
return // Remove this line to enable player-side ticket ui
//ui = SStgui.try_update_ui(user, src, ui)
//if(!ui)
// ui = new(user, src, "TicketChat", "Ticket #[T.id] - [T.LinkedReplyName("\ref[T]")]")
// ui.open()
// user.clear_alert("open ticket")
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "TicketChat", "Ticket #[T.id] - [T.LinkedReplyName("\ref[T]")]")
ui.open()
user.clear_alert("open ticket")
/datum/ticket_chat/tgui_close(mob/user)
. = ..()
return // Remove this line to enable player-side ticket ui
//if(user.client.current_ticket)
// user.throw_alert("open ticket", /obj/screen/alert/open_ticket)
if(user.client.current_ticket)
user.throw_alert("open ticket", /obj/screen/alert/open_ticket)
/datum/ticket_chat/tgui_state(mob/user)
return ADMIN_STATE(R_ADMIN|R_EVENT|R_DEBUG) // Remove this line to enable player-side ticket ui
//return GLOB.tgui_ticket_state
return GLOB.tgui_ticket_state
/datum/ticket_chat/tgui_data(mob/user)
var/list/data = list()
@@ -29,9 +26,9 @@
data["id"] = T.id
data["level"] = T.level
// data["handler"] = T.handler // Uncomment this line to enable player-side ticket ui
data["handler"] = T.handler
// data["log"] = T._interactions // Uncomment this line to enable player-side ticket ui
data["log"] = T._interactions
return data
@@ -43,10 +40,27 @@
if(!params["msg"])
return
var/sane_message = sanitize(params["msg"])
switch(T.level)
if (0)
ui.user.client.cmd_mentor_pm(ui.user.client, sanitize(params["msg"]), T)
if(T.initiator == ui.user.client)
var/client/handler = T.handler_ref?.resolve()
if(handler)
ui.user.client.cmd_mentor_pm(handler, sane_message, T)
return TRUE
T.AddInteraction("[T.initiator_key_name]: [sane_message]")
return TRUE
ui.user.client.cmd_mentor_pm(T.initiator, sane_message, T)
return TRUE
if (1)
ui.user.client.cmd_admin_pm(ui.user.client, sanitize(params["msg"]), T)
if(T.initiator == ui.user.client)
var/client/handler = T.handler_ref?.resolve()
if(handler)
ui.user.client.cmd_admin_pm(handler, sane_message, T)
return TRUE
T.AddInteraction("[key_name_admin(ui.user)]: [sane_message]")
return TRUE
ui.user.client.cmd_admin_pm(T.initiator, sane_message, T)
return TRUE
. = TRUE
+7 -4
View File
@@ -57,6 +57,7 @@
"state" = get_ticket_state(T.state),
"level" = T.level,
"handler" = T.handler,
"ishandled" = !!T.handler_ref?.resolve(),
"opened_at" = (world.time - T.opened_at),
"closed_at" = (world.time - T.closed_at),
"opened_at_date" = gameTimestamp(wtime = T.opened_at),
@@ -71,6 +72,7 @@
"state" = get_ticket_state(T.state),
"level" = T.level,
"handler" = T.handler,
"ishandled" = !!T.handler_ref?.resolve(),
"opened_at" = (world.time - T.opened_at),
"closed_at" = (world.time - T.closed_at),
"opened_at_date" = gameTimestamp(wtime = T.opened_at),
@@ -85,6 +87,7 @@
"state" = get_ticket_state(T.state),
"level" = T.level,
"handler" = T.handler,
"ishandled" = !!T.handler_ref?.resolve(),
"opened_at" = (world.time - T.opened_at),
"closed_at" = (world.time - T.closed_at),
"opened_at_date" = gameTimestamp(wtime = T.opened_at),
@@ -145,7 +148,7 @@
to_chat(ui.user, span_warning("Ticket not found, creating new one..."))
else
player.current_ticket.AddInteraction("[key_name_admin(ui.user)] opened a new ticket.")
player.current_ticket.Close()
player.current_ticket.Close(ui.user)
// Create a new ticket and handle it. You created it afterall!
var/datum/ticket/T = new /datum/ticket(ticket_text, player, TRUE, level)
@@ -153,7 +156,7 @@
T.level = 1
else
T.level = 0
T.HandleIssue()
T.HandleIssue(ui.user)
switch(T.level)
if (0)
ui.user.client.cmd_mentor_pm(player, ticket_text, T)
@@ -168,7 +171,7 @@
ui.user.client.selected_ticket.Retitle()
. = TRUE
if("reopen_ticket")
ui.user.client.selected_ticket.Reopen()
ui.user.client.selected_ticket.Reopen(ui.user)
. = TRUE
if("undock_ticket")
ui.user.client.selected_ticket.tgui_interact(ui.user)
@@ -249,7 +252,7 @@
Retitle()
. = TRUE
if("reopen")
Reopen()
Reopen(ui.user)
. = TRUE
if("legacy")
TicketPanelLegacy(ui.user)