67b0555b11
Il y en avait partout dans des dialogues, des options, le drag&drop d'acteur sur acteur, l'empilage d'objet...
182 lines
5.5 KiB
JavaScript
182 lines
5.5 KiB
JavaScript
import { Misc } from "./misc.js";
|
|
import { SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js";
|
|
|
|
export const MESSAGE_DATA = 'message-data';
|
|
|
|
/**
|
|
* Class providing helper methods to get the list of users, and
|
|
*/
|
|
export class ChatUtility {
|
|
|
|
/* -------------------------------------------- */
|
|
static onSocketMessage(sockmsg) {
|
|
switch (sockmsg.msg) {
|
|
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 data = {
|
|
userId: userId, level: level, message: message
|
|
};
|
|
if (game.user.id == userId) {
|
|
ChatUtility.onNotifyUser(data);
|
|
}
|
|
else {
|
|
game.socket.emit(SYSTEM_SOCKET_ID, {
|
|
msg: "msg_user_ui_notifications", data: data
|
|
});
|
|
}
|
|
}
|
|
|
|
static onNotifyUser(data) {
|
|
if (game.user.id == data.userId) {
|
|
switch (data.level) {
|
|
case 'warn': ui.notifications.warn(data.message); break;
|
|
case 'error': ui.notifications.error(data.message); break;
|
|
default: ui.notifications.info(data.message); break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static onRemoveMessages(data) {
|
|
if (Misc.isUniqueConnectedGM()) {
|
|
if (data.part) {
|
|
const toDelete = game.messages.filter(it => it.data.content.includes(data.part));
|
|
toDelete.forEach(it => it.delete());
|
|
}
|
|
if (data.messageId) {
|
|
game.messages.get(data.messageId)?.delete();
|
|
}
|
|
}
|
|
}
|
|
|
|
static onRemoveMessages(data) {
|
|
if (Misc.isUniqueConnectedGM()) {
|
|
if (data.part) {
|
|
const toDelete = game.messages.filter(it => it.content.includes(data.part));
|
|
toDelete.forEach(it => it.delete());
|
|
}
|
|
if (data.messageId) {
|
|
game.messages.get(data.messageId)?.delete();
|
|
}
|
|
}
|
|
}
|
|
/* -------------------------------------------- */
|
|
|
|
static removeMessages(data) {
|
|
if (Misc.isUniqueConnectedGM()) {
|
|
ChatUtility.onRemoveMessages(data);
|
|
}
|
|
else {
|
|
game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_delete_chat_message", data: data });
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static removeChatMessageContaining(part) {
|
|
ChatUtility.removeMessages({ part: part });
|
|
}
|
|
|
|
static removeChatMessageId(messageId) {
|
|
if (messageId){
|
|
ChatUtility.removeMessages({ messageId: messageId });
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static async createChatWithRollMode(name, chatOptions) {
|
|
return await ChatUtility.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions);
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static async createChatMessage(name, rollMode, chatOptions) {
|
|
switch (rollMode) {
|
|
case "blindroll": // GM only
|
|
if (!game.user.isGM) {
|
|
ChatUtility.blindMessageToGM(chatOptions);
|
|
|
|
chatOptions.whisper = [game.user.id];
|
|
chatOptions.content = "Message envoyé en aveugle au Gardien";
|
|
}
|
|
else {
|
|
chatOptions.whisper = ChatUtility.getUsers(user => user.isGM);
|
|
}
|
|
break;
|
|
default:
|
|
chatOptions.whisper = ChatUtility.getWhisperRecipients(rollMode, name);
|
|
break;
|
|
}
|
|
chatOptions.alias = chatOptions.alias || name;
|
|
return await ChatMessage.create(chatOptions);
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static prepareChatMessage(rollMode, name) {
|
|
return {
|
|
user: game.user.id,
|
|
whisper: ChatUtility.getWhisperRecipients(rollMode, name)
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static getWhisperRecipients(rollMode, name) {
|
|
switch (rollMode) {
|
|
case "blindroll": return ChatUtility.getUsers(user => user.isGM);
|
|
case "gmroll": return ChatUtility.getWhisperRecipientsAndGMs(name);
|
|
case "selfroll": return [game.user.id];
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static getWhisperRecipientsAndGMs(name) {
|
|
let recep1 = ChatMessage.getWhisperRecipients(name) || [];
|
|
return recep1.concat(ChatMessage.getWhisperRecipients('GM'));
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static getUsers(filter) {
|
|
return Misc.getUsers().filter(filter).map(user => user.id);
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
static blindMessageToGM(chatOptions) {
|
|
let chatGM = duplicate(chatOptions);
|
|
chatGM.whisper = ChatUtility.getUsers(user => user.isGM);
|
|
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(data) {
|
|
console.log("blindMessageToGM", data);
|
|
if (game.user.isGM) { // message privé pour GM only
|
|
data.user = game.user.id;
|
|
ChatMessage.create(data);
|
|
}
|
|
}
|
|
|
|
static async setMessageData(chatMessage, key, data) {
|
|
if (data) {
|
|
await chatMessage.setFlag(SYSTEM_RDD, key, JSON.stringify(data));
|
|
}
|
|
}
|
|
|
|
static getMessageData(chatMessage, key) {
|
|
const json = chatMessage.getFlag(SYSTEM_RDD, key);
|
|
return json ? JSON.parse(json) : undefined;
|
|
}
|
|
|
|
static getChatMessage(event) {
|
|
const chatMessageId = $(event.currentTarget).closest('.chat-message').attr('data-message-id');
|
|
return game.messages.get(chatMessageId);
|
|
}
|
|
|
|
}
|