diff --git a/src/bot.ts b/src/bot.ts index 938ec63..ddc5da2 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -5,7 +5,7 @@ import {Command, loadCommands} from "./command"; export class UEMEloBot extends Client { - players: Player[] = [] + servers = new Collection(); fileName = "players.json" commands = new Collection(); @@ -35,11 +35,16 @@ export class UEMEloBot extends Client { if (fs.existsSync(this.fileName)){ let fileContent = fs.readFileSync(this.fileName).toString(); try { - this.players = []; - for (let obj of JSON.parse(fileContent)){ - let p = Player.Load(obj); - this.players.push(p); - console.log(`Parsed player: ${p}`); + this.servers.clear(); + for (let [serverID, players] of Object.entries(JSON.parse(fileContent))){ + console.log(`Server: ${serverID}`); + let playersList: Player[] = []; + for (let obj of (players as Object[])){ + let p = Player.Load(obj); + playersList.push(p); + console.log(`Parsed player: ${p}`); + } + this.servers.set(serverID, playersList); } } catch (error) { console.error(`Failed to parse players: ${error}`); @@ -48,39 +53,41 @@ export class UEMEloBot extends Client { } savePlayersToFile(){ - fs.writeFileSync(this.fileName, JSON.stringify(this.players, null, 4)); + fs.writeFileSync(this.fileName, JSON.stringify(Object.fromEntries(this.servers), null, 4)); } async updatePlayers(){ - for (let p of this.players){ - await p.updateFullName(); - await p.updateCurrentElo(); - if (!p.startElo && p.currentElo){ - p.startElo = p.currentElo; - console.log(`Updated start elo for ${p}`); + for (let [_, players] of this.servers){ + for (let p of players){ + await p.updateFullName(); + await p.updateCurrentElo(); + if (!p.startElo && p.currentElo){ + p.startElo = p.currentElo; + console.log(`Updated start elo for ${p}`); + } } } this.savePlayersToFile(); } - async addPlayer(gameName: string, tagLine: string){ + async addPlayer(gameName: string, tagLine: string, serverID: string){ let player = await Player.TryCreateFrom(gameName, tagLine) as Player; if (!player) return; - if (this.players.find(p => p.puuid === player.puuid)){ + if (this.servers.ensure(serverID, () => []).find(p => p.puuid === player.puuid)) { console.error(`${player} already registered!`); return; } - this.players.push(player); - console.log(`Added ${player}!`); + this.servers.ensure(serverID, () => []).push(player); + console.log(`Added ${player} on Server: ${serverID}!`); this.savePlayersToFile(); return player; } - async removePlayer(gameName: string, tagLine: string){ + async removePlayer(gameName: string, tagLine: string, serverID: string){ let playerCopy = await Player.TryCreateFrom(gameName, tagLine); if (!playerCopy){ @@ -88,13 +95,16 @@ export class UEMEloBot extends Client { return; } - let player = this.players.find(p => p.puuid === playerCopy?.puuid); + let serverPlayers = this.servers.ensure(serverID, () => []); + + let player = serverPlayers.find(p => p.puuid === playerCopy?.puuid); if (!player){ console.error(`Tried to remove non-added player ${playerCopy}!`); return; } - this.players.splice(this.players.indexOf(player), 1); + serverPlayers.splice(serverPlayers.indexOf(player), 1); + this.servers.set(serverID, serverPlayers); console.log(`Removed ${player}!`); this.savePlayersToFile(); return player; diff --git a/src/commands/add.ts b/src/commands/add.ts index 16498eb..c62292f 100644 --- a/src/commands/add.ts +++ b/src/commands/add.ts @@ -1,4 +1,4 @@ -import {Interaction} from "discord.js"; +import {Interaction, PermissionsBitField} from "discord.js"; import {Command} from "../command"; import {UEMEloBot} from "../bot"; @@ -7,7 +7,7 @@ class Add extends Command { super("add", "Spieler hinzufügen"); this.data.addStringOption(option => { return option.setName("riot-id").setDescription("Riot ID: 'Name#Tag'").setRequired(true) - }); + }).setDefaultMemberPermissions(PermissionsBitField.Flags.Administrator); } async execute(interaction: Interaction) { @@ -18,8 +18,14 @@ class Add extends Command { const riotId = interaction.options.getString("riot-id", true); const [gameName, tagLine] = riotId.split("#"); + const serverID = interaction.guild?.id; + if (!serverID){ + console.error("Server ID is missing!"); + await interaction.reply({content: "Fehler!", ephemeral: true}); + return; + } - const player = await client.addPlayer(gameName, tagLine); + const player = await client.addPlayer(gameName, tagLine, serverID); if (player) await interaction.reply({content: `${player} hinzugefügt!`, ephemeral: true}); else diff --git a/src/commands/list.ts b/src/commands/list.ts index 0b82dbd..6987d81 100644 --- a/src/commands/list.ts +++ b/src/commands/list.ts @@ -11,7 +11,14 @@ class List extends Command { if (!interaction.isChatInputCommand()) return; - let players = (interaction.client as UEMEloBot).players; + const serverID = interaction.guild?.id; + if (!serverID){ + console.error("Server ID is missing!"); + await interaction.reply({content: "Fehler!", ephemeral: true}); + return; + } + + let players = (interaction.client as UEMEloBot).servers.ensure(serverID, () => []); if (players.length === 0){ await interaction.reply("0 Spieler registriert!"); return; diff --git a/src/commands/remove.ts b/src/commands/remove.ts index 60867d0..ac2a1fc 100644 --- a/src/commands/remove.ts +++ b/src/commands/remove.ts @@ -18,8 +18,14 @@ class Remove extends Command { const riotId = interaction.options.getString("riot-id", true); const [gameName, tagLine] = riotId.split("#"); + const serverID = interaction.guild?.id; + if (!serverID){ + console.error("Server ID is missing!"); + await interaction.reply({content: "Fehler!", ephemeral: true}); + return; + } - const player = await client.removePlayer(gameName, tagLine); + const player = await client.removePlayer(gameName, tagLine, serverID); if (player) await interaction.reply({content: `${player} entfernt!`, ephemeral: true}); else