webook-tel / src /bots /utils /handlerUtils.ts
Mohammed Foud
all
ca368c8
// utils/handlerUtils.ts
import { BotContext } from "../types/botTypes";
import { createLogger } from '../../utils/logger';
import { AuthService } from '../services/auth';
import { messageManager } from './messageManager';
import { getMainMenuKeyboard } from './keyboardUtils';
const logger = createLogger('HandlerUtils');
const authService = AuthService.getInstance();
/**
* Creates a standardized message reply handler with error handling
* @param replyFunction Function that returns the message and options to send
* @returns A function that handles the reply with proper error handling
*/
export const messageReplyHandler = (
replyFunction: (ctx: BotContext) => Promise<{message: string, options?: any}> | {message: string, options?: any}
) => async (ctx: BotContext) => {
try {
// Execute the reply function to get message content and options
const result = await Promise.resolve(replyFunction(ctx));
// Get the message ID to reply to
const replyToMessageId = ctx.message?.message_id;
// Define default options including parse_mode
const defaultOptions = {
parse_mode: 'HTML'
};
// Add reply_to_message_id to options if not already set
const finalOptions = {
...defaultOptions,
...result.options,
reply_to_message_id: replyToMessageId
};
// Send the reply with the message and options
return await ctx.reply(result.message, finalOptions);
} catch (error: any) {
// Log the error
logger.error(`Error in message reply handler: ${error.message}`);
// Send a generic error message to the user
return ctx.reply("⚠️ حدث خطأ أثناء معالجة طلبك. الرجاء المحاولة مرة أخرى.");
}
};
/**
* Creates a standardized callback query handler with error handling
* @param replyFunction Function that returns the message and options to send after answering callback
* @returns A function that handles the callback with proper error handling
*/
export const callbackReplyHandler = (
replyFunction: (ctx: BotContext) => Promise<{message: string, options?: any}> | {message: string, options?: any} | null
) => async (ctx: BotContext) => {
try {
// Answer the callback query first
await ctx.answerCbQuery();
// Execute the reply function to get message content and options
const result = await Promise.resolve(replyFunction(ctx));
// If result is null or undefined, don't send any message
if (!result) {
return;
}
// Send the reply with the message and any provided options
return await ctx.reply(result.message, result.options);
} catch (error: any) {
// Log the error
logger.error(`Error in callback reply handler: ${error.message}`);
// Send a generic error message to the user
return ctx.reply("⚠️ حدث خطأ أثناء معالجة طلبك. الرجاء المحاولة مرة أخرى.");
}
};
export const authCheckHandler = <T extends any[]>(
handler: (ctx: BotContext, ...args: T) => Promise<{message: string, options?: any}> | {message: string, options?: any}
) => async (ctx: BotContext, ...args: T) => {
const telegramId = ctx.from?.id;
if (!telegramId || !authService.isUserLoggedIn(telegramId, ctx)) {
return {
message: messageManager.getMessage('auth_required'),
options: getMainMenuKeyboard()
};
}
return handler(ctx, ...args);
};