Telegram-user: add ack reactions + fix typing
This commit is contained in:
parent
c9fe83b3f7
commit
d2b3a5102e
@ -2,6 +2,7 @@ import type { TelegramClient } from "@mtcute/node";
|
|||||||
import type { MessageContext } from "@mtcute/dispatcher";
|
import type { MessageContext } from "@mtcute/dispatcher";
|
||||||
import type { RuntimeEnv } from "clawdbot/plugin-sdk";
|
import type { RuntimeEnv } from "clawdbot/plugin-sdk";
|
||||||
|
|
||||||
|
import { resolveAckReaction } from "clawdbot/plugin-sdk";
|
||||||
import { getTelegramUserRuntime } from "../runtime.js";
|
import { getTelegramUserRuntime } from "../runtime.js";
|
||||||
import type { CoreConfig, TelegramUserAccountConfig } from "../types.js";
|
import type { CoreConfig, TelegramUserAccountConfig } from "../types.js";
|
||||||
import { sendMediaTelegramUser, sendMessageTelegramUser } from "../send.js";
|
import { sendMediaTelegramUser, sendMessageTelegramUser } from "../send.js";
|
||||||
@ -57,6 +58,14 @@ function isSenderAllowed(params: {
|
|||||||
return parsed.usernames.has(username.replace(/^@/, ""));
|
return parsed.usernames.has(username.replace(/^@/, ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function resolveTelegramUserPeer(target: string): number | string {
|
||||||
|
if (/^-?\d+$/.test(target)) {
|
||||||
|
const parsed = Number.parseInt(target, 10);
|
||||||
|
if (Number.isFinite(parsed)) return parsed;
|
||||||
|
}
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
async function resolveMediaAttachment(params: {
|
async function resolveMediaAttachment(params: {
|
||||||
client: TelegramClient;
|
client: TelegramClient;
|
||||||
mediaMaxMb: number;
|
mediaMaxMb: number;
|
||||||
@ -110,6 +119,7 @@ export function createTelegramUserMessageHandler(params: TelegramUserHandlerPara
|
|||||||
if ("isSelf" in sender && sender.isSelf) return;
|
if ("isSelf" in sender && sender.isSelf) return;
|
||||||
|
|
||||||
const senderId = String(sender.id);
|
const senderId = String(sender.id);
|
||||||
|
const senderPeer = resolveTelegramUserPeer(senderId);
|
||||||
const senderUsername = "username" in sender ? sender.username : null;
|
const senderUsername = "username" in sender ? sender.username : null;
|
||||||
const senderName = "displayName" in sender ? sender.displayName : senderId;
|
const senderName = "displayName" in sender ? sender.displayName : senderId;
|
||||||
const storeAllowFrom = await core.channel.pairing
|
const storeAllowFrom = await core.channel.pairing
|
||||||
@ -170,6 +180,24 @@ export function createTelegramUserMessageHandler(params: TelegramUserHandlerPara
|
|||||||
id: senderId,
|
id: senderId,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
const ackReactionScope = cfg.messages?.ackReactionScope ?? "group-mentions";
|
||||||
|
const removeAckAfterReply = cfg.messages?.removeAckAfterReply ?? false;
|
||||||
|
const ackReaction = resolveAckReaction(cfg, route.agentId);
|
||||||
|
const shouldAckReaction =
|
||||||
|
Boolean(ackReaction) && (ackReactionScope === "all" || ackReactionScope === "direct");
|
||||||
|
const ackReactionPromise = shouldAckReaction
|
||||||
|
? client
|
||||||
|
.sendReaction({
|
||||||
|
chatId: senderPeer,
|
||||||
|
message: msg.id,
|
||||||
|
emoji: ackReaction,
|
||||||
|
})
|
||||||
|
.then(() => true)
|
||||||
|
.catch((err) => {
|
||||||
|
runtime.error?.(`telegram-user ack reaction failed: ${String(err)}`);
|
||||||
|
return false;
|
||||||
|
})
|
||||||
|
: null;
|
||||||
const storePath = core.channel.session.resolveStorePath(cfg.session?.store, {
|
const storePath = core.channel.session.resolveStorePath(cfg.session?.store, {
|
||||||
agentId: route.agentId,
|
agentId: route.agentId,
|
||||||
});
|
});
|
||||||
@ -278,7 +306,9 @@ export function createTelegramUserMessageHandler(params: TelegramUserHandlerPara
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
onReplyStart: async () => {
|
onReplyStart: async () => {
|
||||||
await client.sendTyping(senderId).catch(() => undefined);
|
await client.sendTyping(senderPeer).catch((err) => {
|
||||||
|
runtime.error?.(`telegram-user typing failed: ${String(err)}`);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
onError: (err) => {
|
onError: (err) => {
|
||||||
runtime.error?.(`telegram-user reply failed: ${String(err)}`);
|
runtime.error?.(`telegram-user reply failed: ${String(err)}`);
|
||||||
@ -292,6 +322,21 @@ export function createTelegramUserMessageHandler(params: TelegramUserHandlerPara
|
|||||||
replyOptions,
|
replyOptions,
|
||||||
});
|
});
|
||||||
markDispatchIdle();
|
markDispatchIdle();
|
||||||
|
|
||||||
|
if (removeAckAfterReply && ackReactionPromise) {
|
||||||
|
const didAck = await ackReactionPromise;
|
||||||
|
if (didAck) {
|
||||||
|
await client
|
||||||
|
.sendReaction({
|
||||||
|
chatId: senderPeer,
|
||||||
|
message: msg.id,
|
||||||
|
emoji: null,
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
runtime.error?.(`telegram-user ack reaction cleanup failed: ${String(err)}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
runtime.error?.(`telegram-user handler failed: ${String(err)}`);
|
runtime.error?.(`telegram-user handler failed: ${String(err)}`);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user