support_bot_2024/bot.js

2274 lines
91 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

require('dotenv').config();
const TelegramBot = require('node-telegram-bot-api');
const fs = require('fs');
const path = require('path');
const nodemailer = require('nodemailer');
const stringSimilarity = require('string-similarity');
const cron = require('node-cron');
const axios = require('axios');
const botStartTime = new Date(); // Startzeitpunkt des Bots
// Token aus der .env-Datei laden
const token = process.env.BOT_TOKEN;
const bot = new TelegramBot(token, { polling: true });
// Admins aus der .env-Datei laden und als Objekt speichern (ID -> {Name, Username, Zuständigkeit}, in der Reihenfolge)
const admins = process.env.ADMINS.split(',').reduce((acc, admin) => {
const [id, name, username, responsibility] = admin.split(':').map(val => val.trim());
acc[id] = { name, username, responsibility };
return acc;
}, {});
// Admin-IDs in der Reihenfolge speichern
const orderedAdminIds = Object.keys(admins);
// Admin-Status-Objekt (speichert den Status jedes Admins)
let adminStatus = {};
// Initialen Status aller Admins auf "offline" setzen
Object.keys(admins).forEach(adminId => {
adminStatus[adminId] = 'offline';
});
// Warteschlange für Benutzeranfragen
let requestQueue = [];
// FAQ-Dateipfad
const dataDir = path.join(__dirname, 'data');
const faqFilePath = path.join(dataDir, 'faq.json');
// Sicherstellen, dass das Verzeichnis existiert
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
}
// Sicherstellen, dass die FAQ-Datei existiert
if (!fs.existsSync(faqFilePath)) {
fs.writeFileSync(faqFilePath, JSON.stringify([]));
}
// FAQ-Daten laden
let faqData = JSON.parse(fs.readFileSync(faqFilePath, 'utf8'));
// Pfad zur link.json
const linksFilePath = path.join(dataDir, 'link.json');
// Sicherstellen, dass die link.json existiert
if (!fs.existsSync(linksFilePath)) {
fs.writeFileSync(linksFilePath, JSON.stringify([]));
}
// Links-Daten laden
let linksData = JSON.parse(fs.readFileSync(linksFilePath, 'utf8'));
// Bewertungsdaten
const ratingsFilePath = path.join(dataDir, 'ratings.json');
// Sicherstellen, dass die ratings.json existiert
if (!fs.existsSync(ratingsFilePath)) {
fs.writeFileSync(ratingsFilePath, JSON.stringify([]));
}
// Ratings-Daten laden
let ratingsData = JSON.parse(fs.readFileSync(ratingsFilePath, 'utf8'));
// Funktion zum Überprüfen der Admin-Rechte in einer Gruppe
const checkBotAdminRights = async (chatId) => {
try {
const botId = await getBotId(); // Funktion zur Ermittlung der Bot-ID
const botInfo = await bot.getChatMember(chatId, botId);
if (botInfo.status !== 'administrator' && botInfo.status !== 'creator') {
// Falls der Bot keine Admin-Rechte hat
const devId = process.env.DEV;
bot.sendMessage(devId, `❗ Der Bot benötigt Admin-Rechte in der Gruppe ${chatId}. Bitte gewähre Admin-Rechte oder überprüfe die Gruppeneinstellungen.`);
}
} catch (error) {
console.error('Error checking bot admin rights:', error);
}
};
// Funktion zur Ermittlung der Bot-ID
const getBotId = async () => {
try {
const botInfo = await bot.getMe();
return botInfo.id; // Rückgabe der Bot-ID
} catch (error) {
console.error('Error getting bot ID:', error);
return null; // Rückgabe von null, falls ein Fehler auftritt
}
};
// Überprüfen aller Gruppen, in denen der Bot Mitglied ist
const checkAllGroupsAdminRights = async () => {
try {
const updates = await bot.getUpdates();
const chatIds = new Set();
updates.forEach(update => {
if (update.message && update.message.chat && update.message.chat.id) {
chatIds.add(update.message.chat.id); // Alle Gruppen-IDs sammeln
}
});
chatIds.forEach(chatId => {
checkBotAdminRights(chatId); // Admin-Rechte für jede Gruppe überprüfen
});
} catch (error) {
console.error('Error checking all group admin rights:', error);
}
};
// Auf Updates vom Bot hören
bot.on('message', async (msg) => {
const chatId = msg.chat.id;
// Beispiel-Nachricht, wenn der Bot in einer neuen Gruppe hinzugefügt wird
if (msg.new_chat_members) {
console.log(`Bot joined new chat: ${chatId}`);
checkBotAdminRights(chatId);
}
});
// Initiale Überprüfung der Admin-Rechte in allen Gruppen
checkAllGroupsAdminRights();
bot.onText(/\/links/, (msg) => {
const chatId = msg.chat.id;
const userId = msg.from.id;
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Prüfen, ob der Benutzer gesperrt ist
if (isUserSpammed(userId)) {
bot.sendMessage(msg.chat.id, '❌ Du bist gesperrt und kannst diesen Befehl nicht verwenden.');
return; // Sperrte Benutzer können keine Befehle verwenden
}
// Sicherstellen, dass linksData existiert und ein Array ist
if (!Array.isArray(linksData)) {
bot.sendMessage(chatId, '❗ Ein Fehler ist aufgetreten.')
.then(() => bot.deleteMessage(chatId, msg.message_id));
return;
}
// Links formatieren
const links = linksData.map((link, index) => {
return `${index + 1}. ${link.title}: ${link.url}`;
}).join('\n');
// Links dem Benutzer senden, ohne Linkvorschau
bot.sendMessage(userId, `🌐 Gespeicherte Links:\n\n${links}`, {
disable_web_page_preview: true // Deaktiviert die Linkvorschau
}).then(() => bot.deleteMessage(chatId, msg.message_id));
});
bot.onText(/\/add_links/, (msg) => {
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (admins[userId]) {
bot.sendMessage(userId, `🔧 Bitte sende den Titel des Links:`)
.then(() => bot.once('message', async (titleMsg) => {
const title = titleMsg.text.trim();
bot.sendMessage(userId, `🔧 Bitte sende die URL des Links:`)
.then(() => bot.once('message', async (urlMsg) => {
const url = urlMsg.text.trim();
if (title && url) {
linksData.push({ title, url });
fs.writeFileSync(linksFilePath, JSON.stringify(linksData, null, 2));
bot.sendMessage(userId, `✅ Link hinzugefügt.`)
.then(() => {
bot.deleteMessage(userId, titleMsg.message_id);
bot.deleteMessage(userId, urlMsg.message_id);
});
} else {
bot.sendMessage(userId, `❌ Bitte stelle sicher, dass du sowohl Titel als auch URL eingibst.`);
}
}));
}));
} else {
bot.sendMessage(userId, '❗ Nur Admins können diesen Befehl verwenden.')
.then(() => bot.deleteMessage(userId, msg.message_id));
}
});
bot.onText(/\/del_links/, (msg) => {
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (admins[userId]) {
bot.sendMessage(userId, `🗑️ Bitte sende die Nummer des Links, den du löschen möchtest:`)
.then(() => bot.once('message', async (linkMsg) => {
const linkIndex = parseInt(linkMsg.text, 10) - 1;
if (linkIndex >= 0 && linkIndex < linksData.length) {
linksData.splice(linkIndex, 1);
fs.writeFileSync(linksFilePath, JSON.stringify(linksData, null, 2));
bot.sendMessage(userId, `✅ Link gelöscht.`)
.then(() => bot.deleteMessage(userId, linkMsg.message_id));
} else {
bot.sendMessage(userId, `❌ Ungültige Link-Nummer.`);
}
}));
} else {
bot.sendMessage(userId, '❗ Nur Admins können diesen Befehl verwenden.')
.then(() => bot.deleteMessage(userId, msg.message_id));
}
});
// Pfad zur "inviteLinks.json"-Datei für Einladungslinks
const inviteLinksFile = path.join(dataDir, 'inviteLinks.json');
// Sicherstellen, dass die "inviteLinks.json"-Datei existiert
if (!fs.existsSync(inviteLinksFile)) {
fs.writeFileSync(inviteLinksFile, JSON.stringify({}));
}
// Funktion zum Laden der Einladungslinks aus der Datei
function loadInviteLinks() {
if (fs.existsSync(inviteLinksFile)) {
const data = fs.readFileSync(inviteLinksFile);
return JSON.parse(data);
}
return {};
}
// Funktion zum Speichern der Einladungslinks in der Datei
function saveInviteLinks() {
fs.writeFileSync(inviteLinksFile, JSON.stringify(inviteLinks, null, 2));
}
// Objekt zur Speicherung von Einladungslinks (wird aus der Datei geladen)
let inviteLinks = loadInviteLinks();
// /einladung-Befehl für alle Benutzer
bot.onText(/\/einladung/, (msg) => {
const chatId = msg.chat.id;
const userId = msg.from.id.toString();
const userName = msg.from.username || `${msg.from.first_name} ${msg.from.last_name}`;
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Prüfen, ob der Benutzer bereits einen Einladungslink erstellt hat
if (inviteLinks[userId]) {
const existingLink = inviteLinks[userId].link;
bot.sendMessage(userId, `🔗 Du hast bereits einen Einladungslink erstellt: ${existingLink}`);
return;
}
// Erstelle einen neuen Einladungslink für die Gruppe
bot.createChatInviteLink(chatId)
.then((inviteLink) => {
// Speichern des Einladungslinks und der Informationen über den Ersteller
inviteLinks[userId] = {
link: inviteLink.invite_link, // invite_link enthält den eigentlichen Link
createdBy: userName,
createdAt: new Date().toLocaleString()
};
// Links in der Datei speichern
saveInviteLinks();
// Den Einladungslink privat an den Benutzer senden
bot.sendMessage(userId, `🔗 Hier ist dein Einladungslink: ${inviteLink.invite_link}`);
// Protokollierung, wer wann den Einladungslink erstellt hat
console.log(`Einladungslink erstellt von ${userName} (ID: ${userId}) am ${inviteLinks[userId].createdAt}`);
})
.catch((error) => {
console.error('Fehler beim Erstellen des Einladungslinks:', error);
bot.sendMessage(userId, '❗ Es gab ein Problem beim Erstellen des Einladungslinks.');
});
});
// Admins können ihren Status mit /online ändern
bot.onText(/\/online/, (msg) => {
const adminId = msg.from.id.toString();
if (admins[adminId]) {
adminStatus[adminId] = 'online';
bot.sendMessage(adminId, `🟢 *Du bist jetzt als "online" markiert, ${admins[adminId].name}!*`);
// Alle wartenden Anfragen an den jetzt online gegangenen Admin senden
requestQueue.forEach((request, index) => {
if (!request.handled) {
bot.sendMessage(adminId, `📩 *Neue Support-Anfrage von ${request.userName}:*\n\n${request.message}`);
requestQueue[index].handled = true; // Markiere die Anfrage als bearbeitet
}
});
} else {
bot.sendMessage(adminId, '❗ *Nur Admins können diesen Befehl verwenden.*');
}
});
// Admins können ihren Status mit /offline ändern
bot.onText(/\/offline/, (msg) => {
const adminId = msg.from.id.toString();
if (admins[adminId]) {
adminStatus[adminId] = 'offline';
bot.sendMessage(adminId, `🔴 *Du bist jetzt als "offline" markiert, ${admins[adminId].name}.*`);
} else {
bot.sendMessage(adminId, '❗ *Nur Admins können diesen Befehl verwenden.*');
}
});
bot.onText(/\/admin/, (msg) => {
const userId = msg.from.id;
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Prüfen, ob der Benutzer gesperrt ist
if (isUserSpammed(userId)) {
bot.sendMessage(msg.chat.id, '❌ Du bist gesperrt und kannst diesen Befehl nicht verwenden.');
return; // Sperrte Benutzer können keine Befehle verwenden
}
const sortedAdminIds = orderedAdminIds.sort((a, b) => a === '5507179337' ? -1 : b === '5507179337' ? 1 : 0);
const adminList = sortedAdminIds.map(adminId => {
const statusIcon = adminStatus[adminId] === 'online' ? '🟢' : '🔴';
const adminName = admins[adminId].name;
const adminUsername = admins[adminId].username.replace(/_/g, '\\_'); // Escape Unterstriche
const adminResponsibility = admins[adminId].responsibility || 'Keine Zuständigkeit angegeben';
return `${statusIcon} *${adminName}*\n _@${adminUsername}_\n 📌 _Zuständigkeit:_ ${adminResponsibility}`;
}).join('\n\n');
bot.sendMessage(userId, `👮 *Liste der Admins:* 👮\n\n${adminList}`, { parse_mode: 'MarkdownV2' })
.catch(error => {
console.error('Fehler beim Senden der Admin-Liste:', error);
});
});
// Temporäre Speicherung der message_id
const commandMessages = {};
bot.onText(/\/chat/, async (msg) => {
const userId = msg.from.id;
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Prüfen, ob der Benutzer gesperrt ist
if (isUserSpammed(userId)) {
bot.sendMessage(msg.chat.id, '❌ Du bist gesperrt und kannst diesen Befehl nicht verwenden.');
return; // Sperrte Benutzer können keine Befehle verwenden
}
const userName = msg.from.username ? `@${msg.from.username}` : `Benutzer ${msg.from.first_name}`;
// Speichern der message_id
commandMessages[userId] = commandMessages[userId] || {};
commandMessages[userId]['/chat'] = msg.message_id;
const onlineAdmins = orderedAdminIds.filter(adminId => adminStatus[adminId] === 'online');
if (onlineAdmins.length > 0) {
const options = {
reply_markup: {
inline_keyboard: onlineAdmins.map(adminId => [{
text: `${adminStatus[adminId] === 'online' ? '🟢' : '🔴'} ${admins[adminId].name}`,
callback_data: adminId
}])
}
};
bot.sendMessage(userId, "💬 *Wähle einen Admin aus, um Unterstützung zu erhalten:*", options)
.then(() => bot.deleteMessage(msg.chat.id, msg.message_id));
} else {
bot.sendMessage(userId, "🔴 *Derzeit ist kein Admin online. Bitte schreibe dein Problem, und wir werden dich kontaktieren, sobald ein Admin verfügbar ist.*");
bot.once('message', (userMsg) => {
const requestMessage = userMsg.text;
requestQueue.push({ userId, userName, message: requestMessage, handled: false });
bot.sendMessage(userId, "✉️ *Deine Anfrage wurde an das Support-Team weitergeleitet.*");
});
}
});
// Reaktion auf die Auswahl eines Admins
bot.on('callback_query', async (callbackQuery) => {
const adminId = callbackQuery.data; // ID des ausgewählten Admins
const userId = callbackQuery.from.id; // ID des Anfragenden Benutzers
const userName = callbackQuery.from.username ? `@${callbackQuery.from.username}` : `Benutzer ${callbackQuery.from.first_name}`;
if (adminStatus[adminId] === 'offline') {
bot.sendMessage(userId, "🔴 *Dieser Admin ist zur Zeit nicht online. Du kannst dein Problem schriftlich einreichen.*");
bot.once('message', async (msg) => {
if (msg.chat.id === userId) {
requestQueue.push({ userId: userId, userName: userName, message: msg.text, handled: false });
bot.sendMessage(userId, `✅ *Deine Nachricht wurde gespeichert und wird an den nächsten verfügbaren Admin weitergeleitet.*`);
}
});
} else {
try {
// Benutzerdaten des Anfragenden Benutzers abrufen
const user = await bot.getChatMember(callbackQuery.message.chat.id, userId);
const userName = user.user.username ? `@${user.user.username}` : `Benutzer ${user.user.first_name}`;
// Admins-Namen und Usernamen aus der .env-Datei nutzen
const adminName = admins[adminId].name;
const adminUsername = admins[adminId].username;
const adminLink = `https://t.me/${adminUsername}`;
// Nachricht an den ausgewählten Admin senden
bot.sendMessage(adminId, `🔔 *Du wurdest von ${userName} für Unterstützung ausgewählt.*\n\nBitte kontaktiere ihn in einem privaten Chat. Du kannst ihm direkt über diesen Link schreiben: ${userName}`);
// Nachricht an den Benutzer senden
bot.sendMessage(userId, `✅ *Der Admin ${adminName} wurde benachrichtigt und wird sich bald bei dir melden.*`);
// Ursprüngliche Nachricht (Befehl /chat) löschen
if (callbackQuery.message.reply_to_message && callbackQuery.message.reply_to_message.message_id) {
bot.deleteMessage(callbackQuery.message.chat.id, callbackQuery.message.reply_to_message.message_id);
}
bot.deleteMessage(callbackQuery.message.chat.id, callbackQuery.message.message_id);
} catch (error) {
console.error('Fehler beim Abrufen des Benutzernamens:', error);
/* bot.sendMessage(userId, '⚠️ *Es gab einen Fehler beim Abrufen des Benutzernamens. Bitte versuche es später erneut.*'); */
}
}
});
const escapeMarkdown = (text) => {
return text
.replace(/([_*\[\]()~`>#+\-=|{}.!])/g, '\\$1') // Escape Markdown reserved characters
.replace(/(?:\r\n|\r|\n)/g, '\\n') // Escape newlines
.replace(/\./g, '\\.'); // Escape dots
};
// Funktion zum Senden der FAQ im privaten Chat
const sendFaqPrivately = (userId) => {
if (faqData.length > 0) {
// FAQs formatieren
const faqs = faqData.map((faq, index) => {
const question = faq.question;
const answer = faq.answer;
return `${index + 1}️⃣\nFrage: ${question}\nAntwort: ${answer}`;
}).join('\n\n');
bot.sendMessage(userId, `❓ FAQs: ❓\n\n${faqs}`)
.catch(error => {
console.error('Fehler beim Senden der FAQ:', error);
});
} else {
bot.sendMessage(userId, '❗ Es sind keine FAQs verfügbar.');
}
};
// Reaktion auf den /faq-Befehl
bot.onText(/\/faq/, (msg) => {
const chatId = msg.chat.id;
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.', { disable_web_page_preview: true });
return;
}
// Prüfen, ob der Benutzer gesperrt ist
if (isUserSpammed(userId)) {
const { expiry } = spammedUsers[userId];
// Nachricht für gesperrte Benutzer senden
if (expiry === 'permanent') {
bot.sendMessage(chatId, '❌ *Du bist dauerhaft gesperrt und kannst diesen Befehl nicht verwenden.*', { disable_web_page_preview: true });
} else {
const formattedExpiry = formatTime(expiry);
bot.sendMessage(chatId, `❌ *Du bist gesperrt bis ${formattedExpiry} und kannst diesen Befehl nicht verwenden.*`, { disable_web_page_preview: true });
}
return; // Verhindert weitere Verarbeitung, wenn der Benutzer gesperrt ist
}
// Sende die FAQ-Nachricht direkt an den Benutzer im privaten Chat
sendFaqPrivately(userId);
});
// /add_faq-Befehl, um FAQs hinzuzufügen (nur privat)
bot.onText(/\/add_faq/, (msg) => {
const userId = msg.from.id.toString();
if (!canExecuteCommand(userId)) {
bot.sendMessage(msg.chat.id, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (admins[userId]) {
bot.sendMessage(userId, `🔧 *Bitte sende die FAQ ein:* \n\nFrage:`)
.then(() => bot.once('message', async (faqMsg) => {
const question = faqMsg.text.trim();
bot.sendMessage(userId, `🔧 *Bitte sende die Antwort:*`)
.then(() => bot.once('message', async (answerMsg) => {
const answer = answerMsg.text.trim();
if (question && answer) {
faqData.push({ question, answer });
fs.writeFileSync(faqFilePath, JSON.stringify(faqData, null, 2));
bot.sendMessage(userId, `✅ *FAQ hinzugefügt.*`);
} else {
bot.sendMessage(userId, `❌ *Bitte stelle sicher, dass du sowohl Frage als auch Antwort eingibst.*`);
}
}));
}));
} else {
bot.sendMessage(userId, '❗ *Nur Admins können diesen Befehl verwenden.*');
}
});
// /edit_faq-Befehl, um FAQs zu bearbeiten (nur privat)
bot.onText(/\/edit_faq/, (msg) => {
const userId = msg.from.id.toString();
if (!canExecuteCommand(userId)) {
bot.sendMessage(msg.chat.id, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (admins[userId]) {
bot.sendMessage(userId, `🔧 *Bitte sende die Nummer der FAQ, die du bearbeiten möchtest:*`)
.then(() => bot.once('message', async (faqMsg) => {
const faqIndex = parseInt(faqMsg.text, 10) - 1;
if (faqIndex >= 0 && faqIndex < faqData.length) {
bot.sendMessage(userId, `✏️ *Bitte sende die neue Frage:*`)
.then(() => bot.once('message', async (questionMsg) => {
const question = questionMsg.text.trim();
bot.sendMessage(userId, `✏️ *Bitte sende die neue Antwort:*`)
.then(() => bot.once('message', async (answerMsg) => {
const answer = answerMsg.text.trim();
if (question && answer) {
faqData[faqIndex] = { question, answer };
fs.writeFileSync(faqFilePath, JSON.stringify(faqData, null, 2));
bot.sendMessage(userId, `✅ *FAQ aktualisiert.*`);
} else {
bot.sendMessage(userId, `❌ *Bitte stelle sicher, dass du sowohl Frage als auch Antwort eingibst.*`);
}
}));
}));
} else {
bot.sendMessage(userId, `❌ *Ungültige FAQ-Nummer.*`);
}
}));
} else {
bot.sendMessage(userId, '❗ *Nur Admins können diesen Befehl verwenden.*');
}
});
// /del_faq-Befehl, um FAQs zu löschen (nur privat)
bot.onText(/\/del_faq/, (msg) => {
const userId = msg.from.id.toString();
if (!canExecuteCommand(userId)) {
bot.sendMessage(msg.chat.id, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (admins[userId]) {
bot.sendMessage(userId, `🗑️ *Bitte sende die Nummer der FAQ, die du löschen möchtest:*`)
.then(() => bot.once('message', async (faqMsg) => {
const faqIndex = parseInt(faqMsg.text, 10) - 1;
if (faqIndex >= 0 && faqIndex < faqData.length) {
faqData.splice(faqIndex, 1);
fs.writeFileSync(faqFilePath, JSON.stringify(faqData, null, 2));
bot.sendMessage(userId, `✅ *FAQ gelöscht.*`);
} else {
bot.sendMessage(userId, `❌ *Ungültige FAQ-Nummer.*`);
}
}));
} else {
bot.sendMessage(userId, '❗ *Nur Admins können diesen Befehl verwenden.*');
}
});
const rateLimit = new Map(); // Speichert die Zeitstempel der letzten Ticket-Einreichung für jeden Benutzer
bot.onText(/\/create_ticket/, (msg) => {
const userId = msg.from.id.toString();
const currentTime = Date.now();
// Überprüfen, ob der Wartungsmodus aktiv ist und ob der Benutzer berechtigt ist
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Prüfen, ob der Benutzer gesperrt ist
if (isUserSpammed(userId)) {
bot.sendMessage(msg.chat.id, '❌ Du bist gesperrt und kannst diesen Befehl nicht verwenden.');
return; // Sperrte Benutzer können keine Befehle verwenden
}
// Überprüfen, ob der Benutzer bereits ein Ticket eingereicht hat
if (rateLimit.has(userId)) {
const lastTicketTime = rateLimit.get(userId);
const timeSinceLastTicket = currentTime - lastTicketTime;
// Überprüfen, ob 5 Minuten (300000 Millisekunden) seit dem letzten Ticket vergangen sind
if (timeSinceLastTicket < 300000) {
const timeLeft = Math.ceil((300000 - timeSinceLastTicket) / 60000); // Zeit übrig in Minuten
return bot.sendMessage(userId, `❌ *Du musst noch ${timeLeft} Minuten warten, bevor du ein weiteres Ticket senden kannst.*`);
}
}
// Wenn der Benutzer noch keine Tickets gesendet hat oder das Zeitlimit abgelaufen ist
if (admins[userId]) {
bot.sendMessage(userId, '🔧 Bitte gib deinen Namen ein:')
.then(() => bot.once('message', async (nameMsg) => {
const name = nameMsg.text.trim();
if (!name) {
bot.sendMessage(userId, '❌ *Name ist erforderlich.*');
return;
}
bot.sendMessage(userId, '✉️ Bitte gib deine E-Mail-Adresse ein:')
.then(() => bot.once('message', async (emailMsg) => {
const email = emailMsg.text.trim();
// Simple E-Mail-Validierung
if (!email || !email.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/)) {
bot.sendMessage(userId, '❌ *Ungültige E-Mail-Adresse.*');
return;
}
bot.sendMessage(userId, '📝 Bitte gib den Inhalt deines Tickets ein:')
.then(() => bot.once('message', async (ticketMsg) => {
const ticketContent = ticketMsg.text.trim();
if (!ticketContent) {
bot.sendMessage(userId, '❌ *Ticket-Inhalt ist erforderlich.*');
return;
}
// E-Mail-Transporter konfigurieren
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.EMAIL_USER,
pass: process.env.EMAIL_PASS
}
});
// E-Mail-Nachricht erstellen
const mailOptions = {
from: process.env.EMAIL_USER,
to: process.env.EMAIL_RECIPIENT,
subject: 'Neues Ticket vom Support-Bot',
text: `Neues Ticket von ${name} (${email}):\n\n${ticketContent}`
};
// E-Mail senden
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.error('Fehler beim Senden der E-Mail:', error);
bot.sendMessage(userId, '⚠️ *Es gab einen Fehler beim Senden des Tickets. Bitte versuche es später erneut.*');
} else {
bot.sendMessage(userId, `✅ *Dein Ticket wurde erfolgreich eingereicht. Vielen Dank, ${name}!`);
}
});
// Zeitstempel des letzten Tickets speichern
rateLimit.set(userId, currentTime);
}));
}));
}));
} else {
bot.sendMessage(userId, '❗ *Nur Admins können diesen Befehl verwenden.*');
}
});
// Beispiel für den /info-Befehl
bot.onText(/\/info/, (msg) => {
const chatId = msg.chat.id;
if (!canExecuteCommand(msg.from.id.toString())) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Hier die Bot-Informationen eintragen
const botName = 'Support Bot'; // Ersetze dies durch den tatsächlichen Bot-Namen
const botVersion = '1.5.6'; // Ersetze dies durch die tatsächliche Version
const botAuthor = 'M_Viper'; // Ersetze dies durch den tatsächlichen Autor
const botLicense = 'MIT'; // Ersetze dies durch die tatsächliche Lizenz
// Informationen ohne MarkdownV2-Formatierung
const infoMessage = `
🤖 Bot Information:
- Name: ${botName}
- Version: ${botVersion}
- Author: ${botAuthor}
- License: ${botLicense}
`;
bot.sendMessage(chatId, infoMessage)
.catch(error => {
console.error('Fehler beim Senden der Bot-Informationen:', error);
});
});
const maintenanceModeFile = path.join(dataDir, 'maintenance_mode.json');
// Sicherstellen, dass die maintenance_mode.json existiert
if (!fs.existsSync(maintenanceModeFile)) {
fs.writeFileSync(maintenanceModeFile, JSON.stringify({ active: false }), 'utf8');
}
// Funktion zum Laden des Wartungsmodus-Status
const loadMaintenanceMode = () => {
return JSON.parse(fs.readFileSync(maintenanceModeFile, 'utf8'));
};
// Funktion zum Speichern des Wartungsmodus-Status
const saveMaintenanceMode = (status) => {
fs.writeFileSync(maintenanceModeFile, JSON.stringify(status, null, 2), 'utf8');
};
// Überprüfen, ob der Wartungsmodus aktiviert ist
const isMaintenanceModeActive = () => {
const status = loadMaintenanceMode();
return status.active;
};
// Funktion zum Umschalten des Wartungsmodus
const toggleMaintenanceMode = (adminId, action) => {
const status = loadMaintenanceMode();
if (action === 'on') {
status.active = true;
saveMaintenanceMode(status);
bot.sendMessage(adminId, '🔧 Wartungsmodus wurde aktiviert.');
} else if (action === 'off') {
status.active = false;
saveMaintenanceMode(status);
bot.sendMessage(adminId, '🔧 Wartungsmodus wurde deaktiviert.');
}
};
// Reaktion auf den /maintenance_mode-Befehl
bot.onText(/\/wartung (on|off)/, (msg, match) => {
const chatId = msg.chat.id;
const userId = msg.from.id.toString();
const action = match[1]; // "on" oder "off"
// Überprüfen, ob der Benutzer der Entwickler ist
const devId = process.env.DEV;
if (userId === devId) {
toggleMaintenanceMode(userId, action);
} else {
bot.sendMessage(chatId, '❌ Du hast keine Berechtigung, den Wartungsmodus zu ändern.');
}
});
// Funktion zur Überprüfung, ob der Befehl während des Wartungsmodus ausgeführt werden kann
const canExecuteCommand = (userId) => {
return !isMaintenanceModeActive() || userId === process.env.DEV;
};
// Hilfe-Befehl
bot.onText(/\/help/, (msg) => {
const chatId = msg.chat.id;
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Prüfen, ob der Benutzer gesperrt ist
if (isUserSpammed(userId)) {
const { expiry } = spammedUsers[userId];
// Nachricht für gesperrte Benutzer senden
if (expiry === 'permanent') {
bot.sendMessage(chatId, '❌ *Du bist dauerhaft gesperrt und kannst diesen Befehl nicht verwenden.*');
} else {
const formattedExpiry = formatTime(expiry);
bot.sendMessage(chatId, `❌ *Du bist gesperrt bis ${formattedExpiry} und kannst diesen Befehl nicht verwenden.*`);
}
return; // Verhindert weitere Verarbeitung, wenn der Benutzer gesperrt ist
}
// Normale Verarbeitung für nicht gesperrte Benutzer (User Befehle)
const helpMessage = `📋 Verfügbare Befehle:\n
🔍 /help - Zeigt diese Hilfe-Nachricht an\n
🔗 /links - Zeigt eine Liste der gespeicherten Links an\n
❓ /faq - Zeigt die FAQ an\n
📝 /create_ticket - Reiche ein Support-Ticket ein\n
👥 /admin - Zeigt eine Liste der Admins und deren Status\n
💬 /chat - Fordere einen Chat mit einem Admin an\n
/info - Zeigt Informationen über den Bot an\n
⭐ /rate - Bewerte unseren Support\n
🔗 /einladung - Erstelle einen persönlichen Einladungslink\n
📅 /termin - Mache einen Chat-Termin mit einem Admin\n
🚨 /escalation - Melde ein Problem an alle Admins\n
📜 /terms - Zeigt die Nutzungsbedingungen des Bots an\n
🗑 /cancel_termin - Storniert einen Chat-Termin\n
`;
bot.sendMessage(chatId, helpMessage); // Kein Markdown verwendet
});
// Hilfe-Befehl für Admins
bot.onText(/\/a_help/, (msg) => {
const chatId = msg.chat.id;
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Überprüfen, ob der Benutzer ein Admin ist (Admin Befehle)
if (admins[userId]) {
const adminHelpMessage = `📋 Verfügbare Admin-Befehle:\n
🟢 /online - Setze deinen Status auf "online"\n
🔴 /offline - Setze deinen Status auf "offline"\n
📄 /add_faq - Füge einen neuen FAQ-Eintrag hinzu\n
✏️ /edit_faq - Bearbeite einen bestehenden FAQ-Eintrag\n
❌ /del_faq - Lösche einen FAQ-Eintrag\n
🔗 /add_links - Füge einen neuen Link hinzu\n
🚫 /del_links - Lösche einen Link\n
⭐ /view_ratings - Zeigt alle Bewertungen an\n
📊 /status - Zeigt Admins & Informationen an\n
📩 /msg_admin - Sende eine Nachricht an alle Admins\n
📝 /view_chat_history - Zeigt den Gesprächsverlauf eines Benutzers\n
📅 /my_termine - zeigt alle zukünftigen Chat-Termine an\n
🕐 /schedule_message - Geplante Nachricht erstellen\n
📌 /pin_message - Ermöglicht es Nachrichten in einem Chat anzupinnen.\n
🛑 /spam - Sperrt einen User für eine festgelegte Zeit\n
🔓 /unspam - Hebt die Sperre eines Users auf\n
🛠️ /maintenance_mode on|off - Wartungsmodus AN/AUS\n
`;
bot.sendMessage(chatId, adminHelpMessage)
.catch(error => console.log('Fehler beim Senden der Nachricht:', error));
} else {
// Nachricht für Nicht-Admins
bot.sendMessage(chatId, "❌ Du hast keine Berechtigung, diesen Befehl zu verwenden.")
.catch(error => console.log('Fehler beim Senden der Nachricht:', error));
}
});
// Admin-Nachrichten verarbeiten
bot.onText(/\/msg_admin/, (msg) => {
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(userId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (admins[userId]) {
bot.sendMessage(userId, '🔧 *Bitte gib die Nachricht ein, die an alle Admins gesendet werden soll:*')
.then(() => bot.once('message', async (messageMsg) => {
const message = messageMsg.text.trim();
if (!message) {
bot.sendMessage(userId, '❌ *Die Nachricht darf nicht leer sein.*');
return;
}
orderedAdminIds.forEach(adminId => {
if (adminId !== userId) {
bot.sendMessage(adminId, `🔧 *Nachricht von ${admins[userId].name}:*\n\n${message}`);
}
});
bot.sendMessage(userId, '✅ *Nachricht an alle Admins gesendet.*');
}));
} else {
bot.sendMessage(userId, '❗ *Nur Admins können diesen Befehl verwenden.*');
}
});
// /rate-Befehl, um den Support zu bewerten
bot.onText(/\/rate/, (msg) => {
const userId = msg.from.id.toString();
const username = msg.from.username ? `@${msg.from.username}` : 'Unbekannt'; // Username holen, wenn vorhanden
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(msg.chat.id, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Prüfen, ob der Benutzer gesperrt ist
if (isUserSpammed(userId)) {
bot.sendMessage(msg.chat.id, '❌ Du bist gesperrt und kannst diesen Befehl nicht verwenden.');
return; // Sperrte Benutzer können keine Befehle verwenden
}
// Benutzer auffordern, eine Bewertung von 1 bis 10 abzugeben
bot.sendMessage(userId, `⭐️ *Bewerte unseren Support von 1 bis 10 Sternen:*`)
.then(() => bot.once('message', async (ratingMsg) => {
const rating = parseInt(ratingMsg.text, 10);
// Validierung der Bewertung
if (isNaN(rating) || rating < 1 || rating > 10) {
bot.sendMessage(userId, '❌ *Bitte gib eine gültige Bewertung von 1 bis 10 Sternen ein.*');
return;
}
// Speichern der Bewertung
ratingsData.push({ userId, username, rating });
fs.writeFileSync(ratingsFilePath, JSON.stringify(ratingsData, null, 2));
bot.sendMessage(userId, `✅ *Danke für deine Bewertung!*`);
// Optional: Benachrichtige den Admin oder speichere die Bewertung anders
}));
});
// /view_ratings-Befehl, um Bewertungen zu sehen (nur privat)
bot.onText(/\/view_ratings/, (msg) => {
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(userId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (admins[userId]) {
if (ratingsData.length > 0) {
const ratings = ratingsData.map((entry) => `⭐️ Benutzer ${entry.username || entry.userId}: ${entry.rating} Sterne`).join('\n\n');
bot.sendMessage(userId, `📊 *Bewertungen:* 📊\n\n${ratings}`);
} else {
bot.sendMessage(userId, '❗ Keine Bewertungen verfügbar.');
}
} else {
bot.sendMessage(userId, '❗ *Nur Admins können diesen Befehl verwenden.*');
}
});
// Initialisierung der Daten
let usageData = [];
let fqaData = [];
let ticketsData = []; // Variable für die Tickets
let chatSessions = []; // Variable für Chats mit Admins
fs.readFile(faqFilePath, 'utf8', (err, data) => {
if (err) {
console.error('Error loading FAQ data:', err);
return;
}
try {
fqaData = JSON.parse(data);
console.log('Loaded FAQ Data:', fqaData); // Logging zur Überprüfung
} catch (e) {
console.error('Error parsing FAQ data:', e);
}
});
// Beispiel: Chat-Daten speichern (Wird angenommen, dass beim Start eines Chats ein Zeitstempel gespeichert wird)
function startChatSession(userId, adminId) {
const startTime = Date.now();
chatSessions.push({ userId, adminId, startTime });
}
// Beispiel: Chat-Daten beenden (Wird angenommen, dass beim Beenden eines Chats der Zeitstempel erfasst wird)
function endChatSession(userId, adminId) {
const endTime = Date.now();
chatSessions = chatSessions.map(session => {
if (session.userId === userId && session.adminId === adminId && !session.endTime) {
session.endTime = endTime;
}
return session;
});
}
// Funktion zum Ermitteln des Webseitenstatus
const getWebsitesStatus = async () => {
const statusPromises = linksData.map(async (link) => {
try {
// Sende eine HTTP-GET-Anfrage an die Webseite
await axios.get(link.url, { timeout: 5000 });
return `🟢 Online ${link.title}`;
} catch (error) {
return `🔴 Offline ${link.title}`;
}
});
// Warten, bis alle Status-Promises abgeschlossen sind
const statuses = await Promise.all(statusPromises);
return statuses.join('\n\n'); // Füge einen Abstand zwischen den Einträgen hinzu
};
// Funktion zur Berechnung der Laufzeit des Bots
const getBotUptime = () => {
const now = new Date();
const uptimeMs = now - botStartTime;
const uptimeMin = Math.floor(uptimeMs / 60000);
const uptimeSec = ((uptimeMs % 60000) / 1000).toFixed(0);
return `${uptimeMin}m ${uptimeSec}s`;
};
// /status-Befehl, um den Status der Admins zu überprüfen
bot.onText(/\/status/, async (msg) => {
const userId = msg.from.id.toString();
const chatId = msg.chat.id;
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (admins[userId]) {
try {
// Status der Admins
const adminStatusMessages = orderedAdminIds.map(id => {
const status = adminStatus[id] || 'offline';
const statusEmoji = status === 'online' ? '🟢' : '🔴';
return `${statusEmoji} ${admins[id].name} (@${admins[id].username}): ${status}`;
}).join('\n\n');
// Weitere Statusinformationen
const totalUsages = usageData.length; // Anzahl der Nutzungen
const totalRatings = ratingsData.length; // Anzahl der Bewertungen
const totalFQA = fqaData.length; // Anzahl der FQA Einträge
const totalTickets = ticketsData.length; // Anzahl der Tickets
const totalLinks = linksData.length; // Anzahl der Links
const totalUsers = loadUsers().length; // Anzahl der Nutzer
const totalSpammedUsers = Object.keys(loadSpammedUsers()).length; // Anzahl der Sperrungen (Spam)
// Dauer der Chats berechnen
const chatDurations = chatSessions.map(session => {
if (session.endTime) {
const durationMs = session.endTime - session.startTime;
const durationMin = Math.floor(durationMs / 60000);
const durationSec = ((durationMs % 60000) / 1000).toFixed(0);
return `🗣️ ${admins[session.adminId].name} (@${admins[session.adminId].username}): ${durationMin}m ${durationSec}s`;
}
return null;
}).filter(Boolean).join('\n');
// Wartungsmodus-Status
const maintenanceModeStatus = isMaintenanceModeActive() ? 'Aktiv' : 'Inaktiv';
// Status der Webseiten
const websiteStatus = await getWebsitesStatus();
// Laufzeit des Bots berechnen
const botUptime = getBotUptime();
const additionalInfo = `📊 Zusätzliche Informationen: 📊\n\n` +
`🔢 Anzahl der Nutzungen: ${totalUsages}\n\n` +
`⭐️ Anzahl der Bewertungen: ${totalRatings}\n\n` +
`❓ Anzahl der FAQ Einträge: ${totalFQA}\n\n` +
`🎟️ Anzahl der Tickets: ${totalTickets}\n\n` +
`🔗 Anzahl der Links: ${totalLinks}\n\n` +
`👥 Anzahl der Nutzer: ${totalUsers}\n\n` +
`🚫 Anzahl der Sperrungen (Spam): ${totalSpammedUsers}\n\n` +
`🕒 Chats mit Admins: \n${chatDurations || 'Keine aktiven Chats'}\n\n` +
`🔧 Wartungsmodus: ${maintenanceModeStatus}\n\n` +
`⏱️ Bot Laufzeit: ${botUptime}`;
// Komplette Statusnachricht
const fullStatusMessage = `🛠️ Admin-Status: 🛠️\n\n${adminStatusMessages}\n\n` +
`══════════════════════════════\n\n` +
`${additionalInfo}\n\n` +
`══════════════════════════════\n\n` +
`🌐 Webseitenstatus: \n\n${websiteStatus}\n\n`;
bot.sendMessage(chatId, fullStatusMessage);
} catch (error) {
console.error('Error while generating status message:', error);
bot.sendMessage(chatId, '❗ Es ist ein Fehler aufgetreten. Bitte versuche es später erneut.');
}
} else {
bot.sendMessage(chatId, '❗ Nur Admins können diesen Befehl verwenden.');
}
});
const repliesFilePath = path.join(dataDir, 'reply.json');
// Sicherstellen, dass die reply.json-Datei existiert und als Array initialisieren
if (!fs.existsSync(repliesFilePath)) {
fs.writeFileSync(repliesFilePath, JSON.stringify([])); // Leeres Array statt Objekt
}
// Lädt Auto-Reply-Antworten aus der reply.json-Datei
let autoReplies;
try {
autoReplies = JSON.parse(fs.readFileSync(repliesFilePath, 'utf8'));
// Falls die Datei versehentlich kein Array ist, setzen wir sie korrekt
if (!Array.isArray(autoReplies)) {
autoReplies = [];
fs.writeFileSync(repliesFilePath, JSON.stringify(autoReplies, null, 2));
}
} catch (error) {
console.error('Fehler beim Laden der Auto-Reply-Daten:', error);
autoReplies = []; // Falls Fehler auftritt, leeres Array initialisieren
}
// Temporärer Speicher für Admins, die auf Eingaben warten
const pendingAutoReplies = {};
// Funktion zum Setzen einer automatischen Antwort
function setAutoReply(question, answer) {
try {
const replyData = { question, answer };
autoReplies.push(replyData);
fs.writeFileSync(repliesFilePath, JSON.stringify(autoReplies, null, 2));
} catch (error) {
console.error('Fehler beim Speichern der Auto-Reply-Daten:', error);
}
}
// /auto_reply-Befehl zum Starten des Prozesses
bot.onText(/\/auto_reply/, (msg) => {
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(userId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (admins[userId]) {
pendingAutoReplies[userId] = { step: 'waiting_for_question' };
bot.sendMessage(userId, '✏️ *Bitte gib die Frage ein, auf die automatisch geantwortet werden soll.*');
} else {
bot.sendMessage(userId, '❗ *Nur Admins können diesen Befehl verwenden.*');
}
});
// Verarbeite Nachrichten und steuere den Frage-Antwort-Prozess
bot.on('message', (msg) => {
const userId = msg.from.id.toString();
const chatId = msg.chat.id;
const text = msg.text;
if (pendingAutoReplies[userId]) {
const pendingReply = pendingAutoReplies[userId];
if (pendingReply.step === 'waiting_for_question') {
// Frage erhalten, nach der Antwort fragen
pendingReply.question = text.trim();
pendingReply.step = 'waiting_for_answer';
bot.sendMessage(userId, `📝 *Frage gespeichert:* "${pendingReply.question}". Bitte gib nun die Antwort ein.`);
} else if (pendingReply.step === 'waiting_for_answer') {
// Antwort erhalten, das Frage-Antwort-Paar speichern
const answer = text.trim();
setAutoReply(pendingReply.question, answer);
bot.sendMessage(chatId, `✅ *Automatische Antwort für die Frage "${pendingReply.question}" wurde gespeichert.*`);
// Entferne den Benutzer aus dem temporären Speicher
delete pendingAutoReplies[userId];
}
} else if (text) {
// Verarbeite eingehende Nachrichten und sende eine automatische Antwort, wenn eine Frage ähnlich ist
const lowerCaseText = text.toLowerCase();
let highestSimilarity = 0;
let bestMatch = null;
// Verwendet Fuzzy Matching, um ähnliche Fragen zu finden
for (const reply of autoReplies) {
const { question, answer } = reply;
// Berechne die Ähnlichkeit zwischen der Benutzerfrage und den gespeicherten Fragen
try {
const similarity = stringSimilarity.compareTwoStrings(lowerCaseText, question.toLowerCase());
if (similarity > highestSimilarity) {
highestSimilarity = similarity;
bestMatch = answer;
}
} catch (error) {
console.error('Fehler bei der Textähnlichkeitsberechnung:', error);
}
}
// Wenn eine hohe Ähnlichkeit festgestellt wurde (z.B. > 0.5), sende die passende Antwort
if (highestSimilarity > 0.5) {
bot.sendMessage(chatId, bestMatch);
}
}
});
const chatHistoryFilePath = path.join(dataDir, 'chat_history.json');
// Sicherstellen, dass die chat_history.json-Datei existiert
if (!fs.existsSync(chatHistoryFilePath)) {
fs.writeFileSync(chatHistoryFilePath, JSON.stringify({}));
}
// Lädt den Gesprächsverlauf aus der chat_history.json-Datei
let chatHistory = {};
try {
chatHistory = JSON.parse(fs.readFileSync(chatHistoryFilePath, 'utf8'));
} catch (error) {
console.error('Fehler beim Laden des Gesprächsverlaufs:', error);
}
// Funktion zum Speichern eines Gesprächsverlaufs
function saveChatHistory(userId, userName, message) {
console.log(`Speichern der Nachricht für Benutzer ${userName}: ${message}`);
if (!chatHistory[userId]) {
chatHistory[userId] = { [userName]: [] };
} else if (!chatHistory[userId][userName]) {
chatHistory[userId][userName] = [];
}
chatHistory[userId][userName].push(message);
try {
fs.writeFileSync(chatHistoryFilePath, JSON.stringify(chatHistory, null, 2));
console.log('Chat-Verlauf erfolgreich gespeichert.');
} catch (error) {
console.error('Fehler beim Speichern des Gesprächsverlaufs:', error);
}
}
// Funktion zum Abrufen der Liste der Benutzer
function listUsers() {
const userList = Object.keys(chatHistory)
.map((userId, index) => {
const userName = Object.keys(chatHistory[userId])[0];
return `${index + 1}. ${userName}`;
})
.join('\n');
return userList || 'Keine Benutzer gefunden.';
}
// Funktion zum Abrufen des Gesprächsverlaufs eines bestimmten Benutzers
function getChatHistory(userId) {
if (chatHistory[userId]) {
return Object.entries(chatHistory[userId])
.map(([name, messages]) => `@${name}:\n${messages.join('\n')}`)
.join('\n\n');
}
return 'Kein Verlauf gefunden.';
}
// /view_chat_history-Befehl zum Anzeigen der Liste der Benutzer
bot.onText(/\/view_chat_history/, (msg) => {
const userId = msg.from.id.toString();
const chatId = msg.chat.id;
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Überprüfe, ob der Benutzer berechtigt ist (Admin-Check)
if (admins[userId]) {
const usersList = listUsers();
bot.sendMessage(chatId, `🔍 *Wähle einen Benutzer aus der Liste aus:* \n\n${usersList}`);
// Temporären Speicher für die Auswahl der Benutzernummer
pendingSelections[userId] = { step: 'waiting_for_selection' };
} else {
bot.sendMessage(chatId, '❗ *Nur Admins können diesen Befehl verwenden.*');
}
});
// Temporärer Speicher für Benutzer, die auf Auswahl warten
const pendingSelections = {};
// Verarbeite die Auswahl des Benutzers
bot.on('message', (msg) => {
const userId = msg.from.id.toString();
const chatId = msg.chat.id;
const text = msg.text;
if (admins[userId]) {
saveChatHistory(userId, msg.from.username || msg.from.first_name, text);
}
if (pendingSelections[userId]) {
const pendingSelection = pendingSelections[userId];
if (pendingSelection.step === 'waiting_for_selection') {
const selectionIndex = parseInt(text.trim(), 10) - 1;
const userIds = Object.keys(chatHistory);
if (selectionIndex >= 0 && selectionIndex < userIds.length) {
const selectedUserId = userIds[selectionIndex];
const userName = Object.keys(chatHistory[selectedUserId])[0];
const history = getChatHistory(selectedUserId);
bot.sendMessage(chatId, `📜 *Gesprächsverlauf für Benutzer ${userName} (${selectedUserId}):*\n\n${history}`);
} else {
bot.sendMessage(chatId, '❗ *Ungültige Auswahl. Bitte gib eine gültige Nummer ein.*');
}
// Entferne die temporären Daten nach der Auswahl
delete pendingSelections[userId];
}
} else if (text) {
// Hier kannst du den normalen Nachrichtenverarbeitungsprozess fortsetzen
}
});
// Funktion zum Speichern eines Gesprächsverlaufs
function saveChatHistory(userId, userName, message) {
if (!chatHistory[userId]) {
chatHistory[userId] = { [userName]: [] };
} else if (!chatHistory[userId][userName]) {
chatHistory[userId][userName] = [];
}
chatHistory[userId][userName].push(message);
fs.writeFileSync(chatHistoryFilePath, JSON.stringify(chatHistory, null, 2));
}
// Funktion zum Extrahieren von Fragen und Antworten aus Chat-Verlauf
function learnFromChatHistory() {
for (const [userId, userChats] of Object.entries(chatHistory)) {
for (const [userName, messages] of Object.entries(userChats)) {
// Hier können Sie die Logik anpassen, um Fragen und Antworten zu extrahieren
messages.forEach((message, index) => {
// Beispielhafte Logik: Jede zweite Nachricht als Antwort behandeln
if (index % 2 === 0) {
const question = message;
const answer = messages[index + 1] || 'Keine Antwort gefunden';
const existingReply = autoReplies.find(r => r.question === question);
if (!existingReply) {
autoReplies.push({ question, answer });
fs.writeFileSync(repliesFilePath, JSON.stringify(autoReplies, null, 2));
}
}
});
}
}
}
// Funktion zum Verarbeiten von Nachrichten
bot.on('message', (msg) => {
const userId = msg.from.id.toString();
const chatId = msg.chat.id;
const text = msg.text;
// Speichern des Gesprächsverlaufs
if (admins[userId]) {
saveChatHistory(userId, msg.from.username || msg.from.first_name, text);
}
// Verarbeite eingehende Nachrichten und sende eine automatische Antwort, wenn eine Frage ähnlich ist
const lowerCaseText = text.toLowerCase();
let highestSimilarity = 0;
let bestMatch = null;
// Verwendet Fuzzy Matching, um ähnliche Fragen zu finden
for (const reply of autoReplies) {
const { question, answer } = reply;
try {
const similarity = stringSimilarity.compareTwoStrings(lowerCaseText, question.toLowerCase());
if (similarity > highestSimilarity) {
highestSimilarity = similarity;
bestMatch = answer;
}
} catch (error) {
console.error('Fehler bei der Textähnlichkeitsberechnung:', error);
}
}
// Wenn eine hohe Ähnlichkeit festgestellt wurde (z.B. > 0.5), sende die passende Antwort
if (highestSimilarity > 0.5) {
bot.sendMessage(chatId, bestMatch);
}
});
// Automatisches Lernen aus Chat-Verlauf regelmäßig ausführen
setInterval(learnFromChatHistory, 24 * 60 * 60 * 1000); // Alle 24 Stunden
// Verzeichnisse und Dateipfade
const appointmentsFilePath = path.join(dataDir, 'appointments.json');
// Sicherstellen, dass das Verzeichnis existiert
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
}
// Sicherstellen, dass die appointments.json-Datei existiert
if (!fs.existsSync(appointmentsFilePath)) {
fs.writeFileSync(appointmentsFilePath, JSON.stringify({}));
}
// Lädt die Termine aus der appointments.json-Datei
let appointments = {};
try {
appointments = JSON.parse(fs.readFileSync(appointmentsFilePath, 'utf8'));
} catch (error) {
console.error('Fehler beim Laden der Termine:', error);
}
// Funktion zum Speichern der Termine
function saveAppointments() {
try {
fs.writeFileSync(appointmentsFilePath, JSON.stringify(appointments, null, 2));
} catch (error) {
console.error('Fehler beim Speichern der Termine:', error);
}
}
// Funktion zum Abrufen der Liste der Admins
function listAdmins() {
return Object.keys(admins).map(adminId => {
const admin = admins[adminId];
const statusIcon = admin.status === 'online' ? '🟢' : '🔴';
const adminName = admin.name || 'Unbekannt';
const adminUsername = admin.username ? `@${admin.username}` : 'Unbekannt';
const adminResponsibility = admin.responsibility || 'Keine Zuständigkeit angegeben';
return `${statusIcon} ${adminName}\n ${adminUsername}\n 📌 Zuständigkeit: ${adminResponsibility}`;
}).join('\n\n');
}
// Funktion zum Formatieren des Datums
function formatDate(date) {
const options = { weekday: 'short', day: '2-digit', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false };
return date.toLocaleDateString('de-DE', options).replace(',', '');
}
// /termin-Befehl zum Vereinbaren eines Chat-Termins
bot.onText(/\/termin/, (msg) => {
const chatId = msg.chat.id;
const userId = msg.from.id.toString();
const username = msg.from.username || msg.from.first_name;
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Prüfen, ob der Benutzer gesperrt ist
if (isUserSpammed(userId)) {
bot.sendMessage(chatId, '❌ Du bist gesperrt und kannst diesen Befehl nicht verwenden.');
return; // Gesperrte Benutzer können keine Befehle verwenden
}
if (appointments[userId]) {
bot.sendMessage(chatId, '📅 Du hast bereits einen Termin geplant. Bitte warte auf den nächsten verfügbaren Termin.');
return;
}
bot.sendMessage(chatId, '🔍 Wähle einen Admin für den Chat-Termin aus:\n\n' + listAdmins());
appointments[userId] = { step: 'waiting_for_admin', username }; // Speichere den Benutzernamen
saveAppointments();
});
// Verarbeite die Auswahl des Admins und des Zeitpunkts
bot.on('message', (msg) => {
const userId = msg.from.id.toString();
const chatId = msg.chat.id;
const text = msg.text.trim();
if (appointments[userId]) {
const appointment = appointments[userId];
if (appointment.step === 'waiting_for_admin') {
const adminName = text;
const adminId = Object.keys(admins).find(id => admins[id].name === adminName);
if (adminId) {
appointment.adminId = adminId;
appointment.step = 'waiting_for_date';
bot.sendMessage(chatId, '📅 Wähle ein Datum und eine Uhrzeit für den Chat-Termin (im Format YYYY-MM-DD HH:MM):');
saveAppointments();
} else {
bot.sendMessage(chatId, '❗ Ungültige Auswahl. Bitte wähle einen Admin aus der Liste aus.');
}
} else if (appointment.step === 'waiting_for_date') {
const [date, time] = text.split(' ');
const appointmentDate = new Date(`${date}T${time}:00`);
if (!isNaN(appointmentDate.getTime()) && appointmentDate > new Date()) {
appointment.date = appointmentDate;
appointment.step = 'confirmed';
const formattedDate = formatDate(appointmentDate);
bot.sendMessage(chatId, '✅ Dein Termin wurde erfolgreich gebucht. Du erhältst Erinnerungen 10 Minuten und 5 Minuten vor Beginn.');
bot.sendMessage(appointment.adminId, `📅 Du hast einen neuen Chat-Termin mit @${appointment.username} am ${formattedDate}.`);
saveAppointments();
// Erinnerungen an beide Parteien
const reminder10Min = appointmentDate - new Date() - 10 * 60 * 1000;
const reminder5Min = appointmentDate - new Date() - 5 * 60 * 1000;
const startTime = appointmentDate - new Date();
if (reminder10Min > 0) {
setTimeout(() => {
bot.sendMessage(userId, `⏰ Dein Chat-Termin mit @${admins[appointment.adminId].username} beginnt in 10 Minuten.`);
bot.sendMessage(appointment.adminId, `⏰ Dein Chat-Termin mit @${appointment.username} beginnt in 10 Minuten.`);
}, reminder10Min);
}
if (reminder5Min > 0) {
setTimeout(() => {
bot.sendMessage(userId, `⏰ Dein Chat-Termin mit @${admins[appointment.adminId].username} beginnt in 5 Minuten.`);
bot.sendMessage(appointment.adminId, `⏰ Dein Chat-Termin mit @${appointment.username} beginnt in 5 Minuten.`);
}, reminder5Min);
}
if (startTime > 0) {
setTimeout(() => {
bot.sendMessage(userId, `📅 Dein Chat-Termin mit @${admins[appointment.adminId].username} beginnt am ${formattedDate}. Starte den Chat jetzt!`);
bot.sendMessage(appointment.adminId, `📅 Dein Chat-Termin mit @${appointment.username} beginnt am ${formattedDate}. Starte den Chat jetzt!`);
admins[appointment.adminId].status = 'offline'; // Setze den Admin auf offline
saveAppointments(); // Speichere den Status
}, startTime);
}
} else {
bot.sendMessage(chatId, '❗ Ungültiges Datum oder Uhrzeit. Bitte gib ein gültiges Datum und eine gültige Uhrzeit im Format YYYY-MM-DD HH:MM an.');
}
}
}
});
// /my_termine-Befehl für Admins
bot.onText(/\/my_termine/, (msg) => {
const adminId = msg.from.id.toString();
const chatId = msg.chat.id;
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(adminId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (!admins[adminId]) {
bot.sendMessage(chatId, '❌ Du bist kein Admin und hast keinen Zugriff auf diesen Befehl.');
return;
}
const adminAppointments = Object.values(appointments).filter(appointment => appointment.adminId === adminId);
if (adminAppointments.length > 0) {
let appointmentsList = '📅 Deine kommenden Termine:\n\n';
adminAppointments.forEach(appointment => {
appointmentsList += `- Mit @${appointment.username} am ${formatDate(new Date(appointment.date))}\n`;
});
bot.sendMessage(chatId, appointmentsList);
} else {
bot.sendMessage(chatId, '📅 Du hast keine anstehenden Termine.');
}
});
// /cancel_termin-Befehl zum Stornieren eines Termins
bot.onText(/\/cancel_termin/, (msg) => {
const chatId = msg.chat.id;
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Prüfen, ob der Benutzer einen Termin hat
if (appointments[userId] && appointments[userId].step === 'confirmed') {
const appointment = appointments[userId];
const formattedDate = formatDate(new Date(appointment.date));
// Bestätigungsnachricht für den Benutzer
bot.sendMessage(chatId, `❗ Bist du sicher, dass du deinen Termin mit @${admins[appointment.adminId].username} am ${formattedDate} stornieren möchtest? Antworte mit 'Ja' oder 'Nein'.`);
// Warten auf Bestätigung der Stornierung
bot.once('message', (confirmationMsg) => {
const confirmationText = confirmationMsg.text.trim().toLowerCase();
if (confirmationText === 'ja') {
// Termin stornieren
delete appointments[userId];
saveAppointments(); // Sicherstellen, dass die Datei aktualisiert wird
bot.sendMessage(chatId, '✅ Dein Termin wurde erfolgreich storniert.');
bot.sendMessage(appointment.adminId, `❌ Der Termin mit @${appointment.username} am ${formattedDate} wurde vom Benutzer storniert.`);
} else {
bot.sendMessage(chatId, '❌ Die Stornierung wurde abgebrochen.');
}
});
} else {
bot.sendMessage(chatId, '❌ Du hast keinen geplanten Termin, den du stornieren könntest.');
}
});
// Pfad zur Datei, in der die Benutzer-Daten gespeichert werden
const usersFilePath = path.join(dataDir, 'users.json');
// Pfad zur Datei, in der die geplanten Nachrichten gespeichert werden
const scheduledMessagesFilePath = path.join(dataDir, 'scheduled_messages.json');
// Sicherstellen, dass das Verzeichnis existiert
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
}
// Sicherstellen, dass die Dateien existieren
if (!fs.existsSync(usersFilePath)) {
fs.writeFileSync(usersFilePath, JSON.stringify([]));
}
if (!fs.existsSync(scheduledMessagesFilePath)) {
fs.writeFileSync(scheduledMessagesFilePath, JSON.stringify([]));
}
// Lädt die Benutzer-Daten aus der users.json-Datei
let users = [];
try {
users = JSON.parse(fs.readFileSync(usersFilePath, 'utf8'));
} catch (error) {
console.error('Fehler beim Laden der Benutzer-Daten:', error);
}
// Lädt die geplanten Nachrichten aus der scheduled_messages.json-Datei
let scheduledMessages = [];
try {
scheduledMessages = JSON.parse(fs.readFileSync(scheduledMessagesFilePath, 'utf8'));
} catch (error) {
console.error('Fehler beim Laden der geplanten Nachrichten:', error);
}
// Funktion zum Speichern der Benutzer-Daten
function saveUsers() {
try {
fs.writeFileSync(usersFilePath, JSON.stringify(users, null, 2));
} catch (error) {
console.error('Fehler beim Speichern der Benutzer-Daten:', error);
}
}
// Funktion zum Speichern der geplanten Nachrichten
function saveScheduledMessages() {
try {
fs.writeFileSync(scheduledMessagesFilePath, JSON.stringify(scheduledMessages, null, 2));
} catch (error) {
console.error('Fehler beim Speichern der geplanten Nachrichten:', error);
}
}
// Funktion zum Senden des Menüs
const sendMenu = (chatId) => {
const groupName = process.env.GROUP_NAME;
const botName = process.env.BOT_NAME;
const menuText = `📢 *Willkommen beim SupportBot von ${groupName}*\n\n` +
`Hallo! Wir freuen uns, dass du bei ${groupName} bist. \n\n` +
`Hier kannst du Unterstützung zu verschiedenen Themen erhalten, wie z.B.:\n` +
`- Unsere Links\n` +
`- Häufig gestellte Fragen (FAQ)\n` +
`- Unterstützung durch unseren Support\n` +
`- Und vieles mehr!\n\n` +
`Nutze die Befehle in /help, um mehr über unsere Funktionen zu erfahren und Unterstützung zu erhalten.\n\n` +
`Falls du Fragen hast oder Hilfe benötigst, stehen wir dir jederzeit zur Verfügung.\n\n` +
`Viel Spaß mit dem ${botName}!`;
const replyMarkup = {
reply_markup: {
inline_keyboard: [
[
{ text: 'Mehr Hilfe', callback_data: 'more_help' }
]
]
}
};
bot.sendMessage(chatId, menuText, { parse_mode: 'Markdown', reply_markup: replyMarkup });
};
// Reaktion auf den /start-Befehl
bot.onText(/\/start/, (msg) => {
const chatId = msg.chat.id;
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Prüfen, ob der Benutzer gesperrt ist
if (isUserSpammed(userId)) {
bot.sendMessage(chatId, '❌ Du bist gesperrt und kannst diesen Befehl nicht verwenden.');
return;
}
const userName = msg.from.username || `${msg.from.first_name} ${msg.from.last_name}`;
// Überprüfen, ob die Benutzer-ID bereits gespeichert ist
if (!users.find(user => user.id === userId)) {
users.push({
id: userId,
name: userName
});
saveUsers();
}
sendMenu(chatId);
});
// Reaktion auf Callback-Querys (Button-Klicks)
bot.on('callback_query', (query) => {
const chatId = query.message.chat.id;
const data = query.data;
if (data === 'more_help') {
// Sende die Hilfe-Nachricht
const helpText = `📚 *Hilfe und Unterstützung*\n\n` +
`Hier findest du Unterstützung für alle verfügbaren Funktionen:\n\n` +
`🔹 /help - Zeigt diese Hilfe-Nachricht an\n` +
`🔗 /links - Zeigt eine Liste der gespeicherten Links an\n` +
`❓ /faq - Zeigt die FAQ an\n` +
`📝 /create_ticket - Reiche ein Support-Ticket ein\n` +
`👥 /admin - Zeigt eine Liste der Admins und deren Status\n` +
`💬 /chat - Fordere einen Chat mit einem Admin an\n` +
` /info - Zeigt Informationen über den Bot an\n` +
`⭐ /rate - Bewerte unseren Support\n` +
`📅 /termin - Mache einen Chat-Termin mit einem Admin\n` +
`🚨 /escalation - Melde ein Problem an alle Admins\n` +
`📜 /terms - Zeigt die Nutzungsbedingungen des Bots an\n` +
`🗑 /cancel_termin - Storniert einen Chat-Termin\n` +
`🔗 /einladung - Erstelle einen Einladungslink für die Gruppe\n` +
`🔗 /einladen - Erstelle einen Einladungslink für die Gruppe`
bot.sendMessage(chatId, helpText, { parse_mode: 'Markdown' });
}
// Optionale Bestätigung der Callback-Query
bot.answerCallbackQuery(query.id);
});
// Speichert den aktuellen Status des Benutzers für die Nachrichteneinstellung
let userStatus = {};
// Befehl zum Starten der Nachrichtplanung
bot.onText(/\/schedule_message/, (msg) => {
const chatId = msg.chat.id;
const adminId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(adminId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Überprüfen, ob der Benutzer ein autorisierter Admin ist
if (!admins[adminId]) {
bot.sendMessage(chatId, '❌ Du bist kein autorisierter Admin und hast keinen Zugriff auf diesen Befehl.');
return;
}
userStatus[adminId] = { step: 'waiting_for_date', chatId };
bot.sendMessage(chatId, '📅 Gib das Datum und die Uhrzeit für die geplante Nachricht im Format YYYY-MM-DD HH:MM an:');
});
// Verarbeitet die Eingabe des Datums und der Uhrzeit
bot.on('message', (msg) => {
const adminId = msg.from.id.toString();
const chatId = msg.chat.id;
const text = msg.text.trim();
if (userStatus[adminId]) {
const status = userStatus[adminId];
if (status.step === 'waiting_for_date') {
const [date, time] = text.split(' ');
const scheduledDate = new Date(`${date}T${time}:00`);
if (!isNaN(scheduledDate.getTime()) && scheduledDate > new Date()) {
status.date = scheduledDate;
status.step = 'waiting_for_message';
bot.sendMessage(chatId, '📝 Gib die Nachricht ein, die du planen möchtest:');
} else {
bot.sendMessage(chatId, '❗ Ungültiges Datum oder Uhrzeit. Bitte gib ein gültiges Datum und eine gültige Uhrzeit im Format YYYY-MM-DD HH:MM an.');
}
} else if (status.step === 'waiting_for_message') {
const message = text;
const scheduledDate = status.date;
scheduledMessages.push({
adminId,
message,
dateTime: scheduledDate.toISOString()
});
saveScheduledMessages();
bot.sendMessage(chatId, `✅ Deine Nachricht wurde für ${formatDate(scheduledDate)} geplant.`);
delete userStatus[adminId]; // Status zurücksetzen
}
}
});
// Funktion zum Formatieren des Datums
function formatDate(date) {
const options = { weekday: 'short', day: '2-digit', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false };
return date.toLocaleDateString('de-DE', options).replace(',', '');
}
// Verarbeite geplante Nachrichten
cron.schedule('* * * * *', () => { // Jede Minute überprüfen
const now = new Date().toISOString();
scheduledMessages.forEach((scheduledMessage, index) => {
if (new Date(scheduledMessage.dateTime) <= new Date()) {
users.forEach(user => {
bot.sendMessage(user.id, scheduledMessage.message);
});
scheduledMessages.splice(index, 1); // Entferne gesendete Nachricht
saveScheduledMessages();
}
});
});
// Verarbeitet neue Benutzerinteraktionen (fängt alle neuen Benutzer auf)
bot.on('new_chat_members', (msg) => {
const chatId = msg.chat.id;
const newMembers = msg.new_chat_members;
newMembers.forEach((member) => {
const userId = member.id.toString();
const userName = member.username || `${member.first_name} ${member.last_name}`;
// Überprüfen, ob der Benutzer bereits gespeichert ist
if (!users.find(user => user.id === userId)) {
users.push({
id: userId,
name: userName
});
saveUsers();
}
});
});
// Funktion zum Senden der Nutzungsbedingungen
const sendTerms = (chatId) => {
const termsText = `📜 *Nutzungsbedingungen*\n\n` +
`Hier sind die Nutzungsbedingungen für die Nutzung unseres Bots:\n\n` +
`1. Du verpflichtest dich, die Dienste des Bots gemäß den geltenden Gesetzen zu nutzen.\n` +
`2. Missbrauch des Bots, einschließlich Spam oder andere unangemessene Aktivitäten, ist untersagt.\n` +
`3. Der Bot speichert keine persönlichen Daten ohne deine Zustimmung.\n` +
`4. Bei Fragen oder Problemen wende dich bitte an unseren Support.\n\n` +
`Bitte halte dich an diese Bedingungen, um einen reibungslosen Service zu gewährleisten.`;
bot.sendMessage(chatId, termsText, { parse_mode: 'Markdown' });
};
// Reaktion auf den /terms-Befehl
bot.onText(/\/terms/, (msg) => {
const chatId = msg.chat.id;
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Sende die Nutzungsbedingungen an den Benutzer
sendTerms(chatId);
});
// Funktion zum Überprüfen, ob ein Benutzer ein Admin ist
const isAdmin = (userId) => {
return admins[userId.toString()] !== undefined;
};
// Speichert den aktuellen Status des Admins für den /pin_message-Befehl
let pinMessageStatus = {};
// Reaktion auf den /pin_message-Befehl
bot.onText(/\/pin_message/, (msg) => {
const chatId = msg.chat.id;
const adminId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(adminId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Überprüfen, ob der Benutzer ein Admin ist
if (!isAdmin(adminId)) {
bot.sendMessage(chatId, '❌ Du bist kein autorisierter Admin und hast keinen Zugriff auf diesen Befehl.');
return;
}
// Status auf "wartet auf Nachricht" setzen
pinMessageStatus[adminId] = { chatId, step: 'waiting_for_message' };
bot.sendMessage(chatId, '📝 Bitte gib die Nachricht ein, die du anheften möchtest:');
});
// Verarbeitet die Nachrichteneingabe
bot.on('message', (msg) => {
const adminId = msg.from.id.toString();
const chatId = msg.chat.id;
const text = msg.text.trim();
// Überprüfen, ob der Admin eine Nachricht senden soll
if (pinMessageStatus[adminId] && pinMessageStatus[adminId].chatId === chatId) {
if (pinMessageStatus[adminId].step === 'waiting_for_message') {
// Nachricht senden und anheften
bot.sendMessage(chatId, text, { reply_markup: { remove_keyboard: true } })
.then((sentMessage) => {
bot.pinChatMessage(chatId, sentMessage.message_id)
.then(() => {
bot.sendMessage(chatId, '✅ Die Nachricht wurde erfolgreich angeheftet.');
})
.catch(error => bot.sendMessage(chatId, `❗ Fehler beim Anheften der Nachricht: ${error.message}`));
})
.catch(error => bot.sendMessage(chatId, `❗ Fehler beim Senden der Nachricht: ${error.message}`));
// Status zurücksetzen
delete pinMessageStatus[adminId];
}
}
});
const spammedUsersFile = path.join(dataDir, 'spammed_users.json');
const usersFile = path.join(dataDir, 'users.json'); // Pfad zur users.json
// Prüfe, ob der Ordner und die Dateien existieren, und erstelle sie, falls nicht
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir);
}
if (!fs.existsSync(spammedUsersFile)) {
fs.writeFileSync(spammedUsersFile, JSON.stringify({}), 'utf8');
}
if (!fs.existsSync(usersFile)) {
fs.writeFileSync(usersFile, JSON.stringify([]), 'utf8'); // Leere Liste, wenn users.json nicht existiert
}
// Funktion zum Laden der gesperrten Benutzer aus der Datei
const loadSpammedUsers = () => {
const data = fs.readFileSync(spammedUsersFile, 'utf8');
return JSON.parse(data);
};
// Funktion zum Speichern der gesperrten Benutzer in der Datei
const saveSpammedUsers = (spammedUsers) => {
fs.writeFileSync(spammedUsersFile, JSON.stringify(spammedUsers, null, 2), 'utf8');
};
// Funktion zum Laden der Benutzer aus der users.json-Datei
const loadUsers = () => {
const data = fs.readFileSync(usersFile, 'utf8');
return JSON.parse(data);
};
let spammedUsers = loadSpammedUsers(); // Gesperrte Benutzer laden
// Liste der verfügbaren Sperrzeiten
const timeOptions = {
'30 Minuten': 30 * 60 * 1000,
'1 Stunde': 60 * 60 * 1000,
'2 Stunden': 2 * 60 * 60 * 1000,
'3 Stunden': 3 * 60 * 60 * 1000,
'4 Stunden': 4 * 60 * 60 * 1000,
'5 Stunden': 5 * 60 * 60 * 1000,
'24 Stunden': 24 * 60 * 60 * 1000,
'Permanent': 'permanent'
};
let spamStep = {}; // Speichert den Fortschritt des /spam Befehls
// Funktion, um zu überprüfen, ob ein Benutzer gesperrt ist
const isUserSpammed = (userId) => {
if (spammedUsers[userId]) {
const { expiry } = spammedUsers[userId];
if (expiry === 'permanent' || expiry > Date.now()) {
return true;
} else {
// Sperre ist abgelaufen, Benutzer entsperren
delete spammedUsers[userId];
saveSpammedUsers(spammedUsers);
return false;
}
}
return false;
};
// Funktion, um eine lesbare Uhrzeit zu generieren
const formatTime = (timestamp) => {
const date = new Date(timestamp);
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const year = date.getFullYear();
return `${hours}:${minutes} Uhr, am ${day}.${month}.${year}`;
};
// Reaktion auf den /spam-Befehl (Start)
bot.onText(/\/spam/, (msg) => {
const chatId = msg.chat.id;
const adminId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(adminId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Überprüfen, ob der Benutzer ein Admin ist
if (!isAdmin(adminId)) {
bot.sendMessage(chatId, '❌ Du bist kein autorisierter Admin und hast keinen Zugriff auf diesen Befehl.');
return;
}
// Frage nach dem Benutzernamen
spamStep[chatId] = { step: 'askUser' }; // Setzt den nächsten Schritt
bot.sendMessage(chatId, 'Bitte gib den Benutzernamen ein (@Name):');
});
// Antwort auf die Eingabe des Benutzernamens
bot.on('message', (msg) => {
const chatId = msg.chat.id;
if (spamStep[chatId]) {
const currentStep = spamStep[chatId].step;
if (currentStep === 'askUser') {
const username = msg.text.trim().replace('@', ''); // Entferne das @-Zeichen
// Benutzer in der users.json anhand des Namens finden
const targetUser = users.find(user => user.name.toLowerCase() === username.toLowerCase());
if (!targetUser) {
bot.sendMessage(chatId, `❌ Benutzer ${username} nicht gefunden. Bitte erneut versuchen.`);
return;
}
spamStep[chatId].targetUser = targetUser;
spamStep[chatId].step = 'askTime'; // Nächster Schritt
bot.sendMessage(chatId, 'Wähle die Sperrdauer aus:', {
reply_markup: {
inline_keyboard: [
[{ text: '30 Minuten', callback_data: '30 Minuten' }],
[{ text: '1 Stunde', callback_data: '1 Stunde' }],
[{ text: '2 Stunden', callback_data: '2 Stunden' }],
[{ text: '3 Stunden', callback_data: '3 Stunden' }],
[{ text: '4 Stunden', callback_data: '4 Stunden' }],
[{ text: '5 Stunden', callback_data: '5 Stunden' }],
[{ text: '24 Stunden', callback_data: '24 Stunden' }],
[{ text: 'Permanent', callback_data: 'Permanent' }]
]
}
});
}
}
});
// Reaktion auf die Zeit-Auswahl
bot.on('callback_query', (query) => {
const chatId = query.message.chat.id;
const selectedTime = query.data;
if (spamStep[chatId] && spamStep[chatId].step === 'askTime') {
const targetUser = spamStep[chatId].targetUser;
if (!timeOptions[selectedTime]) {
bot.sendMessage(chatId, '❌ Ungültige Zeitangabe.');
return;
}
const timeDuration = timeOptions[selectedTime];
const targetUserId = targetUser.id;
// Benutzer sperren
const expiryTime = timeDuration === 'permanent' ? 'permanent' : Date.now() + timeDuration;
spammedUsers[targetUserId] = { expiry: expiryTime };
saveSpammedUsers(spammedUsers); // Gesperrte Benutzer speichern
let successMessage;
if (timeDuration === 'permanent') {
successMessage = `✅ Benutzer @${targetUser.name} wurde dauerhaft gesperrt.`;
} else {
const formattedTime = formatTime(expiryTime);
successMessage = `✅ Benutzer @${targetUser.name} wurde bis ${formattedTime} gesperrt.`;
}
bot.sendMessage(chatId, successMessage);
// Bereinige den Schritt
delete spamStep[chatId];
}
});
// Reaktion auf den /unspam-Befehl (Start)
bot.onText(/\/unspam/, (msg) => {
const chatId = msg.chat.id;
const adminId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(adminId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
// Überprüfen, ob der Benutzer ein Admin ist
if (!isAdmin(adminId)) {
bot.sendMessage(chatId, '❌ Du bist kein autorisierter Admin und hast keinen Zugriff auf diesen Befehl.');
return;
}
// Frage nach dem Benutzernamen
bot.sendMessage(chatId, 'Bitte gib den Benutzernamen des zu entsperrenden Benutzers ein (@Name):');
// Speichert den Schritt zur Entsperrung
spamStep[chatId] = { step: 'askUserToUnspam' };
});
// Reaktion auf die Eingabe des Benutzernamens für die Entsperrung
bot.on('message', (msg) => {
const chatId = msg.chat.id;
if (spamStep[chatId] && spamStep[chatId].step === 'askUserToUnspam') {
const username = msg.text.trim().replace('@', ''); // Entferne das @-Zeichen
// Benutzer in der users.json anhand des Namens finden
const users = loadUsers(); // Lädt alle Benutzer
const targetUser = users.find(user => user.name.toLowerCase() === username.toLowerCase());
if (!targetUser) {
bot.sendMessage(chatId, `❌ Benutzer ${username} nicht gefunden. Bitte erneut versuchen.`);
return;
}
const targetUserId = targetUser.id;
// Überprüfen, ob der Benutzer gesperrt ist
if (!isUserSpammed(targetUserId)) {
bot.sendMessage(chatId, `❌ Benutzer @${targetUser.name} ist nicht gesperrt.`);
} else {
// Benutzer entsperren
delete spammedUsers[targetUserId];
saveSpammedUsers(spammedUsers); // Gesperrte Benutzer aktualisieren
bot.sendMessage(chatId, `✅ Benutzer @${targetUser.name} wurde erfolgreich entsperrt.`);
}
// Bereinige den Schritt
delete spamStep[chatId];
}
});
// Funktion zum Senden der Nachricht an alle Admins
const notifyAdmins = (message) => {
if (Array.isArray(admins)) {
admins.forEach(adminId => {
bot.sendMessage(adminId, message).catch(error => {
console.error(`Fehler beim Senden der Nachricht an Admin ${adminId}:`, error);
});
});
} else {
console.error('Admins-Variable ist kein Array:', admins);
}
};
// Funktion zum Senden der Nachricht an alle Admins
const notifyAllAdmins = (message) => {
Object.keys(admins).forEach(adminId => {
bot.sendMessage(adminId, `🚨 *WICHTIG:* Ein Benutzer hat ein Problem gemeldet:\n\n${message}`, { parse_mode: 'Markdown' });
});
};
// Reaktion auf den /escalation-Befehl
bot.onText(/\/escalation/, (msg) => {
const chatId = msg.chat.id;
const userId = msg.from.id.toString();
// Überprüfen, ob der Befehl während des Wartungsmodus ausgeführt werden kann
if (!canExecuteCommand(userId)) {
bot.sendMessage(chatId, '🔧 Der Bot befindet sich derzeit im Wartungsmodus. Bitte versuche es später erneut.');
return;
}
if (isUserSpammed(userId)) {
bot.sendMessage(chatId, '❌ Du wurdest gesperrt und kannst diesen Befehl nicht verwenden.');
return;
}
// Frage nach dem Problem
bot.sendMessage(chatId, 'Bitte beschreibe dein Problem:');
spamStep[chatId] = { step: 'askProblem' };
});
// Antwort auf die Eingabe des Problems
bot.on('message', (msg) => {
const chatId = msg.chat.id;
if (spamStep[chatId]) {
const currentStep = spamStep[chatId].step;
if (currentStep === 'askProblem') {
const problemDescription = msg.text.trim();
// Nachricht an alle Admins senden
notifyAllAdmins(problemDescription);
bot.sendMessage(chatId, '✅ Dein Problem wurde an alle Admins weitergeleitet.');
// Bereinige den Schritt
delete spamStep[chatId];
}
}
});
console.log('Support-Bot mit Statusprüfung und Benachrichtigungen läuft...');