diff --git a/changelog.md b/changelog.md index acdb92cd..93a4e484 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,8 @@ # 12.0 ## 12.0.15 - Le messager d'Astrobazzarh - Les messages de maladies ne sont plus publics +- Les messages privés dans les TMR sont aussi envoyés au GM + ## 12.0.14 - Les légions d'Astrobazzarh - Feuille de PNJ: - boutons standard (encaissement, ...) diff --git a/module/actor.js b/module/actor.js index ee0569d2..73c21990 100644 --- a/module/actor.js +++ b/module/actor.js @@ -159,7 +159,7 @@ export class RdDActor extends RdDBaseActorSang { const potionUpdates = await Promise.all(potions.map(async it => { const nouveauReve = Math.max(it.system.pr - 1, 0) ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-potionenchantee-chateaudormant.html`, { pr: nouveauReve, alias: this.name, @@ -210,7 +210,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ async grisReve(nbJours) { let message = { - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: `${nbJours} jours de gris rêve sont passés. ` }; for (let i = 0; i < nbJours; i++) { @@ -264,7 +264,7 @@ export class RdDActor extends RdDBaseActorSang { async dormirChateauDormant() { if (!ReglesOptionnelles.isUsing("chateau-dormant-gardien") || !this.system.sommeil || this.system.sommeil.nouveaujour) { const message = { - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: "" }; @@ -400,7 +400,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ async remiseANeuf() { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: 'Remise à neuf de ' + this.name }); await this.supprimerBlessures(it => true); @@ -417,7 +417,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ async dormir(heures, options = { grisReve: false, chateauDormant: false }) { const message = { - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: this.name + ': ' }; const insomnie = this.system.sommeil?.insomnie || heures == 0; @@ -488,7 +488,7 @@ export class RdDActor extends RdDBaseActorSang { else { if (!ReglesOptionnelles.isUsing("recuperation-reve")) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: `Pas de récupération de rêve (${reve} points ignorés)` }); jetsReve.push(0); @@ -919,7 +919,7 @@ export class RdDActor extends RdDBaseActorSang { await this.createEmbeddedDocuments('Item', [souffle]); if (options.chat) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: this.name + " subit un Souffle de Dragon : " + souffle.name }); } @@ -939,7 +939,7 @@ export class RdDActor extends RdDBaseActorSang { await this.createEmbeddedDocuments('Item', [queue]); if (options.chat) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: this.name + " subit une Queue de Dragon : " + queue.name }); } @@ -977,7 +977,7 @@ export class RdDActor extends RdDBaseActorSang { let tmr = await TMRUtility.getTMRAleatoire(tmr => accessible(tmr) && !innaccessible.includes(tmr.coord)); ChatMessage.create({ content: `${raison} : ré-insertion aléatoire.`, - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name) + whisper: ChatUtility.getOwners(this) }); await this.forcerPositionTMRInconnue(tmr); return tmr; @@ -1082,7 +1082,7 @@ export class RdDActor extends RdDBaseActorSang { const jetMoral = await this._jetDeMoral(situation); const finMessage = (jetMoral.succes ? messageReussi : messageManque) ?? (jetMoral.ajustement == 0 ? "Vous gardez votre moral" : jetMoral.ajustement > 0 ? "Vous gagnez du moral" : "Vous perdez du moral"); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: `${finMessage} - jet ${jetMoral.succes ? "réussi" : "manqué"} en situation ${situation} (${jetMoral.jet}/${jetMoral.difficulte}).` }); return jetMoral.ajustement; @@ -1419,7 +1419,7 @@ export class RdDActor extends RdDBaseActorSang { }; ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-transformer-stress.html`, stressRollData) }); @@ -1505,7 +1505,7 @@ export class RdDActor extends RdDBaseActorSang { } if (display) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-carac-xp.html`, checkXp) }); } @@ -1537,7 +1537,7 @@ export class RdDActor extends RdDBaseActorSang { } if (display) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-competence-xp.html`, checkXp) }); } @@ -1563,7 +1563,7 @@ export class RdDActor extends RdDBaseActorSang { } else { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: content }); } @@ -1666,7 +1666,7 @@ export class RdDActor extends RdDBaseActorSang { } ChatMessage.create({ content: "Vous êtes sous le coup d'une Mauvaise Rencontre en Persective." + addMsg, - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); } return rencSpecial; @@ -1678,7 +1678,7 @@ export class RdDActor extends RdDBaseActorSang { if (countInertieDraconique > 0) { ChatMessage.create({ content: `Vous êtes sous le coup d'Inertie Draconique : vous perdrez ${countInertieDraconique + 1} cases de Fatigue par déplacement au lieu d'une.`, - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); } return countInertieDraconique + 1; @@ -1690,7 +1690,7 @@ export class RdDActor extends RdDBaseActorSang { await this.reveActuelIncDec(-1); ChatMessage.create({ content: "Vous êtes sous le coup d'un Péage : l'entrée sur cette case vous a coûté 1 Point de Rêve (déduit automatiquement).", - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); } } @@ -2270,7 +2270,7 @@ export class RdDActor extends RdDBaseActorSang { // Cas de désir lancinant, pas d'expérience sur particulière ChatMessage.create({ content: `Vous souffrez au moins d'un Désir Lancinant, vous ne pouvez pas gagner d'expérience sur une Particulière tant que le désir n'est pas assouvi`, - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); return [] } @@ -2405,7 +2405,7 @@ export class RdDActor extends RdDBaseActorSang { if (countMonteeLaborieuse > 0) { ChatMessage.create({ content: `Vous êtes sous le coup d'une Montée Laborieuse : vos montées en TMR coûtent ${countMonteeLaborieuse} Point de Rêve de plus.`, - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); } return countMonteeLaborieuse; @@ -2453,7 +2453,7 @@ export class RdDActor extends RdDBaseActorSang { if (this.getReveActuel() < minReveValue) { ChatMessage.create({ content: `Vous n'avez les ${minReveValue} Points de Reve nécessaires pour monter dans les Terres Médianes`, - whisper: ChatMessage.getWhisperRecipients(this.name) + whisper: ChatUtility.getOwners(this) }); return; } @@ -2850,7 +2850,7 @@ export class RdDActor extends RdDBaseActorSang { await this.setBonusPotionSoin(potionData.system.herbebonus); } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-soin.html`, potionData) }); } @@ -2887,7 +2887,7 @@ export class RdDActor extends RdDBaseActorSang { this.bonusRepos = potionData.system.herbebonus; } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-repos.html`, potionData) }); } @@ -2919,7 +2919,7 @@ export class RdDActor extends RdDBaseActorSang { this.diminuerQuantiteObjet(herbeData._id, herbeData.nbBrins); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-fabriquer-potion-base.html`, messageData) }); } @@ -2944,7 +2944,7 @@ export class RdDActor extends RdDBaseActorSang { } } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-consommer-potion-generique.html`, potionData) }); } @@ -3044,7 +3044,7 @@ export class RdDActor extends RdDBaseActorSang { /* -------------------------------------------- */ notifyGestionTeteSouffleQueue(item, manualMessage = true) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: `${this.name} a reçu un/une ${item.type}: ${item.name}, qui ${manualMessage ? "n'est pas" : "est"} géré(e) automatiquement. ${manualMessage ? manualMessage : ''}` }); } diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 32015d56..06b560f5 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -189,7 +189,7 @@ export class RdDBaseActorReve extends RdDBaseActor { getEffect(effectId) { return this.getEmbeddedCollection("ActiveEffect").find(it => it.statuses?.has(effectId)); } - + async setEffect(effectId, status) { if (this.isEffectAllowed(effectId)) { const effect = this.getEffect(effectId); @@ -201,7 +201,7 @@ export class RdDBaseActorReve extends RdDBaseActor { } } } - + async removeEffect(id) { const effect = this.getEmbeddedCollection("ActiveEffect").find(it => it.id == id); if (effect) { @@ -296,7 +296,7 @@ export class RdDBaseActorReve extends RdDBaseActor { /* -------------------------------------------- */ async rollCarac(caracName, jetResistance = undefined) { - if (Grammar.equalsInsensitive(caracName, 'taille')){ + if (Grammar.equalsInsensitive(caracName, 'taille')) { return } RdDEmpoignade.checkEmpoignadeEnCours(this) @@ -418,9 +418,9 @@ export class RdDBaseActorReve extends RdDBaseActor { return; } const armure = await this.computeArmure(rollData); - if (ReglesOptionnelles.isUsing('validation-encaissement-gr')){ + if (ReglesOptionnelles.isUsing('validation-encaissement-gr')) { await this.encaisserDommagesValidationGR(rollData, armure, attacker?.id, show); - } + } else { const jet = await RdDUtility.jetEncaissement(rollData, armure, { showDice: SHOW_DICE }); await this.$onEncaissement(jet, show, attacker); @@ -456,16 +456,19 @@ export class RdDBaseActorReve extends RdDBaseActor { show: show ?? {} }); - await ChatUtility.createChatWithRollMode(this.name, { - roll: encaissement.roll, - content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html', encaissement) - }); + await ChatUtility.createChatWithRollMode( + { + roll: encaissement.roll, + content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html', encaissement) + }, + this + ) if (!encaissement.hasPlayerOwner && encaissement.endurance != 0) { - encaissement = foundry.utils.duplicate(encaissement); - encaissement.isGM = true; + encaissement = foundry.utils.duplicate(encaissement) + encaissement.isGM = true ChatMessage.create({ - whisper: ChatMessage.getWhisperRecipients("GM"), + whisper: ChatUtility.getGMs(), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-encaissement.html', encaissement) }); } diff --git a/module/actor/base-actor-sang-sheet.js b/module/actor/base-actor-sang-sheet.js index 2d45db03..2dcd511a 100644 --- a/module/actor/base-actor-sang-sheet.js +++ b/module/actor/base-actor-sang-sheet.js @@ -39,8 +39,8 @@ export class RdDBaseActorSangSheet extends RdDBaseActorReveSheet { ChatMessage.create({ content: `Jet d'Endurance : ${result.jetEndurance} / ${endurance}
${this.actor.name} a ${result.sonne ? 'échoué' : 'réussi'} son Jet d'Endurance ${result.sonne ? 'et devient Sonné' : ''}`, - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.actor.name) - }); + whisper: ChatUtility.getOwners(this.actor) + }) } } diff --git a/module/actor/base-actor-sang.js b/module/actor/base-actor-sang.js index 6e784920..978c27c2 100644 --- a/module/actor/base-actor-sang.js +++ b/module/actor/base-actor-sang.js @@ -5,6 +5,7 @@ import { ITEM_TYPES } from "../item.js"; import { RdDBaseActorReve } from "./base-actor-reve.js"; import { RdDDice } from "../rdd-dice.js"; import { RdDItemBlessure } from "../item/blessure.js"; +import { ChatUtility } from "../chat-utility.js"; /** * Classe de base pour les acteurs qui peuvent subir des blessures @@ -180,7 +181,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve { } } const endActuelle = this.getEnduranceActuelle(); - const blessure = await RdDItemBlessure.createBlessure(this, encaissement.gravite, encaissement.dmg?.loc.label ??'', attacker); + const blessure = await RdDItemBlessure.createBlessure(this, encaissement.gravite, encaissement.dmg?.loc.label ?? '', attacker); if (blessure.isCritique()) { encaissement.endurance = endActuelle; } @@ -196,9 +197,9 @@ export class RdDBaseActorSang extends RdDBaseActorReve { return blessure; } - async supprimerBlessure({gravite}) { + async supprimerBlessure({ gravite }) { const toDelete = this.itemTypes[ITEM_TYPES.blessure].find(it => it.system.gravite == gravite)?.id - if (toDelete){ + if (toDelete) { await this.deleteEmbeddedDocuments('Item', [toDelete]); } } @@ -216,7 +217,10 @@ export class RdDBaseActorSang extends RdDBaseActorReve { /* -------------------------------------------- */ async jetDeVie() { if (this.isDead()) { - ChatMessage.create({ content: `Jet de Vie: ${this.name} est déjà mort, ce n'est pas la peine d'en rajouter !!!!!`, whisper: ChatMessage.getWhisperRecipients(this.name) }); + ChatMessage.create({ + content: `Jet de Vie: ${this.name} est déjà mort, ce n'est pas la peine d'en rajouter !!!!!`, + whisper: ChatUtility.getOwners(this) + }) return } const jetDeVie = await RdDDice.roll("1d20"); @@ -243,7 +247,10 @@ export class RdDBaseActorSang extends RdDBaseActorReve { else if (prochainJet > 0) { msgText += `
Prochain jet de vie dans ${prochainJet} ${isCritique ? 'round' : 'minute'}${prochainJet > 1 ? 's' : ''} ${isCritique ? '(état critique)' : '(état grave)'}` } - ChatMessage.create({ content: msgText, whisper: ChatMessage.getWhisperRecipients(this.name) }); + ChatMessage.create({ + content: msgText, + whisper: ChatUtility.getOwners(this) + }); } /* -------------------------------------------- */ diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index 228181ad..57fbcb07 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -270,6 +270,7 @@ export class RdDBaseActor extends Actor { } let fortune = this.getFortune(); console.log("payer", game.user.character, depense, fortune); + // TODO: passer en handlebars let msg = ""; if (fortune >= depense) { await Monnaie.optimiserFortune(this, fortune - depense); @@ -279,11 +280,10 @@ export class RdDBaseActor extends Actor { msg = "Vous n'avez pas assez d'argent pour payer cette somme !"; } - let message = { - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + ChatMessage.create({ + whisper: ChatUtility.getOwners(this), content: msg - }; - ChatMessage.create(message); + }) } async depenserSols(sols) { @@ -317,7 +317,7 @@ export class RdDBaseActor extends Actor { RdDAudio.PlayContextAudio("argent"); // Petit son ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this.name), content: `Vous avez reçu ${sols} Sols ${fromActor ? " de " + fromActor.name : ''}, qui ont été ajoutés à votre argent.` }); } @@ -371,7 +371,7 @@ export class RdDBaseActor extends Actor { ChatMessage.create({ user: achat.userId, speaker: { alias: (acheteur ?? vendeur).name }, - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(this), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-achat-item.html', chatAchatItem) }); diff --git a/module/chat-utility.js b/module/chat-utility.js index c5a56534..76792c86 100644 --- a/module/chat-utility.js +++ b/module/chat-utility.js @@ -8,15 +8,20 @@ import { RdDTimestamp } from "./time/rdd-timestamp.js"; */ 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_delete_chat_message": return ChatUtility.onRemoveMessages(sockmsg.data); - case "msg_user_ui_notifications": return ChatUtility.onNotifyUser(sockmsg.data); + 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 = { @@ -78,77 +83,90 @@ export class ChatUtility { } /* -------------------------------------------- */ - static async createChatWithRollMode(name, chatOptions) { - let rollMode = game.settings.get("core", "rollMode") - switch (rollMode) { + static async createChatWithRollMode(messageData, actor = undefined) { + switch (game.settings.get("core", "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"; + ChatUtility.blindMessageToGM(messageData) + messageData.whisper = [game.user]; + messageData.content = "Message envoyé en aveugle au Gardien" } else { - chatOptions.whisper = ChatUtility.getUsers(user => user.isGM); + messageData.whisper = ChatUtility.getGMs() } - break; - default: - chatOptions.whisper = ChatUtility.getWhisperRecipients(rollMode, name); - break; + break + case "gmroll": + messageData.whisper = ChatUtility.getOwners(actor) + break + case "selfroll": + messageData.whisper = [game.user] + break } - chatOptions.alias = chatOptions.alias || name; - return await ChatMessage.create(chatOptions); + messageData.alias = messageData.alias ?? actor?.name ?? game.user.name + return await ChatMessage.create(messageData) + } + + static getOwners(document) { + return game.users.filter(it => document.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) + } + + static getUserAndGMs() { + return [game.user, ...ChatUtility.getGMs()] } /* -------------------------------------------- */ - 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 getOwners(actor) { - return game.users.filter(it => actor.getUserLevel(it) == CONST.DOCUMENT_OWNERSHIP_LEVELS.OWNER) - } - - /* -------------------------------------------- */ - static getWhisperRecipientsAndGMs(...names) { - let recipients = [...ChatMessage.getWhisperRecipients('GM')] - names.forEach(name => recipients.push(...ChatMessage.getWhisperRecipients(name))) - return recipients + static getMultipleActorsOwners(...actors) { + return Misc.concat(actors.map(it => it == undefined ? [] : ChatUtility.getOwners(it))) } /* -------------------------------------------- */ static getUsers(filter) { - return game.users.filter(filter).map(user => user.id); + 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) { - let chatGM = foundry.utils.duplicate(chatOptions); - chatGM.whisper = ChatUtility.getUsers(user => user.isGM); - chatGM.content = "Message aveugle de " + game.user.name + "
" + chatOptions.content; - console.log("blindMessageToGM", chatGM); - game.socket.emit(SYSTEM_SOCKET_ID, { msg: "msg_gm_chat_message", data: chatGM }); + const chatGM = foundry.utils.duplicate(chatOptions) + chatGM.content = "Message aveugle de " + game.user.name + "
" + 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 (game.user.isGM) { // message privé pour GM only - socketData.user = game.user.id; - ChatMessage.create(socketData); + if (Misc.firstConnectedGM()) { + ChatMessage.create({ + user: game.user.id, + whisper: ChatUtility.getGMs(), + content: socketData.content + }) } } diff --git a/module/coeur/rdd-coeur.js b/module/coeur/rdd-coeur.js index 4b85988f..f5a4a7f5 100644 --- a/module/coeur/rdd-coeur.js +++ b/module/coeur/rdd-coeur.js @@ -30,7 +30,8 @@ export class RdDCoeur { } static extractInfoCoeur(event) { - return ChatUtility.getMessageData(ChatUtility.getChatMessage(event), INFO_COEUR) + const chatMesage = ChatUtility.getChatMessage(event); + return ChatUtility.getMessageData(chatMesage, INFO_COEUR) } static getInfoCoeur(sourceActorId, targetActorId) { @@ -98,12 +99,11 @@ export class RdDCoeur { static async startSubActeurTendreMoment(actorId, subActeurId) { const infoCoeur = RdDCoeur.getInfoCoeur(actorId, subActeurId) - if (infoCoeur.target?.actor.id) { + if (infoCoeur.target?.actor?.id) { // TODO: passer par une fenêtre pour saisir sa proposition (lieu, heure, ...) - const chatHtml = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-proposer-tendre-moment.hbs`, infoCoeur) const chatMessage = await ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(infoCoeur.target?.actor.name), - content: chatHtml + whisper: ChatUtility.getOwners(infoCoeur.target.actor), + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-proposer-tendre-moment.hbs`, infoCoeur) }) RdDCoeur.addTagsInfoCoeur(infoCoeur, chatMessage) } @@ -127,7 +127,7 @@ export class RdDCoeur { } const chatHtml = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-accepter-tendre-moment.hbs`, infoCoeur) const chatMessage = await ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(infoCoeur.source?.actor.name, infoCoeur.target?.actor.name), + whisper: ChatUtility.getMultipleActorsOwners(infoCoeur.source?.actor, infoCoeur.target?.actor), content: chatHtml }) RdDCoeur.addTagsInfoCoeur(infoCoeur, chatMessage) @@ -142,7 +142,7 @@ export class RdDCoeur { ChatUtility.removeChatMessageId(infoCoeur.chatMessageId) const chatHtml = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/coeur/chat-refuser-tendre-moment.hbs`, infoCoeur) await ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(infoCoeur.source?.actor.name, infoCoeur.target?.actor.name), + whisper: ChatUtility.getMultipleActorsOwners(infoCoeur.source?.actor, infoCoeur.target?.actor), content: chatHtml }); } diff --git a/module/dialog-create-signedraconique.js b/module/dialog-create-signedraconique.js index 48cc1654..0f50f21c 100644 --- a/module/dialog-create-signedraconique.js +++ b/module/dialog-create-signedraconique.js @@ -48,7 +48,7 @@ export class DialogCreateSigneDraconique extends Dialog { async _createSigneForActor(actor, signe) { actor.createEmbeddedDocuments("Item", [signe]); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name), + whisper: ChatUtility.getOwners(actor), content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html", { signe: signe, alias: actor.name diff --git a/module/item/blessure.js b/module/item/blessure.js index 04db4238..14c63724 100644 --- a/module/item/blessure.js +++ b/module/item/blessure.js @@ -62,7 +62,7 @@ export class RdDItemBlessure extends RdDItem { content: `Blessure ${definition.label} appliquée à ${actor.name}`+ `
Perte d'endurance : ${lostEndurance}`+ `
Perte de Vie : ${lostVie}`, - whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name) + whisper: ChatUtility.getOwners(actor) }); } diff --git a/module/rdd-combat.js b/module/rdd-combat.js index be55bc5a..68947438 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -54,10 +54,10 @@ export class RdDCombatManager extends Combat { /* -------------------------------------------- */ async onPreDeleteCombat() { if (Misc.isUniqueConnectedGM()) { - await this.finDeRound({ terminer: true }); + await this.finDeRound({ terminer: true }) ChatUtility.removeChatMessageContaining(`
`) game.messages.filter(m => ChatUtility.getMessageData(m, 'attacker-roll') != undefined && ChatUtility.getMessageData(m, 'defender-roll') != undefined) - .forEach(it => it.delete()); + .forEach(it => it.delete()) RdDEmpoignade.deleteAllEmpoignades() } } @@ -698,7 +698,7 @@ export class RdDCombat { if (this.defender.isEntite([ENTITE_BLURETTE])) { ChatMessage.create({ content: `La cible est une blurette, l'arme à distance sera perdue dans le blurêve`, - whisper: ChatMessage.getWhisperRecipients("GM") + whisper: ChatUtility.getGMs() }) } else { @@ -721,7 +721,7 @@ export class RdDCombat { activite: activite, total: total }), - whisper: ChatMessage.getWhisperRecipients("GM") + whisper: ChatUtility.getGMs() }) } } @@ -846,7 +846,7 @@ export class RdDCombat { const choixParticuliere = await ChatMessage.create({ alias: this.attacker.name, - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name), + whisper: ChatUtility.getOwners(this.attacker), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-particuliere.html', { alias: this.attacker.name, attackerId: this.attackerId, @@ -933,7 +933,7 @@ export class RdDCombat { // message privé: du défenseur à lui même (et aux GMs) speaker: ChatMessage.getSpeaker(this.defender, canvas.tokens.get(this.defenderTokenId)), alias: this.attacker.name, - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.defender.name), + whisper: ChatUtility.getOwners(this.defender), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.html', paramDemandeDefense), }); // flag pour garder les jets d'attaque/defense @@ -976,7 +976,7 @@ export class RdDCombat { /* -------------------------------------------- */ async _onAttaqueEchecTotal(attackerRoll) { const choixEchecTotal = await ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.attacker.name), + whisper: ChatUtility.getOwners(this.attacker), content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-attaque-etotal.html', { attackerId: this.attackerId, attacker: this.attacker, @@ -994,9 +994,9 @@ export class RdDCombat { const arme = rollData.arme; const avecArme = !['', 'sans-armes', 'armes-naturelles'].includes(arme?.system.categorie_parade ?? ''); const action = (rollData.attackerRoll ? (arme ? "la parade" : "l'esquive") : "l'attaque"); - ChatUtility.createChatWithRollMode(this.defender.name, { - content: `Maladresse à ${action}! ` + await RdDRollTables.getMaladresse({ arme: avecArme }) - }); + ChatUtility.createChatWithRollMode( + { content: `Maladresse à ${action}! ` + await RdDRollTables.getMaladresse({ arme: avecArme }) }, + this.defender) } /* -------------------------------------------- */ @@ -1076,9 +1076,9 @@ export class RdDCombat { console.log("RdDCombat._onParadeParticuliere >>>", defenderRoll); if (!defenderRoll.attackerRoll.isPart) { // TODO: attaquant doit jouer résistance et peut être désarmé p132 - ChatUtility.createChatWithRollMode(this.defender.name, { - content: `(à gérer) L'attaquant doit jouer résistance et peut être désarmé (p132)` - }); + ChatUtility.createChatWithRollMode( + { content: `(à gérer) L'attaquant doit jouer résistance et peut être désarmé (p132)` }, + this.defender) } } @@ -1152,9 +1152,9 @@ export class RdDCombat { /* -------------------------------------------- */ _onEsquiveParticuliere(rollData) { console.log("RdDCombat._onEsquiveParticuliere >>>", rollData); - ChatUtility.createChatWithRollMode(this.defender.name, { - content: "Vous pouvez esquiver une deuxième fois!" - }); + ChatUtility.createChatWithRollMode( + { content: "Vous pouvez esquiver une deuxième fois!" }, + this.defender); } /* -------------------------------------------- */ @@ -1322,10 +1322,10 @@ export class RdDCombat { await ChatMessage.create({ content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-acteur.hbs`, formData), alias: actor.name - }); + }) await ChatMessage.create({ content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-actor-turn-sante.hbs`, formData), - whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name), + whisper: ChatUtility.getOwners(actor), alias: actor.name }); } diff --git a/module/rdd-commands.js b/module/rdd-commands.js index 03b0ba8e..fcaa5b4f 100644 --- a/module/rdd-commands.js +++ b/module/rdd-commands.js @@ -17,6 +17,7 @@ import { RdDUtility } from "./rdd-utility.js"; import { FenetreRechercheTirage } from "./tirage/fenetre-recherche-tirage.js"; import { TMRUtility } from "./tmr-utility.js"; import { DialogFatigueVoyage } from "./voyage/dialog-fatigue-voyage.js"; +import { ChatUtility } from "./chat-utility.js"; const rddRollNumeric = /^(\d+)\s*([\+\-]?\d+)?\s*(s)?/; @@ -206,26 +207,20 @@ export class RdDCommands { /* Manage chat commands */ processChatCommand(commandLine, content = '', msg = {}) { // Setup new message's visibility - let rollMode = game.settings.get("core", "rollMode"); - if (["gmroll", "blindroll"].includes(rollMode)) { - msg["whisper"] = ChatMessage.getWhisperRecipients("GM"); - } - if (rollMode === "blindroll") { - msg["blind"] = true; - } - msg["type"] = 0; + ChatUtility.applyRollMode(msg) + msg.type = 0; if (!this.commandsTable) { - this._registerCommands(); + this._registerCommands() } let command = commandLine[0].toLowerCase(); if (this._isCommandHandled(command)) { let params = commandLine.slice(1); - this._processCommand(this.commandsTable, command, params, content, msg); - return true; + this._processCommand(this.commandsTable, command, params, content, msg) + return true } - return false; + return false } _isCommandHandled(command) { @@ -300,7 +295,7 @@ export class RdDCommands { async getRencontreTMR(params) { if (params.length == 1 || params.length == 2) { return game.system.rdd.rencontresTMR.rollRencontre(params[0], params[1]) - } + } return false; } diff --git a/module/rdd-dice.js b/module/rdd-dice.js index cdc5c74f..e9003005 100644 --- a/module/rdd-dice.js +++ b/module/rdd-dice.js @@ -169,7 +169,7 @@ export class RdDDice { return; } - let { whisper, blind } = RdDDice._getWhisperBlind(options); + let { whisper, blind } = ChatUtility.applyRollMode({}, options?.rollMode); if (options.forceDiceResult?.total) { let terms = await RdDDice._getForcedTerms(options); if (terms) { @@ -223,24 +223,4 @@ export class RdDDice { await roll.evaluate(); return roll.total; } - - static _getWhisperBlind(options) { - let whisper = undefined; - let blind = false; - let rollMode = options.rollMode ?? game.settings.get("core", "rollMode"); - switch (rollMode) { - case "blindroll": //GM only - blind = true; - case "gmroll": //GM + rolling player - whisper = ChatUtility.getUsers(user => user.isGM); - break; - case "roll": //everybody - whisper = ChatUtility.getUsers(user => user.active); - break; - case "selfroll": - whisper = [game.user.id]; - break; - } - return { whisper, blind }; - } } \ No newline at end of file diff --git a/module/rdd-empoignade.js b/module/rdd-empoignade.js index 81c3b965..50307a4e 100644 --- a/module/rdd-empoignade.js +++ b/module/rdd-empoignade.js @@ -158,9 +158,12 @@ export class RdDEmpoignade { empoignade = empoignade ?? (await RdDEmpoignade.createEmpoignade(attacker, defender)) //console.log("W.", empoignade, defender.hasArmeeMeleeEquipee()) if ((isNouvelle || empoignade.system.pointsemp == 0) && defender.hasArmeeMeleeEquipee()) { - ChatUtility.createChatWithRollMode(attacker.name, { - content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-valider.html`, { attacker: attacker, defender: defender }) - }) + ChatUtility.createChatWithRollMode( + { + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-valider.html`, { attacker: attacker, defender: defender }) + }, + attacker + ) } else { await this.onAttaqueEmpoignadeValidee(attacker, defender) } @@ -213,7 +216,7 @@ export class RdDEmpoignade { competence: attacker.getCompetenceCorpsACorps() } const msg = await ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(attacker.name), + whisper: ChatUtility.getOwners(attacker), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-empoignade-immobilise.html`, rollData) }) RdDEmpoignade.$storeRollEmpoignade(msg, rollData); @@ -300,7 +303,7 @@ export class RdDEmpoignade { /* -------------------------------------------- */ static async $onRollContrerLiberer(rollData) { let empoignade = rollData.empoignade - + if (rollData.mode == "contrer-empoigner" && !rollData.rolled.isSuccess) { empoignade.system.pointsemp++ RdDEmpoignade.$updateEtatEmpoignade(empoignade) @@ -309,7 +312,7 @@ export class RdDEmpoignade { empoignade.system.pointsemp-- RdDEmpoignade.$updateEtatEmpoignade(empoignade) } - + await RdDResolutionTable.displayRollData(rollData, rollData.defender, 'chat-empoignade-resultat.html') if (empoignade.system.pointsemp >= 2) { let msg = await RdDResolutionTable.displayRollData(rollData, rollData.attacker, 'chat-empoignade-entrainer.html'); diff --git a/module/rdd-main.js b/module/rdd-main.js index ca9b5fc4..18778107 100644 --- a/module/rdd-main.js +++ b/module/rdd-main.js @@ -116,11 +116,11 @@ export class SystemReveDeDragon { this.AppAstrologie = AppAstrologie console.log(`Initializing Reve de Dragon System Settings`) - + // preload handlebars templates RdDUtility.preloadHandlebarsTemplates() AppPersonnageAleatoire.preloadHandlebars() - + /* -------------------------------------------- */ ReglesOptionnelles.initSettings() OptionsAvancees.initSettings() @@ -131,13 +131,13 @@ export class SystemReveDeDragon { DialogChronologie.initSettings() RdDTMRDialog.initSettings() Environnement.initSettings() - + this.initSettings() - + /* -------------------------------------------- */ // Set an initiative formula for the system CONFIG.Combat.initiative = { formula: "1+(1d6/10)", decimals: 2 } - + /* -------------------------------------------- */ console.log(`Initializing Reve de Dragon Socket handlers`) game.socket.on(SYSTEM_SOCKET_ID, async (sockmsg) => { @@ -151,7 +151,7 @@ export class SystemReveDeDragon { console.error('game.socket.on(SYSTEM_SOCKET_ID) Exception: ', sockmsg, ' => ', e) } }) - + /* -------------------------------------------- */ // Define custom Entity classes console.log(`Initializing Reve de Dragon Documents`) @@ -163,7 +163,7 @@ export class SystemReveDeDragon { ajustementsConditions: RdDUtility.getAjustementsConditions(), difficultesLibres: RdDUtility.getDifficultesLibres() } - + /* -------------------------------------------- */ // Register sheet application classes Actors.unregisterSheet("core", ActorSheet) @@ -174,7 +174,7 @@ export class SystemReveDeDragon { Actors.registerSheet(SYSTEM_RDD, RdDActorEntiteSheet, { types: ["entite"], makeDefault: true }) Items.unregisterSheet("core", ItemSheet) await RdDActorExportSheet.init() - + RdDItemSheet.register(RdDSigneDraconiqueItemSheet) RdDItemSheet.register(RdDRencontreItemSheet) RdDItemSheet.register(RdDConteneurItemSheet) @@ -184,7 +184,7 @@ export class SystemReveDeDragon { RdDItemSheet.register(RdDIngredientItemSheet) RdDItemSheet.register(RdDServiceItemSheet) RdDItemSheet.register(RdDBlessureItemSheet) - + Items.registerSheet(SYSTEM_RDD, RdDItemInventaireSheet, { types: [ "objet", "arme", "armure", "livre", "potion", "munition", @@ -204,7 +204,8 @@ export class SystemReveDeDragon { // préparation des différents modules console.log(`Initializing Reve de Dragon Hooks and handlers`) CONFIG.Combat.documentClass = RdDCombatManager - RdDUtility.init() + ChatUtility.init() + RdDUtility.initHooks() RdDDice.init() RdDCommands.init() RdDCombatManager.init() diff --git a/module/rdd-meteo.js b/module/rdd-meteo.js index 8a705747..6b4266b3 100644 --- a/module/rdd-meteo.js +++ b/module/rdd-meteo.js @@ -1,3 +1,4 @@ +import { ChatUtility } from "./chat-utility.js" const vents = [ { min: 0, max: 0, valeur: 'Calme' }, @@ -117,7 +118,7 @@ export class RdDMeteo { ChatMessage.create({ content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-resultat-meteo.html', meteo), - whisper: ChatMessage.getWhisperRecipients('GM') + whisper: ChatUtility.getGMs() }); } diff --git a/module/rdd-namegen.js b/module/rdd-namegen.js index 80a47450..a5f27067 100644 --- a/module/rdd-namegen.js +++ b/module/rdd-namegen.js @@ -1,4 +1,5 @@ import { RdDBaseActor } from "./actor/base-actor.js"; +import { ChatUtility } from "./chat-utility.js"; import { Misc } from "./misc.js"; import { RdDDice } from "./rdd-dice.js"; @@ -15,7 +16,7 @@ export class RdDNameGen { const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-command-nom.html`, { nom: await RdDNameGen.generate() }); - ChatMessage.create({ content: html, whisper: ChatMessage.getWhisperRecipients("GM") }); + ChatMessage.create({ content: html, whisper: ChatUtility.getGMs() }); } static async generate() { diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index f8b341e2..d231370c 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -91,13 +91,14 @@ export class RdDResolutionTable { /* -------------------------------------------- */ static async displayRollData(rollData, actor = undefined, template = 'chat-resultat-general.html') { - return await ChatUtility.createChatWithRollMode(RdDResolutionTable.actorChatName(actor), { - content: await RdDResolutionTable.buildRollDataHtml(rollData, template) - }); + return await ChatUtility.createChatWithRollMode( + { content: await RdDResolutionTable.buildRollDataHtml(rollData, template) }, + actor + ) } static actorChatName(actor) { - return actor?.name ?? game.user.name; + return actor ?? game.user.name; } /* -------------------------------------------- */ @@ -138,14 +139,14 @@ export class RdDResolutionTable { if (carac == 0) { return NaN; } - if (rolled >= carac){ - const upper = Math.ceil(rolled/carac); - return 2*upper -10 + if (rolled >= carac) { + const upper = Math.ceil(rolled / carac); + return 2 * upper - 10 } - if (rolled > Math.floor(carac/2)) { + if (rolled > Math.floor(carac / 2)) { return -8 } - if (rolled > Math.floor(carac/4)) { + if (rolled > Math.floor(carac / 4)) { return -9 } if (rolled > 1) { @@ -265,7 +266,7 @@ export class RdDResolutionTable { } /* -------------------------------------------- */ - static subTable(carac, level, delta = { carac: 2, level: 5}) { + static subTable(carac, level, delta = { carac: 2, level: 5 }) { return { carac, level, @@ -287,8 +288,8 @@ export class RdDResolutionTable { carac: carac, difficulte: level, min: minLevel, - rows: Misc.intArray(minCarac, maxCarac+1), - cols: Misc.intArray(minLevel, maxLevel+1) + rows: Misc.intArray(minCarac, maxCarac + 1), + cols: Misc.intArray(minLevel, maxLevel + 1) }); } diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index eab55338..a80eaba3 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -50,7 +50,7 @@ export class RdDTMRDialog extends Dialog { await PixiTMR.init() let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-tmr.html', tmrData); if (tmrData.mode != 'visu' && !game.user.isGM) { - ChatMessage.create({ content: actor.name + " est monté dans les TMR en mode : " + tmrData.mode, whisper: ChatMessage.getWhisperRecipients("GM") }); + ChatMessage.create({ content: actor.name + " est monté dans les TMR en mode : " + tmrData.mode, whisper: ChatUtility.getGMs() }); } return new RdDTMRDialog(html, actor, tmrData) } @@ -82,7 +82,7 @@ export class RdDTMRDialog extends Dialog { this.rencontreState = 'aucune'; this.subdialog = undefined this.displaySize = undefined - if (!this.viewOnly) { + if (!this.viewOnly && !game.user.isGM) { this._tellToGM(this.actor.name + " monte dans les terres médianes (" + tmrData.mode + ")"); } this.callbacksOnAnimate = []; @@ -496,7 +496,7 @@ export class RdDTMRDialog extends Dialog { rencData.message = this.formatMessageRencontre(rencData, result.message); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(this.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-rencontre-tmr.html`, rencData) }); @@ -571,12 +571,20 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ _tellToGM(message) { - ChatMessage.create({ content: message, user: game.user.id, whisper: ChatMessage.getWhisperRecipients("GM") }); + ChatMessage.create({ + user: game.user.id, + content: message, + whisper: ChatUtility.getGMs() + }); } /* -------------------------------------------- */ _tellToUserAndGM(message) { - ChatMessage.create({ content: message, user: game.user.id, whisper: [game.user.id].concat(ChatMessage.getWhisperRecipients("GM")) }); + ChatMessage.create({ + user: game.user.id, + content: message, + whisper: ChatUtility.getUserAndGMs() + }) } /* -------------------------------------------- */ @@ -715,7 +723,7 @@ export class RdDTMRDialog extends Dialog { } rollData.poesie = await Poetique.getExtrait(); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(this.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.html`, rollData) }); if (rollData.rolled.isEchec) { @@ -739,7 +747,7 @@ export class RdDTMRDialog extends Dialog { if (this.isCaseMaitrisee(tmr.coord)) { ChatMessage.create({ content: tmr.label + ": cette case humide est déja maitrisée grâce à votre Tête Quête des Eaux", - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatUtility.getOwners(this.actor) }); return false; } @@ -751,14 +759,14 @@ export class RdDTMRDialog extends Dialog { if (tmr.type == 'pont' && EffetsDraconiques.isPontImpraticable(this.actor)) { ChatMessage.create({ content: tmr.label + ": Vous êtes sous le coup d'une Impraticabilité des Ponts : ce pont doit être maîtrisé comme une case humide.", - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatUtility.getOwners(this.actor) }); return true; } if (this.isCaseInondee(tmr.coord)) { ChatMessage.create({ content: tmr.label + ": cette case est inondée, elle doit être maîtrisée comme une case humide.", - whisper: ChatMessage.getWhisperRecipients(game.user.name) + whisper: ChatUtility.getOwners(this.actor) }); return true; } @@ -832,7 +840,7 @@ export class RdDTMRDialog extends Dialog { } rollData.poesie = await Poetique.getExtrait(); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(this.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-maitrise-tmr.html`, rollData) }); if (rollData.rolled.isEchec) { @@ -882,17 +890,16 @@ export class RdDTMRDialog extends Dialog { const reserveSecurite = EffetsDraconiques.isReserveEnSecurite(this.actor); const reserveExtensible = this.isReserveExtensible(coord); if (!EffetsDraconiques.isUrgenceDraconique(this.actor) && (reserveSecurite || reserveExtensible)) { - const msg = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-demande-declencher-sort.hbs`, { - actor: this.actor, - sorts: sorts, - coord: coord, - tete: { reserveSecurite: reserveSecurite, reserveExtensible: reserveExtensible } - }) ChatMessage.create({ - content: msg, - whisper: ChatMessage.getWhisperRecipients(game.user.name) - }); - return; + content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-demande-declencher-sort.hbs`, { + actor: this.actor, + sorts: sorts, + coord: coord, + tete: { reserveSecurite: reserveSecurite, reserveExtensible: reserveExtensible } + }), + whisper: ChatUtility.getOwners(this.actor) + }) + return } await this.processSortReserve(sorts[0]); } @@ -906,9 +913,8 @@ export class RdDTMRDialog extends Dialog { this.processSortReserve(sort); } else { ChatMessage.create({ - content: - "Une erreur est survenue : impossible de récupérer le sort en réserve demandé.", - whisper: ChatMessage.getWhisperRecipients(game.user.name), + content: "Une erreur est survenue : impossible de récupérer le sort en réserve demandé.", + whisper: ChatUtility.getOwners(this.actor) }); } } @@ -1091,7 +1097,7 @@ export class RdDTMRDialog extends Dialog { async notifierResonanceSigneDraconique(coord) { if (!this.viewOnly && this.actor.isResonanceSigneDraconique(coord)) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(this.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-resonance.html`, { alias: this.actor.name, typeTMR: TMRUtility.getTMRType(coord) }) }); } diff --git a/module/rdd-utility.js b/module/rdd-utility.js index 9b43c877..20b10526 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -99,9 +99,7 @@ export class RdDUtility { // persistent handling of conteneur show/hide static afficheContenu = {} /* -------------------------------------------- */ - 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 async initHooks() { Hooks.on('renderChatLog', (log, html, chatLog) => RdDUtility.chatListeners(html)) } @@ -292,7 +290,7 @@ export class RdDUtility { Handlebars.registerHelper('array-includes', (array, value) => array.includes(value)); Handlebars.registerHelper('min', (...args) => Math.min(...args.slice(0, -1))); - Handlebars.registerHelper('isLastIndex', (index, list) => index+1 >= list.length); + Handlebars.registerHelper('isLastIndex', (index, list) => index + 1 >= list.length); Handlebars.registerHelper('regle-optionnelle', (option) => ReglesOptionnelles.isUsing(option)); Handlebars.registerHelper('trier', list => list.sort((a, b) => a.name.localeCompare(b.name))); Handlebars.registerHelper('filtreTriCompetences', competences => RdDItemCompetence.triVisible(competences)); @@ -645,18 +643,16 @@ export class RdDUtility { /* -------------------------------------------- */ static onSocketMessage(sockmsg) { switch (sockmsg.msg) { - case "msg_gm_chat_message": - return ChatUtility.handleGMChatMessage(sockmsg.data); case "msg_app_astrologie_refresh": - return Hooks.callAll(APP_ASTROLOGIE_REFRESH); + return Hooks.callAll(APP_ASTROLOGIE_REFRESH) case "msg_request_nombre_astral": - return game.system.rdd.calendrier.requestNombreAstral(sockmsg.data); + return game.system.rdd.calendrier.requestNombreAstral(sockmsg.data) case "msg_tmr_move": let actor = game.actors.get(sockmsg.data.actorId); if (actor.isOwner || game.user.isGM) { - actor.refreshTMRView(); + actor.refreshTMRView() } - break; + break } } @@ -808,17 +804,13 @@ export class RdDUtility { user: game.user.id, rollMode: modeOverride || game.settings.get("core", "rollMode"), content: content - }; - - if (["gmroll", "blindroll"].includes(chatData.rollMode)) chatData["whisper"] = ChatMessage.getWhisperRecipients("GM").map(u => u.id); - if (chatData.rollMode === "blindroll") chatData["blind"] = true; - else if (chatData.rollMode === "selfroll") chatData["whisper"] = [game.user]; + } + ChatUtility.applyRollMode(chatData) if (forceWhisper) { // Final force ! - chatData["speaker"] = ChatMessage.getSpeaker(); - chatData["whisper"] = ChatMessage.getWhisperRecipients(forceWhisper); + chatData.speaker = ChatMessage.getSpeaker(); + chatData.whisper = ChatMessage.getWhisperRecipients(forceWhisper); } - return chatData; } @@ -881,7 +873,7 @@ export class RdDUtility { const current = game.system.rdd.calendrier.heureCourante(); ChatMessage.create({ content: `A l'heure de ${current.label}, le modificateur de Chance/Malchance est de ${Misc.toSignedString(ajustement)} pour l'heure de naissance ${heure.label}.`, - whisper: ChatMessage.getWhisperRecipients("GM") + whisper: ChatUtility.getGMs() }); } else if (heureNaissance) { @@ -900,7 +892,7 @@ export class RdDUtility { if (compName.includes('Thanatos')) { let message = "Vous avez mis des points d'Expérience dans la Voie de Thanatos !
Vous devez réduire manuellement d'un même montant d'XP une autre compétence Draconique."; ChatMessage.create({ - whisper: ChatMessage.getWhisperRecipients(game.user.name), + whisper: ChatUtility.getUserAndGMs(), content: message }); } diff --git a/module/settings/system-compendiums.js b/module/settings/system-compendiums.js index 31321d6d..2a405b06 100644 --- a/module/settings/system-compendiums.js +++ b/module/settings/system-compendiums.js @@ -291,7 +291,7 @@ export class CompendiumTableHelpers { sound: CONFIG.sounds.dice, content: flavorContent }; - await ChatUtility.createChatWithRollMode(game.user.id, messageData) + await ChatUtility.createChatWithRollMode(messageData) } /* -------------------------------------------- */ @@ -304,10 +304,10 @@ export class CompendiumTableHelpers { }); const messageData = { user: game.user.id, - whisper: game.user.id, + whisper: [game.user], content: flavorContent }; - await ChatUtility.createChatWithRollMode(game.user.id, messageData) + await ChatUtility.createChatWithRollMode(messageData) } } \ No newline at end of file diff --git a/module/tmr/effets-rencontres.js b/module/tmr/effets-rencontres.js index 0ab7ebcb..898877c7 100644 --- a/module/tmr/effets-rencontres.js +++ b/module/tmr/effets-rencontres.js @@ -30,7 +30,7 @@ export class EffetsRencontre { static $reve_plus = async (actor, reve) => { if (!ReglesOptionnelles.isUsing("recuperation-reve") && reve < 0) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(actor.name), + whisper: ChatUtility.getOwners(actor), content: `Pas de récupération de rêve (${reve} points ignorés)` }); return @@ -112,7 +112,7 @@ export class EffetsRencontre { poesie: await Poetique.getExtrait() }) ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(context.actor.name), + whisper: ChatUtility.getOwners(context.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.html`, context) }); } @@ -127,7 +127,7 @@ export class EffetsRencontre { } ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(this.name), + whisper: ChatUtility.getOwners(context.actor), content: await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/chat-resultat-reve-de-dragon.html`, context) }); } diff --git a/module/tmr/present-cites.js b/module/tmr/present-cites.js index 1b00a8b0..6112928a 100644 --- a/module/tmr/present-cites.js +++ b/module/tmr/present-cites.js @@ -28,7 +28,7 @@ export class PresentCites extends Draconique { let existants = actor.items.filter(it => this.isCase(it)).map(it => it.system.coord); if (existants.length > 0) { ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(actor), content: "Vous avez encore des présents dans des cités, vous devrez tirer une autre tête pour remplacer celle ci!" }) } diff --git a/module/tmr/urgence-draconique.js b/module/tmr/urgence-draconique.js index f3c00769..8ecbe572 100644 --- a/module/tmr/urgence-draconique.js +++ b/module/tmr/urgence-draconique.js @@ -19,7 +19,7 @@ export class UrgenceDraconique extends Draconique { // La queue se transforme en idée fixe const ideeFixe = await RdDRollTables.getIdeeFixe(); ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(game.user.name), + whisper: ChatUtility.getOwners(actor), content: `En l'absence de sorts en réserve, l'urgence draconique de ${actor.name} se transforme en ${ideeFixe.name}` }); await actor.createEmbeddedDocuments('Item', [ideeFixe]); diff --git a/module/voyage/dialog-fatigue-voyage.js b/module/voyage/dialog-fatigue-voyage.js index 591c1942..e4caa365 100644 --- a/module/voyage/dialog-fatigue-voyage.js +++ b/module/voyage/dialog-fatigue-voyage.js @@ -175,7 +175,7 @@ export class DialogFatigueVoyage extends Dialog { .forEach(async it => { const perteFatigue = fatigueBase + it.ajustement ChatMessage.create({ - whisper: ChatUtility.getWhisperRecipientsAndGMs(it.actor.name), + whisper: ChatUtility.getOwners(it.actor), content: await renderTemplate( 'systems/foundryvtt-reve-de-dragon/templates/voyage/chat-fatigue_voyage.hbs', foundry.utils.mergeObject(it,