const { Client, GatewayIntentBits, EmbedBuilder } = require('discord.js'); const axios = require('axios'); const randomColor = require('randomcolor'); const config = require('./config.json'); const client = new Client({ intents: [GatewayIntentBits.Guilds] }); let lastOnlineTime = Date.now(); let hasNotifiedOffline = false; client.once('ready', async () => { console.log(`Logged in as ${client.user.tag}!`); const channel = await client.channels.fetch(config.channelId); if (!channel) { console.error("Channel not found"); process.exit(1); } let message; try { const messages = await channel.messages.fetch({ limit: 1 }); message = messages.first(); } catch (error) { console.error("Failed to fetch messages:", error); } if (!message) { const embed = new EmbedBuilder().setDescription("Initializing server monitor..."); message = await channel.send({ embeds: [embed] }); } setInterval(async () => { try { const response = await axios.get(config.apiUrl, { timeout: 10000 }); const { game, players, max_players, version, map, name } = response.data; lastOnlineTime = Date.now(); hasNotifiedOffline = false; const embed = new EmbedBuilder() .setColor(randomColor({ luminosity: 'bright', hue: 'rainbow' })) .setTitle('Server Status') .addFields( { name: 'Server Name', value: name, inline: true }, { name: 'Server IP', value: "193.243.190.11:27033", inline: true }, { name: 'Game', value: game, inline: true }, { name: 'Game Mode', value: version, inline: true }, { name: 'Map', value: map, inline: true }, { name: 'Players', value: `${players}/${max_players}`, inline: true } ) .setFooter({ text: `Last updated: ${new Date().toLocaleTimeString()}` }); await message.edit({ embeds: [embed] }); } catch (error) { console.error("Failed to fetch server data:", error); const timeSinceOnline = Date.now() - lastOnlineTime; const minutesOffline = Math.floor(timeSinceOnline / (1000 * 60)); const embed = new EmbedBuilder() .setColor('#FF0000') .setTitle('Server Status') .setDescription(`Server is offline!\nTime since last online: ${minutesOffline} minutes`) .setFooter({ text: `Last updated: ${new Date().toLocaleTimeString()}` }); await message.edit({ embeds: [embed] }); if (minutesOffline >= 20 && !hasNotifiedOffline) { await channel.send({ content: '@here Server has been offline for 20 minutes!' }); hasNotifiedOffline = true; } } }, config.updateInterval); }); client.login(config.token);