Dateien nach "/" hochladen
This commit is contained in:
parent
4e71f532e6
commit
72234b924e
|
@ -0,0 +1,4 @@
|
|||
EMAIL_USER= "Mailadresse (Postausgang)"
|
||||
EMAIL_PASS= "Passwort (Postausgang)"
|
||||
BOT_TOKEN= "Telegram Bot Token"
|
||||
EMAIL_RECIPIENT= "Mail Empfänger Adresse"
|
|
@ -0,0 +1,90 @@
|
|||
- category: "Allgemein"
|
||||
questions:
|
||||
- id: "1"
|
||||
question: "Frage 1"
|
||||
answer: |
|
||||
Antwort auf Frage 1
|
||||
|
||||
- id: "2"
|
||||
question: "Frage 2"
|
||||
answer: |
|
||||
Antwort auf Frage 2
|
||||
|
||||
- id: "3"
|
||||
question: "Frage 3"
|
||||
answer: |
|
||||
Antwort auf Frage 3
|
||||
|
||||
- id: "4"
|
||||
question: "Frage 4"
|
||||
answer: |
|
||||
Antwort auf Frage 4
|
||||
|
||||
- id: "5"
|
||||
question: "Frage 5"
|
||||
answer: |
|
||||
Antwort auf Frage 5
|
||||
|
||||
- id: "6"
|
||||
question: "Wie kann man Frage 6 beantworten?"
|
||||
answer: |
|
||||
Antwort auf Frage 6
|
||||
|
||||
- id: "7"
|
||||
question: "Was ist die Bedeutung von Frage 7?"
|
||||
answer: |
|
||||
Antwort auf Frage 7
|
||||
|
||||
- category: "Technik"
|
||||
questions:
|
||||
- id: "8"
|
||||
question: "Was sind die Hauptmerkmale von Frage 8?"
|
||||
answer: |
|
||||
Antwort auf Frage 8
|
||||
|
||||
- id: "9"
|
||||
question: "Wie funktioniert Frage 9 technisch?"
|
||||
answer: |
|
||||
Antwort auf Frage 9
|
||||
|
||||
- id: "10"
|
||||
question: "Welche Technologien sind hinter Frage 10?"
|
||||
answer: |
|
||||
Antwort auf Frage 10
|
||||
|
||||
- category: "Sonstiges"
|
||||
questions:
|
||||
- id: "11"
|
||||
question: "Frage 11"
|
||||
answer: |
|
||||
Antwort auf Frage 11
|
||||
|
||||
- id: "12"
|
||||
question: "Was ist die Besonderheit von Frage 12?"
|
||||
answer: |
|
||||
Antwort auf Frage 12
|
||||
|
||||
- id: "13"
|
||||
question: "Kannst du mehr Kontext zu Frage 13 geben?"
|
||||
answer: |
|
||||
Antwort auf Frage 13
|
||||
|
||||
- id: "14"
|
||||
question: "Gibt es Anwendungen für Frage 14 im Alltag?"
|
||||
answer: |
|
||||
Antwort auf Frage 14
|
||||
|
||||
- id: "15"
|
||||
question: "Wie relevant ist Frage 15 in der aktuellen Zeit?"
|
||||
answer: |
|
||||
Antwort auf Frage 15
|
||||
|
||||
- id: "16"
|
||||
question: "In welchen Kontexten könnte Frage 16 relevant sein?"
|
||||
answer: |
|
||||
Antwort auf Frage 16
|
||||
|
||||
- id: "17"
|
||||
question: "Kannst du weitere Beispiele für Frage 17 geben?"
|
||||
answer: |
|
||||
Antwort auf Frage 17
|
|
@ -0,0 +1,20 @@
|
|||
- category: Allgemein
|
||||
links:
|
||||
- keyword: 'Google'
|
||||
url: 'https://google.com'
|
||||
- keyword: 'Telegram'
|
||||
url: 'https://telegram.org'
|
||||
|
||||
- category: Support
|
||||
links:
|
||||
- keyword: 'Helpdesk'
|
||||
url: 'https://example.com'
|
||||
- keyword: 'FAQ'
|
||||
url: 'https://example.com'
|
||||
|
||||
- category: Komunitation
|
||||
links:
|
||||
- keyword: 'Telegram Gruppe'
|
||||
url: 'https://example.com'
|
||||
- keyword: 'Discord'
|
||||
url: 'https://example.com'
|
|
@ -0,0 +1,401 @@
|
|||
const TelegramBot = require('node-telegram-bot-api');
|
||||
const nodemailer = require('nodemailer');
|
||||
const fs = require('fs').promises;
|
||||
const yaml = require('js-yaml');
|
||||
const path = require('path');
|
||||
require('dotenv').config();
|
||||
|
||||
const emailConfig = {
|
||||
user: process.env.EMAIL_USER,
|
||||
pass: process.env.EMAIL_PASS,
|
||||
recipient: process.env.EMAIL_RECIPIENT,
|
||||
};
|
||||
|
||||
const botToken = process.env.BOT_TOKEN;
|
||||
|
||||
const botInfo = {
|
||||
name: 'Telegram Support Bot',
|
||||
version: '1.0.0',
|
||||
author: 'M_Viper',
|
||||
license: 'ISC',
|
||||
};
|
||||
|
||||
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
|
||||
|
||||
async function loadFromYaml(filePath) {
|
||||
try {
|
||||
const fileContents = await fs.readFile(filePath, 'utf-8');
|
||||
return yaml.load(fileContents);
|
||||
} catch (error) {
|
||||
console.error(`Fehler beim Laden der YAML-Datei für ${path.basename(filePath)}:`, error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
async function loadLinks() {
|
||||
const linksDataPath = path.join(__dirname, 'links.yml');
|
||||
return await loadFromYaml(linksDataPath);
|
||||
}
|
||||
|
||||
async function loadTeam() {
|
||||
const teamDataPath = path.join(__dirname, 'team.json');
|
||||
return await loadFromYaml(teamDataPath);
|
||||
}
|
||||
|
||||
async function loadFragen() {
|
||||
const fragenDataPath = path.join(__dirname, 'fragen.yml');
|
||||
return await loadFromYaml(fragenDataPath);
|
||||
}
|
||||
|
||||
function sendWelcomeMessage(chatId) {
|
||||
const welcomeMessage = `
|
||||
**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:
|
||||
|
||||
- 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
|
||||
`;
|
||||
|
||||
bot.sendMessage(chatId, welcomeMessage, { parse_mode: 'Markdown' });
|
||||
}
|
||||
|
||||
async function initializeBot() {
|
||||
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);
|
||||
});
|
||||
|
||||
// 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;
|
||||
|
||||
if (msg.text === '/menu') {
|
||||
handleMainMenu(msg, chatId, linksData, fragenData);
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.text && msg.text.toLowerCase() === '/info') {
|
||||
// /info wird nun auch über onText abgefangen
|
||||
return;
|
||||
}
|
||||
|
||||
if (ticketCreationStatus.has(chatId)) {
|
||||
handleTicketCreation(msg, chatId, linksData);
|
||||
return;
|
||||
}
|
||||
|
||||
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.
|
||||
`);
|
||||
}
|
||||
|
||||
function showBotInfo(chatId) {
|
||||
// Sende zuerst das Logo
|
||||
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)}
|
||||
`;
|
||||
|
||||
return bot.sendMessage(chatId, botInfoMessage, { parse_mode: 'Markdown' });
|
||||
})
|
||||
.then(() => {
|
||||
console.log('Bot-Informationen erfolgreich gesendet.');
|
||||
})
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Bot-Info oder des Logos:', error);
|
||||
});
|
||||
}
|
||||
|
||||
function escapeMarkdown(text) {
|
||||
// Funktion zum Hinzufügen von Escape-Zeichen für Markdown-Sonderzeichen
|
||||
return text.replace(/[_*[\]()~`>#+-=|{}.!]/g, '\\$&');
|
||||
}
|
||||
|
||||
function showLinksMenu(chatId, linksData) {
|
||||
const linksMenuKeyboard = {
|
||||
reply_markup: {
|
||||
inline_keyboard: linksData.map((category) => [
|
||||
{ text: category.category, callback_data: `links_${category.category}` },
|
||||
]),
|
||||
},
|
||||
};
|
||||
|
||||
bot.sendMessage(chatId, 'Wähle eine Kategorie:', linksMenuKeyboard)
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Links-Menü-Tastatur:', error);
|
||||
});
|
||||
}
|
||||
|
||||
function showLinksInCategory(chatId, category, linksData) {
|
||||
const categoryData = linksData.find((c) => c.category === category);
|
||||
|
||||
if (categoryData) {
|
||||
const linksKeyboard = {
|
||||
reply_markup: {
|
||||
inline_keyboard: categoryData.links.map((link) => [
|
||||
{ text: link.keyword, url: link.url },
|
||||
]),
|
||||
},
|
||||
};
|
||||
|
||||
bot.sendMessage(chatId, `Hier sind die Links in der Kategorie '${category}':`, linksKeyboard)
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Links-Tastatur:', error);
|
||||
});
|
||||
} else {
|
||||
bot.sendMessage(chatId, `Keine Links gefunden für die Kategorie '${category}'.`)
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Nachricht ohne Links:', error);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function showTeam(chatId, teamData) {
|
||||
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`;
|
||||
});
|
||||
|
||||
bot.sendMessage(chatId, teamMessage, { parse_mode: 'Markdown' })
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Team-Nachricht:', error);
|
||||
});
|
||||
}
|
||||
|
||||
function showFragenMenu(chatId, fragenData) {
|
||||
const fragenMenuKeyboard = {
|
||||
reply_markup: {
|
||||
inline_keyboard: fragenData.map((category) => [
|
||||
{ text: category.category, callback_data: `fragen_${category.category}` },
|
||||
]),
|
||||
},
|
||||
};
|
||||
|
||||
bot.sendMessage(chatId, 'Wähle eine Kategorie:', fragenMenuKeyboard)
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Fragen-Menü-Tastatur:', error);
|
||||
});
|
||||
}
|
||||
|
||||
function showFragenInCategory(chatId, category, fragenData) {
|
||||
const categoryData = fragenData.find((c) => c.category === category);
|
||||
|
||||
if (categoryData) {
|
||||
const fragenKeyboard = {
|
||||
reply_markup: {
|
||||
inline_keyboard: categoryData.questions.map((frage) => [
|
||||
{ text: frage.question, callback_data: `frage_${frage.id}` },
|
||||
]),
|
||||
},
|
||||
};
|
||||
|
||||
bot.sendMessage(chatId, `Hier sind die Fragen in der Kategorie '${category}':`, fragenKeyboard)
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Fragen-Tastatur:', error);
|
||||
});
|
||||
} else {
|
||||
bot.sendMessage(chatId, `Keine Fragen gefunden für die Kategorie '${category}'.`)
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Nachricht ohne Fragen:', error);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async function handleFragen(chatId, fragenData) {
|
||||
showFragenMenu(chatId, fragenData);
|
||||
}
|
||||
|
||||
async function showFrageAnswer(chatId, questionId, fragenData) {
|
||||
const questionData = fragenData.flatMap((c) => c.questions).find((q) => q.id === questionId);
|
||||
|
||||
console.log('Frage-ID:', questionId);
|
||||
console.log('Gefundene Frage-Daten:', questionData);
|
||||
|
||||
if (questionData) {
|
||||
const answerMessage = `Antwort auf Frage '${questionData.question}':\n${questionData.answer}`;
|
||||
bot.sendMessage(chatId, answerMessage, { parse_mode: 'Markdown' })
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Antwort auf die Frage:', error);
|
||||
});
|
||||
} else {
|
||||
bot.sendMessage(chatId, `Keine Antwort gefunden für die Frage '${questionId}'.`)
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Nachricht ohne Antwort:', error);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
const handleMainMenu = (msg, chatId, linksData, fragenData) => {
|
||||
const mainMenuKeyboard = {
|
||||
reply_markup: {
|
||||
inline_keyboard: [
|
||||
[{ text: 'Ticket erstellen', callback_data: 'create_ticket' }],
|
||||
[{ text: 'Links', callback_data: 'links' }],
|
||||
[{ text: 'Fragen', callback_data: 'fragen' }],
|
||||
[{ text: 'Team', callback_data: 'team' }],
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
bot.sendMessage(chatId, 'Hallo! Bitte wähle eine Option:', mainMenuKeyboard)
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden des Hauptmenüs:', error);
|
||||
});
|
||||
};
|
||||
|
||||
function sendTicketEmail(chatId, ticketInfo) {
|
||||
const mailOptions = {
|
||||
from: `"${ticketInfo.name}" <${emailConfig.user}>`,
|
||||
to: emailConfig.recipient,
|
||||
subject: 'Supportanfrage',
|
||||
text: `Name: ${ticketInfo.name}\nE-Mail: ${ticketInfo.email}\nNachricht: ${ticketInfo.message}`,
|
||||
};
|
||||
|
||||
const transporter = nodemailer.createTransport({
|
||||
service: 'gmail',
|
||||
auth: {
|
||||
user: emailConfig.user,
|
||||
pass: emailConfig.pass,
|
||||
},
|
||||
});
|
||||
|
||||
transporter.sendMail(mailOptions, (error, info) => {
|
||||
if (error) {
|
||||
console.error('Fehler beim Senden der Ticket-E-Mail:', error);
|
||||
} else {
|
||||
console.log('Ticket-E-Mail erfolgreich gesendet:', info.response);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
initializeBot();
|
||||
|
||||
|
||||
/*
|
||||
async function handleHelp(chatId, linksData, fragenData) {
|
||||
console.log('Hilfe-Befehl empfangen: /help');
|
||||
|
||||
// Du kannst die Hilfe-Nachricht nach Bedarf anpassen
|
||||
const helpMessage = `
|
||||
Hilfe-Menü:
|
||||
- Um das Hauptmenü anzuzeigen, senden Sie einfach "/menu".
|
||||
- Verwenden Sie "/info", um Informationen zum Bot zu erhalten.
|
||||
- Verwenden Sie "/logo", um das Bot-Logo anzuzeigen.
|
||||
`;
|
||||
|
||||
bot.sendMessage(chatId, helpMessage)
|
||||
.catch((error) => {
|
||||
console.error('Fehler beim Senden der Hilfe-Nachricht:', error);
|
||||
});
|
||||
|
||||
}
|
||||
*/
|
|
@ -0,0 +1,27 @@
|
|||
[
|
||||
{
|
||||
"name": "Name",
|
||||
"position": "Administrator",
|
||||
"zustaendig": "Hosting & DEV - Support",
|
||||
"profil": "https://example.com"
|
||||
},
|
||||
{
|
||||
"name": "Florian",
|
||||
"position": "Moderator",
|
||||
"zustaendig": "Support ",
|
||||
"profil": "https://example.com"
|
||||
},
|
||||
{
|
||||
"name": "Name",
|
||||
"position": "Moderator",
|
||||
"zustaendig": "Support ",
|
||||
"profil": "https://example.com"
|
||||
},
|
||||
{
|
||||
"name": "Name",
|
||||
"position": "Discord Moderator",
|
||||
"zustaendig": "Discord",
|
||||
"profil": "https://example.com"
|
||||
}
|
||||
]
|
||||
|
Loading…
Reference in New Issue