Pour les messages sans actor, la méthode getOwners ne marchait pas. En cas d'absence d'acteur, les gmroll doivent être pour le joueur courant et les MJs
205 lines
6.7 KiB
JavaScript
205 lines
6.7 KiB
JavaScript
import { Misc } from "./misc.js";
|
|
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
|
import { RdDTimestamp } from "./time/rdd-timestamp.js";
|
|
import { RdDTextEditor } from "./apps/rdd-text-roll-editor.js";
|
|
|
|
|
|
/**
|
|
* Class providing helper methods to get the list of users, and
|
|
*/
|
|
export class ChatUtility {
|
|
|
|
static async init() {
|
|
Hooks.on("renderChatMessage", async (app, html, msg) => await ChatUtility.onRenderChatMessage(app, html, msg))
|
|
Hooks.on("createChatMessage", async (chatMessage, options, id) => await ChatUtility.onCreateChatMessage(chatMessage, options, id))
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static onSocketMessage(sockmsg) {
|
|
switch (sockmsg.msg) {
|
|
case "msg_gm_chat_message": return ChatUtility.handleGMChatMessage(sockmsg.data)
|
|
case "msg_delete_chat_message": return ChatUtility.onRemoveMessages(sockmsg.data)
|
|
case "msg_user_ui_notifications": return ChatUtility.onNotifyUser(sockmsg.data)
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static notifyUser(userId, level = 'info', message) {
|
|
const socketData = {
|
|
userId: userId, level: level, message: message
|
|
};
|
|
if (game.user.id == userId) {
|
|
ChatUtility.onNotifyUser(socketData);
|
|
}
|
|
else {
|
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
|
msg: "msg_user_ui_notifications", data: socketData
|
|
});
|
|
}
|
|
}
|
|
|
|
static onNotifyUser(socketData) {
|
|
if (game.user.id == socketData.userId) {
|
|
switch (socketData.level) {
|
|
case 'warn': ui.notifications.warn(socketData.message); break;
|
|
case 'error': ui.notifications.error(socketData.message); break;
|
|
default: ui.notifications.info(socketData.message); break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static onRemoveMessages(socketData) {
|
|
if (Misc.isFirstConnectedGM()) {
|
|
if (socketData.part) {
|
|
const toDelete = game.messages.filter(it => it.content.includes(socketData.part));
|
|
toDelete.forEach(it => it.delete());
|
|
}
|
|
if (socketData.messageId) {
|
|
game.messages.get(socketData.messageId)?.delete();
|
|
}
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static removeMessages(socketData) {
|
|
if (Misc.isFirstConnectedGM()) {
|
|
ChatUtility.onRemoveMessages(socketData);
|
|
}
|
|
else {
|
|
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_delete_chat_message", data: socketData });
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static removeChatMessageContaining(part) {
|
|
ChatUtility.removeMessages({ part: part });
|
|
}
|
|
|
|
static removeChatMessageId(messageId) {
|
|
if (messageId) {
|
|
ChatUtility.removeMessages({ messageId: messageId });
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static async createChatWithRollMode(messageData, actor = undefined) {
|
|
switch (game.settings.get("core", "rollMode")) {
|
|
case "blindroll": // GM only
|
|
if (!game.user.isGM) {
|
|
ChatUtility.blindMessageToGM(messageData)
|
|
messageData.whisper = [game.user];
|
|
messageData.content = "Message envoyé en aveugle au Gardien"
|
|
}
|
|
else {
|
|
messageData.whisper = ChatUtility.getGMs()
|
|
}
|
|
break
|
|
case "gmroll":
|
|
messageData.whisper = actor ? ChatUtility.getOwners(actor) : ChatUtility.getUserAndGMs()
|
|
break
|
|
case "selfroll":
|
|
messageData.whisper = [game.user]
|
|
break
|
|
}
|
|
messageData.alias = messageData.alias ?? actor?.name ?? game.user.name
|
|
return await ChatMessage.create(messageData)
|
|
}
|
|
|
|
static getOwners(document) {
|
|
return document ? game.users.filter(it => document.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) : [game.user]
|
|
}
|
|
|
|
static getUserAndGMs() {
|
|
return [game.user, ...ChatUtility.getGMs()]
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static getMultipleActorsOwners(...actors) {
|
|
return Misc.concat(actors.map(it => it == undefined ? [] : ChatUtility.getOwners(it)))
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static getUsers(filter) {
|
|
return game.users.filter(filter)
|
|
}
|
|
|
|
static getGMs() {
|
|
return game.users.filter(user => user.isGM)
|
|
}
|
|
|
|
static applyRollMode(chatMessageData = {}, rollMode = game.settings.get("core", "rollMode")) {
|
|
switch (rollMode) {
|
|
case "blindroll":
|
|
chatMessageData.blind = true
|
|
chatMessageData.whisper = ChatUtility.getGMs()
|
|
break
|
|
case "gmroll":
|
|
chatMessageData.whisper = ChatUtility.getGMs()
|
|
chatMessageData.blind = false
|
|
break
|
|
case "roll":
|
|
chatMessageData.whisper = ChatUtility.getUsers(user => user.active)
|
|
chatMessageData.blind = false
|
|
break
|
|
case "selfroll":
|
|
chatMessageData.whisper = [game.user]
|
|
chatMessageData.blind = false
|
|
break
|
|
}
|
|
return chatMessageData
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static blindMessageToGM(chatOptions) {
|
|
const chatGM = foundry.utils.duplicate(chatOptions)
|
|
chatGM.content = "Message aveugle de " + game.user.name + "<br>" + chatOptions.content
|
|
console.log("blindMessageToGM", chatGM)
|
|
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_gm_chat_message", data: chatGM })
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static handleGMChatMessage(socketData) {
|
|
console.log("blindMessageToGM", socketData);
|
|
if (Misc.isFirstConnectedGM()) {
|
|
ChatMessage.create({
|
|
user: game.user.id,
|
|
whisper: ChatUtility.getGMs(),
|
|
content: socketData.content
|
|
})
|
|
}
|
|
}
|
|
|
|
static async setMessageData(chatMessage, key, flag) {
|
|
if (flag && chatMessage.isAuthor) {
|
|
await chatMessage.setFlag(SYSTEM_RDD, key, flag)
|
|
}
|
|
}
|
|
|
|
static getMessageData(chatMessage, key) {
|
|
return chatMessage.getFlag(SYSTEM_RDD, key);
|
|
}
|
|
|
|
static getChatMessage(event) {
|
|
const chatMessageId = $(event.currentTarget).closest('.chat-message').attr('data-message-id');
|
|
return game.messages.get(chatMessageId);
|
|
}
|
|
|
|
static async onRenderChatMessage(chatMessage, html, data) {
|
|
const rddTimestamp = chatMessage.getFlag(SYSTEM_RDD, 'rdd-timestamp')
|
|
if (rddTimestamp) {
|
|
const timestamp = new RdDTimestamp(rddTimestamp);
|
|
const timestampData = timestamp.toCalendrier();
|
|
const dateHeure = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/common/date-heure.hbs', timestampData);
|
|
html.find('header.message-header .message-sender').after(dateHeure)
|
|
}
|
|
}
|
|
|
|
static async onCreateChatMessage(chatMessage, options, id) {
|
|
if (chatMessage.isAuthor) {
|
|
await chatMessage.setFlag(SYSTEM_RDD, 'rdd-timestamp', game.system.rdd.calendrier.getTimestamp());
|
|
await chatMessage.update({ content: await RdDTextEditor.enrichHTML(chatMessage.content, undefined, { showLink: false }) })
|
|
}
|
|
}
|
|
}
|