File size: 1,574 Bytes
52048a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import { BotContext } from '../types/botTypes';
import { createLogger } from '../../utils/logger';
import { messageManager } from '../utils/messageManager';

const logger = createLogger('GroupCheckMiddleware');

export const groupCheckMiddleware = async (ctx: BotContext, next: () => Promise<void>) => {
  try {
    // Skip check for non-message updates
    if (!ctx.message || !ctx.from) {
      return next();
    }

    const botData = ctx.botData;
    if (!botData?.join_group_required || !botData?.group_channel_username) {
      return next();
    }

    // Skip check for admin commands
    if ('text' in ctx.message && ctx.message.text?.startsWith('/')) {
      return next();
    }

    try {
      // Check if user is a member of the required group
      const chatMember = await ctx.telegram.getChatMember(
        botData.group_channel_username,
        ctx.from.id
      );

      if (['member', 'administrator', 'creator'].includes(chatMember.status)) {
        return next();
      }

      // User is not a member of the required group
      const message = messageManager.getMessage('join_group_required');

      await ctx.reply(message, {
        parse_mode: 'HTML',
        link_preview_options: { is_disabled: true }
      });

    } catch (error: any) {
      logger.error(`Error checking group membership: ${error.message}`);
      // If there's an error checking membership, allow the user to proceed
      return next();
    }
  } catch (error: any) {
    logger.error(`Error in group check middleware: ${error.message}`);
    return next();
  }
};