From 82355b3e31eefca63b14670740b0f3797ca00771 Mon Sep 17 00:00:00 2001 From: Tommaso Morganti Date: Tue, 14 Apr 2026 19:36:41 +0200 Subject: [PATCH 1/6] fix: do not recreate group if redis is empty --- src/middlewares/bot-membership-handler.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/middlewares/bot-membership-handler.ts b/src/middlewares/bot-membership-handler.ts index 59ad4cf..a329680 100644 --- a/src/middlewares/bot-membership-handler.ts +++ b/src/middlewares/bot-membership-handler.ts @@ -52,9 +52,12 @@ export class BotMembershipHandler> ext if (ctx.chat.type === "private") return next() const redisCheck = await this.TEMP_redis.has(ctx.chat.id.toString()) - if (redisCheck) { - const backendGroup = await api.tg.groups.getById.query({ telegramId: ctx.chat.id }).catch(() => null) - if (backendGroup !== null) return next() + if (redisCheck) return next() + + const backendGroup = await api.tg.groups.getById.query({ telegramId: ctx.chat.id }).catch(() => null) + if (backendGroup !== null) { + await this.TEMP_redis.write(ctx.chat.id.toString(), ctx.chat.id) + return next() } const me = await ctx.getChatMember(ctx.me.id).catch(() => ({ status: "undefined" })) From d603eec0a7216682252cf1ca7c91d58b36e86582 Mon Sep 17 00:00:00 2001 From: Tommaso Morganti Date: Tue, 14 Apr 2026 19:39:38 +0200 Subject: [PATCH 2/6] fix: fixed the fix --- src/middlewares/message-link.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middlewares/message-link.ts b/src/middlewares/message-link.ts index 1dd9421..487008d 100644 --- a/src/middlewares/message-link.ts +++ b/src/middlewares/message-link.ts @@ -23,7 +23,7 @@ export async function parseTelegramMessageLink(link: string): Promise<{ const chatId = chatHandle ? await api.tg.groups.getByTag .query({ tag: chatHandle }) - .then((r) => stripChatId(r?.telegramId) ?? null) + .then((r) => (r?.telegramId ? stripChatId(r.telegramId) : null)) .catch(() => null) : parseInt(match[1], 10) const messageId = match[4] ? parseInt(match[4], 10) : parseInt(match[3], 10) From 4ee32411e60dec6740523bea266120c660d34626 Mon Sep 17 00:00:00 2001 From: Tommaso Morganti Date: Tue, 14 Apr 2026 19:45:02 +0200 Subject: [PATCH 3/6] fix: add ttl --- src/middlewares/bot-membership-handler.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/middlewares/bot-membership-handler.ts b/src/middlewares/bot-membership-handler.ts index a329680..a72b49d 100644 --- a/src/middlewares/bot-membership-handler.ts +++ b/src/middlewares/bot-membership-handler.ts @@ -42,6 +42,7 @@ export class BotMembershipHandler> ext redis, prefix: "TEMP_groups", logger, + ttl: 60 * 60 * 24, // 1 day, just in case }) constructor() { From 18d42f8ae20cbe281fd2d2ebbbf3e44ce77d23b1 Mon Sep 17 00:00:00 2001 From: Lorenzo Corallo Date: Fri, 17 Apr 2026 18:30:00 +0200 Subject: [PATCH 4/6] perf: fill redis once to avoid too many backend calls --- src/middlewares/bot-membership-handler.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/middlewares/bot-membership-handler.ts b/src/middlewares/bot-membership-handler.ts index a72b49d..e864e68 100644 --- a/src/middlewares/bot-membership-handler.ts +++ b/src/middlewares/bot-membership-handler.ts @@ -48,6 +48,8 @@ export class BotMembershipHandler> ext constructor() { super("bot_membership_handler") + this.fillRedis() + // TEMP: this is for initial migration from previous bot this.composer.fork().filter(predicate, async (ctx, next) => { if (ctx.chat.type === "private") return next() @@ -55,12 +57,6 @@ export class BotMembershipHandler> ext const redisCheck = await this.TEMP_redis.has(ctx.chat.id.toString()) if (redisCheck) return next() - const backendGroup = await api.tg.groups.getById.query({ telegramId: ctx.chat.id }).catch(() => null) - if (backendGroup !== null) { - await this.TEMP_redis.write(ctx.chat.id.toString(), ctx.chat.id) - return next() - } - const me = await ctx.getChatMember(ctx.me.id).catch(() => ({ status: "undefined" })) if (me.status !== "administrator") { logger.warn({ chat: ctx.chat }, "Cannot create group because bot is not admin") @@ -97,6 +93,11 @@ export class BotMembershipHandler> ext }) } + private async fillRedis() { + const dbGroups = await api.tg.groups.getAll.query() + await Promise.all(dbGroups.map((g) => this.TEMP_redis.write(g.telegramId.toString(), g.telegramId))) + } + private static isJoin(ctx: MemberContext): boolean { const oldStatusCheck = ["left", "kicked"].includes(ctx.myChatMember.old_chat_member.status) const newStatusCheck = joinEvent[ctx.myChatMember.chat.type].includes(ctx.myChatMember.new_chat_member.status) From 691d6a97926f0693baf51fc196cf60a8203732a9 Mon Sep 17 00:00:00 2001 From: Lorenzo Corallo Date: Fri, 17 Apr 2026 18:31:57 +0200 Subject: [PATCH 5/6] fix: remove ttl, otherwise we lose track this Redis collection will be manually deleted --- src/middlewares/bot-membership-handler.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/middlewares/bot-membership-handler.ts b/src/middlewares/bot-membership-handler.ts index e864e68..ccf16cb 100644 --- a/src/middlewares/bot-membership-handler.ts +++ b/src/middlewares/bot-membership-handler.ts @@ -42,7 +42,6 @@ export class BotMembershipHandler> ext redis, prefix: "TEMP_groups", logger, - ttl: 60 * 60 * 24, // 1 day, just in case }) constructor() { From 82282ec0ec1f31ea6f38893c02055974f3b67869 Mon Sep 17 00:00:00 2001 From: Lorenzo Corallo Date: Fri, 17 Apr 2026 18:33:24 +0200 Subject: [PATCH 6/6] fix: void the fillRedis promise --- src/middlewares/bot-membership-handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middlewares/bot-membership-handler.ts b/src/middlewares/bot-membership-handler.ts index ccf16cb..ca129d5 100644 --- a/src/middlewares/bot-membership-handler.ts +++ b/src/middlewares/bot-membership-handler.ts @@ -47,7 +47,7 @@ export class BotMembershipHandler> ext constructor() { super("bot_membership_handler") - this.fillRedis() + void this.fillRedis() // TEMP: this is for initial migration from previous bot this.composer.fork().filter(predicate, async (ctx, next) => {