wunsch-bot.js aktualisiert

This commit is contained in:
M_Viper 2024-10-20 20:11:57 +00:00
parent 5ec8af8a70
commit 8e599723a4
1 changed files with 75 additions and 55 deletions

View File

@ -6,6 +6,7 @@ const archiver = require('archiver');
const schedule = require('node-schedule'); const schedule = require('node-schedule');
const express = require('express'); const express = require('express');
const bodyParser = require('body-parser'); const bodyParser = require('body-parser');
const axios = require('axios');
const app = express(); const app = express();
app.use(bodyParser.json()); app.use(bodyParser.json());
@ -233,8 +234,6 @@ bot.command('info', async (ctx) => {
}); });
// Callback-Query-Handler
// Callback-Query-Handler // Callback-Query-Handler
bot.on('callback_query', async (ctx) => { bot.on('callback_query', async (ctx) => {
const data = ctx.callbackQuery.data; const data = ctx.callbackQuery.data;
@ -288,6 +287,15 @@ bot.on('callback_query', async (ctx) => {
} else { } else {
await ctx.answerCbQuery('Nur Admins können diese Funktion nutzen.'); await ctx.answerCbQuery('Nur Admins können diese Funktion nutzen.');
} }
} else if (data.startsWith('delete_not_found_')) {
const index = parseInt(data.split('_')[3], 10);
if (deleteNotFoundWish(index)) {
await ctx.reply('Der Eintrag wurde erfolgreich gelöscht.');
} else {
await ctx.reply('Ungültige Nummer. Bitte versuche es erneut.');
}
// Beantworte die Callback-Abfrage
await ctx.answerCbQuery();
} else if (data === 'delete_not_found') { } else if (data === 'delete_not_found') {
await ctx.reply('Bitte gib die Nummer des Eintrags ein, den du löschen möchtest.', { await ctx.reply('Bitte gib die Nummer des Eintrags ein, den du löschen möchtest.', {
reply_markup: JSON.stringify({ reply_markup: JSON.stringify({
@ -334,7 +342,7 @@ bot.on('callback_query', async (ctx) => {
bot.on('text', async (ctx) => { bot.on('text', async (ctx) => {
const chatId = ctx.chat.id.toString(); const chatId = ctx.chat.id.toString();
const userId = ctx.message.from.id; const userId = ctx.message.from.id;
const text = ctx.message.text; const text = ctx.message.text.trim();
const threadId = ctx.message?.message_thread_id; // Thema-ID (falls vorhanden) const threadId = ctx.message?.message_thread_id; // Thema-ID (falls vorhanden)
console.log(`Received message in chat ID ${chatId} and thread ID ${threadId}: ${text}`); // Logging zur Diagnose console.log(`Received message in chat ID ${chatId} and thread ID ${threadId}: ${text}`); // Logging zur Diagnose
@ -342,81 +350,91 @@ bot.on('text', async (ctx) => {
if (chatId !== allowedChatId || threadId !== allowedThreadId) { if (chatId !== allowedChatId || threadId !== allowedThreadId) {
console.log(`Ignoring message in chat ID ${chatId} and thread ID ${threadId} as it's not allowed.`); console.log(`Ignoring message in chat ID ${chatId} and thread ID ${threadId} as it's not allowed.`);
if (text.startsWith('/wunsch')) { if (text.startsWith('/wunsch')) {
// Nachricht zurückweisen, wenn der Befehl in einem nicht erlaubten Kanal verwendet wird
await ctx.reply('❌ Dieser Befehl ist in diesem Kanal nicht erlaubt. Bitte benutze den Befehl in den Serien- und Filmwünsche Kanal.', { disable_notification: true }); await ctx.reply('❌ Dieser Befehl ist in diesem Kanal nicht erlaubt. Bitte benutze den Befehl in den Serien- und Filmwünsche Kanal.', { disable_notification: true });
} }
return; return;
} }
// Überprüfe, ob der Benutzer in der Eingabestimmung ist // Prüfe, ob der Benutzer den Vorgang abbrechen möchte
if (text === '/cancel') {
if (userStates[chatId]) {
const categoryMessageId = userStates[chatId].categoryMessageId;
const wishCommandMessageId = userStates[chatId].wishCommandMessageId;
const commandMessageId = userStates[chatId].commandMessageId;
// Lösche alle relevanten Nachrichten
if (categoryMessageId) await ctx.deleteMessage(categoryMessageId);
if (wishCommandMessageId) await ctx.deleteMessage(wishCommandMessageId);
if (commandMessageId) await ctx.deleteMessage(commandMessageId);
// Setze den Benutzerstatus zurück
delete userStates[chatId];
await ctx.reply('🔴 Der Wunschvorgang wurde abgebrochen.', { disable_notification: true });
} else {
await ctx.reply('🔴 Es gibt keinen laufenden Vorgang zum Abbrechen.', { disable_notification: true });
}
return; // Beende die Verarbeitung
}
// Der Rest des Codes bleibt gleich
if (userStates[chatId]) { if (userStates[chatId]) {
if (userStates[chatId].waitingForLink) { if (userStates[chatId].waitingForLink) {
// Verarbeite den Link des Wunsches const link = text;
const link = text.trim(); // Link erhalten userStates[chatId].wishLink = link;
userStates[chatId].wishLink = link; // Speichern des Links
// Frage nach dem Titel des Wunsches
await ctx.reply(`Bitte gib den Titel des ${userStates[chatId].category} ein.`, { disable_notification: true }); await ctx.reply(`Bitte gib den Titel des ${userStates[chatId].category} ein.`, { disable_notification: true });
userStates[chatId].waitingForLink = false;
userStates[chatId].waitingForLink = false; // Status zurücksetzen userStates[chatId].waitingForWish = true;
userStates[chatId].waitingForWish = true; // Nun auf den Wunsch warten return;
return; // Beende die Verarbeitung, da der Benutzer jetzt nach dem Titel gefragt wird
} }
if (userStates[chatId].waitingForWish) { if (userStates[chatId].waitingForWish) {
// Verarbeite den Titel des Wunsches const wish = text;
const wish = text.trim(); // Titel erhalten
if (wish) { if (wish) {
const category = userStates[chatId].category; const category = userStates[chatId].category;
const link = userStates[chatId].wishLink; const link = userStates[chatId].wishLink;
const categoryMessageId = userStates[chatId].categoryMessageId; const categoryMessageId = userStates[chatId].categoryMessageId;
const titleMessageId = ctx.message.message_id; // ID der Titel-Nachricht erhalten const titleMessageId = ctx.message.message_id;
const commandMessageId = userStates[chatId].commandMessageId; // ID der Befehl-Nachricht erhalten const commandMessageId = userStates[chatId].commandMessageId;
const wishCommandMessageId = userStates[chatId].wishCommandMessageId; // ID der /wunsch-Nachricht erhalten const wishCommandMessageId = userStates[chatId].wishCommandMessageId;
try { try {
userStates[chatId].wishTitle = wish; // Speichern des Wunsch-Titels für spätere Verwendung userStates[chatId].wishTitle = wish;
await sendWish(wish, category, chatId, userId, link); await sendWish(wish, category, chatId, userId, link);
if (categoryMessageId) await ctx.deleteMessage(categoryMessageId);
if (titleMessageId) await ctx.deleteMessage(titleMessageId);
if (commandMessageId) await ctx.deleteMessage(commandMessageId);
if (wishCommandMessageId) await ctx.deleteMessage(wishCommandMessageId);
// Lösche die Nachrichten, die beim Verarbeiten des Wunsches gesendet wurden userStates[chatId].waitingForWish = false;
if (categoryMessageId) await ctx.deleteMessage(categoryMessageId).catch(e => logError(new Error(`Failed to delete category message: ${e.message}`)));
if (titleMessageId) await ctx.deleteMessage(titleMessageId).catch(e => logError(new Error(`Failed to delete title message: ${e.message}`)));
if (commandMessageId) await ctx.deleteMessage(commandMessageId).catch(e => logError(new Error(`Failed to delete command message: ${e.message}`)));
if (wishCommandMessageId) await ctx.deleteMessage(wishCommandMessageId).catch(e => logError(new Error(`Failed to delete /wunsch message: ${e.message}`)));
userStates[chatId].waitingForWish = false; // Benutzerstatus zurücksetzen
} catch (error) { } catch (error) {
logError(new Error(`Error processing wish: ${error.message}`)); logError(new Error(`Error processing wish: ${error.message}`));
} }
} else { } else {
await ctx.reply(`Bitte gib den Titel des ${userStates[chatId].category} ein.`, { disable_notification: true }); await ctx.reply(`Bitte gib den Titel des ${userStates[chatId].category} ein.`, { disable_notification: true });
} }
return; // Beende die Verarbeitung, wenn der Benutzer in der Eingabestimmung ist return;
} }
if (userStates[chatId].waitingForDeleteIndex) { if (userStates[chatId].waitingForDeleteIndex) {
// Verarbeite die Löschanfrage const index = parseInt(text, 10) - 1;
const index = parseInt(text.trim(), 10) - 1; // Index aus der Nachricht extrahieren
if (deleteNotFoundWish(index)) { if (deleteNotFoundWish(index)) {
await ctx.reply('Der Eintrag wurde erfolgreich gelöscht.'); await ctx.reply('Der Eintrag wurde erfolgreich gelöscht.');
} else { } else {
await ctx.reply('Ungültige Nummer. Bitte versuche es erneut.'); await ctx.reply('Ungültige Nummer. Bitte versuche es erneut.');
} }
userStates[chatId].waitingForDeleteIndex = false; // Benutzerstatus zurücksetzen userStates[chatId].waitingForDeleteIndex = false;
return; return;
} }
} }
if (text.startsWith('/wunsch')) { if (text.startsWith('/wunsch')) {
// Benutzer zur Auswahl der Kategorie auffordern const commandMessage = await ctx.reply('Möchtest du etwas wünschen? Wähle bitte eine Kategorie. Du kannst den Vorgang jederzeit mit dem Befehl /cancel abbrechen.', { ...getCategoryKeyboard(), disable_notification: true });
const commandMessage = await ctx.reply('Möchtest du etwas wünschen? Wähle bitte eine Kategorie:', { ...getCategoryKeyboard(), disable_notification: true });
userStates[chatId] = { userStates[chatId] = {
waitingForCategory: true, waitingForCategory: true,
commandMessageId: commandMessage.message_id, // Speichern der ID der Befehl-Nachricht commandMessageId: commandMessage.message_id,
wishCommandMessageId: ctx.message.message_id // Speichern der ID der /wunsch-Nachricht wishCommandMessageId: ctx.message.message_id
}; // Setze den Status auf "wartend auf Kategorie" };
} else if (text.startsWith('/notfound')) { } else if (text.startsWith('/notfound')) {
// Überprüfe, ob der Benutzer ein Admin ist
const admins = await bot.telegram.getChatAdministrators(chatId); const admins = await bot.telegram.getChatAdministrators(chatId);
const isAdmin = admins.some(admin => admin.user.id === userId); const isAdmin = admins.some(admin => admin.user.id === userId);
@ -429,21 +447,23 @@ bot.on('text', async (ctx) => {
replyMessage += 'Keine nicht gefundenen Wünsche.'; replyMessage += 'Keine nicht gefundenen Wünsche.';
} else { } else {
notFoundWishes.forEach((entry, index) => { notFoundWishes.forEach((entry, index) => {
replyMessage += `${index + 1}. Kategorie: ${entry.category}\n Wunsch: ${entry.wish}\n\n\n`; replyMessage += `${index + 1}. Kategorie: ${entry.category} - Wunsch: ${entry.wish}\n`;
}); });
replyMessage += '\n🗑 [Löschen]';
} }
// Sende die Liste direkt an den Admin // Füge die Löschen-Buttons für jeden Eintrag hinzu
await ctx.reply(replyMessage, { disable_notification: true, ...getDeleteNotFoundWishKeyboard() }); const inlineKeyboard = {
reply_markup: JSON.stringify({
inline_keyboard: notFoundWishes.map((_, index) => [
{ text: `🗑️ Löschen ${index + 1}`, callback_data: `delete_not_found_${index}` }
])
})
};
// Lösche den /notfound Befehl await ctx.reply(replyMessage, inlineKeyboard);
await ctx.deleteMessage(ctx.message.message_id).catch(e => logError(new Error(`Failed to delete /notfound command message: ${e.message}`)));
} else { } else {
await ctx.reply('Noch keine nicht gefundenen Wünsche aufgezeichnet.', { disable_notification: true }); await ctx.reply('Es gibt keine nicht gefundenen Wünsche.');
} }
} else {
await ctx.reply('❌ Du bist nicht berechtigt, diese Funktion zu nutzen. ❌', { disable_notification: true });
} }
} }
}); });