import TelegramBot from 'node-telegram-bot-api'; import config from './config/config.js'; import UserHandler from './handlers/userHandler.js'; import UserProductHandler from './handlers/userProductHandler.js'; import UserWalletsHandler from './handlers/userWalletsHandler.js'; import UserLocationHandler from './handlers/userLocationHandler.js'; import AdminHandler from './handlers/adminHandler.js'; import AdminUserHandler from './handlers/adminUserHandler.js'; import AdminLocationHandler from './handlers/adminLocationHandler.js'; import AdminProductHandler from './handlers/adminProductHandler.js'; import ErrorHandler from './utils/errorHandler.js'; import User from './models/User.js'; // Debug logging function const logDebug = (action, functionName) => { console.log(`[DEBUG] Button Press: ${action}`); console.log(`[DEBUG] Calling Function: ${functionName}`); }; const initBot = () => { try { const bot = new TelegramBot(config.BOT_TOKEN, { polling: true }); console.log('Bot initialized successfully'); return bot; } catch (error) { console.error('Failed to initialize bot:', error); process.exit(1); } }; const bot = initBot(); const userHandler = new UserHandler(bot); const userProductHandler = new UserProductHandler(bot); const userWalletsHandler = new UserWalletsHandler(bot); const userLocationHandler = new UserLocationHandler(bot); const adminHandler = new AdminHandler(bot); const adminUserHandler = new AdminUserHandler(bot); const adminLocationHandler = new AdminLocationHandler(bot); const adminProductHandler = new AdminProductHandler(bot); // Start command - Create user profile bot.onText(/\/start/, async (msg) => { logDebug('/start', 'handleStart'); try { await userHandler.handleStart(msg); } catch (error) { await ErrorHandler.handleError(bot, msg.chat.id, error, 'start command'); } }); // Admin command bot.onText(/\/admin/, async (msg) => { logDebug('/admin', 'handleAdminCommand'); try { await adminHandler.handleAdminCommand(msg); } catch (error) { await ErrorHandler.handleError(bot, msg.chat.id, error, 'admin command'); } }); // Handle user menu buttons bot.on('message', async (msg) => { if (!msg.text) return; try { // Check for admin location input if (await adminLocationHandler.handleLocationInput(msg)) { return; } // Check for admin category input if (await adminProductHandler.handleCategoryInput(msg)) { return; } // Check for admin subcategory input if (await adminProductHandler.handleSubcategoryInput(msg)) { return; } // Check for product import if (await adminProductHandler.handleProductImport(msg)) { return; } logDebug(msg.text, 'handleMessage'); switch (msg.text) { case '📦 Products': await userProductHandler.showProducts(msg); break; case '👤 Profile': await userHandler.showProfile(msg); break; case '💰 Wallets': await userWalletsHandler.showBalance(msg); break; case '🛍 Purchases': await userProductHandler.showPurchases(msg); break; case '📦 Manage Products': if (adminHandler.isAdmin(msg.from.id)) { await adminProductHandler.handleProductManagement(msg); } break; case '👥 Manage Users': if (adminHandler.isAdmin(msg.from.id)) { await adminUserHandler.handleUserList(msg); } break; case '📍 Manage Locations': if (adminHandler.isAdmin(msg.from.id)) { await adminLocationHandler.handleViewLocations(msg); } break; } } catch (error) { await ErrorHandler.handleError(bot, msg.chat.id, error, 'message handler'); } }); // Handle callback queries bot.on('callback_query', async (callbackQuery) => { const action = callbackQuery.data; const msg = callbackQuery.message; try { // Profile and location management if (action === 'set_location') { logDebug(action, 'handleSetLocation'); await userLocationHandler.handleSetLocation(callbackQuery); } else if (action.startsWith('set_country_')) { logDebug(action, 'handleSetCountry'); await userLocationHandler.handleSetCountry(callbackQuery); } else if (action.startsWith('set_city_')) { logDebug(action, 'handleSetCity'); await userLocationHandler.handleSetCity(callbackQuery); } else if (action.startsWith('set_district_')) { logDebug(action, 'handleSetDistrict'); await userLocationHandler.handleSetDistrict(callbackQuery); } else if (action === 'back_to_profile') { logDebug(action, 'handleBackToProfile'); await userHandler.handleBackToProfile(callbackQuery); } else if (action === 'back_to_balance') { logDebug(action, 'handleBackToBalance'); await userWalletsHandler.handleBackToBalance(callbackQuery); } // Wallet management else if (action === 'add_wallet') { logDebug(action, 'handleAddWallet'); await userWalletsHandler.handleAddWallet(callbackQuery); } else if (action === 'top_up_wallet') { logDebug(action, 'handleTopUpWallet'); await userWalletsHandler.handleTopUpWallet(callbackQuery); } else if (action === 'wallet_history') { logDebug(action, 'handleWalletHistory'); await userWalletsHandler.handleWalletHistory(callbackQuery); } else if (action === 'view_archived_wallets') { logDebug(action, 'handleViewArchivedWallets'); await userWalletsHandler.handleViewArchivedWallets(callbackQuery); } else if (action === 'refresh_balance') { logDebug(action, 'handleRefreshBalance'); await userWalletsHandler.handleRefreshBalance(callbackQuery); } // Wallet generation else if (action.startsWith('generate_wallet_')) { logDebug(action, 'handleGenerateWallet'); await userWalletsHandler.handleGenerateWallet(callbackQuery); } // Shop navigation else if (action === 'shop_start') { logDebug(action, 'showProducts'); await userProductHandler.showProducts(msg); } else if (action.startsWith('shop_country_')) { logDebug(action, 'handleCountrySelection'); await userProductHandler.handleCountrySelection(callbackQuery); } else if (action.startsWith('shop_city_')) { logDebug(action, 'handleCitySelection'); await userProductHandler.handleCitySelection(callbackQuery); } else if (action.startsWith('shop_district_')) { logDebug(action, 'handleDistrictSelection'); await userProductHandler.handleDistrictSelection(callbackQuery); } else if (action.startsWith('shop_category_')) { logDebug(action, 'handleCategorySelection'); await userProductHandler.handleCategorySelection(callbackQuery); } else if (action.startsWith('shop_subcategory_')) { logDebug(action, 'handleSubcategorySelection'); await userProductHandler.handleSubcategorySelection(callbackQuery); } else if (action.startsWith('shop_product_')) { logDebug(action, 'handleProductSelection'); await userProductHandler.handleProductSelection(callbackQuery); } else if (action.startsWith('increase_quantity_')) { logDebug(action, 'handleIncreaseQuantity'); await userProductHandler.handleIncreaseQuantity(callbackQuery); } else if (action.startsWith('decrease_quantity_')) { logDebug(action, 'handleDecreaseQuantity'); await userProductHandler.handleDecreaseQuantity(callbackQuery); } else if (action.startsWith('buy_product_')) { logDebug(action, 'handleBuyProduct'); await userProductHandler.handleBuyProduct(callbackQuery); } // Admin location management else if (action === 'add_location') { logDebug(action, 'handleAddLocation'); await adminLocationHandler.handleAddLocation(callbackQuery); } else if (action === 'view_locations') { logDebug(action, 'handleViewLocations'); await adminLocationHandler.handleViewLocations(callbackQuery); } else if (action === 'delete_location') { logDebug(action, 'handleDeleteLocation'); await adminLocationHandler.handleDeleteLocation(callbackQuery); } else if (action.startsWith('confirm_delete_')) { logDebug(action, 'handleConfirmDelete'); await adminLocationHandler.handleConfirmDelete(callbackQuery); } // Admin product management else if (action === 'manage_products') { logDebug(action, 'handleProductManagement'); await adminProductHandler.handleProductManagement(callbackQuery); } else if (action.startsWith('prod_country_')) { logDebug(action, 'handleCountrySelection'); await adminProductHandler.handleCountrySelection(callbackQuery); } else if (action.startsWith('prod_city_')) { logDebug(action, 'handleCitySelection'); await adminProductHandler.handleCitySelection(callbackQuery); } else if (action.startsWith('prod_district_')) { logDebug(action, 'handleDistrictSelection'); await adminProductHandler.handleDistrictSelection(callbackQuery); } else if (action.startsWith('add_category_')) { logDebug(action, 'handleAddCategory'); await adminProductHandler.handleAddCategory(callbackQuery); } else if (action.startsWith('edit_category_')) { logDebug(action, 'handleEditCategory'); await adminProductHandler.handleEditCategory(callbackQuery); } else if (action.startsWith('prod_category_')) { logDebug(action, 'handleCategorySelection'); await adminProductHandler.handleCategorySelection(callbackQuery); } else if (action.startsWith('add_subcategory_')) { logDebug(action, 'handleAddSubcategory'); await adminProductHandler.handleAddSubcategory(callbackQuery); } else if (action.startsWith('prod_subcategory_')) { logDebug(action, 'handleSubcategorySelection'); await adminProductHandler.handleSubcategorySelection(callbackQuery); } else if (action.startsWith('add_product_')) { logDebug(action, 'handleAddProduct'); await adminProductHandler.handleAddProduct(callbackQuery); } else if (action.startsWith('view_product_')) { logDebug(action, 'handleViewProduct'); await adminProductHandler.handleViewProduct(callbackQuery); } // Admin user management else if (action.startsWith('view_user_')) { logDebug(action, 'handleViewUser'); await adminUserHandler.handleViewUser(callbackQuery); } else if (action.startsWith('delete_user_')) { logDebug(action, 'handleDeleteUser'); await adminUserHandler.handleDeleteUser(callbackQuery); } else if (action.startsWith('confirm_delete_user_')) { logDebug(action, 'handleConfirmDelete'); await adminUserHandler.handleConfirmDelete(callbackQuery); } else if (action.startsWith('edit_user_balance_')) { logDebug(action, 'handleEditUserBalance'); await adminUserHandler.handleEditUserBalance(callbackQuery); } await bot.answerCallbackQuery(callbackQuery.id); } catch (error) { await ErrorHandler.handleError(bot, msg.chat.id, error, 'callback query'); } }); // Error handling bot.on('polling_error', ErrorHandler.handlePollingError); process.on('unhandledRejection', (error) => { console.error('Unhandled promise rejection:', error); }); console.log('Bot is running...');