Skip to content

Commit

Permalink
Fix several issues with ItemPF2e#toMessage by using core API (found…
Browse files Browse the repository at this point in the history
  • Loading branch information
stwlam authored Dec 6, 2023
1 parent 99c40d8 commit 4bc75c1
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 30 deletions.
49 changes: 21 additions & 28 deletions src/module/item/base/document.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ import { MigrationRunnerBase } from "@module/migration/runner/base.ts";
import { RuleElementOptions, RuleElementPF2e, RuleElementSource, RuleElements } from "@module/rules/index.ts";
import { processGrantDeletions } from "@module/rules/rule-element/grant-item/helpers.ts";
import type { UserPF2e } from "@module/user/document.ts";
import { eventToRollParams } from "@scripts/sheet-util.ts";
import { EnrichmentOptionsPF2e } from "@system/text-editor.ts";
import { ErrorPF2e, isObject, setHasElement, sluggify, tupleHasValue } from "@util";
import { ErrorPF2e, htmlClosest, isObject, setHasElement, sluggify, tupleHasValue } from "@util";
import { UUIDUtils } from "@util/uuid.ts";
import * as R from "remeda";
import { AfflictionSource } from "../affliction/data.ts";
Expand Down Expand Up @@ -178,49 +179,41 @@ class ItemPF2e<TParent extends ActorPF2e | null = ActorPF2e | null> extends Item
*/
async toMessage(
event?: MouseEvent | JQuery.TriggeredEvent,
{
rollMode = undefined,
create = true,
data = {},
}: { rollMode?: RollMode; create?: boolean; data?: Record<string, unknown> } = {},
options: { rollMode?: RollMode; create?: boolean; data?: Record<string, unknown> } = {},
): Promise<ChatMessagePF2e | undefined> {
if (!this.actor) throw ErrorPF2e(`Cannot create message for unowned item ${this.name}`);

// Basic template rendering data
const template = `systems/pf2e/templates/chat/${sluggify(this.type)}-card.hbs`;
const token = this.actor.token;
const nearestItem = event?.currentTarget.closest(".item") ?? {};
const contextualData = Object.keys(data).length > 0 ? data : nearestItem.dataset || {};
const nearestItem = htmlClosest(event?.target, ".item");
const rollOptions = options.data ?? { ...(nearestItem?.dataset ?? {}) };
const templateData = {
actor: this.actor,
tokenId: token ? `${token.parent?.id}.${token.id}` : null,
item: this,
data: await this.getChatData(undefined, contextualData),
data: await this.getChatData(undefined, rollOptions),
};

// Basic chat message data
const chatData: PreCreate<foundry.documents.ChatMessageSource> = {
speaker: ChatMessagePF2e.getSpeaker({
actor: this.actor,
token: this.actor.getActiveTokens(false, true)[0] ?? null,
}),
flags: {
pf2e: { origin: this.getOriginData() },
const rollMode = options.rollMode ?? eventToRollParams(event, { type: "check" }).rollMode ?? "roll";
const chatData = ChatMessagePF2e.applyRollMode(
{
type: CONST.CHAT_MESSAGE_TYPES.OTHER,
speaker: ChatMessagePF2e.getSpeaker({
actor: this.actor,
token: this.actor.getActiveTokens(false, true).at(0),
}),
content: await renderTemplate(template, templateData),
flags: { pf2e: { origin: this.getOriginData() } },
},
type: CONST.CHAT_MESSAGE_TYPES.OTHER,
};

// Toggle default roll mode
rollMode ??= event?.ctrlKey || event?.metaKey ? "blindroll" : game.settings.get("core", "rollMode");
if (["gmroll", "blindroll"].includes(rollMode))
chatData.whisper = ChatMessagePF2e.getWhisperRecipients("GM").map((u) => u.id);
if (rollMode === "blindroll") chatData.blind = true;

// Render the template
chatData.content = await renderTemplate(template, templateData);
rollMode,
);

// Create the chat message
return create ? ChatMessagePF2e.create(chatData, { renderSheet: false }) : new ChatMessagePF2e(chatData);
return options.create ?? true
? ChatMessagePF2e.create(chatData, { rollMode, renderSheet: false })
: new ChatMessagePF2e(chatData, { rollMode });
}

/** A shortcut to `item.toMessage(..., { create: true })`, kept for backward compatibility */
Expand Down
7 changes: 5 additions & 2 deletions types/foundry/client/data/documents/chat-message.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,16 @@ declare global {
* @param rollMode The rollMode preference to apply to this message data
* @returns The modified ChatMessage data with rollMode preferences applied
*/
static applyRollMode(chatData: ChatMessage["_source"], rollMode: RollMode): ChatMessage["_source"];
static applyRollMode<TData extends DeepPartial<ChatMessage["_source"]>>(
chatData: TData,
rollMode: RollMode | "roll",
): TData;

/**
* Update the data of a ChatMessage instance to apply a requested rollMode
* @param rollMode The rollMode preference to apply to this message data
*/
applyRollMode(rollMode: RollMode): void;
applyRollMode(rollMode: RollMode | "roll"): void;

/**
* Attempt to determine who is the speaking character (and token) for a certain Chat Message
Expand Down

0 comments on commit 4bc75c1

Please sign in to comment.