mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-21 15:42:35 +00:00
A user ahelping creates a ticket. Any further ahelps while that ticket is open will go to that ticket (and either adminhelp or pm an admin assigned to the ticket, if one has taken it). A user can close their own ticket up until an admin takes it. Admins can take tickets either manually or just by replying to the PM. An admin taking a ticket notifies other admins. If another admin attempts to take or respond to an assigned ticket, they receive a notification asking if they would like to join the ticket or cancel (any number of admins can join a ticket). When an admin finishes with a ticket, they must close it -- both for logistics and closure for the user. If there is an open ticket assigned to an active admin, round end is automatically delayed (unassigned tickets or tickets assigned to disconnected or afk admins do not delay). Round end will automatically continue once all active tickets are closed. Both staff and non-staff have access to a ticket panel listing tickets, their statuses, and their messages. Non-staff can only see their own tickets. This panel is optional and all features are available inline with chat.
251 lines
8.5 KiB
Plaintext
251 lines
8.5 KiB
Plaintext
//print an error message to world.log
|
|
|
|
|
|
// On Linux/Unix systems the line endings are LF, on windows it's CRLF, admins that don't use notepad++
|
|
// will get logs that are one big line if the system is Linux and they are using notepad. This solves it by adding CR to every line ending
|
|
// in the logs. ascii character 13 = CR
|
|
|
|
#define SEVERITY_ALERT 1
|
|
#define SEVERITY_CRITICAL 2
|
|
#define SEVERITY_ERROR 3
|
|
#define SEVERITY_WARNING 4
|
|
#define SEVERITY_NOTICE 5
|
|
#define SEVERITY_INFO 6
|
|
#define SEVERITY_DEBUG 7
|
|
|
|
/var/global/log_end = world.system_type == UNIX ? ascii2text(13) : ""
|
|
|
|
/proc/error(msg)
|
|
world.log << "## ERROR: [msg][log_end]"
|
|
|
|
#define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].")
|
|
//print a warning message to world.log
|
|
/proc/warning(msg)
|
|
world.log << "## WARNING: [msg][log_end]"
|
|
|
|
//print a testing-mode debug message to world.log
|
|
/proc/testing(msg)
|
|
world.log << "## TESTING: [msg][log_end]"
|
|
|
|
/proc/game_log(category, text)
|
|
diary << "\[[time_stamp()]] [game_id] [category]: [text][log_end]"
|
|
|
|
/proc/log_admin(text,level=5,ckey="",admin_key="",ckey_target="")
|
|
admin_log.Add(text)
|
|
if (config.log_admin)
|
|
game_log("ADMIN", text)
|
|
send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="ADMIN",additional_data=list("_ckey"=html_encode(ckey),"_admin_key"=html_encode(admin_key),"_ckey_target"=html_encode(ckey_target)))
|
|
|
|
/proc/log_debug(text,level = SEVERITY_DEBUG)
|
|
if (config.log_debug)
|
|
game_log("DEBUG", text)
|
|
|
|
for(var/client/C in admins)
|
|
if(!C.prefs) //This is to avoid null.toggles runtime error while still initialyzing players preferences
|
|
return
|
|
if(C.prefs.toggles & CHAT_DEBUGLOGS)
|
|
C << "DEBUG: [text]"
|
|
send_gelf_log(short_message = text, long_message = "[time_stamp()]: [text]", level = level, category = "DEBUG")
|
|
|
|
/proc/log_game(text, level = SEVERITY_NOTICE, ckey = "", admin_key = "", ckey_target = "")
|
|
if (config.log_game)
|
|
game_log("GAME", text)
|
|
send_gelf_log(
|
|
short_message = text,
|
|
long_message = "[time_stamp()]: [text]",
|
|
level = level,
|
|
category = "GAME",
|
|
additional_data = list("_ckey" = html_encode(ckey), "_admin_key" = html_encode(admin_key), "_target" = html_encode(target))
|
|
)
|
|
|
|
/proc/log_vote(text)
|
|
if (config.log_vote)
|
|
game_log("VOTE", text)
|
|
send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=5,category="VOTE")
|
|
|
|
/proc/log_access(text, level = SEVERITY_NOTICE,ckey="")
|
|
if (config.log_access)
|
|
game_log("ACCESS", text)
|
|
send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="ACCESS",additional_data=list("_ckey"=html_encode(ckey)))
|
|
|
|
/proc/log_say(text, level = SEVERITY_NOTICE, ckey = "")
|
|
if (config.log_say)
|
|
game_log("SAY", text)
|
|
send_gelf_log(short_message=text, long_message="[time_stamp()]: [text]",level=level,category="SAY",additional_data=list("_ckey"=html_encode(ckey)))
|
|
|
|
/proc/log_ooc(text, level = SEVERITY_NOTICE, ckey = "")
|
|
if (config.log_ooc)
|
|
game_log("OOC", text)
|
|
send_gelf_log(short_message = text, long_message = "[time_stamp()]: [text]", level = level, category = "OOC", additional_data = list("_ckey" = html_encode(ckey)))
|
|
|
|
/proc/log_whisper(text, level = SEVERITY_NOTICE, ckey = "")
|
|
if (config.log_whisper)
|
|
game_log("WHISPER", text)
|
|
send_gelf_log(short_message = text, long_message = "[time_stamp()]: [text]", level = level, category = "WHISPER", additional_data = list("_ckey" = html_encode(ckey)))
|
|
|
|
/proc/log_emote(text, level = SEVERITY_NOTICE, ckey = "")
|
|
if (config.log_emote)
|
|
game_log("EMOTE", text)
|
|
send_gelf_log(short_message = text, long_message = "[time_stamp()]: [text]",level = level,category = "EMOTE", additional_data = list("_ckey" = html_encode(ckey)))
|
|
|
|
/proc/log_attack(text, level = SEVERITY_NOTICE, ckey = "", ckey_target = "")
|
|
if (config.log_attack)
|
|
game_log("ATTACK", text)
|
|
send_gelf_log(
|
|
short_message = text,
|
|
long_message = "[time_stamp()]: [text]",
|
|
level = level,
|
|
category="ATTACK",
|
|
additional_data = list("_ckey" = html_encode(ckey), "_ckey_target" = html_encode(ckey_target))
|
|
)
|
|
|
|
/proc/log_adminsay(text)
|
|
if (config.log_adminchat)
|
|
game_log("ADMINSAY", text)
|
|
send_gelf_log(short_message = text, long_message = "[time_stamp()]: [text]",level = SEVERITY_NOTICE, category = "ADMINSAY")
|
|
|
|
/proc/log_pda(text, level = SEVERITY_NOTICE, ckey = "", ckey_target = "")
|
|
if (config.log_pda)
|
|
game_log("PDA", text)
|
|
send_gelf_log(
|
|
short_message = text,
|
|
long_message = "[time_stamp()]: [text]",
|
|
level = level,
|
|
category="PDA",
|
|
additional_data = list("_ckey" = html_encode(ckey), "_ckey_target" = html_encode(ckey_target))
|
|
)
|
|
|
|
/proc/log_ntirc(text, level = SEVERITY_NOTICE, ckey = "", conversation = "")
|
|
if (config.log_pda)
|
|
game_log("NTIRC", text)
|
|
send_gelf_log(
|
|
short_message = text,
|
|
long_message="[time_stamp()]: [text]",
|
|
level = level,
|
|
category = "NTIRC",
|
|
additional_data = list("_ckey" = html_encode(ckey), "_ntirc_conversation" = html_encode(conversation))
|
|
)
|
|
|
|
/proc/log_to_dd(text)
|
|
world.log << text //this comes before the config check because it can't possibly runtime
|
|
if(config.log_world_output)
|
|
game_log("DD_OUTPUT", text)
|
|
send_gelf_log(short_message = text, long_message = "[time_stamp()]: [text]", level = SEVERITY_NOTICE, category = "DD_OUTPUT")
|
|
|
|
/proc/log_misc(text)
|
|
game_log("MISC", text)
|
|
send_gelf_log(short_message = text, long_message = "[time_stamp()]: [text]", level = SEVERITY_NOTICE, category="MISC")
|
|
|
|
/proc/log_mc(text)
|
|
game_log("MASTER", text)
|
|
send_gelf_log(text, "[time_stamp()]: [text]", SEVERITY_INFO, "MASTER")
|
|
|
|
/proc/log_gc(text, type, high_severity = FALSE)
|
|
game_log("GC", text)
|
|
send_gelf_log(text, "[time_stamp()]: [text]", high_severity ? SEVERITY_WARNING : SEVERITY_DEBUG, "GARBAGE", additional_data = list("_type" = "[type]"))
|
|
|
|
/proc/log_ss(subsystem, text, log_world = TRUE)
|
|
if (!subsystem)
|
|
subsystem = "UNKNOWN"
|
|
var/msg = "[subsystem]: [text]"
|
|
game_log("SS", msg)
|
|
send_gelf_log(msg, "[time_stamp()]: [msg]", SEVERITY_DEBUG, "SUBSYSTEM", additional_data = list("_subsystem" = subsystem))
|
|
if (log_world)
|
|
world.log << "SS[subsystem]: [text]"
|
|
|
|
/proc/log_ss_init(text)
|
|
game_log("SS", "[text]")
|
|
send_gelf_log(text, "[time_stamp()]: [text]", SEVERITY_INFO, "SS Init")
|
|
|
|
// Generally only used when something has gone very wrong.
|
|
/proc/log_failsafe(text)
|
|
game_log("FAILSAFE", text)
|
|
send_gelf_log(text, "[time_stamp()]: [text]", SEVERITY_ALERT, "FAILSAFE")
|
|
|
|
/proc/log_unit_test(text)
|
|
world.log << "## UNIT_TEST ##: [text]"
|
|
|
|
/proc/log_exception(exception/e)
|
|
if (config.log_runtime)
|
|
if (config.log_runtime == 2)
|
|
log_debug("RUNTIME ERROR:\n[e.name]")
|
|
|
|
diary_runtime << "runtime error:[e.name][log_end]"
|
|
diary_runtime << "[e.desc]"
|
|
send_gelf_log(short_message = "runtime error:[e.name]", long_message = "[e.desc]", level = SEVERITY_WARNING, category = "RUNTIME")
|
|
|
|
//pretty print a direction bitflag, can be useful for debugging.
|
|
/proc/print_dir(var/dir)
|
|
var/list/comps = list()
|
|
if(dir & NORTH) comps += "NORTH"
|
|
if(dir & SOUTH) comps += "SOUTH"
|
|
if(dir & EAST) comps += "EAST"
|
|
if(dir & WEST) comps += "WEST"
|
|
if(dir & UP) comps += "UP"
|
|
if(dir & DOWN) comps += "DOWN"
|
|
|
|
return english_list(comps, nothing_text="0", and_text="|", comma_text="|")
|
|
|
|
//more or less a logging utility
|
|
/proc/key_name(var/whom, var/include_link = null, var/include_name = 1, var/highlight_special = 0, var/datum/ticket/ticket = null)
|
|
var/mob/M
|
|
var/client/C
|
|
var/key
|
|
|
|
if(!whom) return "*null*"
|
|
if(istype(whom, /client))
|
|
C = whom
|
|
M = C.mob
|
|
key = C.key
|
|
else if(ismob(whom))
|
|
M = whom
|
|
C = M.client
|
|
key = M.key
|
|
else if(istype(whom, /datum/mind))
|
|
var/datum/mind/D = whom
|
|
key = D.key
|
|
M = D.current
|
|
if(D.current)
|
|
C = D.current.client
|
|
else if(istype(whom, /datum))
|
|
var/datum/D = whom
|
|
return "*invalid:[D.type]*"
|
|
else
|
|
return "*invalid*"
|
|
|
|
. = ""
|
|
|
|
if(key)
|
|
if(include_link && C)
|
|
. += "<a href='?priv_msg=\ref[C];ticket=\ref[ticket]'>"
|
|
|
|
if(C && C.holder && C.holder.fakekey && !include_name)
|
|
. += "Administrator"
|
|
else
|
|
. += key
|
|
|
|
if(include_link)
|
|
if(C) . += "</a>"
|
|
else . += " (DC)"
|
|
else
|
|
. += "*no key*"
|
|
|
|
if(include_name && M)
|
|
var/name
|
|
|
|
if(M.real_name)
|
|
name = M.real_name
|
|
else if(M.name)
|
|
name = M.name
|
|
|
|
|
|
if(is_special_character(M) && highlight_special)
|
|
. += "/(<font color='#FFA500'>[name]</font>)" //Orange
|
|
else
|
|
. += "/([name])"
|
|
|
|
return .
|
|
|
|
/proc/key_name_admin(var/whom, var/include_name = 1)
|
|
return key_name(whom, 1, include_name, 1)
|