/* * This file contains some module-wide constants and utility functions * that do not really fit elsewhere. */ import { module_settings } from "./settings.mjs"; export const module_id = "the-mills-messages"; // User flag to point to the ID of the journal to store message history to export const history_flag = "history-journal"; /** * This is a copy of Foundry's internal formatting used by * localize.format(), so that we can be consistent. * @param {String} str The string whose "{named_args}" will be formatted * @param {Object} data An object with named_args members, whose data is replaced * @returns {String} The formatted string */ export function str_format(str, data) { const fmt = /{[^}]+}/g; str = str.replace(fmt, k => { return data[k.slice(1, -1)]; }); return str; } /** * Create the journal entry for the history of the specified user, * update the user's history flag and return the entry for further * manipulation if needed. * @param {User} user The user object that we are creating the history for * @return {Promise} The JournalEntry that was created. */ export async function create_history_journal(user) { // Use the settings' title for the journal, or revert to the default one if it is empty. let format_name = {name: user.character ? user.character.name : user.name}; let formated_journal_title = str_format(game.settings.get(module_id, module_settings.HistoryJournalTitle), format_name) let title = formated_journal_title.length > 0 ? formated_journal_title : game.i18n.format("MM.UI.HistoryJournalTitle", format_name) return JournalEntry.create({ name: title, ownership: { default: CONST.DOCUMENT_OWNERSHIP_LEVELS.NONE, [user.id]: CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER // Make the history private and unmodifiable }, }).then(journal => { return user.setFlag(module_id, history_flag, journal.id).then(() => journal); }); } /** * Go through all the user's histories to build a list of existing senders, * so that they can be displayed or re-used. * The final list is sorted and does not contain duplicates, as one sender * can send messages to multiple players at once. * @returns {String[]} A sorted array of the sender names, if any */ export function get_existing_senders() { /** @type {String[]} */ let senders = [] for (let user of game.users.players) { /** @type {JournalEntry} */ let history = game.journal.get(user.getFlag(module_id, history_flag)) if (!history) { continue; } for (let page of history.pages) { if (!senders.includes(page.name)) { senders.push(page.name); } } } return senders.sort(); }