diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_data.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_data.dm index 0b1514d4c04..d1ead35172a 100644 --- a/code/modules/modular_computers/file_system/programs/messenger/messenger_data.dm +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_data.dm @@ -133,13 +133,16 @@ GLOBAL_LIST_EMPTY_TYPED(pda_messengers, /datum/computer_file/program/messenger) var/everyone /// The station time at which this message was made. var/timestamp + /// Whether or not the message is hidden from ghostchat + var/subtle // BUBBER EDIT ADDITION - SUBTLE MESSAGES -/datum/pda_message/New(message, outgoing, timestamp, photo_name = null, everyone = FALSE) +/datum/pda_message/New(message, outgoing, timestamp, photo_name = null, everyone = FALSE, subtle = FALSE) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: /datum/pda_message/New(message, outgoing, timestamp, photo_name = null, everyone = FALSE) src.message = message src.outgoing = outgoing src.timestamp = timestamp src.photo_name = photo_name src.everyone = everyone + src.subtle = subtle // BUBBER EDIT ADDITION - SUBTLE MESSAGES /// Returns an associative list of the message's data, used for ui_data calls. /datum/pda_message/proc/get_ui_data(mob/user) @@ -149,4 +152,5 @@ GLOBAL_LIST_EMPTY_TYPED(pda_messengers, /datum/computer_file/program/messenger) data["photo_path"] = photo_name ? SSassets.transport.get_asset_url(photo_name) : null data["everyone"] = everyone data["timestamp"] = timestamp + data["subtle"] = subtle // BUBBER EDIT ADDITION - SUBTLE MESSAGES return data diff --git a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm index ae0dc9ea586..29528f415f1 100644 --- a/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm +++ b/code/modules/modular_computers/file_system/programs/messenger/messenger_program.dm @@ -294,7 +294,7 @@ return disk.send_virus(computer, target_messenger.computer, usr, params["message"]) - return send_message(usr, params["message"], list(target)) + return send_message(usr, params["message"], list(target), subtle = params["subtle"]) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: return send_message(usr, params["message"], list(target)) if("PDA_clearPhoto") selected_image = null @@ -391,7 +391,7 @@ ////////////////////// /// Brings up the quick reply prompt to send a message. -/datum/computer_file/program/messenger/proc/quick_reply_prompt(mob/living/user, datum/pda_chat/chat) +/datum/computer_file/program/messenger/proc/quick_reply_prompt(mob/living/user, datum/pda_chat/chat, subtle = FALSE) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: /datum/computer_file/program/messenger/proc/quick_reply_prompt(mob/living/user, datum/pda_chat/chat) if(!istype(chat)) return var/datum/computer_file/program/messenger/target = chat.recipient?.resolve() @@ -401,8 +401,8 @@ chat.can_reply = FALSE return var/target_name = target.computer.saved_identification - var/input_message = tgui_input_text(user, "Enter [mime_mode ? "emojis":"a message"]", "NT Messaging[target_name ? " ([target_name])" : ""]", encode = FALSE) - send_message(user, input_message, list(chat)) + var/input_message = tgui_input_text(user, "Enter [mime_mode ? "emojis":"a message"]. Start with # for subtle.", "NT Messaging[target_name ? " ([target_name])" : ""]", encode = FALSE) // BUBBER EDIT CHANGE - SUBTLE MESSAGES + send_message(user, input_message, list(chat), subtle = subtle) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: send_message(user, input_message, list(chat)) /// Helper proc that sends a message to everyone /datum/computer_file/program/messenger/proc/send_message_to_all(mob/living/user, message) @@ -471,7 +471,7 @@ return emoji_parse(message) /// Sends a message to targets via PDA. When sending to everyone, set `everyone` to true so the message is formatted accordingly -/datum/computer_file/program/messenger/proc/send_message(atom/source, message, list/targets, everyone = FALSE) +/datum/computer_file/program/messenger/proc/send_message(atom/source, message, list/targets, everyone = FALSE, subtle = FALSE) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: /datum/computer_file/program/messenger/proc/send_message(atom/source, message, list/targets, everyone = FALSE) var/mob/living/sender if(isliving(source)) sender = source @@ -479,6 +479,14 @@ if(!message) return FALSE + // BUBBER EDIT ADDITION BEGIN - SUBTLE MESSAGES + // If "subtle" it wont be sent to ghostchats. + // A message is "subtle" if it begins with "#", the below code also removes it from the sent message. + if(findtext(message,"#", 1) == TRUE) + subtle = TRUE + message = copytext(message, 2, 0) + // BUBBER EDIT ADDITION END - SUBTLE MESSAGES + // upgrade the image asset to a permanent key var/photo_asset_key = selected_image @@ -540,11 +548,11 @@ target_chats += target_chat target_messengers += target_messenger - if(!send_message_signal(source, message, target_messengers, photo_asset_key, everyone)) + if(!send_message_signal(source, message, target_messengers, photo_asset_key, everyone, FALSE, null, null, subtle)) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: if(!send_message_signal(source, message, target_messengers, photo_asset_key, everyone)) return FALSE // Log it in our logs - var/datum/pda_message/message_datum = new(message, TRUE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), photo_asset_key, everyone) + var/datum/pda_message/message_datum = new(message, TRUE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), photo_asset_key, everyone, subtle = subtle) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: var/datum/pda_message/message_datum = new(message, TRUE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), photo_asset_key, everyone) for(var/datum/pda_chat/target_chat as anything in target_chats) target_chat.add_message(message_datum, show_in_recents = !everyone) target_chat.unread_messages = 0 @@ -570,7 +578,7 @@ return send_message_signal(sender, message, targets, fake_photo, FALSE, TRUE, fake_name, fake_job) -/datum/computer_file/program/messenger/proc/send_message_signal(atom/source, message, list/datum/computer_file/program/messenger/targets, photo_path = null, everyone = FALSE, rigged = FALSE, fake_name = null, fake_job = null) +/datum/computer_file/program/messenger/proc/send_message_signal(atom/source, message, list/datum/computer_file/program/messenger/targets, photo_path = null, everyone = FALSE, rigged = FALSE, fake_name = null, fake_job = null, subtle = FALSE) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: /datum/computer_file/program/messenger/proc/send_message_signal(atom/source, message, list/datum/computer_file/program/messenger/targets, photo_path = null, everyone = FALSE, rigged = FALSE, fake_name = null, fake_job = null) var/mob/sender if(ismob(source)) sender = source @@ -606,6 +614,7 @@ "everyone" = everyone, "photo" = photo_path, "automated" = FALSE, + "subtle" = subtle, // BUBBER EDIT ADDITION - SUBTLE MESSAGES )) if(rigged) //Will skip the message server and go straight to the hub so it can't be cheesed by disabling the message server machine signal.data["fakename"] = fake_name @@ -633,17 +642,30 @@ shell_addendum = "[circuit.parent.get_creator()] " // Log in the talk log - source.log_talk(message, LOG_PDA, tag="[shell_addendum][rigged ? "Rigged" : ""] PDA: [computer.saved_identification] to [signal.format_target()]") + source.log_talk(message, subtle ? LOG_SUBTLER : LOG_PDA, tag="[shell_addendum][rigged ? "Rigged" : ""] PDA: [computer.saved_identification] to [signal.format_target()]") // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: source.log_talk(message, LOG_PDA, tag="[shell_addendum][rigged ? "Rigged" : ""] PDA: [computer.saved_identification] to [signal.format_target()]") if(rigged) log_bomber(sender, "sent a rigged PDA message (Name: [fake_name]. Job: [fake_job]) to [english_list(stringified_targets)] [!is_special_character(sender) ? "(SENT BY NON-ANTAG)" : ""]") + /** BUBBER EDIT CHANGE BEGIN - SUBTLE MESSAGES - Original: + * var/ghost_message = span_game_say("[span_name(signal.format_sender())] [rigged ? "(as [span_name(fake_name)]) Rigged " : ""]PDA Message --> [span_name("[signal.format_target()]")]: \"[signal.format_message()]\"") + * var/list/message_listeners = GLOB.dead_player_list + GLOB.current_observers_list + * for(var/mob/listener as anything in message_listeners) + * if(!(get_chat_toggles(listener) & CHAT_GHOSTPDA)) + * continue + * to_chat(listener, "[FOLLOW_LINK(listener, source)] [ghost_message]") + */ // Show it to ghosts - var/ghost_message = span_game_say("[span_name(signal.format_sender())] [rigged ? "(as [span_name(fake_name)]) Rigged " : ""]PDA Message --> [span_name("[signal.format_target()]")]: \"[signal.format_message()]\"") + var/public_message = "[span_name(signal.format_sender())] [rigged ? "(as [span_name(fake_name)]) Rigged " : ""]PDA Message --> [span_name("[signal.format_target()]")]: \"[signal.format_message()]\"" + var/ghost_message = span_game_say(public_message) var/list/message_listeners = GLOB.dead_player_list + GLOB.current_observers_list - for(var/mob/listener as anything in message_listeners) - if(!(get_chat_toggles(listener) & CHAT_GHOSTPDA)) - continue - to_chat(listener, "[FOLLOW_LINK(listener, source)] [ghost_message]") + if(!subtle) + for(var/mob/listener as anything in message_listeners) + if(!(get_chat_toggles(listener) & CHAT_GHOSTPDA)) + continue + to_chat(listener, "[FOLLOW_LINK(listener, source)] [ghost_message]") + // Log to public log + log_public_file(public_message) + // BUBBER EDIT CHANGE END if(sender) to_chat(sender, span_info("PDA message sent to [signal.format_target()]: \"[message]\"")) @@ -672,7 +694,7 @@ // don't create a new chat for rigged messages, make it a one off notif if(!is_rigged) - var/datum/pda_message/message = new(signal.data["message"], FALSE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"]) + var/datum/pda_message/message = new(signal.data["message"], FALSE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"], signal.data["subtle"]) // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: var/datum/pda_message/message = new(signal.data["message"], FALSE, station_time_timestamp(PDA_MESSAGE_TIMESTAMP_FORMAT), signal.data["photo"], signal.data["everyone"]) chat = find_chat_by_recipient(is_fake_user ? fake_name : sender_ref, is_fake_user) if(!istype(chat)) diff --git a/tgui/packages/tgui/interfaces/NtosMessenger/ChatScreen.tsx b/tgui/packages/tgui/interfaces/NtosMessenger/ChatScreen.tsx index bdbd24adb25..d351ade1b33 100644 --- a/tgui/packages/tgui/interfaces/NtosMessenger/ChatScreen.tsx +++ b/tgui/packages/tgui/interfaces/NtosMessenger/ChatScreen.tsx @@ -32,6 +32,7 @@ type ChatScreenState = { message: string; previewingImage?: string; selectingPhoto: boolean; + subtleMode: boolean; // BUBBER EDIT ADDITION - SUBTLE MESSAGES }; const READ_UNREADS_TIME_MS = 1000; @@ -45,6 +46,7 @@ export class ChatScreen extends Component { message: '', selectingPhoto: false, canSend: true, + subtleMode: false, // BUBBER EDIT ADDITION - SUBTLE MESSAGES }; constructor(props: ChatScreenProps) { @@ -59,6 +61,7 @@ export class ChatScreen extends Component { this.trySetReadTimeout = this.trySetReadTimeout.bind(this); this.tryClearReadTimeout = this.tryClearReadTimeout.bind(this); this.clearUnreads = this.clearUnreads.bind(this); + this.handleToggleSubtle = this.handleToggleSubtle.bind(this); // BUBBER EDIT ADDITION - SUBTLE MESSAGES } componentDidMount() { @@ -151,6 +154,7 @@ export class ChatScreen extends Component { act('PDA_sendMessage', { ref: ref, message: this.state.message, + subtle: this.state.subtleMode, // BUBBER EDIT ADDITION - SUBTLE MESSAGES }); this.setState({ message: '', canSend: false }); @@ -161,6 +165,14 @@ export class ChatScreen extends Component { this.setState({ message: val }); } + // BUBBER EDIT ADDITION BEGIN - SUBTLE MESSAGES + handleToggleSubtle() { + this.setState((state) => ({ + subtleMode: !state.subtleMode, + })); + } + // BUBBER EDIT ADDITION END - SUBTLE MESSAGES + render() { const { act } = useBackend(); const { @@ -173,7 +185,9 @@ export class ChatScreen extends Component { sendingVirus, unreads, } = this.props; - const { message, canSend, previewingImage, selectingPhoto } = this.state; + // BUBBER EDIT CHANGE - SUBTLE MESSAGES - Original: const { message, canSend, previewingImage, selectingPhoto } = this.state; + const { message, canSend, previewingImage, selectingPhoto, subtleMode } = + this.state; let filteredMessages: JSX.Element[] = []; @@ -196,6 +210,7 @@ export class ChatScreen extends Component { everyone={message.everyone} photoPath={message.photo_path} timestamp={message.timestamp} + subtle={message.subtle} // BUBBER EDIT ADDITION - SUBTLE MESSAGES onPreviewImage={ message.photo_path ? () => this.setState({ previewingImage: message.photo_path! }) @@ -268,6 +283,16 @@ export class ChatScreen extends Component { const buttons = canReply ? ( <> {attachmentButton} + {/* BUBBER EDIT ADDITION BEGIN - SUBTLE MESSAGES */} + +