feat: afficher statut OP des joueurs (lire ops.txt)
This commit is contained in:
@@ -46,6 +46,21 @@ router.get('/', isAuthenticated, async (req, res) => {
|
||||
console.warn('usercache.json non trouvé:', usercacheFile);
|
||||
}
|
||||
|
||||
// Récupérer les OP depuis ops.txt
|
||||
let ops = [];
|
||||
const opsFile = path.join(SERVER_DIR, 'ops.txt');
|
||||
if (await fs.pathExists(opsFile)) {
|
||||
try {
|
||||
const opsContent = await fs.readFile(opsFile, 'utf8');
|
||||
ops = opsContent
|
||||
.split('\n')
|
||||
.map(line => line.trim())
|
||||
.filter(line => line.length > 0);
|
||||
} catch (e) {
|
||||
console.error('Erreur lecture ops.txt:', e);
|
||||
}
|
||||
}
|
||||
|
||||
// Récupérer les stats de dernière connexion
|
||||
const statsDir = path.join(SERVER_DIR, 'world', 'stats');
|
||||
let statsByUuid = {};
|
||||
@@ -71,9 +86,11 @@ router.get('/', isAuthenticated, async (req, res) => {
|
||||
|
||||
const players = playerFiles.map(file => {
|
||||
const uuid = file.replace('.dat', '');
|
||||
const playerName = usercache[uuid] || 'Inconnu';
|
||||
return {
|
||||
uuid,
|
||||
name: usercache[uuid] || 'Inconnu',
|
||||
name: playerName,
|
||||
isOp: ops.includes(playerName),
|
||||
lastPlayed: new Date() // TODO: Extraire du fichier .dat si possible
|
||||
};
|
||||
});
|
||||
|
||||
@@ -891,12 +891,13 @@ function getPlayersHTML() {
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Nom</th>
|
||||
<th>OP</th>
|
||||
<th>UUID</th>
|
||||
<th>Dernière Connexion</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="playersTable">
|
||||
<tr><td colspan="3" style="text-align: center;">Chargement...</td></tr>
|
||||
<tr><td colspan="4" style="text-align: center;">Chargement...</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
@@ -924,12 +925,13 @@ async function loadPlayersData() {
|
||||
table.innerHTML = data.players.map(p => `
|
||||
<tr>
|
||||
<td>${p.name}</td>
|
||||
<td style="text-align: center;">${p.isOp ? '✅ OP' : '❌'}</td>
|
||||
<td><code style="font-size: 11px;">${p.uuid}</code></td>
|
||||
<td>${new Date(p.lastPlayed).toLocaleString()}</td>
|
||||
</tr>
|
||||
`).join('');
|
||||
} else {
|
||||
table.innerHTML = '<tr><td colspan="3" style="text-align: center;">Aucun joueur</td></tr>';
|
||||
table.innerHTML = '<tr><td colspan="4" style="text-align: center;">Aucun joueur</td></tr>';
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Erreur joueurs:', e);
|
||||
@@ -1018,15 +1020,46 @@ window.loadOnlinePlayers = async function() {
|
||||
`;
|
||||
|
||||
if (onlineCount > 0 && playerNames.length > 0) {
|
||||
listDiv.innerHTML = `
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; margin-top: 15px;">
|
||||
${playerNames.map(name => `
|
||||
<div style="padding: 12px; background: white; border: 2px solid #4CAF50; border-radius: 8px; text-align: center;">
|
||||
<span style="font-weight: bold; color: #333;">🎮 ${name}</span>
|
||||
</div>
|
||||
`).join('')}
|
||||
</div>
|
||||
`;
|
||||
// Charger les infos des joueurs pour voir qui est OP
|
||||
try {
|
||||
const playersResponse = await fetch(`${API_URL}/players`, {
|
||||
credentials: 'include'
|
||||
});
|
||||
let playersData = await playersResponse.json();
|
||||
let playersByName = {};
|
||||
if (playersData.players) {
|
||||
playersByName = playersData.players.reduce((acc, p) => {
|
||||
acc[p.name] = p;
|
||||
return acc;
|
||||
}, {});
|
||||
}
|
||||
|
||||
listDiv.innerHTML = `
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; margin-top: 15px;">
|
||||
${playerNames.map(name => {
|
||||
const playerInfo = playersByName[name];
|
||||
const isOp = playerInfo && playerInfo.isOp;
|
||||
return `
|
||||
<div style="padding: 12px; background: white; border: 2px solid ${isOp ? '#FFD700' : '#4CAF50'}; border-radius: 8px; text-align: center;">
|
||||
<span style="font-weight: bold; color: #333;">🎮 ${name}</span>
|
||||
${isOp ? '<div style="margin-top: 5px; font-size: 12px; color: #FFD700; font-weight: bold;">👑 OP</div>' : ''}
|
||||
</div>
|
||||
`;
|
||||
}).join('')}
|
||||
</div>
|
||||
`;
|
||||
} catch (e) {
|
||||
console.error('Erreur chargement infos joueurs:', e);
|
||||
listDiv.innerHTML = `
|
||||
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px; margin-top: 15px;">
|
||||
${playerNames.map(name => `
|
||||
<div style="padding: 12px; background: white; border: 2px solid #4CAF50; border-radius: 8px; text-align: center;">
|
||||
<span style="font-weight: bold; color: #333;">🎮 ${name}</span>
|
||||
</div>
|
||||
`).join('')}
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
} else {
|
||||
listDiv.innerHTML = '';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user