Previously, when replying in Discord threads, the replyToMode setting was ignored because existingId was checked before replyToMode. This caused reply references to be added even when replyToMode was set to 'off'. This fix moves the replyToMode check before the existingId check, ensuring that replyToMode: 'off' is respected in all contexts including threads.
57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
import type { ReplyToMode } from "../../config/types.js";
|
|
|
|
export type ReplyReferencePlanner = {
|
|
/** Returns the effective reply/thread id for the next send and updates state. */
|
|
use(): string | undefined;
|
|
/** Mark that a reply was sent (needed when no reference is used). */
|
|
markSent(): void;
|
|
/** Whether a reply has been sent in this flow. */
|
|
hasReplied(): boolean;
|
|
};
|
|
|
|
export function createReplyReferencePlanner(options: {
|
|
replyToMode: ReplyToMode;
|
|
/** Existing thread/reference id (used when present, unless replyToMode is "off"). */
|
|
existingId?: string;
|
|
/** Id to start a new thread/reference when allowed (e.g., parent message id). */
|
|
startId?: string;
|
|
/** Disable reply references entirely (e.g., when posting inside a new thread). */
|
|
allowReference?: boolean;
|
|
/** Seed the planner with prior reply state. */
|
|
hasReplied?: boolean;
|
|
}): ReplyReferencePlanner {
|
|
let hasReplied = options.hasReplied ?? false;
|
|
const allowReference = options.allowReference !== false;
|
|
const existingId = options.existingId?.trim();
|
|
const startId = options.startId?.trim();
|
|
|
|
const use = (): string | undefined => {
|
|
if (!allowReference) return undefined;
|
|
if (options.replyToMode === "off") return undefined;
|
|
if (existingId) {
|
|
hasReplied = true;
|
|
return existingId;
|
|
}
|
|
if (!startId) return undefined;
|
|
if (options.replyToMode === "all") {
|
|
hasReplied = true;
|
|
return startId;
|
|
}
|
|
if (!hasReplied) {
|
|
hasReplied = true;
|
|
return startId;
|
|
}
|
|
return undefined;
|
|
};
|
|
|
|
const markSent = () => {
|
|
hasReplied = true;
|
|
};
|
|
|
|
return {
|
|
use,
|
|
markSent,
|
|
hasReplied: () => hasReplied,
|
|
};
|
|
}
|