From cd2e2fb54c8c2ff62d20c06ee78406c9e649774c Mon Sep 17 00:00:00 2001 From: M_Viper Date: Sun, 14 Jan 2024 10:55:31 +0100 Subject: [PATCH] support_bot.js aktualisiert --- support_bot.js | 393 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 261 insertions(+), 132 deletions(-) diff --git a/support_bot.js b/support_bot.js index 8c7de58..4fb2680 100644 --- a/support_bot.js +++ b/support_bot.js @@ -3,6 +3,7 @@ const nodemailer = require('nodemailer'); const fs = require('fs').promises; const yaml = require('js-yaml'); const path = require('path'); +const axios = require('axios'); require('dotenv').config(); const emailConfig = { @@ -12,6 +13,11 @@ const emailConfig = { }; const botToken = process.env.BOT_TOKEN; +const ADMIN_ID = process.env.ADMIN_ID; + + +// Lade die erlaubten Admin-IDs aus der .env-Datei +const allowedAdminIds = ADMIN_ID.split(','); const botInfo = { name: 'Telegram Support Bot', @@ -24,7 +30,63 @@ const bot = new TelegramBot(botToken, { polling: true }); const ticketCreationStatus = new Map(); -const logoPath = path.join(__dirname, 'logo.png'); // Setze den korrekten Pfad zu deinem Logo +const logoPath = path.join(__dirname, 'logo.png'); + + +function sendErrorNotification(error) { + try { + const adminChatId = 5507179337; + + bot.sendMessage(adminChatId, `Es ist ein Fehler aufgetreten:\n${error}`) + .catch((adminError) => { + console.error('Fehler beim Senden der Fehlermeldung an den Administrator:', adminError); + }); + } catch (sendErrorNotificationError) { + console.error('Fehler beim Senden der Fehlermeldung:', sendErrorNotificationError); + } +} + + +async function checkBotStatus(chatId) { + try { + const isBotOnline = true; + const statusMessage = isBotOnline ? 'Der Bot ist online.' : 'Der Bot ist offline.'; + bot.sendMessage(chatId, statusMessage); + } catch (error) { + console.error('Fehler beim Überprüfen des Bot-Status:', error); + sendErrorNotification(error); + bot.sendMessage(chatId, 'Fehler beim Überprüfen des Bot-Status.'); + } +} + +async function checkWebsiteStatus(chatId) { + const websites = [ + { + name: process.env.WEBSITE_1_NAME, + url: process.env.WEBSITE_1_URL, + }, + { + name: process.env.WEBSITE_2_NAME, + url: process.env.WEBSITE_2_URL, + }, + ]; + + for (const website of websites) { + try { + const response = await axios.get(website.url); + const statusMessage = `✅ ${website.name} ist online.`; + bot.sendMessage(chatId, statusMessage, { parse_mode: 'HTML' }); + } catch (error) { + console.error(`Fehler beim Zugriff auf ${website.name}:`, error); + const errorMessage = `❌ ${website.name} ist offline. Fehler: ${error.message}`; + sendErrorNotification(errorMessage); + bot.sendMessage(chatId, errorMessage, { parse_mode: 'HTML' }); + } + } +} + + +setInterval(checkWebsiteStatus, 30000); async function loadFromYaml(filePath) { try { @@ -32,142 +94,213 @@ async function loadFromYaml(filePath) { return yaml.load(fileContents); } catch (error) { console.error(`Fehler beim Laden der YAML-Datei für ${path.basename(filePath)}:`, error); + sendErrorNotification(error); return []; } } async function loadLinks() { - const linksDataPath = path.join(__dirname, 'links.yml'); - return await loadFromYaml(linksDataPath); + try { + const linksDataPath = path.join(__dirname, 'links.yml'); + return await loadFromYaml(linksDataPath); + } catch (error) { + console.error('Fehler beim Laden der Links:', error); + sendErrorNotification(error); + return []; + } } async function loadTeam() { - const teamDataPath = path.join(__dirname, 'team.json'); - return await loadFromYaml(teamDataPath); + try { + const teamDataPath = path.join(__dirname, 'team.json'); + return await loadFromYaml(teamDataPath); + } catch (error) { + console.error('Fehler beim Laden des Teams:', error); + sendErrorNotification(error); + return []; + } } async function loadFragen() { - const fragenDataPath = path.join(__dirname, 'fragen.yml'); - return await loadFromYaml(fragenDataPath); + try { + const fragenDataPath = path.join(__dirname, 'fragen.yml'); + return await loadFromYaml(fragenDataPath); + } catch (error) { + console.error('Fehler beim Laden der Fragen:', error); + sendErrorNotification(error); + return []; + } } function sendWelcomeMessage(chatId) { const welcomeMessage = ` -**Willkommen beim Support!** + **Herzlich willkommen beim Support!** -Herzlich willkommen! Wir schätzen es, dass Sie sich für unseren Support entschieden haben. Unser oberstes Ziel ist es, Ihnen bestmöglich zu helfen und Ihre Anliegen so schnell wie möglich zu klären. Wenn Sie Unterstützung benötigen, haben Sie verschiedene Möglichkeiten: + Wir freuen uns, dass Sie sich für unseren Support entschieden haben. Unser vorrangiges Ziel ist es, Ihnen bestmöglich zu helfen und Ihre Anliegen so schnell wie möglich zu klären. Falls Sie Unterstützung benötigen, bieten wir Ihnen verschiedene Optionen: + + 👉 Um unser Menü anzuzeigen, tippen Sie einfach "/menu" ein. -- Um unser Menü anzuzeigen, geben Sie einfach "/menu" ein. -- Sollte Ihre Frage nicht beantwortet werden, können Sie ganz einfach ein Ticket erstellen, um spezifische Unterstützung zu erhalten. - -Wir stehen Ihnen zur Verfügung und sind hier, um Ihre Anfragen zu bearbeiten. Bitte geben Sie uns so viele Details wie möglich, damit wir Ihnen effektiv helfen können. - -Vielen Dank für Ihr Vertrauen. - -Herzliche Grüße, -Das Support-Team + 👉 Sollte Ihre Frage nicht beantwortet werden, können Sie unkompliziert ein Ticket erstellen, um spezifische Unterstützung zu erhalten. + + Für weitere Hilfe steht Ihnen unser "/help"-Befehl zur Verfügung. + + Wir sind jederzeit für Sie da und bearbeiten gerne Ihre Anfragen. Bitte teilen Sie uns so viele Details wie möglich mit, damit wir Ihnen effektiv helfen können. + + Vielen Dank für Ihr Vertrauen. + + Herzliche Grüße, + Das Support-Team `; bot.sendMessage(chatId, welcomeMessage, { parse_mode: 'Markdown' }); } async function initializeBot() { - const linksData = await loadLinks(); - const teamData = await loadTeam(); - const fragenData = await loadFragen(); + try { + const linksData = await loadLinks(); + const teamData = await loadTeam(); + const fragenData = await loadFragen(); - // Hinzugefügter Abschnitt für den /info-Befehl - bot.onText(/\/info/, (msg) => { - const chatId = msg.chat.id; - console.log('Info-Befehl empfangen:', msg.text); - showBotInfo(chatId); - }); + bot.onText(/\/info/, (msg) => { + const chatId = msg.chat.id; + console.log('Info-Befehl empfangen:', msg.text); + showBotInfo(chatId); + }); - // Hinzugefügter Abschnitt für den /logo-Befehl - bot.onText(/\/logo/, (msg) => { - const chatId = msg.chat.id; - bot.sendPhoto(chatId, logoPath, { caption: 'Hier ist unser Logo!' }) - .then(() => { - console.log('Logo erfolgreich gesendet.'); - }) - .catch((error) => { - console.error('Fehler beim Senden des Logos:', error); + bot.on('message', async (msg) => { + const chatId = msg.chat.id; + + // Überprüfe, ob die Nachricht "/help" ist, und sende die Hilfe-Nachricht + if (msg.text && msg.text.toLowerCase() === '/help') { + const helpMessage = ` + 🤖 ${botInfo.name} - Hilfe 🤖 + +Verfügbare Befehle: + +1. /menu - Zeigt das Hauptmenü an. +2. /help - Zeigt diese Hilfe an. +2. /info - Zeigt Informationen zum Bot an. +3. /status - Überprüft den aktuellen Bot- und Webseitenstatus. "Nur für Administrator" + + +🎫 Ticket erstellen: 🎫 +👉 Erstellt ein Support-Ticket. + +🔗 Links: 🔗 +👉 Zeigt Links zu verschiedenen Kategorien an. + +❓ Fragen: ❓ + 👉 Zeigt häufig gestellte Fragen (FAQs) an. + + 👮 Team: 👮 +👉 Zeigt Informationen zum Support-Team an. + +‼️ Hinweis: Weitere Funktionen werden folgen ‼️ + `; + + bot.sendMessage(chatId, helpMessage) + .catch((error) => { + console.error('Fehler beim Senden der Hilfe:', error); + }); + + return; + } + + // Überprüfe, ob es sich um den Befehl /menu handelt + if (msg.text === '/menu') { + handleMainMenu(msg, chatId, linksData, fragenData); + return; + } + + // Überprüfe, ob es sich um den Befehl /info handelt + if (msg.text && msg.text.toLowerCase() === '/info') { + // Code für den Befehl /info + return; + } + + // Überprüfe, ob sich der Benutzer im Ticketerstellungsstatus befindet + if (ticketCreationStatus.has(chatId)) { + handleTicketCreation(msg, chatId, linksData); + return; + } + + // Wenn keiner der speziellen Befehle erkannt wurde, sende die Willkommensnachricht + sendWelcomeMessage(chatId); + + bot.onText(/\/status/, (msg) => { + const chatId = msg.chat.id; + const userId = msg.from.id; + + // Prüfe, ob der Benutzer die Berechtigung hat, den /status-Befehl zu verwenden + if (allowedAdminIds.includes(userId.toString())) { + // Führe die Logik für den /status-Befehl aus + bot.sendMessage(chatId, 'Aktueller Bot- und Webseitenstatus wird abgerufen...'); + + // Hier kannst du die Logik für den Statusbefehl implementieren + // Z.B., rufe Funktionen auf, um den aktuellen Bot- und Webseitenstatus zu überprüfen + checkBotStatus(chatId); + checkWebsiteStatus(chatId); + } else { + bot.sendMessage(chatId, 'Du hast keine Berechtigung, diesen Befehl zu verwenden.'); + } }); - }); + }); - bot.on('message', async (msg) => { - const chatId = msg.chat.id; + bot.on('callback_query', (callbackQuery) => { + const chatId = callbackQuery.message.chat.id; + const action = callbackQuery.data; - if (msg.text === '/menu') { - handleMainMenu(msg, chatId, linksData, fragenData); - return; - } + if (action === 'create_ticket') { + ticketCreationStatus.set(chatId, { step: 'waiting_for_name' }); + bot.sendMessage(chatId, 'Um ein Ticket zu erstellen, gib bitte deinen Namen ein:') + .catch((error) => { + console.error('Fehler beim Senden der Aufforderung für den Namen:', error); + }); + } else if (action === 'links') { + showLinksMenu(chatId, linksData); + } else if (action.startsWith('links_')) { + const category = action.replace('links_', ''); + showLinksInCategory(chatId, category, linksData); + } else if (action === 'team') { + showTeam(chatId, teamData); + } else if (action === 'fragen') { + handleFragen(chatId, fragenData); + } else if (action.startsWith('fragen_')) { + const category = action.replace('fragen_', ''); + showFragenInCategory(chatId, category, fragenData); + } else if (action.startsWith('frage_')) { + const questionId = action.replace('frage_', ''); + showFrageAnswer(chatId, questionId, fragenData); + } else { + handleMainMenu(callbackQuery.message, chatId, linksData, fragenData); + } + }); - if (msg.text && msg.text.toLowerCase() === '/info') { - // /info wird nun auch über onText abgefangen - return; - } + bot.startPolling(); - if (ticketCreationStatus.has(chatId)) { - handleTicketCreation(msg, chatId, linksData); - return; - } + console.log(` + *Bot Information:* + - *Name:* ${escapeMarkdown(botInfo.name)} + - *Version:* ${escapeMarkdown(botInfo.version)} + - *Author:* ${escapeMarkdown(botInfo.author)} + - *License:* ${escapeMarkdown(botInfo.license)} + Bot ist gestartet und bereit. + `); + } catch (error) { + console.error('Fehler beim Initialisieren des Bots:', error); - sendWelcomeMessage(chatId); - }); - - bot.on('callback_query', (callbackQuery) => { - const chatId = callbackQuery.message.chat.id; - const action = callbackQuery.data; - - if (action === 'create_ticket') { - ticketCreationStatus.set(chatId, { step: 'waiting_for_name' }); - bot.sendMessage(chatId, 'Um ein Ticket zu erstellen, gib bitte deinen Namen ein:') - .catch((error) => { - console.error('Fehler beim Senden der Aufforderung für den Namen:', error); - }); - } else if (action === 'links') { - showLinksMenu(chatId, linksData); - } else if (action.startsWith('links_')) { - const category = action.replace('links_', ''); - showLinksInCategory(chatId, category, linksData); - } else if (action === 'team') { - showTeam(chatId, teamData); - } else if (action === 'fragen') { - handleFragen(chatId, fragenData); - } else if (action.startsWith('fragen_')) { - const category = action.replace('fragen_', ''); - showFragenInCategory(chatId, category, fragenData); - } else if (action.startsWith('frage_')) { - const questionId = action.replace('frage_', ''); - showFrageAnswer(chatId, questionId, fragenData); - } else { - handleMainMenu(callbackQuery.message, chatId, linksData, fragenData); - } - }); - - bot.startPolling(); - // Logging Bot Information - console.log(` - *Bot Information:* - - *Name:* ${escapeMarkdown(botInfo.name)} - - *Version:* ${escapeMarkdown(botInfo.version)} - - *Author:* ${escapeMarkdown(botInfo.author)} - - *License:* ${escapeMarkdown(botInfo.license)} - Bot ist gestartet und bereit. - `); + sendErrorNotification(error); + } } function showBotInfo(chatId) { - // Sende zuerst das Logo - bot.sendPhoto(chatId, logoPath, { caption: '*Der Bot wurde am 08.01.2024 erstellt' }) + bot.sendPhoto(chatId, logoPath, { caption: '*Der Bot wurde am 08.01.2024 erstellt*' }) .then(() => { - // Dann sende die Bot-Informationen const botInfoMessage = ` - *Bot Information:* - - *Name:* ${escapeMarkdown(botInfo.name)} - - *Author:* ${escapeMarkdown(botInfo.author)} - - *License:* ${escapeMarkdown(botInfo.license)} + 🤖Bot Information:🤖 +- *Name:* ${escapeMarkdown(botInfo.name)} +- *Author:* ${escapeMarkdown(botInfo.author)} +- *License:* ${escapeMarkdown(botInfo.license)} `; return bot.sendMessage(chatId, botInfoMessage, { parse_mode: 'Markdown' }); @@ -181,7 +314,6 @@ function showBotInfo(chatId) { } function escapeMarkdown(text) { - // Funktion zum Hinzufügen von Escape-Zeichen für Markdown-Sonderzeichen return text.replace(/[_*[\]()~`>#+-=|{}.!]/g, '\\$&'); } @@ -225,7 +357,7 @@ function showLinksInCategory(chatId, category, linksData) { } function showTeam(chatId, teamData) { - let teamMessage = 'Unser Team:\n\n'; + let teamMessage = '*Unser Team:*\n\n'; teamData.forEach((member) => { teamMessage += `*Name:* ${member.name}\n*Position:* ${member.position}\n*zuständig:* ${member.zustaendig}\n*Profil:* [Profil](${member.profil})\n\n`; @@ -304,33 +436,30 @@ async function handleTicketCreation(msg, chatId, linksData) { const userId = msg.from.id; const userStatus = ticketCreationStatus.get(chatId); - switch (userStatus.step) { - case 'waiting_for_name': - userStatus.step = 'waiting_for_email'; - userStatus.name = msg.text; - bot.sendMessage(chatId, 'Danke! Bitte gib nun deine E-Mail-Adresse ein:') - .catch((error) => { - console.error('Fehler beim Senden der Aufforderung für den Namen:', error); - }); - break; - case 'waiting_for_email': - userStatus.step = 'waiting_for_message'; - userStatus.email = msg.text; - bot.sendMessage(chatId, 'Vielen Dank! Bitte schreibe jetzt deine Nachricht:') - .catch((error) => { - console.error('Fehler beim Senden der Aufforderung für die E-Mail:', error); - }); - break; - case 'waiting_for_message': - userStatus.message = msg.text; - sendTicketEmail(chatId, userStatus); - ticketCreationStatus.delete(chatId); - bot.sendMessage(chatId, 'Vielen Dank! Dein Ticket wurde erstellt. Wir melden uns bald bei dir.') - .catch((error) => { - console.error('Fehler beim Senden der Bestätigungsnachricht für das Ticket:', error); - }); - handleMainMenu(msg, chatId, linksData); - break; + try { + switch (userStatus.step) { + case 'waiting_for_name': + userStatus.step = 'waiting_for_email'; + userStatus.name = msg.text; + bot.sendMessage(chatId, 'Danke! Bitte gib nun deine E-Mail-Adresse ein:'); + break; + case 'waiting_for_email': + userStatus.step = 'waiting_for_message'; + userStatus.email = msg.text; + bot.sendMessage(chatId, 'Vielen Dank! Bitte schreibe jetzt deine Nachricht:'); + break; + case 'waiting_for_message': + userStatus.message = msg.text; + sendTicketEmail(chatId, userStatus); + ticketCreationStatus.delete(chatId); + bot.sendMessage(chatId, 'Vielen Dank! Dein Ticket wurde erstellt. Wir melden uns bald bei dir.'); + handleMainMenu(msg, chatId, linksData); + break; + } + } catch (error) { + console.error('Fehler beim Ticket-Erstellen:', error); + sendErrorNotification(error); + bot.sendMessage(chatId, 'Es ist ein Fehler beim Erstellen des Tickets aufgetreten. Bitte versuche es später erneut.'); } } @@ -356,7 +485,7 @@ function sendTicketEmail(chatId, ticketInfo) { const mailOptions = { from: `"${ticketInfo.name}" <${emailConfig.user}>`, to: emailConfig.recipient, - subject: 'Supportanfrage', + subject: 'Telegram Supportanfrage', text: `Name: ${ticketInfo.name}\nE-Mail: ${ticketInfo.email}\nNachricht: ${ticketInfo.message}`, }; @@ -377,4 +506,4 @@ function sendTicketEmail(chatId, ticketInfo) { }); } -initializeBot(); \ No newline at end of file +initializeBot();