This is the initial version of the module, for Foundry v12. It allows GMs to write and send messages to players via socketlib, storing an history of those messages, and displaying them on the player's side, with some potential flair, and some controls in the settings. This *does not work* with Foundry v13, as the toolbar registration process has changed.
110 lines
4.1 KiB
JavaScript
110 lines
4.1 KiB
JavaScript
/*
|
|
* This files separates the form-specific validation, creation and types,
|
|
* so they can be used in the main module.
|
|
*/
|
|
|
|
/**
|
|
* @typedef {Object} MessageFormResponse
|
|
* @property {string[]} recipients The list of player IDs the message will be sent to
|
|
* @property {string} sender The name to display as the origin of the message, and in the history
|
|
* @property {string} message The body of the message, a string of HTML
|
|
*/
|
|
|
|
/**
|
|
* @typedef {Object} DialogFormResponse
|
|
* @property {boolean} valid Is the response valid ?
|
|
* @property {MessageFormResponse} form_response The response form the dialog form
|
|
*/
|
|
|
|
/**
|
|
* Given that "required" does not seem to have much impact, check that everything
|
|
* has been properly filled.
|
|
* To be able to reopen the dialog with the existing inputs, return the result of the check
|
|
* as well as the input data.
|
|
* @param {MessageFormResponse} form_response The response from the form, pre-processed
|
|
* @return {DialogFormResponse} Pass the response through and a validity flag
|
|
*/
|
|
export function validate_form(form_response) {
|
|
let valid = true;
|
|
if (form_response.message.length === 0 ||
|
|
form_response.recipients.length === 0 ||
|
|
form_response.sender.length === 0) {
|
|
ui.notifications.warn("MM.Errors.MissingFields", {localize:true});
|
|
valid = false;
|
|
}
|
|
return {valid, form_response};
|
|
}
|
|
|
|
/**
|
|
* Prepare the HTML used for the sending message dialog, filling previous values and handling if it is a chained message.
|
|
* @param {MessageFormResponse|null} [existing_values=null] Values from a previously filled form
|
|
* @param {boolean} [chain=false] If this is a chained message or not
|
|
* @returns {string} HTML for the send message Dialog content
|
|
*/
|
|
export function prepare_send_message_html(existing_values = null, chain = false) {
|
|
let players_options = []
|
|
for (let user of game.users.filter((user) => !user.isGM)) {
|
|
players_options.push({
|
|
label: user.character ? user.character.name : user.name,
|
|
value: user.id,
|
|
})
|
|
}
|
|
if (existing_values && existing_values.recipients.length > 0) {
|
|
players_options
|
|
.filter((option) => existing_values.recipients.includes(option.value))
|
|
.forEach((option) => {option.selected = true})
|
|
}
|
|
|
|
const recipient_input = foundry.applications.fields.createMultiSelectInput({
|
|
name: "recipients_IDs",
|
|
required: true,
|
|
blank: false,
|
|
options: players_options,
|
|
/*
|
|
* Send chained messages to the same recipients, disallow changing it in this case.
|
|
* This is an arbitrary decision that simplifies the process of sending the messages.
|
|
*/
|
|
disabled: chain,
|
|
})
|
|
|
|
const recipient_group = foundry.applications.fields.createFormGroup({
|
|
input: recipient_input,
|
|
label: "MM.Dialogs.SendDialog.RecipientsLabel",
|
|
hint: chain ? "MM.Dialogs.SendDialog.RecipientsChainHint" : "MM.Dialogs.SendDialog.RecipientsHint",
|
|
localize: true,
|
|
})
|
|
|
|
const sender_input = foundry.applications.fields.createTextInput({
|
|
name: "sender_name",
|
|
required: true,
|
|
placeholder: game.i18n.localize("MM.Dialogs.SendDialog.SenderPlaceholder"),
|
|
value: existing_values ? existing_values.sender : null,
|
|
})
|
|
|
|
const sender_group = foundry.applications.fields.createFormGroup({
|
|
input: sender_input,
|
|
label: "MM.Dialogs.SendDialog.SenderLabel",
|
|
hint: "MM.Dialogs.SendDialog.SenderHint",
|
|
localize: true
|
|
})
|
|
|
|
const message_input = foundry.applications.elements.HTMLProseMirrorElement.create({
|
|
name: "message",
|
|
required: true,
|
|
value: existing_values && existing_values.message ? existing_values.message : "",
|
|
editable: true,
|
|
compact: true,
|
|
collaborate: false,
|
|
toggled: false,
|
|
height: 350,
|
|
})
|
|
|
|
const message_group = foundry.applications.fields.createFormGroup({
|
|
input: message_input,
|
|
label: "MM.Dialogs.SendDialog.MessageEditorLabel",
|
|
stacked: true,
|
|
localize: true,
|
|
})
|
|
|
|
return recipient_group.outerHTML + sender_group.outerHTML + message_group.outerHTML;
|
|
}
|