minor fixes (#7410)

This commit is contained in:
silicons
2025-11-30 14:44:47 -05:00
committed by GitHub
parent 482e3dd848
commit 5a60958957
8 changed files with 188 additions and 175 deletions

View File

@@ -501,6 +501,7 @@
#include "code\__HELPERS\sorts\TimSort.dm"
#include "code\__HELPERS\text\format.dm"
#include "code\__HELPERS\text\padding.dm"
#include "code\__HELPERS\text\sanitize.dm"
#include "code\__HELPERS\text\scramble.dm"
#include "code\__HELPERS\type2type\color.dm"
#include "code\__HELPERS\type2type\type2type.dm"
@@ -2761,9 +2762,12 @@
#include "code\modules\client\onboarding\panic_bunker.dm"
#include "code\modules\client\onboarding\security_checks.dm"
#include "code\modules\client\verbs\fix_statpanel.dm"
#include "code\modules\client\verbs\looc.dm"
#include "code\modules\client\verbs\minimap.dm"
#include "code\modules\client\verbs\motd.dm"
#include "code\modules\client\verbs\ooc.dm"
#include "code\modules\client\verbs\system.dm"
#include "code\modules\client\verbs\toggle_verticality_visibility.dm"
#include "code\modules\client\verbs\view.dm"
#include "code\modules\client\verbs\view_playtime.dm"
#include "code\modules\clothing\chameleon.dm"

View File

@@ -15,7 +15,7 @@
/// Used for preprocessing entered text.
// todo: extra is a bad param, we should instead just have linebreaks = n for n linebreaks, and a way to disable it.
/proc/sanitize(input, max_length = MAX_MESSAGE_LEN, encode = TRUE, trim = TRUE, extra = TRUE)
/proc/sanitize(input, max_length = MAX_MESSAGE_LEN, encode = TRUE, trim = TRUE, extra = TRUE, newlines_allowed = 24)
if(!input)
// don't toss out blank input by nulling it
return input
@@ -25,7 +25,7 @@
if(extra)
var/temp_input = replace_characters(input, list("\n"=" ","\t"=" "))//one character is replaced by two
if(length_char(input) < (length_char(temp_input) - 24)) //24 is the number of linebreaks allowed per message
if(length_char(input) < (length_char(temp_input) - newlines_allowed)) //24 is the number of linebreaks allowed per message
input = replace_characters(temp_input,list(" "=" "))//replace again, this time the double spaces with single ones
if(encode)

View File

@@ -8,3 +8,14 @@
// todo: rustg
var/static/regex/expression = regex(@"[^a-zA-Z0-9_ ]+", "g")
return replacetext_char(str, expression, "")
/**
* Sanitizes OOC / LOOC input.
* * Will perform HTML encoding.
*/
/proc/sanitize_input_ooc(str)
var/static/regex/expression = regex(@"[\r\n\t]", "g")
. = str
. = trim(.)
. = replacetext_char(., expression, "")
. = html_encode(.)

View File

@@ -554,3 +554,32 @@ GLOBAL_VAR_INIT(log_clicks, FALSE)
/client/proc/AnnouncePR(announcement)
to_chat(src, announcement)
// TODO: this shoudln't be on client.
/client/proc/getAlertDesc()
var/color
var/desc
//borrow the same colors from the fire alarms
switch(get_security_level())
if("green")
color = "#00ff00"
desc = "" //no special description if nothing special is going on
if("yellow")
color = "#ffff00"
desc = CONFIG_GET(string/alert_desc_yellow_upto)
if("violet")
color = "#9933ff"
desc = CONFIG_GET(string/alert_desc_violet_upto)
if("orange")
color = "#ff9900"
desc = CONFIG_GET(string/alert_desc_orange_upto)
if("blue")
color = "#1024A9"
desc = CONFIG_GET(string/alert_desc_blue_upto)
if("red")
color = "#ff0000"
desc = CONFIG_GET(string/alert_desc_red_upto)
if("delta")
color = "#FF6633"
desc = CONFIG_GET(string/alert_desc_delta)
. = SPAN_NOTICE("<br>The alert level on \the [station_name()] is currently: <font color=[color]>Code [capitalize(get_security_level())]</font>. [desc]")

View File

@@ -0,0 +1,119 @@
/client/proc/looc_wrapper()
var/message = input("","looc (text)") as text|null
if(message)
looc(message)
/client/verb/looc(msg as text)
set name = "LOOC"
set desc = "Local OOC, seen only by those in view."
set category = VERB_CATEGORY_OOC
if(!reject_on_initialization_block())
return
if(!reject_age_unverified())
return
if(!mob)
return
if(IsGuestKey(key))
to_chat(src, "Guests may not use OOC.")
return
if(SSbans.t_is_role_banned_ckey(ckey, role = BAN_ROLE_OOC) && IS_DEAD(mob))
to_chat(src, SPAN_WARNING("You are banned from typing in LOOC while dead, and deadchat."))
return
// -- HTML ENCODE HERE --
msg = sanitize_input_ooc(msg)
// -- END --
if(!msg)
return
if(!get_preference_toggle(/datum/game_preference_toggle/chat/looc))
to_chat(src, "<span class='danger'>You have LOOC muted.</span>")
return
if(!holder)
if(!config_legacy.looc_allowed)
to_chat(src, "<span class='danger'>LOOC is globally muted.</span>")
return
if(!config_legacy.dooc_allowed && (mob.stat == DEAD))
to_chat(usr, "<span class='danger'>OOC for dead mobs has been turned off.</span>")
return
if(prefs.muted & MUTE_OOC)
to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>")
return
if(findtext(msg, "byond://"))
to_chat(src, "<B>Advertising other servers is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return
if(msg)
handle_spam_prevention(MUTE_OOC)
var/mob/source = mob.get_looc_source()
var/turf/T = get_turf(source)
if(!T)
return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
var/list/m_viewers = in_range["mobs"]
var/list/receivers = list() //Clients, not mobs.
var/list/r_receivers = list()
var/display_name = get_public_key()
if(mob.stat != DEAD)
display_name = mob.name
// Resleeving shenanigan prevention.
if(ishuman(mob))
var/mob/living/carbon/human/H = mob
if(H.original_player && H.original_player != H.ckey) //In a body not their own
display_name = "[H.mind.name] (as [H.name])"
// Everyone in normal viewing range of the LOOC
for(var/mob/viewer in m_viewers)
if(viewer.client && viewer.client.get_preference_toggle(/datum/game_preference_toggle/chat/looc))
receivers |= viewer.client
else if(istype(viewer,/mob/observer/eye)) // For AI eyes and the like
var/mob/observer/eye/E = viewer
if(E.owner && E.owner.client)
receivers |= E.owner.client
// Admins with RLOOC displayed who weren't already in
for(var/client/admin in GLOB.admins)
if(!(admin in receivers) && admin.get_preference_toggle(/datum/game_preference_toggle/admin/global_looc))
r_receivers |= admin
msg = emoji_parse(msg)
if(persistent.ligma)
to_chat(src, "<span class='looc'>" + "LOOC: " + "<EM>[display_name]: </EM><span class='message'><span class='linkify'>[msg]</span></span></span>")
log_shadowban("[key_name(src)] LOOC: [msg]")
return
log_looc(msg,src)
// Send a message
for(var/client/target in receivers)
var/admin_stuff = ""
if(target in GLOB.admins)
admin_stuff += "/([key])"
to_chat(target, "<span class='looc'>" + "LOOC: " + "<EM>[display_name][admin_stuff]: </EM><span class='message'><span class='linkify'>[msg]</span></span></span>")
for(var/client/target in r_receivers)
var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])"
to_chat(target, "<span class='looc'>" + "LOOC: " + " <span class='prefix'>(R)</span><EM>[display_name][admin_stuff]: </EM> <span class='message'><span class='linkify'>[msg]</span></span></span>")
/mob/proc/get_looc_source()
return src
/mob/living/silicon/ai/get_looc_source()
if(eyeobj)
return eyeobj
return src

View File

@@ -0,0 +1,11 @@
/client/verb/motd()
set name = "MOTD"
set category = VERB_CATEGORY_OOC
set desc ="Check the Message of the Day"
var/motd = config.motd
if(motd)
to_chat(src, "<blockquote class=\"motd\">[motd]</blockquote>", handle_whitespace=FALSE)
else
to_chat(src, "<span class='notice'>The Message of the Day has not been set.</span>")
to_chat(src, getAlertDesc())

View File

@@ -1,57 +1,3 @@
// todo: most of the things in here should probably be re-thought category wise;
// verticality for one is more graphics/visuals
// but isn't a preference because it's something you need to actively see at some times but not others..
/client/verb/toggle_verticality_visibility()
set name = "Toggle Verticality Plane"
set desc = "Toggle if you see ceiling overlays and similar."
set category = VERB_CATEGORY_OOC
var/atom/movable/screen/plane_master/plane = global_planes.by_plane_type(/atom/movable/screen/plane_master/verticality)
plane.alpha = plane.alpha == 255? 0 : 255
to_chat(src, SPAN_NOTICE("You now [plane.alpha == 255? "see" : "no longer see"] verticality overlays."))
/client/verb/motd()
set name = "MOTD"
set category = VERB_CATEGORY_OOC
set desc ="Check the Message of the Day"
var/motd = config.motd
if(motd)
to_chat(src, "<blockquote class=\"motd\">[motd]</blockquote>", handle_whitespace=FALSE)
else
to_chat(src, "<span class='notice'>The Message of the Day has not been set.</span>")
to_chat(src, getAlertDesc())
/client/proc/getAlertDesc()
var/color
var/desc
//borrow the same colors from the fire alarms
switch(get_security_level())
if("green")
color = "#00ff00"
desc = "" //no special description if nothing special is going on
if("yellow")
color = "#ffff00"
desc = CONFIG_GET(string/alert_desc_yellow_upto)
if("violet")
color = "#9933ff"
desc = CONFIG_GET(string/alert_desc_violet_upto)
if("orange")
color = "#ff9900"
desc = CONFIG_GET(string/alert_desc_orange_upto)
if("blue")
color = "#1024A9"
desc = CONFIG_GET(string/alert_desc_blue_upto)
if("red")
color = "#ff0000"
desc = CONFIG_GET(string/alert_desc_red_upto)
if("delta")
color = "#FF6633"
desc = CONFIG_GET(string/alert_desc_delta)
. = SPAN_NOTICE("<br>The alert level on \the [station_name()] is currently: <font color=[color]>Code [capitalize(get_security_level())]</font>. [desc]")
/client/proc/ooc_wrapper()
var/message = input("","ooc (text)") as text|null
if(message)
@@ -95,12 +41,14 @@
if(QDELETED(src))
return
msg = sanitize(msg)
var/raw_msg = msg
// -- HTML ENCODE HERE --
msg = sanitize_input_ooc(msg)
// -- END --
if(!msg)
return
var/raw_msg = msg
msg = emoji_parse(msg)
if(((msg[1] in list(".",";",":","#")) || findtext_char(msg, "say", 1, 5))) //SSticker.HasRoundStarted() &&
@@ -158,120 +106,3 @@
to_chat(target, "<span class='prefix [ooc_style]'><span class='ooc'><font color='[effective_color]'>" + "OOC: " + "<EM>[display_name]: </EM><span class='linkify'>[msg]</span></span></span></font>")
else
to_chat(target, "<span class='ooc'><span class='[ooc_style]'><span class='message'>OOC: <EM>[display_name]: </EM><span class='linkify'>[msg]</span></span></span></span>")
/client/proc/looc_wrapper()
var/message = input("","looc (text)") as text|null
if(message)
looc(message)
/client/verb/looc(msg as text)
set name = "LOOC"
set desc = "Local OOC, seen only by those in view."
set category = VERB_CATEGORY_OOC
if(!reject_on_initialization_block())
return
if(!reject_age_unverified())
return
if(!mob)
return
if(IsGuestKey(key))
to_chat(src, "Guests may not use OOC.")
return
if(SSbans.t_is_role_banned_ckey(ckey, role = BAN_ROLE_OOC) && IS_DEAD(mob))
to_chat(src, SPAN_WARNING("You are banned from typing in LOOC while dead, and deadchat."))
return
msg = sanitize(msg)
if(!msg)
return
if(!get_preference_toggle(/datum/game_preference_toggle/chat/looc))
to_chat(src, "<span class='danger'>You have LOOC muted.</span>")
return
if(!holder)
if(!config_legacy.looc_allowed)
to_chat(src, "<span class='danger'>LOOC is globally muted.</span>")
return
if(!config_legacy.dooc_allowed && (mob.stat == DEAD))
to_chat(usr, "<span class='danger'>OOC for dead mobs has been turned off.</span>")
return
if(prefs.muted & MUTE_OOC)
to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>")
return
if(findtext(msg, "byond://"))
to_chat(src, "<B>Advertising other servers is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return
if(msg)
handle_spam_prevention(MUTE_OOC)
var/mob/source = mob.get_looc_source()
var/turf/T = get_turf(source)
if(!T)
return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
var/list/m_viewers = in_range["mobs"]
var/list/receivers = list() //Clients, not mobs.
var/list/r_receivers = list()
var/display_name = get_public_key()
if(mob.stat != DEAD)
display_name = mob.name
// Resleeving shenanigan prevention.
if(ishuman(mob))
var/mob/living/carbon/human/H = mob
if(H.original_player && H.original_player != H.ckey) //In a body not their own
display_name = "[H.mind.name] (as [H.name])"
// Everyone in normal viewing range of the LOOC
for(var/mob/viewer in m_viewers)
if(viewer.client && viewer.client.get_preference_toggle(/datum/game_preference_toggle/chat/looc))
receivers |= viewer.client
else if(istype(viewer,/mob/observer/eye)) // For AI eyes and the like
var/mob/observer/eye/E = viewer
if(E.owner && E.owner.client)
receivers |= E.owner.client
// Admins with RLOOC displayed who weren't already in
for(var/client/admin in GLOB.admins)
if(!(admin in receivers) && admin.get_preference_toggle(/datum/game_preference_toggle/admin/global_looc))
r_receivers |= admin
msg = emoji_parse(msg)
if(persistent.ligma)
to_chat(src, "<span class='looc'>" + "LOOC: " + "<EM>[display_name]: </EM><span class='message'><span class='linkify'>[msg]</span></span></span>")
log_shadowban("[key_name(src)] LOOC: [msg]")
return
log_looc(msg,src)
// Send a message
for(var/client/target in receivers)
var/admin_stuff = ""
if(target in GLOB.admins)
admin_stuff += "/([key])"
to_chat(target, "<span class='looc'>" + "LOOC: " + "<EM>[display_name][admin_stuff]: </EM><span class='message'><span class='linkify'>[msg]</span></span></span>")
for(var/client/target in r_receivers)
var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])"
to_chat(target, "<span class='looc'>" + "LOOC: " + " <span class='prefix'>(R)</span><EM>[display_name][admin_stuff]: </EM> <span class='message'><span class='linkify'>[msg]</span></span></span>")
/mob/proc/get_looc_source()
return src
/mob/living/silicon/ai/get_looc_source()
if(eyeobj)
return eyeobj
return src

View File

@@ -0,0 +1,8 @@
/client/verb/toggle_verticality_visibility()
set name = "Toggle Verticality Plane"
set desc = "Toggle if you see ceiling overlays and similar."
set category = VERB_CATEGORY_OOC
var/atom/movable/screen/plane_master/plane = global_planes.by_plane_type(/atom/movable/screen/plane_master/verticality)
plane.alpha = plane.alpha == 255? 0 : 255
to_chat(src, SPAN_NOTICE("You now [plane.alpha == 255? "see" : "no longer see"] verticality overlays."))