2024-01-22 21:58:42 +00:00
const TelegramBot = require ( 'node-telegram-bot-api' ) ;
const ping = require ( 'ping' ) ;
const os = require ( 'os' ) ;
const fs = require ( 'fs' ) ;
const yaml = require ( 'js-yaml' ) ;
require ( 'dotenv' ) . config ( ) ;
const serverNotificationState = { } ;
const logDirectory = 'logs/' ;
let usersAddingServer = { } ;
let isShowingDetails = false ;
const botStartTime = new Date ( ) ;
2024-01-25 19:09:20 +00:00
const { promisify } = require ( 'util' ) ;
const exec = promisify ( require ( 'child_process' ) . exec ) ;
2024-01-22 21:58:42 +00:00
const developerChatIds = process . env . DEVELOPER _CHAT _IDS . split ( ',' ) ;
const token = process . env . TELEGRAM _BOT _TOKEN ;
const tgId = process . env . TG _ID ;
const bot = new TelegramBot ( token , { polling : true } ) ;
2024-01-22 22:06:44 +00:00
2024-01-22 21:58:42 +00:00
if ( ! tgId ) {
2024-01-25 19:09:20 +00:00
const errorMessage = 'Fehler: Die ID wurde geändert. Der Bot wird nicht gestartet.' ;
2024-01-22 21:58:42 +00:00
console . error ( errorMessage ) ;
sendErrorNotification ( developerChatIds [ 0 ] , errorMessage ) ;
process . exit ( 1 ) ;
}
2024-01-22 22:06:44 +00:00
2024-01-22 21:58:42 +00:00
if ( tgId !== '5507179337' ) {
const errorMessage = 'Fehler: Der Bot wird nicht gestartet.' ;
console . error ( errorMessage ) ;
sendErrorNotification ( developerChatIds [ 0 ] , errorMessage ) ;
process . exit ( 1 ) ;
}
2024-01-22 22:06:44 +00:00
2024-01-22 21:58:42 +00:00
function isDeveloperChat ( chatId ) {
return developerChatIds . includes ( chatId . toString ( ) ) ;
}
const activeUserIds = new Set ( ) ;
const monitoredServers = [ ] ;
// Lese die Konfigurationsdatei
try {
const configContent = fs . readFileSync ( 'configurations.yml' , 'utf8' ) ;
const config = yaml . load ( configContent ) ;
// Überprüfe, ob es eine Server-Konfiguration gibt
if ( config ) {
// Füge die überwachten Server zur Liste hinzu
Object . values ( config ) . forEach ( serverList => {
monitoredServers . push ( ... serverList ) ;
} ) ;
}
} catch ( error ) {
console . error ( 'Fehler beim Lesen der Konfigurationsdatei:' , error . message ) ;
}
// Event-Handler für den Befehl /stats
bot . onText ( /\/stats/ , ( msg ) => {
const chatId = msg . chat . id ;
if ( isDeveloperChat ( chatId ) ) {
if ( ! activeUserIds . has ( chatId ) ) {
activeUserIds . add ( chatId ) ;
}
try {
// Gesamtanzahl der überwachten Server
const serverCount = getServerCount ( ) ; // Funktion, die die Anzahl der überwachten Server zurückgibt
// Anzahl der Fehler im error.log
const errorCount = getErrorCount ( ) ; // Funktion, die die Anzahl der Fehler im error.log zurückgibt
// Bot Uptime in Stunden
const uptime = getBotUptime ( ) ; // Funktion, die die Bot-Uptime in Stunden zurückgibt
// Anzahl der Benutzer, die diesen Bot nutzen
const totalUserCount = getTotalUserCount ( ) ;
// Version des Telegram Bot API-Pakets
const telegramBotApiVersion = getTelegramBotApiVersion ( ) ;
2024-01-25 19:09:20 +00:00
// Nachricht mit den Statistiken senden
2024-01-22 21:58:42 +00:00
bot . sendMessage ( chatId , `
2024-01-22 22:06:44 +00:00
* Statistik *
Gesamtanzahl der überwachten Server : $ { serverCount }
Anzahl der Fehler im error . log : $ { errorCount }
Bot Uptime : $ { uptime . days } Tage , $ { uptime . hours } Stunden und $ { uptime . minutes } Minuten
Anzahl der Benutzer : $ { totalUserCount }
Telegram Bot API - Version : $ { telegramBotApiVersion }
2024-01-22 21:58:42 +00:00
` );
} catch ( error ) {
console . error ( 'Fehler beim Abrufen der Statistiken:' , error . message ) ;
bot . sendMessage ( chatId , 'Fehler beim Abrufen der Statistiken. Bitte versuche es später erneut.' ) ;
}
} else {
bot . sendMessage ( chatId , 'Dieser Befehl ist nur für Entwickler' ) ;
}
} ) ;
// Funktion, um die Anzahl der überwachten Server zu erhalten
function getServerCount ( ) {
return monitoredServers . length ;
}
// Funktion, um die Anzahl der Fehler im error.log zu erhalten
function getErrorCount ( ) {
try {
const errorLogContent = fs . readFileSync ( 'error.log' , 'utf8' ) ;
const errorLines = errorLogContent . split ( '\n' ) ;
return errorLines . length ;
} catch ( error ) {
console . error ( 'Fehler beim Lesen der error.log-Datei:' , error . message ) ;
return 'Fehler beim Lesen der Log-Datei' ;
}
}
// Funktion, um die Bot-Uptime in Tagen, Stunden und Minuten zu erhalten
function getBotUptime ( ) {
const uptimeMilliseconds = new Date ( ) - botStartTime ; // botStartTime sollte irgendwo definiert und beim Bot-Start festgelegt sein
// Berechne Tage, Stunden und Minuten
const days = Math . floor ( uptimeMilliseconds / ( 1000 * 60 * 60 * 24 ) ) ;
const hours = Math . floor ( ( uptimeMilliseconds % ( 1000 * 60 * 60 * 24 ) ) / ( 1000 * 60 * 60 ) ) ;
const minutes = Math . floor ( ( uptimeMilliseconds % ( 1000 * 60 * 60 ) ) / ( 1000 * 60 ) ) ;
return { days , hours , minutes } ;
}
// Pfad zur user_information.yml
const userInformationPath = 'user_information.yml' ;
// Funktion, um die Gesamtanzahl der Benutzer-IDs in der user_information.yml zu erhalten
function getTotalUserCount ( ) {
try {
// Lese den Inhalt der Datei
const userInformationContent = fs . readFileSync ( userInformationPath , 'utf8' ) ;
// Parsen des YAML-Inhalts
const userInformation = yaml . load ( userInformationContent ) ;
// Prüfe, ob die Benutzerinformation ein Objekt ist
if ( typeof userInformation === 'object' && userInformation !== null ) {
// Zähle die Gesamtanzahl der Benutzer-IDs
const totalUserCount = Object . keys ( userInformation ) . length ;
return ` ${ totalUserCount } ` ;
} else {
console . error ( 'Ungültiges Format der Benutzerinformation.' ) ;
return 'Fehler bei der Verarbeitung der Benutzerinformation' ;
}
} catch ( error ) {
console . error ( 'Fehler beim Lesen der Benutzerinformation:' , error . message ) ;
return 'Fehler beim Lesen der Benutzerinformation' ;
}
}
// Beispielaufruf
console . log ( getTotalUserCount ( ) ) ;
// Funktion, um die Version des Telegram Bot API-Pakets zu erhalten
function getTelegramBotApiVersion ( ) {
try {
// Lese den Inhalt der package.json-Datei
const packageJsonContent = fs . readFileSync ( 'package.json' , 'utf8' ) ;
// Parsen des JSON-Inhalts
const packageJson = JSON . parse ( packageJsonContent ) ;
// Gib die Version des Telegram Bot API-Pakets zurück
return packageJson . dependencies [ 'node-telegram-bot-api' ] ;
} catch ( error ) {
console . error ( 'Fehler beim Lesen der package.json-Datei:' , error . message ) ;
return 'Fehler beim Lesen der package.json-Datei' ;
}
}
// Funktion zum Speichern von Benutzerinformationen
function saveUserInformation ( userId , username ) {
try {
let userInformation = { } ;
if ( fs . existsSync ( userInformationPath ) ) {
const data = fs . readFileSync ( userInformationPath , 'utf8' ) ;
userInformation = yaml . load ( data ) || { } ;
}
userInformation [ ` user ${ userId } ` ] = {
id : userId ,
name : username
} ;
const yamlString = yaml . dump ( userInformation ) ;
fs . writeFileSync ( userInformationPath , yamlString , 'utf8' ) ;
} catch ( error ) {
console . error ( 'Fehler beim Speichern von Benutzerinformationen:' , error . message ) ;
}
}
// Funktion zum Initialisieren beim Start des Bots
function initialize ( ) {
// Stelle sicher, dass die Datei existiert oder erstelle sie
const userInformationPath = 'user_information.yml' ;
if ( ! fs . existsSync ( userInformationPath ) ) {
fs . writeFileSync ( userInformationPath , '' , 'utf8' ) ;
}
}
// Rufe die Initialisierungsfunktion auf
initialize ( ) ;
bot . onText ( /\/user_id/ , ( msg ) => {
const chatId = msg . chat . id ;
// Überprüfen, ob der Benutzer Entwickler ist
if ( ! isDeveloperChat ( chatId ) ) {
bot . sendMessage ( chatId , 'Dieser Befehl ist nur für Entwickler.' ) ;
return ;
}
try {
// Lade Benutzerinformationen aus der user_information.yml-Datei
const userInformation = loadUserInformation ( ) ;
// Überprüfen, ob Benutzerinformationen vorhanden sind
if ( Object . keys ( userInformation ) . length === 0 ) {
bot . sendMessage ( chatId , 'Keine Benutzerinformationen gefunden.' ) ;
return ;
}
// Konvertiere Benutzerinformationen in eine Liste von Benutzernamen und IDs
const userList = Object . keys ( userInformation ) . map ( key => {
const user = userInformation [ key ] ;
return ` ${ user . name } - ${ user . id } ` ;
} ) ;
// Sende die Liste der Benutzerinformationen
bot . sendMessage ( chatId , 'Benutzerinformationen:\n' + userList . join ( '\n' ) ) ;
} catch ( error ) {
console . error ( 'Fehler beim Abrufen von Benutzerinformationen:' , error . message ) ;
bot . sendMessage ( chatId , 'Fehler beim Abrufen von Benutzerinformationen.' ) ;
}
} ) ;
function loadUserInformation ( ) {
try {
const userInformationPath = './user_information.yml' ;
const data = fs . readFileSync ( userInformationPath , 'utf8' ) ;
return yaml . load ( data ) || { } ;
} catch ( error ) {
console . error ( 'Fehler beim Laden der Benutzerinformationen:' , error . message ) ;
return { } ;
}
}
// Event-Handler für das Hinzufügen und Entfernen von Benutzern
bot . on ( 'message' , ( msg ) => {
const chatId = msg . chat . id ;
const userId = msg . from . id ;
// Überprüfe, ob die Benutzer-ID bereits gespeichert wurde
if ( ! activeUserIds . has ( chatId ) ) {
activeUserIds . add ( chatId ) ;
// Speichere Benutzerinformationen
saveUserInformation ( userId . toString ( ) , ` @ ${ msg . from . username } ` ) ;
}
if ( ! activeUserIds . has ( chatId ) ) {
activeUserIds . add ( chatId ) ;
}
} ) ;
bot . on ( 'polling_error' , ( error ) => {
console . error ( ` Polling error: ${ error . message } ` ) ;
} ) ;
function escapeMarkdown ( text ) {
return text . replace ( /[_*[\]()~`>#+-=|{}.!]/g , '\\$&' ) ;
}
function getBotInfo ( ) {
const botInfo = {
name : 'Server Monitoring' ,
version : '1.0.0' ,
author : 'M_Viper' ,
license : 'MIT' ,
} ;
const infoMessage = `
Bot Information :
- * Name : * $ { escapeMarkdown ( botInfo . name ) }
- * Version : * $ { escapeMarkdown ( botInfo . version ) }
- * Author : * $ { escapeMarkdown ( botInfo . author ) }
- * License : * $ { escapeMarkdown ( botInfo . license ) }
Bot wurde am 22.01 . 2024 erstellt .
` ;
console . log ( infoMessage ) ;
return infoMessage ;
}
bot . onText ( /\/user_id (.+)/ , ( msg , match ) => {
const chatId = msg . chat . id ;
// Überprüfen, ob der Benutzer Entwickler ist
if ( ! isDeveloperChat ( chatId ) ) {
bot . sendMessage ( chatId , 'Dieser Befehl ist nur für Entwickler.' ) ;
return ;
}
const targetUsername = match [ 1 ] ;
// Überprüfen, ob der Benutzer existiert
bot . getChat ( targetUsername )
. then ( user => {
const userId = user . id ;
bot . sendMessage ( chatId , ` Die ID des Benutzers @ ${ targetUsername } ist: ${ userId } ` ) ;
} )
. catch ( error => {
bot . sendMessage ( chatId , ` Der Benutzer @ ${ targetUsername } existiert nicht. ` ) ;
} ) ;
} ) ;
bot . onText ( /\/user_delete (.+)/ , ( msg , match ) => {
const chatId = msg . chat . id ;
// Überprüfen, ob der Benutzer Entwickler ist
if ( ! isDeveloperChat ( chatId ) ) {
bot . sendMessage ( chatId , 'Dieser Befehl ist nur für Entwickler.' ) ;
return ;
}
const targetUserId = match [ 1 ] ;
// Überprüfen, ob der Benutzer existiert und Server hinzugefügt hat
if ( ! targetUserId || ! userServerConfigurations [ targetUserId ] ) {
bot . sendMessage ( chatId , ` Der Benutzer mit ID ${ targetUserId } existiert nicht oder hat keine Server hinzugefügt. ` ) ;
return ;
}
// Lösche alle Server des Zielbenutzers
delete userServerConfigurations [ targetUserId ] ;
saveConfigurations ( userServerConfigurations ) ;
bot . sendMessage ( chatId , ` Alle Server des Benutzers mit ID ${ targetUserId } wurden gelöscht. ` ) ;
} ) ;
bot . onText ( /\/info/ , ( msg ) => {
const chatId = msg . chat . id ;
const infoMessage = getBotInfo ( ) ;
const options = {
parse _mode : 'Markdown' ,
} ;
bot . sendMessage ( chatId , infoMessage , options ) ;
} ) ;
2024-01-25 19:09:20 +00:00
// Event-Handler für den Befehl /log_clear
bot . onText ( /\/error_clear/ , ( msg ) => {
const chatId = msg . chat . id ;
// Überprüfen, ob die Chat-ID des Benutzers in den Developer-Chat-IDs enthalten ist
if ( ! isDeveloperChat ( chatId ) ) {
bot . sendMessage ( chatId , 'Dieser Befehl ist nur für Entwickler' ) ;
return ;
}
try {
const logFileName = 'error.log' ;
const logFilePath = logFileName ; // Pfade im gleichen Verzeichnis
// Lösche den Inhalt des Logfiles
fs . writeFileSync ( logFilePath , '' ) ;
bot . sendMessage ( chatId , 'Der Log-Inhalt wurde erfolgreich gelöscht.' ) ;
} catch ( error ) {
console . error ( ` Fehler beim Löschen des Log-Inhalts: ${ error . message } ` ) ;
bot . sendMessage ( chatId , 'Fehler beim Löschen des Log-Inhalts.' ) ;
}
} ) ;
// Event-Handler für den Befehl /error_send
bot . onText ( /\/error_send/ , ( msg ) => {
const chatId = msg . chat . id ;
// Überprüfen, ob die Chat-ID des Benutzers in den Developer-Chat-IDs enthalten ist
if ( ! isDeveloperChat ( chatId ) ) {
bot . sendMessage ( chatId , 'Dieser Befehl ist nur für Entwickler' ) ;
return ;
}
try {
const logFileName = 'error.log' ;
const logFilePath = logFileName ; // Pfade im gleichen Verzeichnis
// Überprüfe, ob die Logdatei existiert
if ( fs . existsSync ( logFilePath ) ) {
// Sende die Logdatei als Dokument an den Entwickler
bot . sendDocument ( chatId , logFilePath ) ;
} else {
bot . sendMessage ( chatId , ` Die Logdatei ${ logFileName } existiert nicht. ` ) ;
}
} catch ( error ) {
console . error ( ` Fehler beim Senden der Logdatei: ${ error . message } ` ) ;
bot . sendMessage ( chatId , 'Fehler beim Senden der Logdatei.' ) ;
}
} ) ;
2024-01-22 21:58:42 +00:00
// Füge diese Funktion hinzu, um Fehlerbenachrichtigungen und das Protokoll zu handhaben
bot . on ( 'polling_error' , ( error ) => {
console . error ( ` Polling error: ${ error . message } ` ) ;
2024-01-25 19:09:20 +00:00
sendErrorNotification ( developerChatIds , ` Polling error: ${ error . message } ` ) ;
2024-01-22 21:58:42 +00:00
} ) ;
process . on ( 'unhandledRejection' , ( reason , promise ) => {
console . error ( 'Unhandled rejection:' , reason ) ;
2024-01-25 19:09:20 +00:00
sendErrorNotification ( developerChatIds , ` Unhandled rejection: ${ reason } ` ) ;
2024-01-22 21:58:42 +00:00
} ) ;
process . on ( 'uncaughtException' , ( error ) => {
console . error ( 'Uncaught exception:' , error ) ;
2024-01-25 19:09:20 +00:00
sendErrorNotification ( developerChatIds , ` Uncaught exception: ${ error } ` ) ;
2024-01-22 21:58:42 +00:00
} ) ;
// Füge diese Funktion hinzu, um Fehlerbenachrichtigungen und das Protokoll zu handhaben
bot . on ( 'polling_error' , ( error ) => {
console . error ( ` Polling error: ${ error . message } ` ) ;
2024-01-25 19:09:20 +00:00
sendErrorNotification ( developerChatIds , ` Polling error: ${ error . message } ` ) ;
2024-01-22 21:58:42 +00:00
} ) ;
process . on ( 'unhandledRejection' , ( reason , promise ) => {
console . error ( 'Unhandled rejection:' , reason ) ;
2024-01-25 19:09:20 +00:00
sendErrorNotification ( developerChatIds , ` Unhandled rejection: ${ reason } ` ) ;
2024-01-22 21:58:42 +00:00
} ) ;
process . on ( 'uncaughtException' , ( error ) => {
console . error ( 'Uncaught exception:' , error ) ;
2024-01-25 19:09:20 +00:00
sendErrorNotification ( developerChatIds , ` Uncaught exception: ${ error } ` ) ;
2024-01-22 21:58:42 +00:00
} ) ;
// Funktion zum Senden von Fehlerbenachrichtigungen und Erstellen des Fehlerprotokolls
function sendErrorNotification ( chatId , errorMessage ) {
const errorNotification = ` ❗️ *Fehler im Bot:* \n \n \` \` \` ${ errorMessage } \` \` \` ` ;
bot . sendMessage ( chatId , errorNotification , { parse _mode : 'Markdown' } ) ;
// Fehlerprotokoll erstellen
const logFilePath = 'error.log' ;
const formattedDate = new Date ( ) . toISOString ( ) . replace ( /T/ , ' ' ) . replace ( /\..+/ , '' ) ;
const logEntry = ` [ ${ formattedDate } ] ${ errorMessage } \n ` ;
fs . appendFile ( logFilePath , logEntry , ( err ) => {
if ( err ) {
console . error ( ` Fehler beim Schreiben in das Fehlerprotokoll: ${ err . message } ` ) ;
}
} ) ;
}
const errorLogPath = 'error.log' ;
fs . openSync ( errorLogPath , 'a' ) ;
bot . onText ( /\/error/ , ( msg ) => {
const chatId = msg . chat . id ;
// Überprüfen, ob die Chat-ID des Benutzers in den Developer-Chat-IDs enthalten ist
if ( ! isDeveloperChat ( chatId ) ) {
bot . sendMessage ( chatId , 'Dieser Befehl ist nur für Entwickler' ) ;
return ;
}
try {
const logFileName = 'error.log' ;
const logFilePath = logDirectory + logFileName ;
if ( fs . existsSync ( logFilePath ) ) {
const logContent = fs . readFileSync ( logFilePath , 'utf8' ) ;
const logEntries = logContent . split ( '\n' ) . filter ( entry => entry . trim ( ) !== '' ) . slice ( - 8 ) ;
if ( logEntries . length > 0 ) {
const logMessage = ` Die letzten 8 Fehlerprotokolle: \n \n ${ logEntries . join ( '\n' ) } ` ;
bot . sendMessage ( chatId , logMessage ) ;
} else {
bot . sendMessage ( chatId , 'Keine Fehlerprotokolle vorhanden.' ) ;
}
} else {
bot . sendMessage ( chatId , 'Kein Fehlerprotokoll vorhanden. Es wurden noch keine Fehler protokolliert.' ) ;
}
} catch ( error ) {
console . error ( ` Fehler beim Lesen des Fehlerprotokolls: ${ error . message } ` ) ;
bot . sendMessage ( chatId , 'Fehler beim Lesen des Fehlerprotokolls.' ) ;
}
} ) ;
function createLogEntry ( action , serverName , serverAddress ) {
const currentDate = new Date ( ) ;
const formattedDate = currentDate . toISOString ( ) . replace ( /T/ , ' ' ) . replace ( /\..+/ , '' ) ;
const logEntry = ` [ ${ formattedDate } ] Action: ${ action } , Server Name: ${ serverName } , Server Address: ${ serverAddress } \n ` ;
return logEntry ;
}
function writeToLog ( userId , logEntry ) {
const logFileName = ` user_ ${ userId } _log.txt ` ;
const logFilePath = logDirectory + logFileName ;
try {
if ( ! fs . existsSync ( logDirectory ) ) {
fs . mkdirSync ( logDirectory ) ;
}
// Lese vorhandene Logeinträge
let existingLogEntries = [ ] ;
if ( fs . existsSync ( logFilePath ) ) {
const existingLogContent = fs . readFileSync ( logFilePath , 'utf8' ) ;
existingLogEntries = existingLogContent . split ( '\n' ) . filter ( entry => entry . trim ( ) !== '' ) ;
}
// Füge neuen Eintrag hinzu
existingLogEntries . push ( logEntry ) ;
// Entferne Einträge älter als 7 Tage
const currentTime = Date . now ( ) ;
const sevenDaysAgo = currentTime - 7 * 24 * 60 * 60 * 1000 ;
existingLogEntries = existingLogEntries . filter ( entry => {
const entryTimestamp = new Date ( entry . split ( ']' ) [ 0 ] . replace ( '[' , '' ) ) . getTime ( ) ;
return entryTimestamp >= sevenDaysAgo ;
} ) ;
// Schreibe die neuen Logeinträge
fs . writeFileSync ( logFilePath , existingLogEntries . join ( '\n' ) , 'utf8' ) ;
} catch ( error ) {
console . error ( ` Fehler beim Schreiben des Logs: ${ error . message } ` ) ;
}
}
let userServerConfigurations = loadConfigurations ( ) ;
const chatIds = new Set ( ) ;
function loadConfigurations ( ) {
try {
if ( fs . existsSync ( 'configurations.yml' ) ) {
const data = fs . readFileSync ( 'configurations.yml' , 'utf8' ) ;
return yaml . load ( data ) || { } ;
} else {
saveConfigurations ( { } ) ;
return { } ;
}
} catch ( error ) {
console . error ( 'Fehler beim Laden der Konfigurationen:' , error . message ) ;
return { } ;
}
}
function saveConfigurations ( configurations ) {
try {
const yamlString = yaml . dump ( configurations ) ;
fs . writeFileSync ( 'configurations.yml' , yamlString , 'utf8' ) ;
} catch ( error ) {
console . error ( 'Fehler beim Speichern der Konfigurationen:' , error . message ) ;
}
}
function getCpuUsage ( ) {
return Math . floor ( Math . random ( ) * 101 ) ;
}
function getRamUsage ( ) {
return Math . floor ( Math . random ( ) * 101 ) ;
}
function getNetworkTraffic ( ) {
return Math . floor ( Math . random ( ) * 101 ) ;
}
async function getUptime ( ) {
const uptimeInSeconds = os . uptime ( ) ;
const days = Math . floor ( uptimeInSeconds / ( 24 * 3600 ) ) ;
const hours = Math . floor ( ( uptimeInSeconds % ( 24 * 3600 ) ) / 3600 ) ;
const minutes = Math . floor ( ( uptimeInSeconds % 3600 ) / 60 ) ;
return ` ${ days } Tage, ${ hours } Stunden, ${ minutes } Minuten ` ;
}
async function checkServerStatus ( serverAddress ) {
try {
const result = await ping . promise . probe ( serverAddress ) ;
return result . alive ? 'Online' : 'Offline' ;
} catch ( error ) {
console . error ( ` Fehler beim Überprüfen des Servers ${ serverAddress } : ${ error . message } ` ) ;
return 'Fehler' ;
}
}
const onlineIcon = '✅' ;
const offlineIcon = '❌' ;
const errorIcon = '⚠️' ;
const bannerEmoji = '🚀' ;
function sendStatusMessage ( chatId , serverName , serverStatus ) {
const statusIcon = serverStatus === 'Online' ? onlineIcon : offlineStatus === 'Offline' ? offlineIcon : errorIcon ;
const statusMessage = ` Server ${ bannerEmoji } ${ serverName } ${ bannerEmoji } ist ${ statusIcon } ${ serverStatus } . ` ;
bot . sendMessage ( chatId , statusMessage ) ;
}
2024-01-25 19:09:20 +00:00
// Funktion, um die Bot-Uptime in Tagen, Stunden und Minuten zu erhalten
function getBotUptime ( ) {
const uptimeMilliseconds = new Date ( ) - botStartTime ; // botStartTime sollte irgendwo definiert und beim Bot-Start festgelegt sein
// Berechne Tage, Stunden und Minuten
const days = Math . floor ( uptimeMilliseconds / ( 1000 * 60 * 60 * 24 ) ) ;
const hours = Math . floor ( ( uptimeMilliseconds % ( 1000 * 60 * 60 * 24 ) ) / ( 1000 * 60 * 60 ) ) ;
const minutes = Math . floor ( ( uptimeMilliseconds % ( 1000 * 60 * 60 ) ) / ( 1000 * 60 ) ) ;
return { days , hours , minutes } ;
}
bot . onText ( /\/uptime/ , ( msg ) => {
2024-01-22 21:58:42 +00:00
const chatId = msg . chat . id ;
2024-01-25 19:09:20 +00:00
const { days , hours , minutes } = getBotUptime ( ) ;
bot . sendMessage ( chatId , ` Bot Uptime: ${ days } Tage, ${ hours } Stunden und ${ minutes } Minuten ` ) ;
2024-01-22 21:58:42 +00:00
} ) ;
bot . onText ( /\/start/ , ( msg ) => {
const chatId = msg . chat . id ;
// Überprüfen, ob der Befehl /start_notifications verwendet wurde
if ( ! msg . text . includes ( '/start_notifications' ) ) {
// Senden Sie die Nachricht nur, wenn der Befehl /start_notifications nicht verwendet wurde
bot . sendMessage ( chatId , 'Bot gestartet. Benutze /add_server, /delete_server, /status und /help für die Serververwaltung.' ) ;
}
chatIds . add ( chatId ) ;
} ) ;
bot . onText ( /\/start_notifications/ , ( msg ) => {
const chatId = msg . chat . id ;
startNotifications ( chatId ) ;
} ) ;
function startNotifications ( chatId ) {
const userServers = userServerConfigurations [ chatId ] || [ ] ;
if ( userServers . length === 0 ) {
bot . sendMessage ( chatId , 'Du hast noch keine Server hinzugefügt. Benutze /add_server, um einen Server hinzuzufügen.' ) ;
return ;
}
userServers . forEach ( serverConfig => {
const serverAddress = serverConfig . address ;
serverNotificationState [ serverAddress ] = true ;
} ) ;
bot . sendMessage ( chatId , 'Benachrichtigungen für alle Server wurden aktiviert.' ) ;
}
bot . onText ( /\/stop_notifications/ , ( msg ) => {
const chatId = msg . chat . id ;
stopNotifications ( chatId ) ;
} ) ;
function stopNotifications ( chatId ) {
const userServers = userServerConfigurations [ chatId ] || [ ] ;
if ( userServers . length === 0 ) {
bot . sendMessage ( chatId , 'Du hast noch keine Server hinzugefügt. Benutze /add_server, um einen Server hinzuzufügen.' ) ;
return ;
}
userServers . forEach ( serverConfig => {
const serverAddress = serverConfig . address ;
serverNotificationState [ serverAddress ] = false ;
} ) ;
bot . sendMessage ( chatId , 'Benachrichtigungen für alle Server wurden deaktiviert.' ) ;
}
bot . onText ( /\/status/ , async ( msg ) => {
const chatId = msg . chat . id ;
const userServers = userServerConfigurations [ chatId ] || [ ] ;
if ( userServers . length === 0 ) {
bot . sendMessage ( chatId , 'Du hast noch keine Server hinzugefügt. Benutze /add_server, um einen Server hinzuzufügen.' ) ;
return ;
}
let statusMessage = 'Server Status:\n' ;
for ( const serverConfig of userServers ) {
const serverName = serverConfig . name ;
const serverAddress = serverConfig . address ;
try {
const serverStatus = await checkServerStatus ( serverAddress ) ;
const statusIcon = serverStatus === 'Online' ? '✅' : serverStatus === 'Offline' ? '❌' : '⚠️' ;
const notificationEnabled = serverNotificationState [ serverAddress ] ;
statusMessage += `
* Server : * $ { bannerEmoji } $ { serverName } $ { bannerEmoji } $ { statusIcon } $ { serverStatus }
* Benachrichtigungen : * $ { notificationEnabled ? 'Aktiviert' : 'Deaktiviert' }
\ n ` ;
} catch ( error ) {
console . error ( ` Fehler beim Überprüfen des Servers ${ serverName } : ${ error . message } ` ) ;
statusMessage += ` Fehler beim Überprüfen des Servers ${ bannerEmoji } ${ serverName } ${ bannerEmoji } . ${ errorIcon } \n ` ;
}
}
// Füge hier den Benachrichtigungsstatus direkt unterhalb der Serverliste hinzu
const notificationStatusMessage = 'Benachrichtigungen für alle Server sind ' +
( Object . values ( serverNotificationState ) . every ( ( status ) => status ) ? 'aktiviert.' : 'deaktiviert.' ) ;
statusMessage += ` \n ${ notificationStatusMessage } ` ;
const options = {
parse _mode : 'Markdown' ,
reply _markup : {
inline _keyboard : [
[ {
text : 'Details' ,
callback _data : 'details'
} ]
]
}
} ;
bot . sendMessage ( chatId , statusMessage , options ) ;
} ) ;
bot . onText ( /\/add_server/ , ( msg ) => {
const chatId = msg . chat . id ;
bot . sendMessage ( chatId , 'Füge einen neuen Server hinzu. Sende mir zuerst den Namen des Servers:' ) ;
// Verwendung der Variable usersAddingServer
usersAddingServer [ chatId ] = { name : null , address : null } ;
bot . once ( 'text' , ( serverNameMsg ) => {
usersAddingServer [ chatId ] . name = serverNameMsg . text ;
bot . sendMessage ( chatId , ` Servername ${ bannerEmoji } ${ serverNameMsg . text } ${ bannerEmoji } wurde hinzugefügt. Jetzt sende mir die IP-Adresse des Servers: ` ) ;
bot . once ( 'text' , ( serverAddressMsg ) => {
usersAddingServer [ chatId ] . address = serverAddressMsg . text ;
userServerConfigurations [ chatId ] = userServerConfigurations [ chatId ] || [ ] ;
userServerConfigurations [ chatId ] . push ( usersAddingServer [ chatId ] ) ;
saveConfigurations ( userServerConfigurations ) ;
const logEntry = createLogEntry ( 'Add Server' , usersAddingServer [ chatId ] . name , usersAddingServer [ chatId ] . address ) ;
writeToLog ( chatId , logEntry ) ;
bot . sendMessage ( chatId , ` Server ${ bannerEmoji } ${ usersAddingServer [ chatId ] . name } ${ bannerEmoji } mit Adresse " ${ usersAddingServer [ chatId ] . address } " wurde hinzugefügt. ` ) ;
} ) ;
} ) ;
} ) ;
bot . onText ( /\/delete_server/ , ( msg ) => {
const chatId = msg . chat . id ;
const userServers = userServerConfigurations [ chatId ] || [ ] ;
if ( userServers . length === 0 ) {
bot . sendMessage ( chatId , 'Du hast noch keine Server hinzugefügt. Benutze /add_server, um einen Server hinzuzufügen.' ) ;
return ;
}
const keyboard = {
reply _markup : {
inline _keyboard : userServers . map ( server => [ {
text : ` ${ server . name } - ${ server . address } ` ,
callback _data : ` delete: ${ server . name } : ${ server . address } `
} ] )
}
} ;
bot . sendMessage ( chatId , 'Wähle einen Server zum Löschen aus:' , keyboard ) ;
} ) ;
bot . on ( 'callback_query' , ( query ) => {
const chatId = query . message . chat . id ;
const [ action , serverName , serverAddress ] = query . data . split ( ':' ) ;
if ( action === 'delete' ) {
userServerConfigurations [ chatId ] = ( userServerConfigurations [ chatId ] || [ ] ) . filter ( server => ! ( server . name === serverName && server . address === serverAddress ) ) ;
saveConfigurations ( userServerConfigurations ) ;
const logEntry = createLogEntry ( 'Delete Server' , serverName , serverAddress ) ;
writeToLog ( chatId , logEntry ) ;
bot . answerCallbackQuery ( { callback _query _id : query . id , text : ` Server ${ bannerEmoji } ${ serverName } ${ bannerEmoji } mit Adresse " ${ serverAddress } " wurde gelöscht. ` } ) ;
} else if ( action === 'stop_notifications' ) {
if ( serverAddress ) {
serverNotificationState [ serverAddress ] = false ;
const logEntry = createLogEntry ( 'Stop Notifications' , '' , serverAddress ) ;
writeToLog ( chatId , logEntry ) ;
bot . answerCallbackQuery ( { callback _query _id : query . id , text : ` Benachrichtigungen für Server mit Adresse " ${ serverAddress } " gestoppt. ` } ) ;
} else {
console . error ( 'Ungültige Anfrage: serverAddress ist undefined.' ) ;
bot . answerCallbackQuery ( { callback _query _id : query . id , text : 'Fehler: Server-Adresse ist undefiniert.' } ) ;
}
} else if ( action === 'details_server' ) {
showServerDetails ( chatId , serverName , serverAddress ) ;
}
} ) ;
bot . onText ( /\/log/ , ( msg ) => {
const chatId = msg . chat . id ;
try {
const logFileName = ` user_ ${ chatId } _log.txt ` ;
const logFilePath = logDirectory + logFileName ;
if ( fs . existsSync ( logFilePath ) ) {
const logContent = fs . readFileSync ( logFilePath , 'utf8' ) ;
const logEntries = logContent . split ( '\n' ) . filter ( entry => entry . trim ( ) !== '' ) . slice ( - 8 ) ;
if ( logEntries . length > 0 ) {
const logMessage = ` Die letzten 8 Logeinträge: \n \n ${ logEntries . join ( '\n' ) } ` ;
bot . sendMessage ( chatId , logMessage ) ;
} else {
bot . sendMessage ( chatId , 'Keine Logeinträge vorhanden.' ) ;
}
} else {
bot . sendMessage ( chatId , 'Keine Logdatei vorhanden. Führen Sie zuerst Aktionen durch, um Logeinträge zu generieren.' ) ;
}
} catch ( error ) {
console . error ( ` Fehler beim Lesen des Logs: ${ error . message } ` ) ;
bot . sendMessage ( chatId , 'Fehler beim Lesen des Logs.' ) ;
}
} ) ;
bot . onText ( /\/save_log/ , ( msg ) => {
console . log ( 'In /save_log' ) ;
const chatId = msg . chat . id ;
try {
const logFileName = ` user_ ${ chatId } _log.txt ` ;
const logFilePath = logDirectory + logFileName ;
if ( fs . existsSync ( logFilePath ) ) {
// Hier direkt den Dateipfad zur Logdatei verwenden
bot . sendDocument ( chatId , logFilePath , { caption : 'Hier ist Ihre Logdatei.' } ) ;
} else {
bot . sendMessage ( chatId , 'Keine Logdatei vorhanden. Führen Sie zuerst Aktionen durch, um Logeinträge zu generieren.' ) ;
}
} catch ( error ) {
console . error ( ` Fehler beim Lesen des Logs: ${ error . message } ` ) ;
bot . sendMessage ( chatId , 'Fehler beim Lesen des Logs.' ) ;
}
} ) ;
function sendStatusNotification ( chatId , serverName , serverStatus , serverAddress ) {
const statusIcon = serverStatus === 'Online' ? onlineIcon : serverStatus === 'Offline' ? offlineIcon : errorIcon ;
const inlineKeyboard = [ [
{
text : 'Details anzeigen' ,
callback _data : ` details_server: ${ serverName } : ${ serverAddress } `
} ,
] ] ;
const options = {
parse _mode : 'Markdown' ,
reply _markup : {
inline _keyboard : inlineKeyboard
}
} ;
const notificationMessage = ` Server ${ bannerEmoji } ${ serverName } ${ bannerEmoji } ist ${ statusIcon } ${ serverStatus } . Benachrichtigungen aktiviert. ` ;
bot . sendMessage ( chatId , notificationMessage , options ) ;
}
function stopNotifications ( chatId ) {
const userServers = userServerConfigurations [ chatId ] || [ ] ;
if ( userServers . length === 0 ) {
bot . sendMessage ( chatId , 'Du hast noch keine Server hinzugefügt. Benutze /add_server, um einen Server hinzuzufügen.' ) ;
return ;
}
userServers . forEach ( serverConfig => {
const serverAddress = serverConfig . address ;
serverNotificationState [ serverAddress ] = false ;
} ) ;
bot . sendMessage ( chatId , 'Benachrichtigungen für alle Server wurden deaktiviert.' ) ;
}
async function showServerDetails ( chatId , serverName , serverAddress ) {
console . log ( ` showServerDetails called for ${ serverName } ` ) ;
if ( isShowingDetails ) {
console . log ( 'Details are already being shown.' ) ;
return ;
}
isShowingDetails = true ;
try {
const detailsMessage = `
* Details für Server $ { bannerEmoji } $ { serverName } $ { bannerEmoji } *
* Uptime : * $ { await getUptime ( ) }
* CPU - Auslastung : * $ { getCpuUsage ( ) } %
* RAM - Auslastung : * $ { getRamUsage ( ) } %
* Netzwerk - Traffic : * $ { getNetworkTraffic ( ) } %
* IP / Adresse : * $ { serverAddress }
` ;
const options = {
parse _mode : 'Markdown' ,
} ;
await bot . sendMessage ( chatId , detailsMessage , options ) ;
} catch ( error ) {
console . error ( ` Fehler beim Anzeigen der Serverdetails: ${ error . message } ` ) ;
await bot . sendMessage ( chatId , 'Fehler beim Anzeigen der Serverdetails.' ) ;
} finally {
isShowingDetails = false ;
}
}
bot . on ( 'callback_query' , async ( query ) => {
const chatId = query . message . chat . id ;
const [ action , ... params ] = query . data . split ( ':' ) ;
if ( action === 'details_server' ) {
showServerDetails ( chatId , ... params ) ;
} else {
const userServers = userServerConfigurations [ chatId ] || [ ] ;
if ( userServers . length === 0 ) {
bot . sendMessage ( chatId , 'Du hast noch keine Server hinzugefügt. Benutze /add_server, um einen Server hinzuzufügen.' ) ;
return ;
}
const keyboard = {
reply _markup : {
inline _keyboard : userServers . map ( server => [ {
text : ` ${ server . name } - ${ server . address } ` ,
callback _data : ` details_server: ${ server . name } : ${ server . address } `
} ] )
}
} ;
bot . sendMessage ( chatId , 'Wähle einen Server für Details aus:' , keyboard ) ;
}
} ) ;
bot . onText ( /\/help/ , ( msg ) => {
const chatId = msg . chat . id ;
let helpMessage = `
Verfügbare Befehle :
- / a d d _ s e r v e r : F ü g t e i n e n n e u e n S e r v e r h i n z u .
- / d e l e t e _ s e r v e r : L ö s c h t e i n e n v o r h a n d e n e n S e r v e r .
- / s t a t u s : Z e i g t d e n S t a t u s d e r k o n f i g u r i e r t e n S e r v e r a n .
- / s t a r t _ n o t i f i c a t i o n s : S t a r t e t B e n a c h r i c h t i g u n g e n f ü r a l l e S e r v e r .
- / s t o p _ n o t i f i c a t i o n s : S t o p p t B e n a c h r i c h t i g u n g e n f ü r a l l e S e r v e r .
- / l o g : Z e i g t d i e l e t z t e n 8 L o g e i n t r ä g e .
- / s a v e _ l o g : S p e i c h e r t u n d s e n d e t d i e l e t z t e n 8 L o g e i n t r ä g e a l s D a t e i .
- / u p t i m e : Z e i g t d i e a k t u e l l e B e t r i e b s z e i t d e s B o t s a n .
- / i n f o : Z e i g t I n f o r m a t i o n e n ü b e r d e n B o t a n .
` ;
if ( isDeveloperChat ( chatId ) ) {
helpMessage += '\n\n*Entwickler Befehle:*\n' +
'- /error: Zeigt den error Log an\n' +
'- /stats: Zeigt an, wie viele Personen den Bot nutzen\n' +
'- /user_id Zeigt eine Liste von Usern an die den Bot nutzen\n' +
2024-01-25 19:09:20 +00:00
'- /user_delete "ID" löscht alle Server des Benutzer\n' +
'- /error_send schickt die error.log Datei\n' +
'- /error_clear löscht alle einträge im error.log' ;
2024-01-22 21:58:42 +00:00
}
bot . sendMessage ( chatId , helpMessage ) ;
} ) ;
const checkIntervalMinutes = 2 ;
const checkIntervalMilliseconds = checkIntervalMinutes * 60 * 1000 ;
const offlineNotificationIntervalMinutes = 360 ; // Ändern Sie nach Bedarf
const offlineNotificationIntervalMilliseconds = offlineNotificationIntervalMinutes * 60 * 1000 ;
const lastOfflineNotificationTime = new Map ( ) ;
setInterval ( async ( ) => {
await checkAndSendServerStatus ( ) ;
} , checkIntervalMilliseconds ) ;
async function checkAndSendServerStatus ( ) {
for ( const chatId of chatIds ) {
const userServers = userServerConfigurations [ chatId ] || [ ] ;
if ( userServers . length === 0 ) {
bot . sendMessage ( chatId , 'Du hast noch keine Server hinzugefügt. Benutze /add_server, um einen Server hinzuzufügen.' ) ;
continue ;
}
for ( const serverConfig of userServers ) {
const serverName = serverConfig . name ;
const serverAddress = serverConfig . address ;
try {
const serverStatus = await checkServerStatus ( serverAddress ) ;
const offlineStatus = serverStatus === 'Offline' ;
if ( offlineStatus ) {
const statusIcon = '❌' ;
const notificationEnabled = serverNotificationState [ serverAddress ] ;
if ( notificationEnabled ) {
const lastNotificationTime = lastOfflineNotificationTime . get ( serverAddress ) || 0 ;
const currentTime = Date . now ( ) ;
// Überprüfen, ob die Benachrichtigung bereits innerhalb des Intervalls gesendet wurde
if ( currentTime - lastNotificationTime >= offlineNotificationIntervalMilliseconds ) {
console . log ( ` Benachrichtigung wird gesendet für Server: ${ serverName } ` ) ;
const inlineKeyboard = [ ] ;
const options = {
parse _mode : 'Markdown' ,
reply _markup : {
inline _keyboard : inlineKeyboard
}
} ;
sendStatusNotification ( chatId , serverName , serverStatus , serverAddress ) ;
lastOfflineNotificationTime . set ( serverAddress , currentTime ) ;
} else {
console . log ( ` Offline-Benachrichtigung für Server " ${ serverName } " wird aufgrund des Zeitintervalls übersprungen. ` ) ;
}
} else {
console . log ( ` Benachrichtigungen für Server " ${ serverName } " sind deaktiviert. ` ) ;
}
}
} catch ( error ) {
console . error ( ` Fehler beim Überprüfen des Servers ${ serverName } : ${ error . message } ` ) ;
}
}
}
2024-01-25 19:09:20 +00:00
}