2024-08-20 22:12:46 -04:00
|
|
|
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] });
|
2025-02-05 09:56:39 -05:00
|
|
|
let lastOnlineTime = Date.now();
|
|
|
|
let hasNotifiedOffline = false;
|
2024-08-20 22:12:46 -04:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2025-02-05 09:56:39 -05:00
|
|
|
lastOnlineTime = Date.now();
|
|
|
|
hasNotifiedOffline = false;
|
|
|
|
|
2024-08-20 22:12:46 -04:00
|
|
|
const embed = new EmbedBuilder()
|
|
|
|
.setColor(randomColor({ luminosity: 'bright', hue: 'rainbow' }))
|
|
|
|
.setTitle('Server Status')
|
|
|
|
.addFields(
|
|
|
|
{ name: 'Server Name', value: name, inline: true },
|
2024-08-22 15:28:09 -04:00
|
|
|
{ name: 'Server IP', value: "193.243.190.11:27033", inline: true },
|
2024-08-20 22:12:46 -04:00
|
|
|
{ name: 'Game', value: game, inline: true },
|
2024-08-22 15:26:09 -04:00
|
|
|
{ name: 'Game Mode', value: version, inline: true },
|
2024-08-20 22:12:46 -04:00
|
|
|
{ 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] });
|
2025-02-05 09:56:39 -05:00
|
|
|
|
2024-08-20 22:12:46 -04:00
|
|
|
} catch (error) {
|
|
|
|
console.error("Failed to fetch server data:", error);
|
2025-02-05 09:56:39 -05:00
|
|
|
const timeSinceOnline = Date.now() - lastOnlineTime;
|
|
|
|
const minutesOffline = Math.floor(timeSinceOnline / (1000 * 60));
|
|
|
|
|
2024-08-20 22:12:46 -04:00
|
|
|
const embed = new EmbedBuilder()
|
2025-02-05 09:56:39 -05:00
|
|
|
.setColor('#FF0000')
|
2024-08-20 22:12:46 -04:00
|
|
|
.setTitle('Server Status')
|
2025-02-05 09:56:39 -05:00
|
|
|
.setDescription(`Server is offline!\nTime since last online: ${minutesOffline} minutes`)
|
2024-08-20 22:12:46 -04:00
|
|
|
.setFooter({ text: `Last updated: ${new Date().toLocaleTimeString()}` });
|
|
|
|
|
|
|
|
await message.edit({ embeds: [embed] });
|
2025-02-05 09:56:39 -05:00
|
|
|
|
|
|
|
if (minutesOffline >= 20 && !hasNotifiedOffline) {
|
|
|
|
await channel.send({ content: '@here Server has been offline for 20 minutes!' });
|
|
|
|
hasNotifiedOffline = true;
|
|
|
|
}
|
2024-08-20 22:12:46 -04:00
|
|
|
}
|
|
|
|
}, config.updateInterval);
|
|
|
|
});
|
|
|
|
|
2025-02-05 09:56:39 -05:00
|
|
|
client.login(config.token);
|