103 lines
4.1 KiB
JavaScript
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; |