160 lines
4.7 KiB
JavaScript
160 lines
4.7 KiB
JavaScript
import db from '../config/database.js';
|
|
import Validators from '../utils/validators.js';
|
|
|
|
export default class UserLocationHandler {
|
|
constructor(bot) {
|
|
this.bot = bot;
|
|
}
|
|
|
|
async handleSetLocation(callbackQuery) {
|
|
const chatId = callbackQuery.message.chat.id;
|
|
const messageId = callbackQuery.message.message_id;
|
|
|
|
try {
|
|
const countries = await db.allAsync('SELECT DISTINCT country FROM locations ORDER BY country');
|
|
|
|
if (countries.length === 0) {
|
|
await this.bot.editMessageText(
|
|
'No locations available yet.',
|
|
{
|
|
chat_id: chatId,
|
|
message_id: messageId,
|
|
reply_markup: {
|
|
inline_keyboard: [[
|
|
{ text: '« Back to Profile', callback_data: 'back_to_profile' }
|
|
]]
|
|
}
|
|
}
|
|
);
|
|
return;
|
|
}
|
|
|
|
const keyboard = {
|
|
inline_keyboard: [
|
|
...countries.map(loc => [{
|
|
text: loc.country,
|
|
callback_data: `set_country_${loc.country}`
|
|
}]),
|
|
[{ text: '« Back to Profile', callback_data: 'back_to_profile' }]
|
|
]
|
|
};
|
|
|
|
await this.bot.editMessageText(
|
|
'🌍 Select your country:',
|
|
{
|
|
chat_id: chatId,
|
|
message_id: messageId,
|
|
reply_markup: keyboard
|
|
}
|
|
);
|
|
} catch (error) {
|
|
console.error('Error in handleSetLocation:', error);
|
|
await this.bot.sendMessage(chatId, 'Error loading countries. Please try again.');
|
|
}
|
|
}
|
|
|
|
async handleSetCountry(callbackQuery) {
|
|
const chatId = callbackQuery.message.chat.id;
|
|
const messageId = callbackQuery.message.message_id;
|
|
const country = callbackQuery.data.replace('set_country_', '');
|
|
|
|
try {
|
|
const cities = await db.allAsync(
|
|
'SELECT DISTINCT city FROM locations WHERE country = ? ORDER BY city',
|
|
[country]
|
|
);
|
|
|
|
const keyboard = {
|
|
inline_keyboard: [
|
|
...cities.map(loc => [{
|
|
text: loc.city,
|
|
callback_data: `set_city_${country}_${loc.city}`
|
|
}]),
|
|
[{ text: '« Back to Countries', callback_data: 'set_location' }]
|
|
]
|
|
};
|
|
|
|
await this.bot.editMessageText(
|
|
`🏙 Select city in ${country}:`,
|
|
{
|
|
chat_id: chatId,
|
|
message_id: messageId,
|
|
reply_markup: keyboard
|
|
}
|
|
);
|
|
} catch (error) {
|
|
console.error('Error in handleSetCountry:', error);
|
|
await this.bot.sendMessage(chatId, 'Error loading cities. Please try again.');
|
|
}
|
|
}
|
|
|
|
async handleSetCity(callbackQuery) {
|
|
const chatId = callbackQuery.message.chat.id;
|
|
const messageId = callbackQuery.message.message_id;
|
|
const [country, city] = callbackQuery.data.replace('set_city_', '').split('_');
|
|
|
|
try {
|
|
const districts = await db.allAsync(
|
|
'SELECT district FROM locations WHERE country = ? AND city = ? ORDER BY district',
|
|
[country, city]
|
|
);
|
|
|
|
const keyboard = {
|
|
inline_keyboard: [
|
|
...districts.map(loc => [{
|
|
text: loc.district,
|
|
callback_data: `set_district_${country}_${city}_${loc.district}`
|
|
}]),
|
|
[{ text: '« Back to Cities', callback_data: `set_country_${country}` }]
|
|
]
|
|
};
|
|
|
|
await this.bot.editMessageText(
|
|
`📍 Select district in ${city}:`,
|
|
{
|
|
chat_id: chatId,
|
|
message_id: messageId,
|
|
reply_markup: keyboard
|
|
}
|
|
);
|
|
} catch (error) {
|
|
console.error('Error in handleSetCity:', error);
|
|
await this.bot.sendMessage(chatId, 'Error loading districts. Please try again.');
|
|
}
|
|
}
|
|
|
|
async handleSetDistrict(callbackQuery) {
|
|
const chatId = callbackQuery.message.chat.id;
|
|
const messageId = callbackQuery.message.message_id;
|
|
const userId = callbackQuery.from.id;
|
|
const [country, city, district] = callbackQuery.data.replace('set_district_', '').split('_');
|
|
|
|
try {
|
|
await db.runAsync('BEGIN TRANSACTION');
|
|
|
|
await db.runAsync(
|
|
'UPDATE users SET country = ?, city = ?, district = ? WHERE telegram_id = ?',
|
|
[country, city, district, userId.toString()]
|
|
);
|
|
|
|
await db.runAsync('COMMIT');
|
|
|
|
await this.bot.editMessageText(
|
|
`✅ Location updated successfully!\n\nCountry: ${country}\nCity: ${city}\nDistrict: ${district}`,
|
|
{
|
|
chat_id: chatId,
|
|
message_id: messageId,
|
|
reply_markup: {
|
|
inline_keyboard: [[
|
|
{ text: '« Back to Profile', callback_data: 'back_to_profile' }
|
|
]]
|
|
}
|
|
}
|
|
);
|
|
} catch (error) {
|
|
await db.runAsync('ROLLBACK');
|
|
console.error('Error in handleSetDistrict:', error);
|
|
await this.bot.sendMessage(chatId, 'Error updating location. Please try again.');
|
|
}
|
|
}
|
|
} |