Spaces:
Paused
Paused
| import { supabase } from '../../db/supabase'; | |
| import { createLogger } from '../../utils/logger'; | |
| const logger = createLogger('MessageManager'); | |
| interface BotMessage { | |
| id: string; | |
| bot_id: string; | |
| key: string; | |
| ar_value: string; | |
| en_value: string; | |
| description?: string; | |
| created_at: string; | |
| updated_at: string; | |
| } | |
| class MessageManager { | |
| private static instance: MessageManager; | |
| private messages: Map<string, BotMessage> = new Map(); | |
| private language: 'ar' | 'en' = 'ar'; | |
| private constructor() {} | |
| static getInstance(): MessageManager { | |
| if (!MessageManager.instance) { | |
| MessageManager.instance = new MessageManager(); | |
| } | |
| return MessageManager.instance; | |
| } | |
| setLanguage(lang: 'ar' | 'en') { | |
| this.language = lang; | |
| logger.info(`Language set to: ${lang}`); | |
| } | |
| getLanguage(): 'ar' | 'en' { | |
| return this.language; | |
| } | |
| async loadMessages() { | |
| try { | |
| const { data, error } = await supabase | |
| .from('bot_messages') | |
| .select('*') | |
| if (error) throw error; | |
| this.messages.clear(); | |
| data.forEach((message: BotMessage) => { | |
| this.messages.set(message.key, message); | |
| }); | |
| // Add default messages if not in database | |
| this.addDefaultMessages(); | |
| logger.info(`Messages loaded successfully for bot `); | |
| } catch (error) { | |
| logger.error('Error loading messages:', error); | |
| throw error; | |
| } | |
| } | |
| private addDefaultMessages() { | |
| const defaultMessages = { | |
| 'balance_update_notification': { | |
| ar_value: '💰 <b>تحديث الرصيد</b>\n\n' + | |
| 'تم تحديث رصيدك:\n' + | |
| 'الرصيد السابق: {old_balance}$\n' + | |
| 'الرصيد الجديد: {new_balance}$\n' + | |
| 'نوع التغيير: {change_type}\n' + | |
| 'قيمة التغيير: {change_amount}$', | |
| en_value: '💰 <b>Balance Update</b>\n\n' + | |
| 'Your balance has been updated:\n' + | |
| 'Previous balance: ${old_balance}\n' + | |
| 'New balance: ${new_balance}\n' + | |
| 'Change type: {change_type}\n' + | |
| 'Change amount: ${change_amount}' | |
| }, | |
| 'search_product_prompt': { | |
| ar_value: 'الرجاء إدخال اسم الخدمة التي تبحث عنها:', | |
| en_value: 'Please enter the name of the service you are looking for:' | |
| }, | |
| 'no_search_results': { | |
| ar_value: 'عذراً، لم يتم العثور على نتائج لبحثك.', | |
| en_value: 'Sorry, no results found for your search.' | |
| }, | |
| 'invalid_search_input': { | |
| ar_value: 'الرجاء إدخال ما لا يقل عن حرفين للبحث.', | |
| en_value: 'Please enter at least 2 characters to search.' | |
| }, | |
| 'search_country_prompt': { | |
| ar_value: 'الرجاء إدخال اسم الدولة أو رمزها أو علمها:', | |
| en_value: 'Please enter the country name, code, or flag:' | |
| }, | |
| 'no_country_search_results': { | |
| ar_value: 'عذراً، لم يتم العثور على دول مطابقة لبحثك.', | |
| en_value: 'Sorry, no matching countries found for your search.' | |
| }, | |
| 'affordable_products_list': { | |
| ar_value: 'المنتجات التي يمكنك شراؤها برصيدك الحالي ({balance}):', | |
| en_value: 'Products you can buy with your current balance ({balance}):' | |
| }, | |
| 'no_affordable_products': { | |
| ar_value: 'عذراً، لا توجد منتجات يمكنك شراؤها برصيدك الحالي ({balance}).', | |
| en_value: 'Sorry, no products can be bought with your current balance ({balance}).' | |
| }, | |
| 'error_user_not_found': { | |
| ar_value: '❌ لم يتم العثور على معلومات المستخدم.', | |
| en_value: '❌ User information not found.' | |
| }, | |
| 'error_invalid_page': { | |
| ar_value: '❌ رقم الصفحة غير صحيح.', | |
| en_value: '❌ Invalid page number.' | |
| }, | |
| 'error_invalid_filter': { | |
| ar_value: '❌ نوع الفلتر غير صحيح.', | |
| en_value: '❌ Invalid filter type.' | |
| }, | |
| 'error_user_state_not_found': { | |
| ar_value: '❌ لم يتم العثور على حالة المستخدم.', | |
| en_value: '❌ User state not found.' | |
| }, | |
| 'error_general': { | |
| ar_value: '❌ حدث خطأ. يرجى المحاولة مرة أخرى.', | |
| en_value: '❌ An error occurred. Please try again.' | |
| } | |
| }; | |
| Object.entries(defaultMessages).forEach(([key, value]) => { | |
| if (!this.messages.has(key)) { | |
| this.messages.set(key, { | |
| id: key, | |
| bot_id: 'default', | |
| key, | |
| ar_value: value.ar_value, | |
| en_value: value.en_value, | |
| created_at: new Date().toISOString(), | |
| updated_at: new Date().toISOString() | |
| }); | |
| } | |
| }); | |
| } | |
| getMessage(key: string): string { | |
| const message = this.messages.get(key); | |
| if (!message) { | |
| logger.warn(`Message not found for key: ${key}`); | |
| return `${key}`; | |
| } | |
| const value = this.language === 'ar' ? message.ar_value : message.en_value; | |
| logger.debug(`Retrieved message for key '${key}': ${value.substring(0, 100)}...`); | |
| return value; | |
| } | |
| async updateMessage(key: string, arValue: string, enValue: string, description?: string) { | |
| try { | |
| const { data, error } = await supabase | |
| .from('bot_messages') | |
| .upsert({ | |
| key, | |
| ar_value: arValue, | |
| en_value: enValue, | |
| description | |
| }) | |
| .select() | |
| .single(); | |
| if (error) throw error; | |
| if (data) { | |
| this.messages.set(key, data); | |
| } | |
| return data; | |
| } catch (error) { | |
| logger.error('Error updating message:', error); | |
| throw error; | |
| } | |
| } | |
| async reloadMessages() { | |
| await this.loadMessages(); | |
| } | |
| } | |
| export const messageManager = MessageManager.getInstance(); |