diff --git a/scripts/macros/rollDice.mjs b/scripts/macros/rollDice.mjs index b6bebf9..2519669 100644 --- a/scripts/macros/rollDice.mjs +++ b/scripts/macros/rollDice.mjs @@ -24,6 +24,7 @@ async function rollDice() { ], }); const [ statBase, successThreshold, critsEnabled ] = Object.values(answers); + const rollMode = game.settings.get(`core`, `rollMode`); let successes = 0; const results = []; @@ -39,12 +40,19 @@ async function rollDice() { } } - const m = new ChatMessage({ - title: `Dice Pool`, - content: `Rolled: ${results.join(`, `)}
Successes: ${successes}`, - }); - m.applyRollMode(game.settings.get(`core`, `rollMode`)); - ui.chat.postOne(m); + const chatData = ChatMessage.applyRollMode( + { + title: `Dice Pool`, + content: `Rolled: ${taf.utils.hideMessageText(results.join(`, `))}
Successes: ${taf.utils.hideMessageText(successes)}`, + flags: { taf: { + rollModedContent: true, + rollMode, + } }, + }, + rollMode, + ); + + await ChatMessage.implementation.create(chatData); } rollDice() \ No newline at end of file diff --git a/src/consts.mjs b/src/consts.mjs new file mode 100644 index 0000000..0c13482 --- /dev/null +++ b/src/consts.mjs @@ -0,0 +1,3 @@ +export const FEATURE_FLAGS = Object.freeze({ + ROLLMODECONTENT: `Roll Mode Message Content`, +}); diff --git a/src/hooks/renderChatMessage.mjs b/src/hooks/renderChatMessage.mjs new file mode 100644 index 0000000..15f70a0 --- /dev/null +++ b/src/hooks/renderChatMessage.mjs @@ -0,0 +1,21 @@ +import { FEATURE_FLAGS } from "../consts.mjs"; + +Hooks.on(`renderChatMessage`, (msg, html) => { + + // Short-Circuit when the flag isn't set for the message + if (msg.getFlag(`taf`, `rollModedContent`)) { + return; + } + + const featureFlags = game.settings.get(game.system.id, `flags`); + const featureFlagEnabled = featureFlags.includes(FEATURE_FLAGS.ROLLMODECONTENT); + + const contentElement = html.find(`.message-content`)[0]; + let content = contentElement.innerHTML; + if (featureFlagEnabled && msg.blind && !game.user.isGM) { + content = content.replace(/-=.*?=-/gm, `???`); + } else { + content = content.replace(/-=|=-/gm, ``); + } + contentElement.innerHTML = content; +}); diff --git a/src/main.mjs b/src/main.mjs index fba71bb..7f4ae1b 100644 --- a/src/main.mjs +++ b/src/main.mjs @@ -7,7 +7,12 @@ import { ItemProxy } from "./documents/Item/_proxy.mjs"; // DataModel Imports import { PlayerData } from "./documents/Actor/Player/Model.mjs"; +// Hook Imports +import "./hooks/renderChatMessage.mjs"; +import "./hooks/hotReload.mjs"; + // Misc Imports +import "./utils/globalTaf.mjs"; import "./utils/logger.mjs"; import "./utils/DialogManager.mjs"; import { registerCustomComponents } from "./components/_index.mjs"; diff --git a/src/settings/world_settings.mjs b/src/settings/world_settings.mjs index ab835d9..db4d7ed 100644 --- a/src/settings/world_settings.mjs +++ b/src/settings/world_settings.mjs @@ -1 +1,24 @@ -export function registerWorldSettings() {}; +import { FEATURE_FLAGS } from "../consts.mjs"; + +export function registerWorldSettings() { + game.settings.register(game.system.id, `flags`, { + name: `Feature Flags`, + hint: `World-based feature flags that are used to enable/disable specific behaviours`, + scope: `world`, + type: new foundry.data.fields.SetField( + new foundry.data.fields.StringField( + { + empty: false, + trim: true, + options: Object.values(FEATURE_FLAGS), + }, + ), + { + required: false, + initial: new Set(), + }, + ), + config: true, + requiresReload: true, + }); +}; diff --git a/src/utils/feature_flags/rollModeMessageContent.mjs b/src/utils/feature_flags/rollModeMessageContent.mjs new file mode 100644 index 0000000..059852a --- /dev/null +++ b/src/utils/feature_flags/rollModeMessageContent.mjs @@ -0,0 +1,10 @@ +import { FEATURE_FLAGS } from "../../consts.mjs"; + +export function hideMessageText(content) { + const featureFlags = game.settings.get(game.system.id, `flags`); + const hideContent = featureFlags.includes(FEATURE_FLAGS.ROLLMODECONTENT); + if (hideContent) { + return `-=${content}=-`; + } + return content; +}; diff --git a/src/utils/globalTaf.mjs b/src/utils/globalTaf.mjs new file mode 100644 index 0000000..3ed03fe --- /dev/null +++ b/src/utils/globalTaf.mjs @@ -0,0 +1,11 @@ +import { FEATURE_FLAGS } from "../consts.mjs"; +import { hideMessageText } from "./feature_flags/rollModeMessageContent.mjs"; + +globalThis.taf = Object.freeze({ + utils: { + hideMessageText, + }, + const: { + FEATURE_FLAGS, + }, +});