2274 lines
91 KiB
JavaScript
2274 lines
91 KiB
JavaScript
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...'); |