General Cleanup (#19088)

* Remove unused news_articles system

* Rip out the webhook system

* Merk bot/

* Rip out old IRC code

* Move the malf_ai manual

* Clean up the tools folder

* Revert "Remove unused news_articles system"

This reverts commit b1295ce8fa714ea35d768365c267b4b60fcd2faa.

* Put these back
This commit is contained in:
ShadowLarkens
2026-01-30 20:39:50 +01:00
committed by GitHub
parent 193ba5851c
commit e8e986e6f5
122 changed files with 89 additions and 13656 deletions
-8
View File
@@ -1588,14 +1588,6 @@ ADMIN_VERB(cancel_reboot, R_SERVER, "Cancel Reboot", "Cancels a pending world re
log_game(plaintext_title)
log_game(fax_text)
SSwebhooks.send(
WEBHOOK_FAX_SENT,
list(
"name" = "[key_name(owner)] [plaintext_title].",
"body" = fax_text
)
)
else
to_chat(src.owner, span_warning("Message reply failed."))
+77 -187
View File
@@ -1,6 +1,3 @@
#define IRCREPLYCOUNT 2
//allows right clicking mobs to send an admin PM to their client, forwards the selected mob's client to cmd_admin_pm
/client/proc/cmd_admin_pm_context(mob/M in GLOB.mob_list)
set category = null
@@ -78,207 +75,100 @@
return
var/client/recipient
var/irc = 0
if(istext(whom))
if(cmptext(copytext(whom,1,2),"@"))
whom = findStealthKey(whom)
if(whom == "IRCKEY")
irc = 1
else
recipient = GLOB.directory[whom]
recipient = GLOB.directory[whom]
else if(isclient(whom))
recipient = whom
//get message text, limit it's length.and clean/escape html
if(!msg)
msg = tgui_input_text(src, "Message:", "Private message to [key_name(recipient, 0, 0)]", multiline = TRUE, encode = FALSE)
if(irc)
if(!ircreplyamount) //to prevent people from spamming irc
return
if(!msg)
msg = tgui_input_text(src, "Message:", "Private message to Administrator", multiline = TRUE, encode = FALSE)
if(!msg)
return
if(holder)
to_chat(src, span_admin_pm_warning("Error: Use the admin IRC channel, nerd."))
return
else
//get message text, limit it's length.and clean/escape html
if(!msg)
msg = tgui_input_text(src, "Message:", "Private message to [key_name(recipient, 0, 0)]", multiline = TRUE, encode = FALSE)
//clean the message if it's not sent by a high-rank admin
if(!check_rights(R_SERVER|R_DEBUG, FALSE)||irc)//no sending html to the poor bots
msg = trim(sanitize(copytext(msg,1,MAX_MESSAGE_LEN)))
if(!msg)
return
if (src.handle_spam_prevention(MUTE_ADMINHELP))
return
if(prefs.muted & MUTE_ADMINHELP)
to_chat(src, span_admin_pm_warning("Error: Admin-PM: You are unable to use admin PM-s (muted)."))
return
if(!recipient)
if(!current_ticket)
to_chat(src, span_admin_pm_warning("Error: Admin-PM: Client not found."))
to_chat(src, msg)
return
log_admin("Adminhelp: [key_name(src)]: [msg]")
current_ticket.MessageNoRecipient(msg)
//clean the message if it's not sent by a high-rank admin
if(!check_rights(R_SERVER|R_DEBUG, FALSE))//no sending html to the poor bots
msg = trim(sanitize(copytext(msg,1,MAX_MESSAGE_LEN)))
if(!msg)
return
if (src.handle_spam_prevention(MUTE_ADMINHELP))
return
if(prefs.muted & MUTE_ADMINHELP)
to_chat(src, span_admin_pm_warning("Error: Admin-PM: You are unable to use admin PM-s (muted)."))
return
if(!recipient)
if(!current_ticket)
to_chat(src, span_admin_pm_warning("Error: Admin-PM: Client not found."))
to_chat(src, msg)
return
log_admin("Adminhelp: [key_name(src)]: [msg]")
current_ticket.MessageNoRecipient(msg)
return
var/rawmsg = msg
var/keywordparsedmsg = keywords_lookup(msg)
if(irc)
to_chat(src, span_admin_pm_notice("PM to-" + span_bold("Admins") + ": [rawmsg]"))
admin_ticket_log(src, span_admin_pm_warning("Reply PM from-" + span_bold("[key_name(src, TRUE, TRUE)]") + " to " + span_italics("IRC") + ": [keywordparsedmsg]"))
ircreplyamount--
if(recipient.holder)
if(holder) //both are admins
to_chat(recipient, span_admin_pm_warning("Admin PM from-" + span_bold("[key_name(src, recipient, 1)]") + ": [keywordparsedmsg]"))
to_chat(src, span_admin_pm_notice("Admin PM to-" + span_bold("[key_name(recipient, src, 1)]") + ": [keywordparsedmsg]"))
//omg this is dumb, just fill in both their tickets
var/interaction_message = span_admin_pm_notice("PM from-" + span_bold("[key_name(src, recipient, 1)]") + " to-" + span_bold("[key_name(recipient, src, 1)]") + ": [keywordparsedmsg]")
admin_ticket_log(src, interaction_message)
if(recipient != src) //reeee
admin_ticket_log(recipient, interaction_message)
else //recipient is an admin but sender is not
var/replymsg = span_admin_pm_warning("Reply PM from-" + span_bold("[key_name(src, recipient, 1)]") + ": [keywordparsedmsg]")
admin_ticket_log(src, replymsg)
to_chat(recipient, replymsg)
to_chat(src, span_admin_pm_notice("PM to-" + span_bold("Admins") + ": [msg]"))
//play the recieving admin the adminhelp sound (if they have them enabled)
if(recipient.prefs?.read_preference(/datum/preference/toggle/holder/play_adminhelp_ping))
recipient << 'sound/effects/adminhelp.ogg'
else
if(recipient.holder)
if(holder) //both are admins
to_chat(recipient, span_admin_pm_warning("Admin PM from-" + span_bold("[key_name(src, recipient, 1)]") + ": [keywordparsedmsg]"))
to_chat(src, span_admin_pm_notice("Admin PM to-" + span_bold("[key_name(recipient, src, 1)]") + ": [keywordparsedmsg]"))
if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
if(!recipient.current_ticket)
new /datum/ticket(msg, recipient, TRUE, 1)
//omg this is dumb, just fill in both their tickets
var/interaction_message = span_admin_pm_notice("PM from-" + span_bold("[key_name(src, recipient, 1)]") + " to-" + span_bold("[key_name(recipient, src, 1)]") + ": [keywordparsedmsg]")
admin_ticket_log(src, interaction_message)
if(recipient != src) //reeee
admin_ticket_log(recipient, interaction_message)
to_chat(recipient, span_admin_pm_warning(span_huge(span_bold("-- Administrator private message --"))))
to_chat(recipient, span_admin_pm_warning("Admin PM from-" + span_bold("[key_name(src, recipient, 0)]") + ": [msg]"))
to_chat(recipient, span_admin_pm_warning(span_italics("Click on the administrator's name to reply.")))
to_chat(src, span_admin_pm_notice("Admin PM to-" + span_bold("[key_name(recipient, src, 1)]") + ": [msg]"))
else //recipient is an admin but sender is not
var/replymsg = span_admin_pm_warning("Reply PM from-" + span_bold("[key_name(src, recipient, 1)]") + ": [keywordparsedmsg]")
admin_ticket_log(src, replymsg)
to_chat(recipient, replymsg)
to_chat(src, span_admin_pm_notice("PM to-" + span_bold("Admins") + ": [msg]"))
admin_ticket_log(recipient, span_admin_pm_notice("PM From [key_name_admin(src)]: [keywordparsedmsg]"))
//play the recieving admin the adminhelp sound (if they have them enabled)
if(recipient.prefs?.read_preference(/datum/preference/toggle/holder/play_adminhelp_ping))
recipient << 'sound/effects/adminhelp.ogg'
//always play non-admin recipients the adminhelp sound
recipient << 'sound/effects/adminhelp.ogg'
else
if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
if(!recipient.current_ticket)
new /datum/ticket(msg, recipient, TRUE, 1)
//AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
if(CONFIG_GET(flag/popup_admin_pm))
spawn() //so we don't hold the caller proc up
var/sender = src
var/sendername = key
var/reply = tgui_input_text(recipient, msg,"Admin PM from-[sendername]", "", multiline = TRUE) //show message and await a reply
if(recipient && reply)
if(sender)
recipient.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
else
adminhelp(reply) //sender has left, adminhelp instead
return
to_chat(recipient, span_admin_pm_warning(span_huge(span_bold("-- Administrator private message --"))))
to_chat(recipient, span_admin_pm_warning("Admin PM from-" + span_bold("[key_name(src, recipient, 0)]") + ": [msg]"))
to_chat(recipient, span_admin_pm_warning(span_italics("Click on the administrator's name to reply.")))
to_chat(src, span_admin_pm_notice("Admin PM to-" + span_bold("[key_name(recipient, src, 1)]") + ": [msg]"))
else //neither are admins
to_chat(src, span_admin_pm_warning("Error: Admin-PM: Non-admin to non-admin PM communication is forbidden."))
return
admin_ticket_log(recipient, span_admin_pm_notice("PM From [key_name_admin(src)]: [keywordparsedmsg]"))
//always play non-admin recipients the adminhelp sound
recipient << 'sound/effects/adminhelp.ogg'
//AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
if(CONFIG_GET(flag/popup_admin_pm))
spawn() //so we don't hold the caller proc up
var/sender = src
var/sendername = key
var/reply = tgui_input_text(recipient, msg,"Admin PM from-[sendername]", "", multiline = TRUE) //show message and await a reply
if(recipient && reply)
if(sender)
recipient.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
else
adminhelp(reply) //sender has left, adminhelp instead
return
else //neither are admins
to_chat(src, span_admin_pm_warning("Error: Admin-PM: Non-admin to non-admin PM communication is forbidden."))
return
if(irc)
log_admin("PM: [key_name(src)]->IRC: [rawmsg]")
for(var/client/X in GLOB.admins)
if(!check_rights_for(X, R_ADMIN))
continue
to_chat(X, span_admin_pm_notice(span_bold("PM: [key_name(src, X, 0)]-&gt;IRC:") + " [keywordparsedmsg]"))
else
log_admin("PM: [key_name(src)]->[key_name(recipient)]: [rawmsg]")
//we don't use message_admins here because the sender/receiver might get it too
for(var/client/X in GLOB.admins)
if(!check_rights_for(X, R_ADMIN))
continue
if(X.key!=key && X.key!=recipient.key) //check client/X is an admin and isn't the sender or recipient
to_chat(X, span_admin_pm_notice(span_bold("PM: [key_name(src, X, 0)]-&gt;[key_name(recipient, X, 0)]:") + " [keywordparsedmsg]"))
/proc/IrcPm(target,msg,sender)
var/client/C = GLOB.directory[target]
var/datum/ticket/ticket = C ? C.current_ticket : GLOB.tickets.CKey2ActiveTicket(target)
var/compliant_msg = trim(lowertext(msg))
var/irc_tagged = "[sender](IRC)"
var/list/splits = splittext(compliant_msg, " ")
if(splits.len && splits[1] == "ticket")
if(splits.len < 2)
return "Usage: ticket <close|resolve|icissue|reject>"
switch(splits[2])
if("close")
if(ticket)
ticket.Close(irc_tagged)
return "Ticket #[ticket.id] successfully closed"
if("resolve")
if(ticket)
ticket.Resolve(irc_tagged)
return "Ticket #[ticket.id] successfully resolved"
if("icissue")
if(ticket)
ticket.ICIssue(irc_tagged)
return "Ticket #[ticket.id] successfully marked as IC issue"
if("reject")
if(ticket)
ticket.Reject(irc_tagged)
return "Ticket #[ticket.id] successfully rejected"
else
return "Usage: ticket <close|resolve|icissue|reject>"
return "Error: Ticket could not be found"
var/static/stealthkey
var/adminname = "Administrator"
if(!C)
return "Error: No client"
if(!stealthkey)
stealthkey = GenIrcStealthKey()
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
if(!msg)
return "Error: No message"
message_admins("IRC message from [sender] to [key_name_admin(C)] : [msg]")
log_admin("IRC PM: [sender] -> [key_name(C)] : [msg]")
to_chat(C, span_admin_pm_warning(span_huge(span_bold("-- Administrator private message --"))))
to_chat(C, span_admin_pm_warning("Admin PM from-" + span_bold("<a href='byond://?priv_msg=[stealthkey]'>[adminname]</a>") + ": [msg]"))
to_chat(C, span_admin_pm_warning(span_italics("Click on the administrator's name to reply.")))
admin_ticket_log(C, span_admin_pm_notice("PM From [irc_tagged]: [msg]"))
window_flash(C)
//always play non-admin recipients the adminhelp sound
C << 'sound/effects/adminhelp.ogg'
C.ircreplyamount = IRCREPLYCOUNT
return "Message Successful"
/proc/GenIrcStealthKey()
var/num = (rand(0,1000))
var/i = 0
while(i == 0)
i = 1
for(var/P in GLOB.stealthminID)
if(num == GLOB.stealthminID[P])
num++
i = 0
var/stealth = "@[num2text(num)]"
GLOB.stealthminID["IRCKEY"] = stealth
return stealth
#undef IRCREPLYCOUNT
log_admin("PM: [key_name(src)]->[key_name(recipient)]: [rawmsg]")
//we don't use message_admins here because the sender/receiver might get it too
for(var/client/X in GLOB.admins)
if(!check_rights_for(X, R_ADMIN))
continue
if(X.key!=key && X.key!=recipient.key) //check client/X is an admin and isn't the sender or recipient
to_chat(X, span_admin_pm_notice(span_bold("PM: [key_name(src, X, 0)]-&gt;[key_name(recipient, X, 0)]:") + " [keywordparsedmsg]"))
-7
View File
@@ -24,13 +24,6 @@
to_chat(world, span_filter_system(span_alert("[GLOB.custom_event_msg]")))
to_chat(world, span_filter_system("<br>"))
SSwebhooks.send(
WEBHOOK_CUSTOM_EVENT,
list(
"text" = GLOB.custom_event_msg,
)
)
// normal verb for players to view info
/client/verb/cmd_view_custom_event()
set category = "OOC.Game"
-7
View File
@@ -46,7 +46,6 @@
var/last_message = ""
///contins a number of how many times a message identical to last_message was sent.
var/last_message_count = 0
var/ircreplyamount = 0
var/entity_narrate_holder //Holds /datum/entity_narrate when using the relevant admin verbs.
var/fakeConversations //Holds fake PDA conversations for event set-up
@@ -63,8 +62,6 @@
var/datum/volume_panel/volume_panel = null // Initialized by /client/verb/volume_panel()
var/seen_news = 0
var/adminhelped = 0
///////////////
//SOUND STUFF//
///////////////
@@ -75,10 +72,6 @@
////////////
// comment out the line below when debugging locally to enable the options & messages menu
//control_freak = 1
var/received_irc_pm = -99999
var/irc_admin //IRC admin that spoke with them last.
var/mute_irc = 0
var/ip_reputation = 0 //Do we think they're using a proxy/vpn? Only if IP Reputation checking is enabled in config.
///Used for limiting the rate of topic sends by the client to avoid abuse
@@ -49,8 +49,6 @@ Software would almost exclusively use NanoUI modules. Few exceptions are text ed
and similar programs which for some reason require HTML UI. Most software will be highly dependent on NTNet to work as laptops are not physically connected to the station's network.
What i plan to add:
Note: XXXXDB programs will use ingame_manuals to display basic help for players, similar to how books, etc. do
Basic - Software in this bundle is automagically preinstalled in every new computer
NTN Transfer - Allows P2P transfer of files to other computers that run this.
Configurator - Allows configuration of computer's hardware, basically status screen.
-8
View File
@@ -438,14 +438,6 @@ Extracted to its own procedure for easier logic handling with paper bundles.
summary = copytext(summary, 1, webhook_length_limit + 1)
summary += "\n\[Truncated\]"
SSwebhooks.send(
WEBHOOK_FAX_SENT,
list(
"name" = "[faxname] '[sent.name]' sent from [key_name(sender)]",
"body" = summary
)
)
/*
##### ####
##### Webhook Functionality ####
+8 -92
View File
@@ -310,31 +310,21 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
if(1)
to_chat(C, span_adminnotice("PM to-" + span_bold("Admins") + ": [name]"))
//send it to irc if nobody is on and tell us how many were on
var/admin_number_present = send2irc_adminless_only(initiator_ckey, name)
var/admin_number_present = count_admins()
log_admin("Ticket #[id]: [key_name(initiator)]: [name] - heard by [admin_number_present] non-AFK admins who have +BAN.")
if(admin_number_present <= 0)
to_chat(C, span_notice("No active admins are online, your adminhelp was sent to the admin discord."))
send2adminchatwebhook()
var/list/adm = get_admin_counts()
var/list/activemins = adm["present"]
var activeMins = activemins.len
var/activeMins = activemins.len
if(is_bwoink)
ahelp_discord_message("[level == 0 ? "MENTORHELP" : "ADMINHELP"]: FROM: [key_name_admin(usr)] TO [initiator_ckey]/[initiator_key_name] - MSG: \n ```[raw_msg]``` \n Heard by [activeMins] NON-AFK staff members.")
else
ahelp_discord_message("[level == 0 ? "MENTORHELP" : "ADMINHELP"]: FROM: [initiator_ckey]/[initiator_key_name] - MSG: \n ```[raw_msg]``` \n Heard by [activeMins] NON-AFK staff members.")
// Also send it to discord since that's the hip cool thing now.
SSwebhooks.send(
WEBHOOK_AHELP_SENT,
list(
"name" = "Ticket ([id]) (Round ID: [GLOB.round_id ? GLOB.round_id : "No database"]) ticket opened.",
"body" = "[key_name(initiator)] has opened a ticket. \n[msg]",
"color" = COLOR_WEBHOOK_POOR
)
)
GLOB.tickets.active_tickets += src
// Open a new chat with the user
@@ -477,14 +467,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
initiator.mob.throw_alert("open ticket", /atom/movable/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 [ismob(user) ? key_name(user) : user]."
)
)
//private
/datum/ticket/proc/RemoveActive()
if(state != AHELP_ACTIVE)
@@ -511,14 +493,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
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 [ismob(user) ? key_name(user) : user].",
"color" = COLOR_WEBHOOK_BAD
)
)
initiator?.mob?.clear_alert("open ticket")
//Mark open ticket as resolved/legitimate, returns ahelp verb
@@ -542,15 +516,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
message_admins(msg)
log_admin(msg)
if(type == 1)
SSwebhooks.send(
WEBHOOK_AHELP_SENT,
list(
"name" = "Ticket ([id]) (Round ID: [GLOB.round_id ? GLOB.round_id : "No database"]) resolved.",
"body" = "Marked as Resolved by [ismob(user) ? key_name(user) : user].",
"color" = COLOR_WEBHOOK_GOOD
)
)
initiator?.mob?.clear_alert("open ticket")
//Close and return ahelp verb, use if ticket is incoherent
@@ -573,14 +538,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
log_admin(msg)
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 [ismob(user) ? key_name(user) : user].",
"color" = COLOR_WEBHOOK_BAD
)
)
//Resolve ticket with IC Issue message
/datum/ticket/proc/ICIssue(user)
@@ -601,14 +558,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
log_admin(msg)
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 [ismob(user) ? key_name(user) : user].",
"color" = COLOR_WEBHOOK_BAD
)
)
//Handle ticket
/datum/ticket/proc/HandleIssue(user)
@@ -640,13 +589,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket_list)
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" = "[ismob(user) ? key_name(user) : user] is now handling the ticket."
)
)
/datum/ticket/proc/Retitle()
var/new_title = tgui_input_text(usr, "Enter a title for the ticket", "Rename Ticket", name)
@@ -764,6 +706,11 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket)
// HELPER PROCS
//
/proc/count_admins(requiredflags = R_BAN)
var/list/adm = get_admin_counts(requiredflags)
var/list/activemins = adm["present"]
. = activemins.len
/proc/get_admin_counts(requiredflags = R_BAN)
. = list("total" = list(), "noflags" = list(), "afk" = list(), "stealth" = list(), "present" = list())
for(var/client/X in GLOB.admins)
@@ -777,37 +724,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/statclick/ticket)
else
.["present"] += X
/proc/send2irc_adminless_only(source, msg, requiredflags = R_BAN)
var/list/adm = get_admin_counts()
var/list/activemins = adm["present"]
. = activemins.len
/*
if(. <= 0)
var/final = ""
var/list/afkmins = adm["afk"]
var/list/stealthmins = adm["stealth"]
var/list/powerlessmins = adm["noflags"]
var/list/allmins = adm["total"]
if(!afkmins.len && !stealthmins.len && !powerlessmins.len)
final = "[msg] - No admins online"
else
final = "[msg] - All admins stealthed\[[english_list(stealthmins)]\], AFK\[[english_list(afkmins)]\], or lacks +BAN\[[english_list(powerlessmins)]\]! Total: [allmins.len] "
send2irc(source,final)*/
/proc/ircadminwho()
var/list/message = list("Admins: ")
var/list/admin_keys = list()
for(var/client/C as anything in GLOB.admins)
admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]"
for(var/admin in admin_keys)
if(LAZYLEN(admin_keys) > 1)
message += ", [admin]"
else
message += "[admin]"
return jointext(message, "")
/proc/keywords_lookup(msg,irc)
//This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE!
-72
View File
@@ -1,72 +0,0 @@
/decl/webhook
var/id
var/list/urls
var/list/mentions
/decl/webhook/proc/get_message(var/list/data)
. = list()
/decl/webhook/proc/http_post(var/target_url, var/payload)
if (!target_url)
return -1
var/result = LIBCALL(HTTP_POST_DLL_LOCATION, "send_post_request")(target_url, payload, json_encode(list("Content-Type" = "application/json")))
result = cached_json_decode(result)
if (result["error_code"])
log_runtime("byhttp error: [result["error"]] ([result["error_code"]])")
return result["error_code"]
return list(
"status_code" = result["status_code"],
"body" = result["body"]
)
/decl/webhook/proc/send(var/list/data)
var/list/message = get_message(data)
if(!length(message))
return FALSE
if(CONFIG_GET(flag/disable_webhook_embeds))
var/list/embed_content
for(var/list/embed in message["embeds"])
if(embed["title"])
LAZYADD(embed_content, "**[embed["title"]]**")
if(embed["description"])
LAZYADD(embed_content, embed["description"])
if(length(embed_content))
if(message["content"])
message["content"] = "[message["content"]]\n[jointext(embed_content, "\n")]"
else
message["content"] = jointext(embed_content, "\n")
message -= "embeds"
. = TRUE
for(var/target_url in urls)
var/url_message = message.Copy()
var/list/url_mentions = get_mentions(target_url)
if(islist(url_mentions) && length(url_mentions))
if(url_message["content"])
url_message["content"] = "[jointext(url_mentions, ", ")]: [url_message["content"]]"
else
url_message["content"] = "[jointext(url_mentions, ", ")]"
var/list/httpresponse = http_post(target_url, json_encode(url_message))
if(!islist(httpresponse))
. = FALSE
continue
switch(httpresponse["status_code"])
if (200 to 299)
continue
if (400 to 599)
log_runtime("Webhooks: HTTP error code while sending to '[target_url]': [httpresponse["status_code"]]. Data: [httpresponse["body"]].")
else
log_runtime("Webhooks: unknown HTTP code while sending to '[target_url]': [httpresponse["status_code"]]. Data: [httpresponse["body"]].")
. = FALSE
/decl/webhook/proc/get_mentions(var/mentioning_url)
. = mentions?.Copy()
var/url_mentions = LAZYACCESS(urls, mentioning_url)
if(length(url_mentions))
LAZYDISTINCTADD(., url_mentions)
@@ -1,13 +0,0 @@
/decl/webhook/ahelp_sent
id = WEBHOOK_AHELP_SENT
/decl/webhook/ahelp_sent/get_message(var/list/data)
.= ..()
.["embeds"] = list(list(
"title" = "[data["name"]]",
"description" = data["body"],
"color" = data["color"] || COLOR_WEBHOOK_DEFAULT
))
/decl/webhook/ahelp_sent/get_mentions()
. = !length(GLOB.admins) && ..() // VOREStation Edit - GLOB admins
@@ -1,11 +0,0 @@
/decl/webhook/custom_event
id = WEBHOOK_CUSTOM_EVENT
// Data expects a "text" field containing the new custom event text.
/decl/webhook/custom_event/get_message(var/list/data)
. = ..()
.["embeds"] = list(list(
"title" = "A custom event is beginning.",
"description" = (data && data["text"]) || "undefined",
"color" = COLOR_WEBHOOK_DEFAULT
))
@@ -1,10 +0,0 @@
/decl/webhook/fax_sent
id = WEBHOOK_FAX_SENT
/decl/webhook/fax_sent/get_message(var/list/data)
.= ..()
.["embeds"] = list(list(
"title" = "[data["name"]]",
"description" = data["body"],
"color" = COLOR_WEBHOOK_DEFAULT
))
-26
View File
@@ -1,26 +0,0 @@
/decl/webhook/roundend
id = WEBHOOK_ROUNDEND
// Data expects three numerical fields: "survivors", "escaped", "ghosts", "clients"
/decl/webhook/roundend/get_message(var/list/data)
. = ..()
var/desc = "A round of **[SSticker.mode ? SSticker.mode.name : "Unknown"]** (Round ID: [GLOB.round_id ? GLOB.round_id : "No database"]) has ended.\n\n"
if(data)
var/s_escaped = "Escaped"
if(!emergency_shuttle.evac)
s_escaped = "Transferred"
if(data["survivors"] > 0)
desc += "Survivors: **[data["survivors"]]**\n"
desc += "[s_escaped]: **[data["escaped"]]**\n"
else
desc += "There were **no survivors**.\n\n"
desc += "Ghosts: **[data["ghosts"]]**\n"
desc += "Players: **[data["clients"]]**\n"
desc += "Round duration: **[roundduration2text()]**"
.["embeds"] = list(list(
// "title" = global.end_credits_title,
"title" = "Round Has Ended",
"description" = desc,
"color" = COLOR_WEBHOOK_DEFAULT
))
@@ -1,17 +0,0 @@
/decl/webhook/roundprep
id = WEBHOOK_ROUNDPREP
// Data expects "url" and field pointing to the current hosted server and port to connect on.
/decl/webhook/roundprep/get_message(var/list/data)
. = ..()
var/desc = "The server has been started!\n"
if(data && data["map"])
desc += "Map: **[data["map"]]**\n"
if(data && data["url"])
desc += "Address: <[data["url"]]>"
.["embeds"] = list(list(
"title" = "New round is being set up.",
"description" = desc,
"color" = COLOR_WEBHOOK_DEFAULT
))
@@ -1,16 +0,0 @@
/decl/webhook/roundstart
id = WEBHOOK_ROUNDSTART
// Data expects a "url" field pointing to the current hosted server and port to connect on.
/decl/webhook/roundstart/get_message(var/list/data)
. = ..()
var/desc = "Gamemode: **[GLOB.master_mode]**\n"
desc += "Players: **[GLOB.player_list.len]**"
if(data && data["url"])
desc += "\nAddress: <[data["url"]]>"
.["embeds"] = list(list(
"title" = "Round has started.",
"description" = desc,
"color" = COLOR_WEBHOOK_DEFAULT
))