fix(core): 🐛 优化 Telegram 机器人验证逻辑与话题同步
在用户发送消息时增加对已验证状态和屏蔽状态的检查。如果用户已验证且未被屏蔽, 直接发送提示信息告知其可以直接交流。同时,引入了 topic_id 检查以支持话题 资料同步功能。 主要变更: - 增加 syncTopicProfile 调用以同步话题信息 - 优化用户验证状态的逻辑判断 - 为已验证用户添加自动回复提示
This commit is contained in:
@@ -507,6 +507,14 @@ async function handlePrivate(msg, env, ctx) {
|
|||||||
if (text === "/start") {
|
if (text === "/start") {
|
||||||
if (isAdm && ctx) ctx.waitUntil(registerCommands(env));
|
if (isAdm && ctx) ctx.waitUntil(registerCommands(env));
|
||||||
if (!isAdm) {
|
if (!isAdm) {
|
||||||
|
if (u.topic_id) await syncTopicProfile(u, msg.from, env);
|
||||||
|
if (u.user_state === 'verified' && !u.is_blocked) {
|
||||||
|
return api(env.BOT_TOKEN, "sendMessage", {
|
||||||
|
chat_id: id,
|
||||||
|
text: "✅ 您已经完成验证,可以直接发送消息,我会帮您转达给管理员。",
|
||||||
|
reply_to_message_id: msg.message_id
|
||||||
|
});
|
||||||
|
}
|
||||||
await updUser(id, { user_state: 'new' }, env);
|
await updUser(id, { user_state: 'new' }, env);
|
||||||
u.user_state = 'new';
|
u.user_state = 'new';
|
||||||
}
|
}
|
||||||
@@ -563,8 +571,17 @@ async function sendStart(id, msg, env) {
|
|||||||
const u = await getUser(id, env);
|
const u = await getUser(id, env);
|
||||||
if (u.topic_id) {
|
if (u.topic_id) {
|
||||||
try {
|
try {
|
||||||
const success = await sendInfoCardToTopic(env, u, msg.from, u.topic_id);
|
await syncTopicProfile(u, msg.from, env);
|
||||||
if (!success) await updUser(id, { topic_id: null }, env);
|
if (!u.user_info.card_msg_id) {
|
||||||
|
const cardId = await sendInfoCardToTopic(env, u, msg.from, u.topic_id);
|
||||||
|
if (cardId) {
|
||||||
|
u.user_info.card_msg_id = cardId;
|
||||||
|
u.user_info.join_date = msg.date || (Date.now()/1000);
|
||||||
|
await updUser(id, { user_info: u.user_info }, env);
|
||||||
|
} else {
|
||||||
|
await updUser(id, { topic_id: null }, env);
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (e) { await updUser(id, { topic_id: null }, env); }
|
} catch (e) { await updUser(id, { topic_id: null }, env); }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -687,9 +704,7 @@ async function relayToTopic(msg, u, env) {
|
|||||||
|
|
||||||
// 1. 动态检测并同步用户基础标识信息变更
|
// 1. 动态检测并同步用户基础标识信息变更
|
||||||
if (u.user_info.name !== uMeta.name || u.user_info.username !== uMeta.username) {
|
if (u.user_info.name !== uMeta.name || u.user_info.username !== uMeta.username) {
|
||||||
u.user_info.name = uMeta.name; u.user_info.username = uMeta.username;
|
await syncTopicProfile(u, msg.from, env);
|
||||||
await updUser(uid, { user_info: u.user_info }, env);
|
|
||||||
if (u.topic_id) api(env.BOT_TOKEN, "editForumTopic", { chat_id: env.ADMIN_GROUP_ID, message_thread_id: u.topic_id, name: uMeta.topicName }).catch(e=>{});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 线程池资源申请:建立独立话题
|
// 2. 线程池资源申请:建立独立话题
|
||||||
@@ -703,6 +718,7 @@ async function relayToTopic(msg, u, env) {
|
|||||||
const t = await api(env.BOT_TOKEN, "createForumTopic", { chat_id: env.ADMIN_GROUP_ID, name: uMeta.topicName });
|
const t = await api(env.BOT_TOKEN, "createForumTopic", { chat_id: env.ADMIN_GROUP_ID, name: uMeta.topicName });
|
||||||
tid = t.message_thread_id.toString();
|
tid = t.message_thread_id.toString();
|
||||||
u.user_info.card_msg_id = null;
|
u.user_info.card_msg_id = null;
|
||||||
|
u.user_info.topic_name = uMeta.topicName;
|
||||||
const dummy = await api(env.BOT_TOKEN, "sendMessage", { chat_id: env.ADMIN_GROUP_ID, message_thread_id: tid, text: "✨ 正在加载用户资料...", disable_notification: true });
|
const dummy = await api(env.BOT_TOKEN, "sendMessage", { chat_id: env.ADMIN_GROUP_ID, message_thread_id: tid, text: "✨ 正在加载用户资料...", disable_notification: true });
|
||||||
u.user_info.dummy_msg_id = dummy.message_id;
|
u.user_info.dummy_msg_id = dummy.message_id;
|
||||||
await updUser(uid, { topic_id: tid, user_info: u.user_info }, env);
|
await updUser(uid, { topic_id: tid, user_info: u.user_info }, env);
|
||||||
@@ -1307,6 +1323,38 @@ const getUMeta = (tgUser, dbUser, d) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
async function syncTopicProfile(u, tgUser, env) {
|
||||||
|
const meta = getUMeta(tgUser, u, Date.now() / 1000);
|
||||||
|
const nextInfo = { ...(u.user_info || {}) };
|
||||||
|
let dirty = false;
|
||||||
|
|
||||||
|
if (nextInfo.name !== meta.name) {
|
||||||
|
nextInfo.name = meta.name;
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
if (nextInfo.username !== meta.username) {
|
||||||
|
nextInfo.username = meta.username;
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (u.topic_id && meta.topicName && nextInfo.topic_name !== meta.topicName) {
|
||||||
|
await api(env.BOT_TOKEN, "editForumTopic", {
|
||||||
|
chat_id: env.ADMIN_GROUP_ID,
|
||||||
|
message_thread_id: u.topic_id,
|
||||||
|
name: meta.topicName
|
||||||
|
}).catch(() => {});
|
||||||
|
nextInfo.topic_name = meta.topicName;
|
||||||
|
dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dirty) {
|
||||||
|
u.user_info = nextInfo;
|
||||||
|
await updUser(u.user_id, { user_info: nextInfo }, env);
|
||||||
|
}
|
||||||
|
|
||||||
|
return meta;
|
||||||
|
}
|
||||||
|
|
||||||
// 动态键盘矩阵构建:受限 API 规避检查点
|
// 动态键盘矩阵构建:受限 API 规避检查点
|
||||||
const getBtns = (id, blk, username) => {
|
const getBtns = (id, blk, username) => {
|
||||||
const btns = [];
|
const btns = [];
|
||||||
|
|||||||
Reference in New Issue
Block a user