support_bot_2024/bot.js

2274 lines
91 KiB
JavaScript
Raw Normal View History

2024-09-14 18:49:49 +00:00
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...');