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,
+ },
+});