bluebubbles: honor reaction mention gating (#55283)

This commit is contained in:
Jacob Tomlinson
2026-03-26 10:42:19 -07:00
committed by GitHub
parent e7e4fbcab9
commit f8c9863078
2 changed files with 60 additions and 0 deletions

View File

@@ -1658,6 +1658,19 @@ export async function processReaction(
const peerId = reaction.isGroup
? (chatGuid ?? chatIdentifier ?? (chatId ? String(chatId) : "group"))
: reaction.senderId;
const requireMention =
reaction.isGroup &&
core.channel.groups.resolveRequireMention({
cfg: config,
channel: "bluebubbles",
groupId: peerId,
accountId: account.accountId,
});
if (requireMention) {
logVerbose(core, runtime, "bluebubbles: skipping group reaction (requireMention=true)");
return;
}
const route = core.channel.routing.resolveAgentRoute({
cfg: config,

View File

@@ -1318,6 +1318,28 @@ describe("BlueBubbles webhook monitor", () => {
expect(mockEnqueueSystemEvent).not.toHaveBeenCalled();
});
it("skips group reactions when requireMention=true", async () => {
mockEnqueueSystemEvent.mockClear();
mockResolveRequireMention.mockReturnValue(true);
setupWebhookTarget({
account: createMockAccount({
groupPolicy: "open",
}),
});
const payload = createTimestampedMessageReactionPayloadForTest({
isGroup: true,
chatGuid: "iMessage;+;chat123456",
associatedMessageType: 2000,
handle: { address: "+15559999999" },
});
await dispatchWebhookPayload(payload);
expect(mockEnqueueSystemEvent).not.toHaveBeenCalled();
});
it("enqueues system event for reaction added", async () => {
mockEnqueueSystemEvent.mockClear();
@@ -1335,6 +1357,31 @@ describe("BlueBubbles webhook monitor", () => {
);
});
it("enqueues group reactions when requireMention=false", async () => {
mockEnqueueSystemEvent.mockClear();
mockResolveRequireMention.mockReturnValue(false);
setupWebhookTarget({
account: createMockAccount({
groupPolicy: "open",
}),
});
const payload = createTimestampedMessageReactionPayloadForTest({
isGroup: true,
chatGuid: "iMessage;+;chat123456",
associatedMessageType: 2000,
handle: { address: "+15559999999" },
});
await dispatchWebhookPayload(payload);
expect(mockEnqueueSystemEvent).toHaveBeenCalledWith(
expect.stringContaining("reacted with ❤️ [[reply_to:"),
expect.any(Object),
);
});
it("enqueues system event for reaction removed", async () => {
mockEnqueueSystemEvent.mockClear();