diff --git a/citadel.dme b/citadel.dme index 63360afb2cc..d19bb0a96f9 100644 --- a/citadel.dme +++ b/citadel.dme @@ -2377,6 +2377,7 @@ #include "code\modules\catalogue\cataloguer.dm" #include "code\modules\catalogue\cataloguer_visuals.dm" #include "code\modules\catalogue\cataloguer_vr.dm" +#include "code\modules\client\client-admin.dm" #include "code\modules\client\client.dm" #include "code\modules\client\client_procs.dm" #include "code\modules\client\connection.dm" diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 29dc2560586..2029c1189ee 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -361,7 +361,7 @@ GLOBAL_LIST_INIT(testing_global_profiler, list("_PROFILE_NAME" = "Global")) include_link = FALSE if(key) - if(C && C.holder && C.holder.fakekey && !include_name) + if(C?.is_under_stealthmin() && !include_name) if(include_link) . += "" . += "Administrator" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index dc2eebbef6e..cbfb0473ff9 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -427,7 +427,7 @@ var/list/creatures = list() var/list/namecounts = list() for(var/mob/M in mobs) - if(isobserver(M) && ghostfollow && M.client?.holder && M.client.holder.fakekey && M.get_preference_toggle(/datum/game_preference_toggle/admin/stealth_hides_ghost)) + if(isobserver(M) && ghostfollow && M.client.is_under_stealthmin() && M.get_preference_toggle(/datum/game_preference_toggle/admin/stealth_hides_ghost)) continue var/name = M.name if (name in names) diff --git a/code/datums/variable_settings/variable_setting_controller.dm b/code/datums/variable_settings/variable_setting_controller.dm index 0cafa61e264..af375011bde 100644 --- a/code/datums/variable_settings/variable_setting_controller.dm +++ b/code/datums/variable_settings/variable_setting_controller.dm @@ -94,7 +94,7 @@ if(announce == "Cancel") return else if(announce == "Yes") - to_chat(world, "[user?.client?.holder?.fakekey? "Administrator" : user.key] applied preset [input] to [src].") + to_chat(world, "[user?.client?.is_under_stealthmin()? "Administrator" : user.key] applied preset [input] to [src].") message_admins(logstr) log_admin(logstr) if(input == initial_preset_name) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index d25c2379d64..f3802a4adfe 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -98,10 +98,7 @@ /datum/world_topic/jsonplayers/Run(list/input, addr) . = list() for(var/client/C in GLOB.clients) - if(C.holder?.fakekey) - . += C.holder.fakekey - continue - . += C.key + . += C.get_public_key() return json_encode(.) /datum/world_topic/jsonmanifest diff --git a/code/game/verbs/advanced_who.dm b/code/game/verbs/advanced_who.dm index d60a7a51dba..3336d621568 100644 --- a/code/game/verbs/advanced_who.dm +++ b/code/game/verbs/advanced_who.dm @@ -11,13 +11,11 @@ if(holder && (R_ADMIN & holder.rights || R_MOD & holder.rights)) for(var/client/C in GLOB.clients) - var/entry = "\t[C.key]" + var/entry = "\t[C.get_revealed_key()]" if(!C.initialized) entry += " - Uninitialized" Lines += entry continue - if(C.holder && C.holder.fakekey) - entry += " (as [C.holder.fakekey])" entry += " - Playing as [C.mob.real_name]" switch(C.mob.stat) if(UNCONSCIOUS) @@ -64,10 +62,10 @@ entry += "[C.ckey] - Uninitialized" Lines += entry continue - if(C.holder && C.holder.fakekey) - entry += "[C.holder.fakekey]" + if(C == src) + entry += "[C.get_revealed_key()]" else - entry += "[C.key]" + entry += "[C.get_public_key()]" if(C.get_preference_toggle(/datum/game_preference_toggle/presence/show_advanced_who)) if(isobserver(C.mob)) entry += " - Observing" diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index c1491171b5c..2d578a59ddf 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -11,13 +11,11 @@ if(holder && (R_ADMIN & holder.rights || R_MOD & holder.rights)) for(var/client/C in GLOB.clients) - var/entry = "\t[C.key]" + var/entry = "\t[C.get_revealed_key()]" if(!C.initialized) entry += "[C.ckey] - Uninitialized" Lines += entry continue - if(C.holder && C.holder.fakekey) - entry += " (as [C.holder.fakekey])" if(!C.initialized) entry += " - [SPAN_BOLDANNOUNCE("UNINITIALIZED!")]" continue @@ -64,10 +62,7 @@ Lines += entry else for(var/client/C in GLOB.clients) - if(C.holder && C.holder.fakekey) - Lines += C.holder.fakekey - else - Lines += C.key + Lines += (C == src)? C.get_revealed_key() : C.get_public_key() for(var/line in sortList(Lines)) msg += "[line]\n" @@ -86,13 +81,10 @@ if(!C.initialized) continue - if(C.holder.fakekey && !((R_ADMIN|R_MOD) & holder.rights)) + if(C.is_under_stealthmin() && !((R_ADMIN|R_MOD) & holder.rights)) continue - msg += "\t[C] is a [C.holder.rank]" - - if(C.holder.fakekey) - msg += " (as [C.holder.fakekey])" + msg += "\t[C.get_revealed_key()] is a [C.holder.rank]" if(isobserver(C.mob)) msg += " - Observing" @@ -113,7 +105,7 @@ for(var/client/C in GLOB.admins) if(!C.initialized) continue - if(C.holder.fakekey) + if(C.is_under_stealthmin()) continue // hidden msg += "\t[C] is a [C.holder.rank]" num_admins_online++ diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 8253f8e3ddf..ba9fde122e5 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -653,7 +653,7 @@ var/global/floorIsLava = 0 if(!check_rights(R_SERVER,0)) message = sanitize(message, 500, extra = 0) message = replacetext(message, "\n", "
") // required since we're putting it in a

tag - to_chat(world, "[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:

[message]

") + to_chat(world, "[usr.client.is_under_stealthmin() ? "Administrator" : usr.key] Announces:

[message]

") log_admin("Announce: [key_name(usr)] : [message]") feedback_add_details("admin_verb","A") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 363d9c100b0..533e46e0aea 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -778,6 +778,8 @@ var/list/admin_verbs_event_manager = list( message_admins("[src] deadmined themself.", 1) deadmin() to_chat(src, "You are now a normal player.") + if(deadmin_holder?.fakekey) + to_chat(src, SPAN_RED(SPAN_BIG(SPAN_ANNOUNCE("Your ckey is still obfuscated as '[deadmin_holder.fakekey]' due to de-adminning while stealthed.")))) add_verb(src, /client/proc/readmin_self) feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 57ac0ef0e9f..be83c2f246b 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -7,7 +7,9 @@ GLOBAL_PROTECT(href_token) var/rank = "Temporary Admin" var/client/owner = null var/rights = 0 - var/fakekey = null + // todo: rework + /// If set, we are under stealth-mode with this as our public ckey. + var/fakekey = null var/datum/marked_datum diff --git a/code/modules/admin/verbs/antag-ooc.dm b/code/modules/admin/verbs/antag-ooc.dm index 42ddff81155..ad727810c65 100644 --- a/code/modules/admin/verbs/antag-ooc.dm +++ b/code/modules/admin/verbs/antag-ooc.dm @@ -21,10 +21,7 @@ return // Name shown to admins. - var/display_name = src.key - if(holder) - if(holder.fakekey) - display_name = usr.client.holder.fakekey + var/display_name = get_public_key() // Name shown to other players. Admins whom are not also antags have their rank displayed. var/player_display = (is_admin && !is_antag) ? "[display_name]([usr.client.holder.rank])" : display_name diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 170b05efba8..3b961cd99b5 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -26,13 +26,10 @@ GLOBAL_LIST_INIT(stealthmin_nicknames, world.file2list("[global.config.directory return var/key - if(holder.fakekey) - if(get_preference_toggle(/datum/game_preference_toggle/admin/obfuscate_stealth_dsay)) - key = pick(GLOB.stealthmin_nicknames) - else - key = holder.fakekey + if(is_under_stealthmin() && get_preference_toggle(/datum/game_preference_toggle/admin/obfuscate_stealth_dsay)) + key = pick(GLOB.stealthmin_nicknames) else - key = src.key + key = get_public_key() msg = emoji_parse(msg) diff --git a/code/modules/admin/verbs/server/admin_reboot.dm b/code/modules/admin/verbs/server/admin_reboot.dm index bc16edf05c8..586c312be77 100644 --- a/code/modules/admin/verbs/server/admin_reboot.dm +++ b/code/modules/admin/verbs/server/admin_reboot.dm @@ -17,7 +17,7 @@ var/result = input(usr, "Select reboot method", "World Reboot", options[1]) as null|anything in options if(result) // SSblackbox.record_feedback("tally", "admin_verb", 1, "Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - var/init_by = "Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]." + var/init_by = "Initiated by [usr.key]." switch(result) if("Regular Restart") if(!(isnull(usr.client.address) || (usr.client.address in localhost_addresses))) diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index e837a16845e..9917921e1d8 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -532,7 +532,7 @@ return message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a
VV window") log_admin("Admin [key_name(usr)] Showed [key_name(C)] a VV window of a [src]") - to_chat(C, "[holder.fakekey ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") + to_chat(C, "[is_under_stealthmin() ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") C.debug_variables(thing) if(href_list["datumrefresh"]) diff --git a/code/modules/admin/view_variables/topic_basic.dm b/code/modules/admin/view_variables/topic_basic.dm index e1ffc1cfa60..98a5b3f999c 100644 --- a/code/modules/admin/view_variables/topic_basic.dm +++ b/code/modules/admin/view_variables/topic_basic.dm @@ -38,7 +38,7 @@ return message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window") log_admin("Admin [key_name(usr)] Showed [key_name(C)] a VV window of a [target]") - to_chat(C, "[holder.fakekey ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") + to_chat(C, "[is_under_stealthmin() ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") C.debug_variables(target) if(check_rights(R_DEBUG)) if(href_list[VV_HK_DELETE]) diff --git a/code/modules/client/client-admin.dm b/code/modules/client/client-admin.dm new file mode 100644 index 00000000000..ac5d759e3e8 --- /dev/null +++ b/code/modules/client/client-admin.dm @@ -0,0 +1,25 @@ +//* This file is explicitly licensed under the MIT license. *// +//* Copyright (c) 2024 silicons *// + +//* Stealthmin *// + +/** + * get effective ckey for render, respecting stealth keys + */ +/client/proc/get_public_key() + return holder?.fakekey || deadmin_holder?.fakekey || key + +/** + * gets effective ckey & stealth key for render + */ +/client/proc/get_revealed_key() + if(!(holder?.fakekey || deadmin_holder?.fakekey)) + return key + var/fake_ckey = holder?.fakekey || deadmin_holder?.fakekey || "INVALID-KEY" + return "[fake_ckey]/([key])" + +/** + * should we be under stealthmin + */ +/client/proc/is_under_stealthmin() + return !!(holder?.fakekey || deadmin_holder?.fakekey) diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 2dc29bc7fcf..b4dde9fa9bc 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -129,7 +129,7 @@ return var/ooc_style = "everyone" - if(holder && !holder.fakekey) + if(holder && !is_under_stealthmin()) ooc_style = "elevated" if(holder.rights & R_EVENT) ooc_style = "event_manager" @@ -149,13 +149,11 @@ if(target.get_preference_toggle(/datum/game_preference_toggle/chat/ooc)) if(target.is_key_ignored(key)) // If we're ignored by this person, then do nothing. continue - var/display_name = src.key - if(holder) - if(holder.fakekey) - if(target.holder) - display_name = "[holder.fakekey]/([src.key])" - else - display_name = holder.fakekey + var/display_name + if(target.holder || target == src) + display_name = get_revealed_key() + else + display_name = get_public_key() if(effective_color) // keeping this for the badmins to_chat(target, "" + "OOC: " + "[display_name]: [msg]") else @@ -224,9 +222,7 @@ var/list/receivers = list() //Clients, not mobs. var/list/r_receivers = list() - var/display_name = key - if(holder && holder.fakekey) - display_name = holder.fakekey + var/display_name = get_public_key() if(mob.stat != DEAD) display_name = mob.name // Resleeving shenanigan prevention. diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index a5b01d56b09..47ea91b2463 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -285,7 +285,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) var/keyname if(subject && subject.client) var/client/C = subject.client - keyname = (C.holder && C.holder.fakekey) ? C.holder.fakekey : C.key + keyname = C.get_public_key() if(C.mob) //Most of the time this is the observer/dead mob; we can totally use him if there is no better name var/mindname var/realname = C.mob.real_name @@ -363,7 +363,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) C = M.original.client if(C) - if(!isnull(C.holder?.fakekey) || !C.get_preference_toggle(/datum/game_preference_toggle/presence/announce_ghost_joinleave)) + if(C.is_under_stealthmin() || !C.get_preference_toggle(/datum/game_preference_toggle/presence/announce_ghost_joinleave)) return var/name if(C.mob) @@ -376,7 +376,7 @@ var/list/intents = list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM) else name = M.real_name if(!name) - name = (C.holder && C.holder.fakekey) ? C.holder.fakekey : C.key + name = C.get_public_key() if(joined_ghosts) say_dead_direct("The ghost of [name] now [pick("skulks","lurks","prowls","creeps","stalks")] among [pick("the dead","the spirits","the graveyard","the deceased","us")]. [message]") else