Files
Foundry-VTT-Docker/resources/app/client/data/collections/messages.js
2025-01-04 00:34:03 +01:00

81 lines
2.3 KiB
JavaScript

/**
* The singleton collection of ChatMessage documents which exist within the active World.
* This Collection is accessible within the Game object as game.messages.
* @extends {WorldCollection}
*
* @see {@link ChatMessage} The ChatMessage document
* @see {@link ChatLog} The ChatLog sidebar directory
*/
class Messages extends WorldCollection {
/** @override */
static documentName = "ChatMessage";
/* -------------------------------------------- */
/**
* @override
* @returns {SidebarTab}
* */
get directory() {
return ui.chat;
}
/* -------------------------------------------- */
/** @override */
render(force=false) {}
/* -------------------------------------------- */
/**
* If requested, dispatch a Chat Bubble UI for the newly created message
* @param {ChatMessage} message The ChatMessage document to say
* @private
*/
sayBubble(message) {
const {content, style, speaker} = message;
if ( speaker.scene === canvas.scene.id ) {
const token = canvas.tokens.get(speaker.token);
if ( token ) canvas.hud.bubbles.say(token, content, {
cssClasses: style === CONST.CHAT_MESSAGE_STYLES.EMOTE ? ["emote"] : []
});
}
}
/* -------------------------------------------- */
/**
* Handle export of the chat log to a text file
* @private
*/
export() {
const log = this.contents.map(m => m.export()).join("\n---------------------------\n");
let date = new Date().toDateString().replace(/\s/g, "-");
const filename = `fvtt-log-${date}.txt`;
saveDataToFile(log, "text/plain", filename);
}
/* -------------------------------------------- */
/**
* Allow for bulk deletion of all chat messages, confirm first with a yes/no dialog.
* @see {@link Dialog.confirm}
*/
async flush() {
return Dialog.confirm({
title: game.i18n.localize("CHAT.FlushTitle"),
content: `<h4>${game.i18n.localize("AreYouSure")}</h4><p>${game.i18n.localize("CHAT.FlushWarning")}</p>`,
yes: async () => {
await this.documentClass.deleteDocuments([], {deleteAll: true});
const jumpToBottomElement = document.querySelector(".jump-to-bottom");
jumpToBottomElement.classList.add("hidden");
},
options: {
top: window.innerHeight - 150,
left: window.innerWidth - 720
}
});
}
}