mc-access-bot/src/utils/minecraftServer.js

103 lines
4.1 KiB
JavaScript

const { status } = require('minecraft-server-util');
class MinecraftServerUtil {
constructor() {
this.serverIP = process.env.MINECRAFT_SERVER_IP;
this.host = this.serverIP.split(':')[0];
this.port = parseInt(this.serverIP.split(':')[1]) || 25565;
}
async getServerStatus() {
try {
console.log(`🔍 Vérification du serveur ${this.host}:${this.port}...`);
const result = await status(this.host, this.port, { timeout: 10000 });
console.log('✅ Réponse du serveur reçue');
// Gérer la description qui peut être un objet complexe
let description = 'Serveur Minecraft';
if (result.description) {
if (typeof result.description === 'string') {
description = result.description;
} else if (result.description.text) {
description = result.description.text;
} else if (result.description.extra) {
description = result.description.extra.map(part => part.text || '').join('');
} else {
description = JSON.stringify(result.description);
}
}
return {
online: true,
version: result.version?.name || 'Inconnu',
protocol: result.version?.protocol || 0,
players: {
online: result.players?.online || 0,
max: result.players?.max || 0,
list: result.players?.sample || []
},
description: description,
latency: result.roundTripLatency || 0,
favicon: result.favicon
};
} catch (error) {
console.error('❌ Erreur lors de la vérification du serveur:', error);
return {
online: false,
error: error.message
};
}
}
async isServerOnline() {
const status = await this.getServerStatus();
return status.online;
}
formatStatusEmbed(statusData) {
const { EmbedBuilder } = require('discord.js');
const emojiManager = require('./emojiManager');
if (!statusData.online) {
return new EmbedBuilder()
.setTitle(`${emojiManager.error} Serveur Minecraft - Hors ligne`)
.setDescription(`Le serveur \`${this.serverIP}\` est actuellement hors ligne.`)
.addFields(
{ name: 'Erreur', value: statusData.error || 'Serveur inaccessible', inline: true }
)
.setColor('#FF0000')
.setTimestamp();
}
const embed = new EmbedBuilder()
.setTitle(`${emojiManager.success} Serveur Minecraft - En ligne`)
.setDescription(`Le serveur \`${this.serverIP}\` est en ligne !`)
.addFields(
{ name: '👥 Joueurs', value: `${statusData.players.online}/${statusData.players.max}`, inline: true },
{ name: '📋 Version', value: statusData.version, inline: true },
{ name: '📡 Latence', value: `${statusData.latency}ms`, inline: true }
)
.setColor('#00FF00')
.setTimestamp();
if (statusData.description && statusData.description !== 'Serveur Minecraft') {
// Limiter la taille de la description pour éviter les erreurs Discord
const description = statusData.description.length > 1024
? statusData.description.substring(0, 1021) + '...'
: statusData.description;
embed.addFields({ name: '📝 Description', value: description, inline: false });
}
if (statusData.players.list && statusData.players.list.length > 0) {
const playerList = statusData.players.list
.slice(0, 10) // Limiter à 10 joueurs
.map(player => player.name)
.join(', ');
embed.addFields({ name: '🎮 Joueurs connectés', value: playerList, inline: false });
}
return embed;
}
}
module.exports = MinecraftServerUtil;