safari fix
This commit is contained in:
183
src/bot.ts
183
src/bot.ts
@@ -64,19 +64,11 @@ export class QuixoticBot {
|
||||
private setupHandlers(): void {
|
||||
console.log('🔧 Setting up bot handlers...');
|
||||
|
||||
// Log all incoming messages for debugging
|
||||
// Handle messages
|
||||
this.bot.on('message', (msg: any) => {
|
||||
console.log('📨 Received message:', {
|
||||
type: msg.web_app ? 'web_app_data' : (msg.text ? 'text' : 'other'),
|
||||
from: msg.from?.id,
|
||||
chat: msg.chat?.id,
|
||||
hasWebAppData: !!msg.web_app?.data,
|
||||
webAppDataLength: msg.web_app?.data?.length || 0
|
||||
});
|
||||
|
||||
// Handle web app data in regular message event
|
||||
if (msg.web_app?.data) {
|
||||
console.log('🔍 Web app data found in message:', msg.web_app.data);
|
||||
this.handleWebAppData(msg);
|
||||
return; // Important: don't process as regular message
|
||||
}
|
||||
@@ -177,31 +169,21 @@ export class QuixoticBot {
|
||||
|
||||
// Handle web app data - primary event handler
|
||||
this.bot.on('web_app_data', async (msg: Message) => {
|
||||
console.log('🔍 Web app data received via web_app_data event:', msg.web_app?.data);
|
||||
this.handleWebAppData(msg);
|
||||
});
|
||||
|
||||
// Additional handler for callback queries (sometimes WebApp data comes here)
|
||||
// Handle callback queries
|
||||
this.bot.on('callback_query', async (query: any) => {
|
||||
console.log('📞 Callback query received:', {
|
||||
id: query.id,
|
||||
data: query.data,
|
||||
from: query.from?.id
|
||||
});
|
||||
|
||||
if (query.data) {
|
||||
try {
|
||||
const data = JSON.parse(query.data);
|
||||
if (data.action === 'send_audio') {
|
||||
console.log('🎵 Audio action from callback query');
|
||||
await this.sendAudioFileInternal(query.message.chat.id, data.audioUrl, data.title);
|
||||
}
|
||||
} catch {
|
||||
console.log('Callback query data is not JSON, ignoring');
|
||||
// Not JSON, ignore
|
||||
}
|
||||
}
|
||||
|
||||
// Answer callback query to remove loading state
|
||||
await this.bot.answerCallbackQuery(query.id);
|
||||
});
|
||||
|
||||
@@ -259,51 +241,6 @@ export class QuixoticBot {
|
||||
}
|
||||
});
|
||||
|
||||
// Add universal event logger for debugging
|
||||
this.bot.on('edited_message', (msg: any) => {
|
||||
console.log('✏️ Edited message received, checking for web app data:', !!msg.web_app?.data);
|
||||
if (msg.web_app?.data) {
|
||||
this.handleWebAppData(msg);
|
||||
}
|
||||
});
|
||||
|
||||
this.bot.on('channel_post', (msg: any) => {
|
||||
console.log('📢 Channel post received, checking for web app data:', !!msg.web_app?.data);
|
||||
if (msg.web_app?.data) {
|
||||
this.handleWebAppData(msg);
|
||||
}
|
||||
});
|
||||
|
||||
// Log all update types
|
||||
this.bot.on('update', (update: any) => {
|
||||
const updateTypes = Object.keys(update).filter(key => key !== 'update_id');
|
||||
console.log('🔄 Update received:', {
|
||||
types: updateTypes,
|
||||
update_id: update.update_id
|
||||
});
|
||||
|
||||
// Check for web_app_data in any part of the update
|
||||
const checkForWebAppData = (obj: any, path = ''): any => {
|
||||
if (!obj || typeof obj !== 'object') return null;
|
||||
|
||||
if (obj.web_app?.data) {
|
||||
console.log(`🎯 Found web_app_data at ${path}:`, obj.web_app.data);
|
||||
return obj;
|
||||
}
|
||||
|
||||
for (const [key, value] of Object.entries(obj)) {
|
||||
const result = checkForWebAppData(value, `${path}.${key}`);
|
||||
if (result) return result;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
const msgWithData = checkForWebAppData(update);
|
||||
if (msgWithData && msgWithData.chat?.id) {
|
||||
console.log('🚀 Processing web app data found in update');
|
||||
this.handleWebAppData(msgWithData);
|
||||
}
|
||||
});
|
||||
|
||||
console.log('✅ Bot handlers setup complete');
|
||||
}
|
||||
@@ -319,144 +256,64 @@ export class QuixoticBot {
|
||||
|
||||
private async sendAudioFileInternal(chatId: number, audioUrl: string, title: string): Promise<void> {
|
||||
try {
|
||||
console.log(`🎵 Starting sendAudioFile to chat ${chatId}`);
|
||||
console.log(`🔗 Audio URL: ${audioUrl}`);
|
||||
console.log(`📝 Title: ${title}`);
|
||||
console.log(`📤 Sending: ${title} to chat ${chatId}`);
|
||||
|
||||
// Send initial status message
|
||||
const statusMsg = await this.bot.sendMessage(chatId, '⏳ Подготавливаю MP3 файл...');
|
||||
|
||||
// Validate audio URL
|
||||
if (!audioUrl.startsWith('http')) {
|
||||
throw new Error(`Invalid audio URL: ${audioUrl}`);
|
||||
}
|
||||
|
||||
// Try sending as audio with proper error handling
|
||||
// Try sending as audio
|
||||
try {
|
||||
console.log('🚀 Attempting sendAudio...');
|
||||
const audioResult = await this.bot.sendAudio(chatId, audioUrl, {
|
||||
await this.bot.sendAudio(chatId, audioUrl, {
|
||||
title: title,
|
||||
performer: 'SoundCloud',
|
||||
caption: `🎵 ${title}\n\n🤖 Загружено через Quixotic`,
|
||||
parse_mode: undefined,
|
||||
protect_content: false
|
||||
caption: `🎵 ${title}`,
|
||||
parse_mode: undefined
|
||||
});
|
||||
|
||||
console.log(`✅ Audio sent successfully! Message ID: ${audioResult.message_id}`);
|
||||
|
||||
// Delete status message after success
|
||||
try {
|
||||
await this.bot.deleteMessage(chatId, statusMsg.message_id);
|
||||
} catch {
|
||||
console.log('Could not delete status message (not critical)');
|
||||
}
|
||||
|
||||
console.log(`✅ Audio sent: ${title}`);
|
||||
return;
|
||||
|
||||
} catch (audioError: any) {
|
||||
console.error('❌ SendAudio failed:', audioError.message);
|
||||
console.error('Audio error details:', audioError);
|
||||
|
||||
// Update status message
|
||||
await this.bot.editMessageText('📄 Отправляю как документ...', {
|
||||
chat_id: chatId,
|
||||
message_id: statusMsg.message_id
|
||||
});
|
||||
|
||||
// Fallback: try sending as document
|
||||
// Fallback: try as document
|
||||
try {
|
||||
console.log('🚀 Attempting sendDocument fallback...');
|
||||
const docResult = await this.bot.sendDocument(chatId, audioUrl, {
|
||||
caption: `🎵 ${title}\n\n🤖 Загружено через Quixotic`,
|
||||
await this.bot.sendDocument(chatId, audioUrl, {
|
||||
caption: `🎵 ${title}`,
|
||||
parse_mode: undefined
|
||||
});
|
||||
|
||||
console.log(`✅ Document sent successfully! Message ID: ${docResult.message_id}`);
|
||||
|
||||
// Delete status message after success
|
||||
try {
|
||||
await this.bot.deleteMessage(chatId, statusMsg.message_id);
|
||||
} catch {
|
||||
console.log('Could not delete status message (not critical)');
|
||||
}
|
||||
|
||||
console.log(`✅ Document sent: ${title}`);
|
||||
return;
|
||||
|
||||
} catch (documentError: any) {
|
||||
console.error('❌ SendDocument also failed:', documentError.message);
|
||||
console.error('Document error details:', documentError);
|
||||
throw documentError;
|
||||
}
|
||||
}
|
||||
|
||||
} catch (error: any) {
|
||||
console.error('💥 Complete send audio failure:', error.message);
|
||||
console.error('Full error object:', error);
|
||||
console.error('❌ Send failed:', error.message);
|
||||
|
||||
// Send fallback message with direct link
|
||||
// Send fallback with link
|
||||
try {
|
||||
await this.bot.sendMessage(chatId,
|
||||
'❌ Не удалось отправить файл автоматически.\n\n' +
|
||||
`🎵 *${title}*\n\n` +
|
||||
`📥 Скачайте напрямую: [Ссылка на MP3](${audioUrl})\n\n` +
|
||||
`_Ошибка: ${error.message}_`,
|
||||
{
|
||||
parse_mode: 'Markdown',
|
||||
disable_web_page_preview: false
|
||||
}
|
||||
`❌ Не удалось отправить файл.\n🎵 ${title}\n🔗 ${audioUrl}`
|
||||
);
|
||||
} catch (msgError: any) {
|
||||
console.error('💥 Failed to send error message:', msgError.message);
|
||||
// Last resort - try without markdown
|
||||
try {
|
||||
await this.bot.sendMessage(chatId,
|
||||
`❌ Ошибка отправки файла.\n🎵 ${title}\n🔗 ${audioUrl}`
|
||||
);
|
||||
} catch (lastError) {
|
||||
console.error('💥 All fallback methods failed:', lastError);
|
||||
}
|
||||
} catch {
|
||||
// Silent fail
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async handleWebAppData(msg: Message): Promise<void> {
|
||||
const chatId = msg.chat.id;
|
||||
const userId = msg.from?.id;
|
||||
|
||||
console.log('🔧 HandleWebAppData called with:', {
|
||||
chatId,
|
||||
userId,
|
||||
hasWebAppData: !!msg.web_app?.data,
|
||||
dataLength: msg.web_app?.data?.length || 0
|
||||
});
|
||||
|
||||
if (!msg.web_app?.data) {
|
||||
console.log('❌ No web app data found in message');
|
||||
await this.bot.sendMessage(chatId, '❌ Данные не получены. Попробуйте еще раз.');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
console.log('📝 Raw web app data:', msg.web_app.data);
|
||||
const data: WebAppData = JSON.parse(msg.web_app.data);
|
||||
console.log('✅ Parsed data successfully:', data);
|
||||
|
||||
if (data.action === 'send_audio') {
|
||||
console.log(`🎵 Processing audio request for user ${userId}, chat ${chatId}: ${data.title}`);
|
||||
console.log(`🔗 Audio URL: ${data.audioUrl}`);
|
||||
|
||||
// Send immediate confirmation
|
||||
await this.bot.sendMessage(chatId, '⏳ Получил запрос, отправляю аудио...');
|
||||
|
||||
console.log(`🎵 WebApp request: ${data.title}`);
|
||||
await this.sendAudioFileInternal(chatId, data.audioUrl, data.title);
|
||||
} else {
|
||||
console.log('⚠️ Unknown action:', data.action);
|
||||
await this.bot.sendMessage(chatId, `❌ Неизвестное действие: ${data.action}`);
|
||||
}
|
||||
} catch (parseError: any) {
|
||||
console.error('❌ Web app data parse error:', parseError.message);
|
||||
console.error('Raw data that failed to parse:', msg.web_app?.data);
|
||||
await this.bot.sendMessage(chatId, `❌ Ошибка обработки данных: ${parseError.message}`);
|
||||
console.error('❌ WebApp data parse error:', parseError.message);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user