diff --git a/plex-bot.js b/plex-bot.js index 933e059..bf66f1a 100644 --- a/plex-bot.js +++ b/plex-bot.js @@ -17,6 +17,7 @@ const { scheduleJob } = require('node-schedule'); const { format } = require('date-fns'); const archiver = require('archiver'); + const today = format(new Date(), 'yyyy-MM-dd'); console.log(today); // Sollte das aktuelle Datum im Format yyyy-MM-dd ausgeben @@ -509,150 +510,28 @@ function updateEnvPassword(newPassword) { passwordChangeRequired = false; // Sperre aufheben, Login wieder möglich } -const usersNightMode = {}; // Temporärer Speicher für Nachtmodus -// Funktion zum Laden der Benutzerdaten aus der user.yml -function loadUserData() { - if (!fs.existsSync(USER_YML_PATH)) { - fs.writeFileSync(USER_YML_PATH, yaml.stringify({})); - } - return yaml.load(USER_YML_PATH); -} -// Funktion zum Speichern der Benutzerdaten in die user.yml -function saveUserData(userData) { - fs.writeFileSync(USER_YML_PATH, yaml.stringify(userData, 4)); -} -// /night Befehl -bot.onText(/\/night/, (msg) => { - const chatId = msg.chat.id; - const userData = loadUserData(); // Lade die Benutzerdaten - const userId = chatId.toString(); - bot.sendMessage(chatId, 'Bitte geben Sie die Startzeit des Nachtmodus im Format HH:mm ein (z.B. 22:00):'); - bot.once('message', (msg) => { - const startTime = msg.text; - if (!/^\d{2}:\d{2}$/.test(startTime)) { - return bot.sendMessage(chatId, 'Ungültiges Zeitformat. Bitte geben Sie die Zeit im Format HH:mm ein.'); - } - bot.sendMessage(chatId, 'Bitte geben Sie die Endzeit des Nachtmodus im Format HH:mm ein (z.B. 06:00):'); - bot.once('message', (msg) => { - const endTime = msg.text; - if (!/^\d{2}:\d{2}$/.test(endTime)) { - return bot.sendMessage(chatId, 'Ungültiges Zeitformat. Bitte geben Sie die Zeit im Format HH:mm ein.'); - } - // Speichere die Nachtmodus-Daten ohne die Benachrichtigungen sofort zu deaktivieren - userData[userId] = userData[userId] || {}; - userData[userId].nightMode = { startTime, endTime }; - saveUserData(userData); // Speichere die Daten in die yml-Datei - bot.sendMessage(chatId, `🌓 Nachtmodus geplant von ${startTime} bis ${endTime}. Benachrichtigungen werden deaktiviert, wenn der Nachtmodus beginnt.`); - }); - }); -}); -// Funktion zur Überprüfung, ob der Benutzer im Nachtmodus ist -function isUserInNightMode(chatId) { - const userData = loadUserData(); - const userId = chatId.toString(); - const userNightMode = userData[userId] && userData[userId].nightMode; - if (!userNightMode) return false; - const now = moment(); - const start = moment(userNightMode.startTime, 'HH:mm'); - const end = moment(userNightMode.endTime, 'HH:mm'); - if (end.isBefore(start)) { - return now.isAfter(start) || now.isBefore(end); // Nachtmodus über Mitternacht - } else { - return now.isBetween(start, end); // Normaler Nachtmodus - } -} -// Überprüft und stellt den Nachtmodus nach Ablauf wieder her -function resetNotificationsAfterNightMode() { - const userData = loadUserData(); - for (const userId in userData) { - if (isUserInNightMode(userId)) continue; - // Setze die Benachrichtigungseinstellungen auf den ursprünglichen Wert zurück - if (userData[userId].originalNotifications !== undefined) { - userData[userId].notifications = userData[userId].originalNotifications; - delete userData[userId].originalNotifications; // Lösche die temporäre Speicherung - saveUserData(userData); - } - } -} -// Funktion zur automatischen Aktivierung des Nachtmodus -function activateNightMode() { - const userData = loadUserData(); - for (const userId in userData) { - const userNightMode = userData[userId] && userData[userId].nightMode; - if (!userNightMode) continue; - const now = moment(); - const start = moment(userNightMode.startTime, 'HH:mm'); - const end = moment(userNightMode.endTime, 'HH:mm'); - // Wenn die Startzeit erreicht ist und die Benachrichtigungen noch nicht deaktiviert wurden, deaktiviere sie - if (now.isSameOrAfter(start) && userData[userId].notifications !== false) { - userData[userId].originalNotifications = userData[userId].notifications; - userData[userId].notifications = false; - saveUserData(userData); - bot.sendMessage(userId, `🌓 Der Nachtmodus hat begonnen. Deine Benachrichtigungen wurden auf Stumm geschaltet.`); - console.log(`Nachtmodus für Benutzer ${userId} aktiviert.`); - } - // Wenn die Endzeit erreicht ist und die Benachrichtigungen deaktiviert wurden, aktiviere sie wieder - if (now.isSameOrAfter(end) && userData[userId].notifications === false) { - userData[userId].notifications = userData[userId].originalNotifications; - delete userData[userId].originalNotifications; // Lösche die temporäre Speicherung - saveUserData(userData); - bot.sendMessage(userId, `🌓 Der Nachtmodus endet, die Benachrichtigungen sind jetzt wieder aktiv.`); - console.log(`Nachtmodus für Benutzer ${userId} deaktiviert.`); - } - } -} -// Automatische Nachtmodus-Aktivierung und Zurücksetzung überwachen -setInterval(() => { - activateNightMode(); // Nachtmodus aktivieren, wenn es Zeit ist - resetNotificationsAfterNightMode(); // Benachrichtigungen nach dem Nachtmodus zurücksetzen -}, 60 * 1000); // Überprüfung alle 60 Sekunden - -// /night_off Befehl -bot.onText(/\/n_off/, (msg) => { - const chatId = msg.chat.id; - const userData = loadUserData(); // Lade die Benutzerdaten - const userId = chatId.toString(); - - if (userData[userId] && userData[userId].nightMode) { - // Setze die Benachrichtigungseinstellungen auf den ursprünglichen Wert zurück - if (userData[userId].originalNotifications !== undefined) { - userData[userId].notifications = userData[userId].originalNotifications; - delete userData[userId].originalNotifications; // Lösche die temporäre Speicherung - } - - // Entferne die Nachtmodus-Daten - delete userData[userId].nightMode; - - // Speichere die Änderungen in der user.yml-Datei - saveUserData(userData); - - bot.sendMessage(chatId, '🌓 Der Nachtmodus wurde deaktiviert. Benachrichtigungen sind wieder aktiviert.'); - } else { - bot.sendMessage(chatId, 'Es ist kein Nachtmodus aktiv.'); - } -}); @@ -1088,6 +967,23 @@ if (query.data.startsWith('change_email')) { } }); + + + + + + + + + + + + + + + + + // Lade Abonnenten beim Start loadSubscribers(); @@ -1139,45 +1035,58 @@ bot.onText(/\/profil/, (msg) => { } const role = roles.length > 0 ? roles.join(', ') : 'Benutzer'; - // Schritt 2: Newsletter-Status aus subscribers.json lesen fs.readFile(subscribersFilePath, 'utf8', (err, subsData) => { - if (err) { - console.error(`Fehler beim Lesen der Datei ${subscribersFilePath}: ${err}`); - bot.sendMessage(chatId, 'Fehler beim Laden des Newsletter-Status.') - .catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); - return; - } + if (err) { + console.error(`Fehler beim Lesen der Datei ${subscribersFilePath}: ${err}`); + bot.sendMessage(chatId, 'Fehler beim Laden des Newsletter-Status.') + .catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); + return; + } + + let subscribers; + try { + subscribers = JSON.parse(subsData); // JSON sicher parsen + } catch (parseErr) { + console.error('Fehler beim Parsen der subscribers.json:', parseErr); + bot.sendMessage(chatId, 'Fehler beim Verarbeiten der Abonnentendaten.') + .catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); + return; + } + + // Status prüfen, ob der Benutzer abonniert ist + const isSubscribed = subscribers.some(subscriber => subscriber.chatId === chatId); + const newsletterStatus = isSubscribed ? 'Ja' : 'Nein'; - const subscribers = JSON.parse(subsData); - const isSubscribed = subscribers.some(subscriber => subscriber.chatId === chatId); - const newsletterStatus = isSubscribed ? 'Ja' : 'Nein'; + // Schritt 3: Wünsche aus wishes_${chatId}.json lesen + fs.readFile(wishesFilePath, 'utf8', (err, wishesData) => { + let wishesCount = 0; // Initialisierung der Wünsche + let notificationStatus = user.notifications ? 'Ja' : 'Nein'; - // Schritt 3: Wünsche aus wishes_${chatId}.json lesen - fs.readFile(wishesFilePath, 'utf8', (err, wishesData) => { - let wishesCount = 0; // Initialisierung der Wünsche - let notificationStatus = user.notifications ? 'Ja' : 'Nein'; + if (!err) { + try { + const userWishes = JSON.parse(wishesData); + wishesCount = userWishes.length; + } catch (parseErr) { + console.error('Fehler beim Parsen der wishes-Datei:', parseErr); + } + } - if (!err) { - const userWishes = JSON.parse(wishesData); - wishesCount = userWishes.length; - } + // Schritt 4: Anzahl der Feedbacks zählen + fs.stat(feedbackFilePath, (err) => { + let feedbackCount = 0; // Standardwert für Feedbacks - // Schritt 4: Anzahl der Feedbacks zählen - fs.stat(feedbackFilePath, (err) => { - let feedbackCount = 0; // Standardwert für Feedbacks + if (!err) { // Datei existiert + fs.readFile(feedbackFilePath, 'utf8', (err, feedbackData) => { + if (!err) { + const feedbackLines = feedbackData.split('\n'); + feedbackCount = feedbackLines.filter(line => line.includes(`chatId ${chatId}`)).length; // Zähle nur die Feedbacks des aktuellen Benutzers + } - if (!err) { // Datei existiert - fs.readFile(feedbackFilePath, 'utf8', (err, feedbackData) => { - if (!err) { - const feedbackLines = feedbackData.split('\n'); - feedbackCount = feedbackLines.filter(line => line.includes(`chatId ${chatId}`)).length; // Zähle nur die Feedbacks des aktuellen Benutzers - } + // Benutzerlevel aktualisieren basierend auf den aktuellen Wünschen + const updatedUserLevel = getUserLevel(commandCount, wishesCount); - // Benutzerlevel aktualisieren basierend auf den aktuellen Wünschen - const updatedUserLevel = getUserLevel(commandCount, wishesCount); - - // Schritt 5: Nachricht formatieren und senden - const profileMessage = ` + // Schritt 5: Nachricht formatieren und senden + const profileMessage = ` 📝 *Profil Informationen:*\n\n 👤 *Name:* @${userName}\n 🔑 *ID:* ${userId}\n @@ -1190,21 +1099,19 @@ bot.onText(/\/profil/, (msg) => { 🔔 *Benachrichtigung:* ${notificationStatus}\n `.trim(); // Whitespace entfernen -//🎞️ *Lieblingsgenre:* ${favoriteGenre}\n - - // Sende Profilinformationen und zeige Button an - bot.sendMessage(chatId, profileMessage, { - parse_mode: 'MarkdownV2', - reply_markup: { - inline_keyboard: [ - [{ text: 'Profil Bearbeiten', callback_data: 'edit_profile' }] - ] - } - }).catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); - }); - } else { - // Datei existiert nicht, einfach die Nachricht senden - const profileMessage = ` + // Sende Profilinformationen und zeige Button an + bot.sendMessage(chatId, profileMessage, { + parse_mode: 'MarkdownV2', + reply_markup: { + inline_keyboard: [ + [{ text: 'Profil Bearbeiten', callback_data: 'edit_profile' }] + ] + } + }).catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); + }); + } else { + // Datei existiert nicht, einfach die Nachricht senden + const profileMessage = ` 📝 *Profil Informationen:*\n\n 👤 *Name:* @${userName}\n 🔑 *ID:* ${userId}\n @@ -1217,21 +1124,22 @@ bot.onText(/\/profil/, (msg) => { 🔔 *Benachrichtigung:* ${notificationStatus}\n `.trim(); // Whitespace entfernen - bot.sendMessage(chatId, profileMessage, { - parse_mode: 'MarkdownV2', - reply_markup: { - inline_keyboard: [ - [{ text: 'Profil Bearbeiten', callback_data: 'edit_profile' }] - ] - } - }).catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); - } - }); - }); + bot.sendMessage(chatId, profileMessage, { + parse_mode: 'MarkdownV2', + reply_markup: { + inline_keyboard: [ + [{ text: 'Profil Bearbeiten', callback_data: 'edit_profile' }] + ] + } + }).catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); + } + }); + }); }); }); }); + // Callback query handler for profile editing bot.on('callback_query', (callbackQuery) => { const action = callbackQuery.data; @@ -1243,7 +1151,7 @@ bot.on('callback_query', (callbackQuery) => { reply_markup: { inline_keyboard: [ [ - //{ text: 'Lieblingsgenre setzen', callback_data: 'set_favorite_genre' }, + { text: 'Lieblingsgenre setzen', callback_data: 'set_favorite_genre' }, { text: 'Profil zurücksetzen', callback_data: 'reset_profile' } ], [ @@ -1413,11 +1321,21 @@ bot.on('callback_query', (callbackQuery) => { return; } - const wOffen = load(wOffenData); - delete wOffen[chatId]; // Entferne den Benutzer aus w_offen.json + let wOffen; + try { + wOffen = JSON.parse(wOffenData); // Sicheres Parsen der JSON-Daten + } catch (parseErr) { + console.error(`Fehler beim Parsen der w_offen.json: ${parseErr}`); + bot.sendMessage(chatId, 'Fehler beim Löschen des Profils.') + .catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); + return; + } - // Schreibe die aktualisierten Einträge zurück in die w_offen.json - fs.writeFile(wOffenFilePath, dump(wOffen), 'utf8', (err) => { + // Entferne alle Wünsche des Benutzers + wOffen = wOffen.filter(wish => wish.userId !== chatId); + + // Schreibe die aktualisierten Wünsche zurück in die w_offen.json + fs.writeFile(wOffenFilePath, JSON.stringify(wOffen, null, 2), 'utf8', (err) => { if (err) { console.error(`Fehler beim Schreiben in die Datei ${wOffenFilePath}: ${err}`); bot.sendMessage(chatId, 'Fehler beim Löschen des Profils.') @@ -1480,7 +1398,7 @@ bot.on('callback_query', (callbackQuery) => { .catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); } }); -} + } }); const { load, dump } = require('js-yaml'); // Stelle sicher, dass js-yaml installiert ist @@ -1497,16 +1415,26 @@ function formatDate(dateString) { } // Funktion zum Bestimmen des Benutzerlevels -function getUserLevel(commandCount, wishCount) { +function getUserLevel(commandCount) { let level = 'Neuling'; // Kriterien für die Vergabe des Benutzerlevels - if (commandCount > 50) { - level = 'VIP Benutzer'; - } else if (commandCount > 20) { + if (commandCount >= 6000) { + level = 'Legendärer Benutzer'; + } else if (commandCount >= 3000) { + level = 'Meister Benutzer'; + } else if (commandCount >= 1600) { + level = 'Fortgeschrittener Benutzer'; + } else if (commandCount >= 800) { level = 'Erfahrener Benutzer'; - } else if (commandCount > 5 || wishCount > 1) { + } else if (commandCount >= 400) { + level = 'VIP Benutzer'; + } else if (commandCount >= 200) { level = 'Aktiver Benutzer'; + } else if (commandCount >= 100) { + level = 'Gelegentlicher Benutzer'; + } else if (commandCount >= 30) { + level = 'Neuling'; } return level; @@ -1568,6 +1496,24 @@ bot.on('message', (msg) => { }); }); + + + + + + + + + + + + + + + + + + // Befehl zum Sichern der Dateien bot.onText(/\/backup/, (msg) => { const chatId = msg.chat.id; @@ -3294,6 +3240,304 @@ async function fetchPlexData(url) { } } +const usersNightMode = {}; // Temporärer Speicher für Nachtmodus + +// Funktion zum Laden der Benutzerdaten aus der user.yml +function loadUserData() { + if (!fs.existsSync(USER_YML_PATH)) { + fs.writeFileSync(USER_YML_PATH, yaml.stringify({})); + } + return yaml.load(USER_YML_PATH); +} + +// Funktion zum Speichern der Benutzerdaten in die user.yml +function saveUserData(userData) { + fs.writeFileSync(USER_YML_PATH, yaml.stringify(userData, 4)); +} + +// Funktion zum Anheften der Nachtmodus-Nachricht +function pinNightModeMessage(chatId, messageId) { + bot.pinChatMessage(chatId, messageId).catch(err => console.error('Fehler beim Anheften der Nachricht:', err)); +} + +// Funktion zum Entfernen der angehefteten Nachricht +function unpinNightModeMessage(chatId) { + bot.unpinChatMessage(chatId).catch(err => console.error('Fehler beim Entfernen der angehefteten Nachricht:', err)); +} + +// /night Befehl +bot.onText(/\/night/, (msg) => { + const chatId = msg.chat.id; + const userData = loadUserData(); // Lade die Benutzerdaten + const userId = chatId.toString(); + + // Standard-Buttons + const buttons = []; + + // Überprüfen, ob der Benutzer bereits Nachtmodi hat + if (!userData[userId] || !userData[userId].nightModes || userData[userId].nightModes.length === 0) { + buttons.push([{ text: '🌙 Nachtmodus eingeben', callback_data: 'input_night_mode' }]); + } else { + buttons.push( + [ + { text: '🛠️ Nachtmodus bearbeiten', callback_data: 'edit_night_mode' }, + { text: '➕ Weiteren Nachtmodus eingeben', callback_data: 'add_night_mode' } + ], + [{ text: '🗑️ Nachtmodus löschen', callback_data: 'delete_night_mode' }] + ); + } + + // Zeige die Inline-Buttons an + bot.sendMessage(chatId, 'Wählen Sie eine Option:', { + reply_markup: { + inline_keyboard: buttons, + }, + }); +}); + +// Callback-Query-Handler für die Inline-Buttons +bot.on('callback_query', (query) => { + const chatId = query.message.chat.id; + const userId = chatId.toString(); + const userData = loadUserData(); // Lade die Benutzerdaten + + if (query.data === 'input_night_mode') { + // Eingabe eines neuen Nachtmodus + bot.sendMessage(chatId, 'Bitte geben Sie die Startzeit des Nachtmodus im Format HH:mm ein (z.B. 22:00):'); + + bot.once('message', (msg) => { + const startTime = msg.text; + + // Sicherstellen, dass msg.text existiert und gültig ist + if (!startTime || !/^\d{2}:\d{2}$/.test(startTime)) { + return bot.sendMessage(chatId, 'Ungültiges Zeitformat. Bitte geben Sie die Zeit im Format HH:mm ein.'); + } + + bot.sendMessage(chatId, 'Bitte geben Sie die Endzeit des Nachtmodus im Format HH:mm ein (z.B. 06:00):'); + + bot.once('message', (msg) => { + const endTime = msg.text; + + // Sicherstellen, dass msg.text existiert und gültig ist + if (!endTime || !/^\d{2}:\d{2}$/.test(endTime)) { + return bot.sendMessage(chatId, 'Ungültiges Zeitformat. Bitte geben Sie die Zeit im Format HH:mm ein.'); + } + + // Speichere die Nachtmodus-Daten + userData[userId] = userData[userId] || {}; + userData[userId].nightModes = userData[userId].nightModes || []; + userData[userId].nightModes.push({ startTime, endTime }); + saveUserData(userData); // Speichere die Daten in die yml-Datei + + bot.sendMessage(chatId, `🌓 Nachtmodus geplant von ${startTime} bis ${endTime}.`); + }); + }); + } else if (query.data === 'edit_night_mode') { + // Bearbeiten eines bestehenden Nachtmodus + if (userData[userId] && userData[userId].nightModes && userData[userId].nightModes.length > 0) { + const nightModes = userData[userId].nightModes; + + let nightModesText = 'Aktuelle Nachtmodi:\n'; + nightModes.forEach((mode, index) => { + nightModesText += `${index + 1}: ${mode.startTime} bis ${mode.endTime}\n`; + }); + + nightModesText += 'Geben Sie die Nummer des Nachtmodus ein, den Sie bearbeiten möchten:'; + bot.sendMessage(chatId, nightModesText); + + bot.once('message', (msg) => { + const modeIndex = parseInt(msg.text) - 1; + + if (isNaN(modeIndex) || modeIndex < 0 || modeIndex >= nightModes.length) { + return bot.sendMessage(chatId, 'Ungültige Auswahl.'); + } + + bot.sendMessage(chatId, 'Bitte geben Sie die neue Startzeit im Format HH:mm ein (z.B. 22:00):'); + + bot.once('message', (msg) => { + const newStartTime = msg.text; + + // Sicherstellen, dass msg.text existiert und gültig ist + if (!newStartTime || !/^\d{2}:\d{2}$/.test(newStartTime)) { + return bot.sendMessage(chatId, 'Ungültiges Zeitformat. Bitte geben Sie die Zeit im Format HH:mm ein.'); + } + + bot.sendMessage(chatId, 'Bitte geben Sie die neue Endzeit im Format HH:mm ein (z.B. 06:00):'); + + bot.once('message', (msg) => { + const newEndTime = msg.text; + + // Sicherstellen, dass msg.text existiert und gültig ist + if (!newEndTime || !/^\d{2}:\d{2}$/.test(newEndTime)) { + return bot.sendMessage(chatId, 'Ungültiges Zeitformat. Bitte geben Sie die Zeit im Format HH:mm ein.'); + } + + // Aktualisiere den Nachtmodus + userData[userId].nightModes[modeIndex] = { startTime: newStartTime, endTime: newEndTime }; + saveUserData(userData); // Speichere die Änderungen + + bot.sendMessage(chatId, `🌓 Nachtmodus aktualisiert auf ${newStartTime} bis ${newEndTime}.`); + }); + }); + }); + } else { + bot.sendMessage(chatId, 'Es sind keine Nachtmodi zum Bearbeiten vorhanden.'); + } + } else if (query.data === 'add_night_mode') { + // Eingabe eines weiteren Nachtmodus + bot.sendMessage(chatId, 'Bitte geben Sie die Startzeit des Nachtmodus im Format HH:mm ein (z.B. 22:00):'); + + bot.once('message', (msg) => { + const startTime = msg.text; + + // Sicherstellen, dass msg.text existiert und gültig ist + if (!startTime || !/^\d{2}:\d{2}$/.test(startTime)) { + return bot.sendMessage(chatId, 'Ungültiges Zeitformat. Bitte geben Sie die Zeit im Format HH:mm ein.'); + } + + bot.sendMessage(chatId, 'Bitte geben Sie die Endzeit des Nachtmodus im Format HH:mm ein (z.B. 06:00):'); + + bot.once('message', (msg) => { + const endTime = msg.text; + + // Sicherstellen, dass msg.text existiert und gültig ist + if (!endTime || !/^\d{2}:\d{2}$/.test(endTime)) { + return bot.sendMessage(chatId, 'Ungültiges Zeitformat. Bitte geben Sie die Zeit im Format HH:mm ein.'); + } + + // Speichere den neuen Nachtmodus + userData[userId].nightModes.push({ startTime, endTime }); + saveUserData(userData); // Speichere die Daten in die yml-Datei + + bot.sendMessage(chatId, `🌓 Weiterer Nachtmodus geplant von ${startTime} bis ${endTime}.`); + }); + }); + } else if (query.data === 'delete_night_mode') { + // Zeige Liste der Nachtmodi zum Löschen + if (userData[userId] && userData[userId].nightModes && userData[userId].nightModes.length > 0) { + const nightModes = userData[userId].nightModes; + + let nightModesText = '🔄 **Bitte wählen Sie einen Nachtmodus zum Löschen:**\n\n'; + nightModes.forEach((mode, index) => { + nightModesText += `🕒 **${index + 1}:** ${mode.startTime} bis ${mode.endTime}\n`; + }); + + nightModesText += '\n🗑️ *Geben Sie die Nummer des Nachtmodus ein, den Sie löschen möchten:*'; + bot.sendMessage(chatId, nightModesText); + + bot.once('message', (msg) => { + const modeIndex = parseInt(msg.text) - 1; + + if (isNaN(modeIndex) || modeIndex < 0 || modeIndex >= nightModes.length) { + return bot.sendMessage(chatId, 'Ungültige Auswahl.'); + } + + // Lösche den ausgewählten Nachtmodus + userData[userId].nightModes.splice(modeIndex, 1); // Lösche den Nachtmodus an der gegebenen Indexposition + saveUserData(userData); // Speichere die Änderungen + bot.sendMessage(chatId, '🗑️ Der ausgewählte Nachtmodus wurde gelöscht.'); + }); + } else { + bot.sendMessage(chatId, 'Es gibt keinen Nachtmodus, der gelöscht werden kann.'); + } + } +}); + +// Funktion zur Überprüfung, ob der Benutzer im Nachtmodus ist +function isUserInNightMode(chatId) { + const userData = loadUserData(); + const userId = chatId.toString(); + const userNightModes = userData[userId] && userData[userId].nightModes; + + if (!userNightModes || userNightModes.length === 0) return false; + + const now = moment(); + + return userNightModes.some(userNightMode => { + const start = moment(userNightMode.startTime, 'HH:mm'); + const end = moment(userNightMode.endTime, 'HH:mm'); + + if (end.isBefore(start)) { + return now.isAfter(start) || now.isBefore(end); // Nachtmodus über Mitternacht + } else { + return now.isBetween(start, end); // Normaler Nachtmodus + } + }); +} + +// Funktion zur automatischen Aktivierung des Nachtmodus +function activateNightMode() { + const userData = loadUserData(); + + for (const userId in userData) { + const userNightModes = userData[userId] && userData[userId].nightModes; + if (!userNightModes) continue; + + const now = moment(); + + userNightModes.forEach(userNightMode => { + const start = moment(userNightMode.startTime, 'HH:mm'); + const end = moment(userNightMode.endTime, 'HH:mm'); + + // Nachtmodus über Mitternacht + if (end.isBefore(start)) { + if (now.isAfter(start) || now.isBefore(end)) { + handleNightModeActivation(userId, userData); + } else { + handleNightModeDeactivation(userId, userData); + } + } + // Normaler Nachtmodus + else { + if (now.isBetween(start, end)) { + handleNightModeActivation(userId, userData); + } else { + handleNightModeDeactivation(userId, userData); + } + } + }); + } +} + +// Funktion zur Aktivierung des Nachtmodus +function handleNightModeActivation(userId, userData) { + if (userData[userId].notifications !== false) { + userData[userId].originalNotifications = userData[userId].notifications; + userData[userId].notifications = false; + saveUserData(userData); + + bot.sendMessage(userId, `🌓 Der Nachtmodus hat begonnen. Deine Benachrichtigungen wurden auf Stumm geschaltet.`) + .then((msg) => { + // Pin die Nachricht + pinNightModeMessage(userId, msg.message_id); + }); + + console.log(`Nachtmodus für Benutzer ${userId} aktiviert.`); + } +} + +// Funktion zur Deaktivierung des Nachtmodus +function handleNightModeDeactivation(userId, userData) { + if (userData[userId].notifications === false) { + userData[userId].notifications = userData[userId].originalNotifications; + delete userData[userId].originalNotifications; + saveUserData(userData); + + bot.sendMessage(userId, `🌓 Der Nachtmodus endet, die Benachrichtigungen sind jetzt wieder aktiv.`) + .then(() => { + // Unpin die Nachricht + unpinNightModeMessage(userId); + }); + + console.log(`Nachtmodus für Benutzer ${userId} deaktiviert.`); + } +} + +// Automatische Nachtmodus-Aktivierung überwachen +setInterval(() => { + activateNightMode(); +}, 60 * 1000); // Überprüfung alle 60 Sekunden + // Funktion zum Erstellen der Datei 'w_offen.json' im Hauptverzeichnis, falls sie noch nicht existiert function ensureWOffenFileExists() { const filePath = path.join(__dirname, 'w_offen.json'); // Hauptverzeichnis @@ -3347,8 +3591,8 @@ function getTypeKeyboard() { return { reply_markup: JSON.stringify({ inline_keyboard: [ - [{ text: 'Film', callback_data: 'type_film' }], - [{ text: 'Serie', callback_data: 'type_serie' }] + [{ text: '🎬 Film', callback_data: 'type_film' }], + [{ text: '📺 Serie', callback_data: 'type_serie' }] ] }) }; @@ -3363,19 +3607,20 @@ async function sendWish(wish, type, chatId) { reply_markup: JSON.stringify({ inline_keyboard: [ [ - { text: 'Wunsch erfüllt', callback_data: `wish_fulfilled_${chatId}` }, - { text: 'Wunsch nicht erfüllt', callback_data: `wish_not_fulfilled_${chatId}` } + { text: '✅ Wunsch erfüllt', callback_data: `wish_fulfilled_${chatId}` }, + { text: '❌ Wunsch nicht erfüllt', callback_data: `wish_not_fulfilled_${chatId}` } ] ] }) }; try { - await Promise.all([ + const [msg1, msg2] = await Promise.all([ bot.sendMessage(USER1_ID, message, inlineKeyboard), bot.sendMessage(USER2_ID, message, inlineKeyboard), ]); console.log(`Wunsch von Typ ${type} wurde an ${USER1_ID} und ${USER2_ID} gesendet.`); + return { messageId1: msg1.message_id, messageId2: msg2.message_id }; // Rückgabe der Nachricht IDs } catch (error) { console.error(`Fehler beim Senden des Wunsches: ${error.message}`); } @@ -3392,8 +3637,12 @@ bot.on('callback_query', async (query) => { if (data.startsWith('type_')) { // Benutzer hat den Typ ausgewählt (Film oder Serie) const type = data === 'type_film' ? 'Film' : 'Serie'; - bot.sendMessage(chatId, `Du hast ${type} ausgewählt. Bitte gib den Titel des ${type} ein.`) + await bot.sendMessage(chatId, `Du hast ${type} ausgewählt. Bitte gib den Titel des ${type} ein.`) .catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); + + // Lösche die Nachricht der Kategorieauswahl + await bot.deleteMessage(chatId, query.message.message_id).catch(error => console.error(`Fehler beim Löschen der Nachricht: ${error.message}`)); + userStates[chatId] = { type, waitingForWish: true }; // Setze den Status auf "wartend auf Wunsch" } @@ -3401,10 +3650,10 @@ bot.on('callback_query', async (query) => { const userId = data.split('_')[2]; // Der Ersteller des Wunsches const messageText = query.message.text; // Der Text des Wunsches const wishTitle = messageText.split('Titel:\n')[1].trim(); // Titel korrekt extrahieren - - bot.sendMessage(userId, '🎉 Dein Wunsch wurde erfüllt!') + + await bot.sendMessage(userId, '🎉 Dein Wunsch wurde erfüllt!') .catch(error => console.error(`Fehler beim Senden der Nachricht: ${error.message}`)); - + // Wunsch in der Datei 'wishes_.json' als erfüllt markieren const filePath = path.join(__dirname, 'wunsch', `wishes_${userId}.json`); fs.readFile(filePath, (err, data) => { @@ -3417,7 +3666,7 @@ bot.on('callback_query', async (query) => { } return wish; // Alle anderen Wünsche unverändert lassen }); - + fs.writeFile(filePath, JSON.stringify(wishes, null, 2), (err) => { if (err) { console.error(`Fehler beim Aktualisieren des Wunsches: ${err}`); @@ -3425,35 +3674,41 @@ bot.on('callback_query', async (query) => { }); } }); + + // Lösche die Wunschnachricht + await bot.deleteMessage(chatId, query.message.message_id); } - + if (data.startsWith('wish_not_fulfilled_')) { const userId = query.message.chat.id; // Nutze die Chat-ID des Nachrichtenautors - bot.sendMessage(userId, '😢 Dein Wunsch wurde leider nicht erfüllt.') - .catch(error => console.error(`Fehler beim Senden der Nachricht: ${error.message}`)); + await bot.sendMessage(userId, '😢 Dein Wunsch wurde leider nicht erfüllt.') + .catch(error => console.error(`Fehler beim Senden der Nachricht: ${error.message}`)); // Wunsch in der Datei 'w_offen.json' speichern const filePath = path.join(__dirname, 'w_offen.json'); const wishDetails = { - userId, - message: query.message.text, + userId: userId, // Chat-ID als userId speichern + message: query.message.text, // Nachricht als Wunsch speichern }; fs.readFile(filePath, (err, data) => { - let openWishes = []; - if (!err) { - openWishes = JSON.parse(data); // Vorhandene offene Wünsche lesen - } - openWishes.push(wishDetails); // Neuen offenen Wunsch hinzufügen - - fs.writeFile(filePath, JSON.stringify(openWishes, null, 2), (err) => { - if (err) { - console.error(`Fehler beim Speichern des offenen Wunsches: ${err}`); - } else { - console.log('Der nicht erfüllte Wunsch wurde in der Datei "w_offen.json" gespeichert.'); + let openWishes = []; + if (!err && data.length > 0) { + openWishes = JSON.parse(data); // Vorhandene offene Wünsche lesen } - }); + openWishes.push(wishDetails); // Neuen offenen Wunsch hinzufügen + + fs.writeFile(filePath, JSON.stringify(openWishes, null, 2), (err) => { + if (err) { + console.error(`Fehler beim Speichern des offenen Wunsches: ${err}`); + } else { + console.log('Der nicht erfüllte Wunsch wurde in der Datei "w_offen.json" gespeichert.'); + } + }); }); + + // Lösche die Wunschnachricht + await bot.deleteMessage(chatId, query.message.message_id); } bot.answerCallbackQuery(query.id).catch(error => { @@ -3464,25 +3719,25 @@ bot.on('callback_query', async (query) => { // Verarbeite eingehende Nachrichten bot.on('message', async (msg) => { const chatId = msg.chat.id; - const text = msg.text; + const text = msg.text || ''; // Sicherstellen, dass text definiert ist if (userStates[chatId] && userStates[chatId].waitingForWish) { const wish = text.trim(); if (wish) { const type = userStates[chatId].type; await sendWish(wish, type, chatId); - bot.sendMessage(chatId, `Dein ${type}-Wunsch wurde übermittelt.`) + await bot.sendMessage(chatId, `✅ Dein ${type}-Wunsch wurde übermittelt.`) .catch(error => console.error(`Fehler bei der Bestätigungsnachricht: ${error.message}`)); userStates[chatId].waitingForWish = false; } else { - bot.sendMessage(chatId, `Bitte gib den Titel des ${userStates[chatId].type} ein.`) + await bot.sendMessage(chatId, `✍️ Bitte gib den Titel des ${userStates[chatId].type} ein.`) .catch(error => console.error(`Fehler bei der Wunsch-Nachricht: ${error.message}`)); } return; } if (text.startsWith('/wunsch')) { - bot.sendMessage(chatId, 'Möchtest du einen Film oder eine Serie wünschen? Wähle bitte eine Option:', getTypeKeyboard()) + await bot.sendMessage(chatId, '🎬 Möchtest du einen Film oder eine Serie wünschen? Wähle bitte eine Option:', getTypeKeyboard()) .catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); userStates[chatId] = { waitingForType: true }; } @@ -3511,42 +3766,13 @@ bot.on('message', async (msg) => { // Objekt zur Verfolgung der Benutzer, die auf eine Eingabe warten let waitingForWishIndex = {}; -// Funktion zum Anzeigen aller offenen Wünsche und Inline-Button zum Markieren eines Wunsches als erfüllt -bot.onText(/\/open_wishes/, (msg) => { - const chatId = msg.chat.id; - - // Pfad zur 'w_offen.json' Datei - const filePath = path.join(__dirname, 'w_offen.json'); - - fs.readFile(filePath, (err, data) => { - if (err || data.length === 0) { - bot.sendMessage(chatId, 'Es gibt keine offenen Wünsche.') - .catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); - } else { - const openWishes = JSON.parse(data); - if (openWishes.length === 0) { - bot.sendMessage(chatId, 'Es gibt keine offenen Wünsche.') - .catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); - return; +// API-Endpunkt für offene Wünsche +app.get('/api/wishes', (req, res) => { + fs.readFile('w_offen.json', 'utf8', (err, data) => { + if (err) { + return res.status(500).json({ error: 'Fehler beim Lesen der Wünsche' }); } - - let message = '📜 Offene Wünsche:\n\n'; - openWishes.forEach((wish, index) => { - message += `${index + 1}. User ID: ${wish.userId}\n🔹 Titel: ${wish.message}\n\n`; - }); - - // Inline-Keyboard mit einem Button, um einen Wunsch als erfüllt zu markieren - const inlineKeyboard = { - reply_markup: JSON.stringify({ - inline_keyboard: [ - [{ text: 'Wunsch als erfüllt markieren', callback_data: 'mark_wish_fulfilled' }] - ] - }) - }; - - bot.sendMessage(chatId, message, inlineKeyboard) - .catch(error => console.error(`Fehler bei der Nachricht: ${error.message}`)); - } + res.json(JSON.parse(data)); }); }); @@ -4605,6 +4831,7 @@ app.get('/api/latest-movies', async (req, res) => { const movies = response.data.MediaContainer.Metadata.slice(0, 10).map(movie => ({ title: movie.title, coverImage: `${process.env.PLEX_DOMAIN}${movie.thumb}?X-Plex-Token=${process.env.PLEX_TOKEN}`, // Coverbild-URL mit Token + summary: movie.summary // Hier fügst du die Zusammenfassung hinzu })); console.log(movies); // Überprüfung der Daten @@ -4795,16 +5022,49 @@ app.delete('/api/delete-faq', (req, res) => { } }); -// API-Endpunkt für offene Wünsche app.get('/api/wishes', (req, res) => { fs.readFile('w_offen.json', 'utf8', (err, data) => { if (err) { return res.status(500).json({ error: 'Fehler beim Lesen der Wünsche' }); } - res.json(JSON.parse(data)); + try { + // Hier kannst du die Logik zum Parsen der Datei manuell implementieren + const wishes = parseWishes(data); + res.json(wishes); + } catch (error) { + return res.status(500).json({ error: 'Fehler beim Verarbeiten der Wünsche' }); + } }); }); +// Funktion zum manuellen Parsen der nicht-standardisierten Daten +function parseWishes(data) { + const wishes = []; + const lines = data.split('\n'); + let currentWish = {}; + + for (let line of lines) { + if (line.startsWith('- userId:')) { + if (Object.keys(currentWish).length > 0) { + wishes.push(currentWish); // vorherigen Wunsch speichern + } + currentWish = { userId: parseInt(line.split(': ')[1]) }; // userId speichern + } else if (line.startsWith('message: |-')) { + // Nächste Zeile ist der Beginn der Nachricht + currentWish.message = ''; + } else if (currentWish.message !== undefined) { + currentWish.message += line + '\n'; // Nachricht aufbauen + } + } + + // Den letzten Wunsch hinzufügen + if (Object.keys(currentWish).length > 0) { + wishes.push(currentWish); + } + + return wishes; +} + // Endpoint für das Feedback app.get('/api/feedback', (req, res) => { const feedbackFilePath = path.join(__dirname, 'feedback.log'); @@ -5239,62 +5499,17 @@ function sendToTelegram(report) { - - - // Ende Frontend - - - - - - - - - - - - - /// Definition der logDebug-Funktion function logDebug(message) { console.log(`${new Date().toISOString()} - DEBUG: ${message}`); } -// Funktion zum Verarbeiten von Webhook-Anfragen -app.post('/mywebhook', async (req, res) => { -try { - const event = req.body; - logDebug(`Received webhook event: ${JSON.stringify(event, null, 2)}`); - if (event.type === 'library.new' && event.Metadata) { - const addedMovie = event.Metadata; - const movieTitle = addedMovie.title || 'Unbekannt'; - const message = `Ein neuer Film wurde hinzugefügt:\n\nTitel: ${movieTitle}`; - - const users = yaml.load(USER_YML_PATH); - const sendMessages = Object.keys(users).map(chatId => - bot.sendMessage(chatId, message).catch(error => { - logError(`Error sending message to chatId ${chatId}: ${error.message}`); - }) - ); - - await Promise.all(sendMessages); - logMessage(`Sent new movie message to all users`); - } else { - logDebug(`Unhandled event type or missing metadata: ${event.type}`); - } - - res.sendStatus(200); -} catch (error) { - logError(`Error processing webhook: ${error.message}`); - res.sendStatus(500); -} -}); // Express-Server starten app.listen(PORT, () => {