From 048316704730ea280f1a44c758c30fe1cee637c5 Mon Sep 17 00:00:00 2001 From: Superlagg Date: Sat, 20 Apr 2024 19:13:35 -0700 Subject: [PATCH 1/4] easier than discord integration --- AAADevTool/AAA_DEVELOPMENT_CONFIG.json | 2 +- code/__DEFINES/voreconstants.dm | 2 + code/__HELPERS/unsorted.dm | 29 +- code/_onclick/hud/_defines.dm | 4 +- code/controllers/subsystem/chat.dm | 198 +++++++- code/controllers/subsystem/prefbreak.dm | 8 + code/datums/components/storage/storage.dm | 3 +- code/datums/elements/flavor_text.dm | 24 +- code/modules/admin/admin.dm | 8 +- code/modules/admin/admin_verbs.dm | 11 + code/modules/client/preferences.dm | 8 + code/modules/client/preferences_savefile.dm | 15 +- icons/mob/screen_gen.dmi | Bin 144674 -> 144788 bytes .../controllers/subsystem/interactions.dm | 3 + .../client/verbs/character_directory.dm | 98 ++-- sound/effects/direct_message_recieved.ogg | Bin 0 -> 14647 bytes sound/effects/direct_message_setn.ogg | Bin 0 -> 14797 bytes .../tgui-panel/styles/goon/chat-dark.scss | 2 +- .../tgui-panel/styles/goon/chat-light.scss | 2 +- .../tgui/interfaces/CharacterDirectory.js | 436 ++++++++++++------ .../tgui/interfaces/CharacterInspection.js | 328 +++++++++++++ 21 files changed, 999 insertions(+), 182 deletions(-) create mode 100644 sound/effects/direct_message_recieved.ogg create mode 100644 sound/effects/direct_message_setn.ogg create mode 100644 tgui/packages/tgui/interfaces/CharacterInspection.js diff --git a/AAADevTool/AAA_DEVELOPMENT_CONFIG.json b/AAADevTool/AAA_DEVELOPMENT_CONFIG.json index ed0b9849218..81fa68cf739 100644 --- a/AAADevTool/AAA_DEVELOPMENT_CONFIG.json +++ b/AAADevTool/AAA_DEVELOPMENT_CONFIG.json @@ -1,3 +1,3 @@ { - "sanic speed" : false + "sanic speed" : true } diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm index a89f81f757a..43f71a88590 100644 --- a/code/__DEFINES/voreconstants.dm +++ b/code/__DEFINES/voreconstants.dm @@ -305,3 +305,5 @@ GLOBAL_LIST_INIT(prey_release_sounds, list( #define RADIOPREF_HEAR_RADIO_BLURBLES "hear_staticky_chittering" #define RADIOPREF_HEAR_RADIO_STATIC "hear_staticky_clicks" + +#define ADMIN_CHAT_FILTER_DMS "ADMIN_CHAT_FILTER_DMS" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index f60fe43311e..7798b00b22a 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1199,7 +1199,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) /mob/dview/Destroy(force = FALSE) if(!ready_to_die) - stack_trace("ALRIGHT WHICH FUCKER TRIED TO DELETE *MY* DVIEW?") + stack_trace("ALRIGHT WHICH frickER TRIED TO DELETE *MY* DVIEW?") if (!force) return QDEL_HINT_LETMELIVE @@ -1707,6 +1707,31 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) if(clint) return clint +/// Takes in a client, mob, ckey, quid, or even prefs, and returns a mob +/proc/extract_mob(something) + if(isclient(something)) + var/client/clint = something + return clint.mob + if(ismob(something)) + return something + if(istext(something)) + var/client/C = LAZYACCESS(GLOB.directory, something) + if(C) + return C.mob + var/mob/critter = SSeconomy.quid2mob(something) + if(critter) + return critter + if(istype(something, /datum/preferences)) + var/datum/preferences/P = something + return P.parent.mob + +/// takes in something that may have preferences, and returns their quid, wot wot +/proc/extract_quid(something) + var/datum/preferences/P = extract_prefs(something) + if(!P) + return + return P.quester_uid + /// Takes in a client, mob, or ckey, and returns the ckey /proc/get_ckey(clientthing) var/client/clint @@ -1799,7 +1824,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) var/index = GaussianReacharound(mean, stddev, min, max) return index -/// takes in fuckin anything and outputs if its a player +/// takes in frickin anything and outputs if its a player /proc/isplayer(imput) if(istext(imput)) return !!LAZYACCESS(GLOB.directory, imput) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 56878471ad2..bf3bfb065b4 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -85,7 +85,7 @@ #define ui_acti "EAST-3:24,SOUTH:5" #define ui_zonesel "EAST-1:28,SOUTH:5" #define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) -#define ui_crafting "EAST-1:27,SOUTH+3:5" +#define ui_crafting "EAST-4:24,SOUTH+1:6" #define ui_building "EAST-1:27,SOUTH+2:7" #define ui_language_menu "EAST-1:27,SOUTH+2:22" #define ui_wield "EAST-1:10,SOUTH+1:23" @@ -181,6 +181,6 @@ #define ui_resistdelay "EAST-3:24,SOUTH+1:4" #define ui_combat_toggle "EAST-4:22,SOUTH:5" -#define ui_boxcraft "EAST-4:22,SOUTH+1:6" +#define ui_boxcraft "EAST-4:24,SOUTH+1:6" #define ui_boxarea "EAST-4:6,SOUTH+1:6" #define ui_boxlang "EAST-5:22,SOUTH+1:6" diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm index d482c6a253d..60f975ac79d 100644 --- a/code/controllers/subsystem/chat.dm +++ b/code/controllers/subsystem/chat.dm @@ -23,6 +23,9 @@ SUBSYSTEM_DEF(chat) var/flirt_debug = TRUE var/debug_block_radio_blurbles = FALSE + /// Format: list("quid" = /datum/character_inspection) + var/list/inspectors = list() + /// list of flirt ckey things so that we can store their target or something /// format: list("flirterckey" = "targetckey") var/list/active_flirters = list() @@ -88,11 +91,15 @@ SUBSYSTEM_DEF(chat) /datum/controller/subsystem/chat/fire() for(var/key in payload_by_client) var/client/client = key - var/payload = payload_by_client[key] + var/list/payload = payload_by_client[key] payload_by_client -= key if(client) - if(payload["prefCheck"] && CHECK_PREFS(client, payload["prefCheck"])) - continue // we dont want to see it + // for(var/pl_badwater in 1 to LAZYLEN(payload)) + // // Check if we should block this message + // var/list/control_point = LAZYACCESS(payload, pl_badwater) + // if(control_point["prefCheck"] && !CHECK_PREFS(client, control_point["prefCheck"])) + // payload.Cut(pl_badwater, pl_badwater-1) // Failmate + // continue // we dont want to see it // Send to tgchat client.tgui_panel?.window.send_message("chat/message", payload) // Send to old chat @@ -106,10 +113,14 @@ SUBSYSTEM_DEF(chat) for(var/_target in target) var/client/client = CLIENT_FROM_VAR(_target) if(client) + if(message["prefCheck"] && !CHECK_PREFS(client, message["prefCheck"])) + continue LAZYADD(payload_by_client[client], list(message)) return var/client/client = CLIENT_FROM_VAR(target) if(client) + if(message["prefCheck"] && !CHECK_PREFS(client, message["prefCheck"])) + return LAZYADD(payload_by_client[client], list(message)) /datum/controller/subsystem/chat/proc/build_flirt_datums() @@ -270,6 +281,89 @@ SUBSYSTEM_DEF(chat) /datum/controller/subsystem/chat/ui_state(mob/user) return GLOB.always_state +/datum/controller/subsystem/chat/proc/start_page(mob/sender, mob/reciever) + if(!sender || !reciever) + return + sender = extract_mob(sender) + if(!sender) + return + reciever = extract_mob(reciever) + if(!reciever) + return + if(is_blocked(sender, reciever)) + to_chat(sender, span_warning("Module failed to load.")) + return + var/theirname = name_or_shark(reciever) || "some jerk" // stop. naming. your. ckeys. after. your characcteres!!!!!!!!!!!!!!!!!! + var/mesage = input( + sender, + "Enter your message to [theirname]. This will send a direct message to them, which they can reply to! Be sure to respect their OOC preferences, don't be a creep (unless they like it), and have fun!", + "Direct OOC Message", + "" + ) as message|null + if(!mesage) + return + var/myname = name_or_shark(sender) || "some jerk" + var/payload2them = {"From [myname]: [mesage]
"} + payload2them = span_private(payload2them) + to_chat(reciever, span_private("
You have a new message from [name_or_shark(sender) || "Some jerk"]!")) + to_chat(reciever, payload2them) + var/payload2me = {"To [theirname]: [mesage]
"} + payload2me = span_private(payload2me) + to_chat(sender, span_private("
Your message to [theirname] has been sent!")) + to_chat(sender, payload2me) + sender.playsound_local(sender, 'sound/effects/direct_message_setn.ogg', 75, FALSE) + reciever.playsound_local(reciever, 'sound/effects/direct_message_recieved.ogg', 75, FALSE) + log_ooc("[sender.real_name] ([sender.ckey]) -> [reciever.real_name] ([reciever.ckey]): [mesage]") + message_admins("[ADMIN_TPMONTY(sender)] -DM-> [ADMIN_TPMONTY(reciever)]: [mesage]", ADMIN_CHAT_FILTER_DMS) + +/datum/controller/subsystem/chat/Topic(href, list/href_list) + . = ..() + if(href_list["DM"]) + start_page(href_list["sender_quid"], href_list["reciever_quid"]) + +/datum/controller/subsystem/chat/proc/is_blocked(mob/sender, mob/reciever) + return FALSE // todo: this + +/datum/controller/subsystem/chat/proc/name_or_shark(mob/they) + if(!istype(they)) + return "Nobody" + if(check_rights(R_ADMIN, FALSE)) + return they.real_name // we're an admin, we can see their name + if(ckey(they.real_name) == ckey(they.ckey) || ckey(they.name) == ckey(they.ckey)) + if(strings("data/super_special_ultra_instinct.json", "[ckey(they.name)]", TRUE, TRUE)) + return they.name + if(strings("data/super_special_ultra_instinct.json", "[ckey(they.real_name)]", TRUE, TRUE)) + return they.real_name + if(they.client) + return they.client.prefs.my_shark + else + return "Some jerk" + return they.name + +/datum/controller/subsystem/chat/proc/inspect_character(mob/viewer, list/payload) + if(!viewer) + return + viewer = extract_mob(viewer) + if(!viewer || !viewer.client) + return + var/datum/character_inspection/chai = LAZYACCESS(inspectors, viewer.client.prefs.quester_uid) + if(!chai) + chai = new() + inspectors[viewer.client.prefs.quester_uid] = chai + chai.update(viewer, payload) + chai.show_to(viewer) + return TRUE + /datum/controller/subsystem/chat/proc/flirt_debug_toggle() TOGGLE_VAR(flirt_debug) build_flirt_datums() @@ -569,4 +663,102 @@ SUBSYSTEM_DEF(chat) message = replacetext(message, "THEIR", emoter.p_their()) return message +////////////// so those datums were awful, maybe this one will be better +/datum/character_inspection // DROP YOUR PANTS, ITS CHARACTER INSPECTION DAY + var/gender + var/species + var/vorepref + var/erppref + var/kisspref + var/flink + var/ad + var/notes + var/flavor + var/their_quid + var/looking_for_friends + var/dms_r_open + var/name + + /// update the character inspection with new data +/datum/character_inspection/proc/update(mob/viewer, list/payload) + if(!payload) + return + gender = payload["gender"] + species = payload["species"] + vorepref = payload["tag"] + erppref = payload["erptag"] + kisspref = payload["whokisser"] + flink = payload["flist"] + ad = payload["character_ad"] + notes = payload["ooc_notes"] + flavor = payload["flavor_text"] + their_quid = payload["quid"] + looking_for_friends = payload["looking_for_friends"] + dms_r_open = payload["dms_r_open"] + name = payload["name"] + if(viewer && viewer.client) + show_to(viewer) + + /// show the character inspection to the viewer +/datum/character_inspection/proc/show_to(mob/viewer) + ui_interact(viewer) + +/datum/character_inspection/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CharacterInspection") + ui.open() + ui.set_autoupdate(FALSE) + +/datum/character_inspection/ui_static_data(mob/user) + var/list/static_data = list() + static_data["gender"] = gender + static_data["species"] = species + static_data["vorepref"] = vorepref + static_data["erppref"] = erppref + static_data["kisspref"] = kisspref + static_data["flink"] = flink + static_data["ad"] = html_decode(ad) + static_data["notes"] = html_decode(notes) + static_data["flavor"] = html_decode(flavor) + static_data["their_quid"] = their_quid + static_data["name"] = name + static_data["looking_for_friends"] = looking_for_friends + static_data["dms_r_open"] = dms_r_open + if(user && user.client) // dont know why they wouldnt, but whatever + static_data["viewer_quid"] = user.client.prefs.quester_uid + return static_data + +/datum/character_inspection/ui_act(action, list/params) + . = ..() + if(!params["viewer_quid"]) + return + var/mob/viower = extract_mob(params["viewer_quid"]) + if(!viower) // warning: sum of dis chapta is extremely scray + return // viower excretion advisd + var/mob/viowed = extract_mob(params["their_quid"]) + if(!viowed) + return + if(action == "pager") + SSchat.start_page(viower, viowed) + if(action == "view_flist") + if(viowed) + to_chat(viower, span_notice("Opening F-list...")) + SEND_SIGNAL(viowed, COMSIG_FLIST, viower) + return TRUE + else + to_chat(viower, span_alert("Couldn't find that character's F-list!")) + return TRUE + +/datum/character_inspection/ui_state(mob/user) + return GLOB.always_state + +/mob/verb/direct_message(mob/A as mob in view(10, src)) + set name = "Direct Message" + set category = "OOC" + set desc = "Send a direct message to this character." + set popup_menu = TRUE + + SSchat.start_page(src, A) + diff --git a/code/controllers/subsystem/prefbreak.dm b/code/controllers/subsystem/prefbreak.dm index 1f785a2bbe0..b56392bda43 100644 --- a/code/controllers/subsystem/prefbreak.dm +++ b/code/controllers/subsystem/prefbreak.dm @@ -244,6 +244,14 @@ SUBSYSTEM_DEF(prefbreak) // ALL ABOARD THE S.S. PREFBREAK OFF TO **** YOUR ***** PREFBROKEN return CHECK_BITFIELD(consumer.chat_toggles, CHAT_HEAR_RADIOSTATIC) // kinda vital here +/// im an admin and i dont want to hear about how you want to destroy someone's bussy +/datum/prefcheck/admin_wire_tap + index = ADMIN_CHAT_FILTER_DMS + +/datum/prefcheck/admin_wire_tap/allowed(datum/preferences/consumer) + PREFBROKEN + return consumer.admin_wire_tap // kinda vital here + diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index a32785d1c79..3cf8d81d82c 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -66,6 +66,7 @@ var/list/ui_item_blocks var/current_maxscreensize + var/max_depth = STORAGE_VIEW_DEPTH var/allow_big_nesting = FALSE //allow storage objects of the same or greater size. @@ -336,7 +337,7 @@ /datum/component/storage/proc/check_views() for(var/mob/M in can_see_contents()) - if(!isobserver(M) && !M.can_reach(parent, STORAGE_VIEW_DEPTH)) + if(!isobserver(M) && !M.can_reach(parent, max_depth)) close(M) /datum/component/storage/proc/emp_act(datum/source, severity) diff --git a/code/datums/elements/flavor_text.dm b/code/datums/elements/flavor_text.dm index f1fe16d77a6..1a2f964b429 100644 --- a/code/datums/elements/flavor_text.dm +++ b/code/datums/elements/flavor_text.dm @@ -14,6 +14,7 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code var/save_key /// Do not attempt to render a preview on examine. If this is on, it will display as \[flavor_name\] var/examine_no_preview = FALSE + var/why_does_it_do_this = 0 /datum/element/flavor_text/Attach(datum/target, text = "", _name = "Flavor Text", _addendum, _max_len = MAX_FLAVOR_LEN, _always_show = FALSE, _edit = TRUE, _save_key, _examine_no_preview = FALSE, _attach_internet_link = FALSE) . = ..() @@ -110,11 +111,26 @@ GLOBAL_LIST_EMPTY(mobs_with_editable_flavor_text) //et tu, hacky code return TRUE /datum/element/flavor_text/proc/actually_show_flist(mob/living/carbon/human/H, mob/reader) - if(alert(reader, "This will open the following link '[H.dna.features["flist"]]' in your browser. Are you sure?","Open external link","Yes","No") =="Yes") - reader << link(H.dna.features["flist"]) - return TRUE - else + if(!H.dna.features["flist"]) + to_chat(reader, span_alert("They don't have an F-List link!")) return + to_chat(reader, span_green("The fancy F-List dialog box is broken :( so just imagine there's a cool window here with a button!")) + to_chat(reader, span_green("Click here for F-List: [H.dna.features["flist"]]")) + + // var/show_it = alert( + // reader, + // "This will open the following link '[H.dna.features["flist"]]' in your browser. Are you sure?", + // "Open external link", + // "Yes", + // "No" + // ) + // if(show_it == "Yes") + // if(prob(5)) + // to_chat(reader, span_alert("So be it.")) + // reader << link(H.dna.features["flist"]) + // return TRUE + // else + // return /mob/proc/manage_flavor_tests() set name = "Manage Flavor Texts" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 67f64754799..a26a6de02ba 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -6,13 +6,13 @@ message_admins(finalMessage) log_world(finalMessage) -/proc/message_admins(msg) +/proc/message_admins(msg, pref) msg = "ADMIN LOG: [msg]" - to_chat(GLOB.admins, msg, confidential = TRUE) + to_chat(GLOB.admins, msg, confidential = TRUE, pref_check = pref) -/proc/relay_msg_admins(msg) +/proc/relay_msg_admins(msg, pref) msg = "RELAY: [msg]" - to_chat(GLOB.admins, msg, confidential = TRUE) + to_chat(GLOB.admins, msg, confidential = TRUE, pref_check = pref) ///////////////////////////////////////////////////////////////////////////////////////////////Panels diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index aaac22837c0..1bfebaf586d 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -14,6 +14,7 @@ GLOBAL_PROTECT(admin_verbs_default) /client/proc/toggleadminhelpsound, /client/proc/debugstatpanel, /client/proc/ignore_as_a_ghost, + /client/proc/toggle_admin_wire_tap, /client/proc/toggle_seeing_ghosts, /* Toggles whether or not the player can see ghosts */ /client/proc/RemoteLOOC, /*Fuck you I'm a PascaleCase enjoyer when it comes to functions. Fuck you nerds for using your shitty ass underscores like you know what the fuck you're reading why add an extra character and waste a couple milimeters of eye movement for me to read your entire proc name like jesus fucking christ bro. Just literally use PascalCase it looks so much neater, it's modern, industry professionals are taught to use it, C# coding standards state this, C++ coding standards, Unreal Engine developers do this, and so do Unity professionals. Like bruh please. Join me in the revolution to do PascalCase. */ // Welcome to byond~ src.grab_antlers_and_grind(deer_boi) ) @@ -688,6 +689,16 @@ GLOBAL_PROTECT(admin_verbs_hideable) P.save_preferences() to_chat(usr, "Preferences saved.") +/client/proc/toggle_admin_wire_tap() + set category = "OOC" + set name = "Ignore Others' DMs" + set desc = "Blocks seeing DMs from players to players who arent you." + + TOGGLE_VAR(prefs.admin_wire_tap) + prefs.save_preferences() + to_chat(src, span_abductor("You will [prefs.admin_wire_tap ? "now" : "no longer"] eavesdrop on other players' DMs.")) + to_chat(src, "Preferences saved.") + /client/proc/give_spell(mob/T in GLOB.mob_list) set category = "Admin.Fun" set name = "Give Spell" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 95a80b91c5b..f09407cc7f9 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -83,6 +83,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/pda_color = "#808000" var/pda_skin = PDA_SKIN_CLASSIC + var/my_shark = "Bingus Whale" + var/genital_whitelist = "" var/whoflags = DEFAULT_WHO_FLAGS var/lockouts = NONE @@ -146,6 +148,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/kisser = KISS_DEFAULT // Kiss this ( Y ) /// which quester UID we're using var/quester_uid + var/dm_open = TRUE + var/needs_a_friend = FALSE // for the quest + var/list/blocked_from_dms = list() // list of quids /// rough approximations of the character's finished quests var/list/saved_finished_quests = list() /// tight list of the character's active quests @@ -154,6 +159,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/datum/species/pref_species = new /datum/species/mammal() //Mutant race /// If our species supports it, this will override our appearance. See species.dm. "Default" will just use the base icon var/alt_appearance = "Default" + var/admin_wire_tap = TRUE var/list/features = list( "mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", @@ -397,6 +403,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) /datum/preferences/New(client/C) parent = C + if(LAZYLEN(GLOB.cow_names)) + my_shark = safepick(GLOB.cow_names + GLOB.carp_names + GLOB.megacarp_last_names) spawn(0) if(C) chatbgcolor = winget(C, "statbrowser", "background-color") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 493483f41cf..0b5060ba5f6 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -319,6 +319,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["genital_whitelist"] >> genital_whitelist S["lockouts"] >> lockouts // my bans! + S["admin_wire_tap"] >> admin_wire_tap // my bans! chat_toggles |= CHAT_LOOC // the LOOC doesn't stop @@ -377,6 +378,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car key_bindings = sanitize_islist(key_bindings, list()) modless_key_bindings = sanitize_islist(modless_key_bindings, list()) aghost_squelches = sanitize_islist(aghost_squelches, list()) + admin_wire_tap = sanitize_integer(admin_wire_tap, TRUE) verify_keybindings_valid() // one of these days this will runtime and you'll be glad that i put it in a different proc so no one gets their saves wiped @@ -490,10 +492,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["lockouts"], lockouts) WRITE_FILE(S["aghost_squelches"], aghost_squelches) WRITE_FILE(S["genital_whitelist"], genital_whitelist) - - //permanent tattoos - WRITE_FILE(S["permanent_tattoos"], permanent_tattoos) - return 1 + WRITE_FILE(S["admin_wire_tap"], admin_wire_tap) /datum/preferences/proc/load_character(slot) if(!path) @@ -940,9 +939,12 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //Permanent Tattoos S["permanent_tattoos"] >> permanent_tattoos + S["dm_open"] >> dm_open + S["needs_a_friend"] >> needs_a_friend //Permanent Tattoos faved_interactions = safe_json_decode(S["faved_interactions"]) + blocked_from_dms = safe_json_decode(S["blocked_from_dms"]) /// Test if they have a saved quid, if not, generate one. var/saved_quid @@ -970,6 +972,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car faved_interactions = sanitize_islist(faved_interactions, list()) saved_finished_quests = sanitize_islist(saved_finished_quests, list()) saved_active_quests = sanitize_islist(saved_active_quests, list()) + dm_open = sanitize_integer(dm_open, TRUE) + needs_a_friend = sanitize_integer(needs_a_friend, TRUE) //Sanitize @@ -1408,6 +1412,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_flist"], features["flist"]) WRITE_FILE(S["feature_taste"], features["taste"]) + WRITE_FILE(S["dm_open"], dm_open) + WRITE_FILE(S["needs_a_friend"], needs_a_friend) //special WRITE_FILE(S["special_s"] ,special_s) @@ -1556,6 +1562,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //permanent tattoos WRITE_FILE(S["permanent_tattoos"], permanent_tattoos) + WRITE_FILE(S["blocked_from_dms"], safe_json_encode(blocked_from_dms)) //permanent tattoos WRITE_FILE(S["faved_interactions"], safe_json_encode(faved_interactions)) if(LAZYLEN(saved_finished_quests)) diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index d042eb10b46553362d23ba173fc02154a4d681ac..6d137f76e0ed6ef6aec74aa569b61b0b20c2e90f 100644 GIT binary patch delta 14098 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 ZWDeadJZHow2zcGmWiq;1a>M@F{|7%eVz2-J delta 13983 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 diff --git a/modular_sand/code/controllers/subsystem/interactions.dm b/modular_sand/code/controllers/subsystem/interactions.dm index 26245a1b918..bdc2ff3049b 100644 --- a/modular_sand/code/controllers/subsystem/interactions.dm +++ b/modular_sand/code/controllers/subsystem/interactions.dm @@ -155,6 +155,7 @@ SUBSYSTEM_DEF(interactions) to_chat(target, span_greentext("You have given [requesting] consent to do lewd things with you!")) if(requesting) to_chat(requesting, span_greentext("[target] has given you consent to do lewd things with them!")) + message_admins("[ADMIN_TPMONTY(requesting)] requested consent from [ADMIN_TPMONTY(target)]. [target] said yes!") /// consenting! target declined consent /datum/controller/subsystem/interactions/proc/decline_consent(mob/decliner, mob/denied, ahelp) @@ -165,6 +166,7 @@ SUBSYSTEM_DEF(interactions) to_chat(decliner, span_userdanger("You have declined [denied]'s request to do lewd things with you!")) log_ooc("[key_name_admin(decliner)] has declined [key_name_admin(denied)]'s request to do lewd things with them!") if(!ahelp) + message_admins("[ADMIN_TPMONTY(decliner)] declined consent from [ADMIN_TPMONTY(denied)].") return log_ooc("[key_name_admin(decliner)] has also requested an admin regarding [key_name_admin(denied)]'s request to do lewd things with them!") to_chat(decliner, span_userdanger("An admin will be with you shortly!!!")) @@ -219,6 +221,7 @@ SUBSYSTEM_DEF(interactions) consents -= keyname to_chat(revoked, span_userdanger("[revoker] has revoked consent for you to do lewd things with them!")) to_chat(revoker, span_userdanger("You have revoked consent from [revoked] to do lewd things with you!")) + message_admins("[ADMIN_TPMONTY(revoker)] has revoked [ADMIN_TPMONTY(revoked)]'s consent to do lewd things with them. (Original approver: [original_approver])") log_ooc("[key_name_admin(revoker)] has revoked [key_name_admin(revoked)]'s consent to do lewd things with them! (Original approver: [key_name_admin(original_approver)])") if(ahelp) log_ooc("[key_name_admin(revoker)] has also requested an admin regarding [key_name_admin(revoked)]'s consent to do lewd things with them!") diff --git a/modular_splurt/code/datums/modules/client/verbs/character_directory.dm b/modular_splurt/code/datums/modules/client/verbs/character_directory.dm index 675c923a6f6..0cfc1b94846 100644 --- a/modular_splurt/code/datums/modules/client/verbs/character_directory.dm +++ b/modular_splurt/code/datums/modules/client/verbs/character_directory.dm @@ -35,38 +35,40 @@ GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP /datum/character_directory/ui_data(mob/user) . = ..() - var/list/data = . + var/list/data = list() + data["personalName"] = user.real_name if (user?.client?.prefs) data["personalVisibility"] = user.client.prefs.show_in_directory data["personalTag"] = user.client.prefs.directory_tag || "Unset" data["personalErpTag"] = user.client.prefs.directory_erptag || "Unset" var/adtext = user.client.prefs.directory_ad - if(LAZYLEN(adtext) > 85) - adtext = copytext(adtext, 1, 128) + "..." + if(LAZYLEN(adtext) > 256) + adtext = copytext(adtext, 1, 256) + "..." else if(!adtext) adtext = "Unset" data["personalAdvert"] = adtext - var/fucktext = user.client.prefs.features["flist"] - if(!fucktext) - fucktext = "Unset" - data["personalFlist"] = fucktext || "Unset" + var/fricktext = user.client.prefs.features["flist"] + if(!fricktext) + fricktext = "Unset" + data["personalFlist"] = fricktext || "Unset" data["prefsOnly"] = TRUE - + data["personalDMs"] = user.client.prefs.dm_open + data["personalQuid"] = user.client.prefs.quester_uid + data["personalLookingForFriends"] = user.client.prefs.needs_a_friend data["canOrbit"] = isobserver(user) - return data +// return data -/datum/character_directory/ui_static_data(mob/user) - . = ..() - var/list/data = . +// /datum/character_directory/ui_static_data(mob/user) +// . = ..() +// var/list/data = . var/list/directory_mobs = list() for(var/client/C in GLOB.clients) // Allow opt-out and filter players not in the game // if(!C.prefs.show_in_directory) // continue - // These are the three vars we're trying to find // The approach differs based on the mob the client is controlling var/ref = REF(C?.mob) @@ -82,7 +84,7 @@ GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP var/tag = "Unset" var/erptag = "Unset" var/character_ad = "Unset" - var/fucklist = "Unset" + var/fricklist = "Unset" tag = C.prefs.directory_tag || "Unset" erptag = C.prefs.directory_erptag || "Unset" character_ad = C.prefs.directory_ad @@ -117,7 +119,7 @@ GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP ooc_notes = C.prefs.features["ooc_notes"] flavor_text = C.prefs.features["flavor_text"] - fucklist = C.prefs.features["flist"] || FALSE + fricklist = C.prefs.features["flist"] || FALSE directory_mobs.Add(list(list( "name" = name, @@ -130,7 +132,10 @@ GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP "ref" = ref, "gender" = thegender, "whokisser" = whokisser, - "flist" = fucklist, + "flist" = fricklist, + "quid" = C.prefs.quester_uid, // love is a quest, and I'm on a quest for love + "dms_r_open" = C.prefs.dm_open, + "looking_for_friends" = C.prefs.needs_a_friend, ))) data["directory"] = directory_mobs @@ -166,11 +171,37 @@ GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP ghost.reset_perspective(null) return TRUE if("view_flist") - var/ref = params["ref"] - var/atom/movable/poi = (locate(ref) in GLOB.mob_list) || (locate(ref) in GLOB.poi_list) - if (poi == null) + var/mob/them = extract_mob(params["quid"]) + if(them) + to_chat(user, span_notice("Opening F-list...")) + SEND_SIGNAL(them, COMSIG_FLIST, user) + return TRUE + else + to_chat(user, span_alert("Couldn't find that character's F-list!")) return TRUE - return SEND_SIGNAL(poi, COMSIG_FLIST, user) + if("inspect") + var/list/payload = list() + payload["quid"] = params["quid"] + payload["my_quid"] = params["my_quid"] + payload["name"] = params["name"] + payload["species"] = params["species"] + payload["ooc_notes"] = params["ooc_notes"] + payload["tag"] = params["tag"] + payload["erptag"] = params["erptag"] + payload["character_ad"] = params["character_ad"] + payload["flavor_text"] = params["flavor_text"] + payload["ref"] = params["ref"] + payload["gender"] = params["gender"] + payload["whokisser"] = params["whokisser"] + payload["flist"] = params["flist"] + payload["quid"] = params["quid"] + payload["dms_r_open"] = params["dms_r_open"] + payload["looking_for_friends"] = params["looking_for_friends"] + SSchat.inspect_character(user, payload) + if("pager") + SSchat.start_page(user, params["quid"]) + if("setLookingForFriends") + TOGGLE_VAR(user.client.prefs.needs_a_friend) else return check_for_mind_or_prefs(user, action, params["overwrite_prefs"]) @@ -198,22 +229,35 @@ GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP var/visible = user.client.prefs.show_in_directory to_chat(user, "You are now [!visible ? "shown" : "not shown"] in the directory.") return set_for_mind_or_prefs(user, action, !visible) + if ("setDMs") + var/doom2 = user.client.prefs.dm_open + to_chat(user, "You are [!doom2 ? "now open for" : "no longer open for"] direct OOC messaging.") + return set_for_mind_or_prefs(user, action, !doom2) if ("editAd") var/current_ad = user.client.prefs.directory_ad - var/new_ad = stripped_multiline_input_or_reflect(user, "Change your character ad", "Character Ad", current_ad, MAX_FLAVOR_LEN) + var/new_ad = stripped_multiline_input_or_reflect(user, "Change your character ad. Most HTML is supported! =3", "Character Ad", current_ad, MAX_FLAVOR_LEN) if(isnull(new_ad)) to_chat(user, span_notice("Okay! Your ad has not been changed!")) return return set_for_mind_or_prefs(user, action, new_ad) if ("editFlist") var/current_flist = user.client.prefs.features["flist"] - var/new_flist = stripped_input(user, "Change your character flist", "Character Flist", current_flist, 256) // flist links are less than 256 characters, right? - if(isnull(new_flist)) + var/link = stripped_input( + user, + "Set always-visible F-list. Just copy and paste the link you want to use from the browser. Leave it blank to remove the previous link.", + "F-list", + current_flist, + 256 + ) + if(!length(link)) + set_for_mind_or_prefs(user, action, link) + to_chat(usr, span_alert("Removed the previous F-list link.")) + else if(findtext(link, "https://www.f-list.net")) //we want to avoid malicious links, so let's check if it's actually a valid link first + set_for_mind_or_prefs(user, action, link) + to_chat(usr, span_green("F-list link added!")) + if(isnull(link)) to_chat(user, span_notice("Okay! Your flist has not been changed!")) return - return set_for_mind_or_prefs(user, action, new_flist) - else - to_chat(user, span_warning("You can only make temporary changes while in game")) /datum/character_directory/proc/set_for_mind_or_prefs(mob/user, action, new_value) if(!user || !user.client) @@ -224,6 +268,8 @@ GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP switch(action) if ("setTag") P.directory_tag = new_value + if ("setDMs") + P.dm_open = new_value if ("setErpTag") P.directory_erptag = new_value if ("setVisible") diff --git a/sound/effects/direct_message_recieved.ogg b/sound/effects/direct_message_recieved.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0c2dc83bc20891a08e8bf0718b87f76ddc30d702 GIT binary patch literal 14647 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 literal 0 HcmV?d00001 diff --git a/sound/effects/direct_message_setn.ogg b/sound/effects/direct_message_setn.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2c150e2939b7f320361b310f5d3eabb38e9381ee GIT binary patch literal 14797 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 { const { act, data } = useBackend(context); const { + personalName, personalVisibility, personalTag, personalErpTag, prefsOnly, personalAdvert, personalFlist, + personalDMs, } = data; - const [overlay, setOverlay] = useLocalState(context, 'overlay', null); - const [overwritePrefs, setOverwritePrefs] = useLocalState(context, 'overwritePrefs', prefsOnly); + const [ + SelectedTab, + setSelectedTab, + ] = useLocalState(context, 'SelectedTab', 1); return ( - - - {(overlay && ) || ( - + + + +
- - Save to current preferences slot:  - - + ); +} + +// / The main window! either your characters or the available characters +const MainWindow = (props, context) => { // main screen turn on + const { act, data } = useBackend(context); + + const [ + SelectedTab, + setSelectedTab, + ] = useLocalState(context, 'SelectedTab', 1); + + + return ( + <> + {SelectedTab === 1 && ( + + )} + {SelectedTab === 2 && ( + + )} + {SelectedTab === 3 && ( + + )} + + ); +}; + +const SettingsControl = (props, context) => { + const { act, data } = useBackend(context); + const { + personalName, + personalVisibility, + personalTag, + personalErpTag, + prefsOnly, + personalAdvert, + personalFlist, + personalDMs, + } = data; + const [overwritePrefs, setOverwritePrefs] = useLocalState(context, 'overwritePrefs', prefsOnly); return (
setOverlay(null)} />}> -
- {overlay.gender} -
-
- {overlay.species} -
-
- {overlay.tag} -
-
- - {overlay.erptag} - -
-
- {overlay.whokisser} -
-
- {overlay.flist_link} -
-
- - {overlay.character_ad || 'Unset.'} - -
-
- - {overlay.ooc_notes || 'Unset.'} - -
-
- - {overlay.flavor_text || 'Unset.'} - -
+ title="Controls" + buttons={ + + {/* + Save to current preferences slot:  + +
+ ); +}; + +const ReadMe = (props, context) => { + const { act, data } = useBackend(context); + const { ReadmeText } = data; + + return ( +
+
); }; +const BottomToolbar = (props, context) => { + const { act, data } = useBackend(context); + const { personalLookingForFriends } = data; + + return ( + + + + + + +