added "remove" command

main
Benjamin Kraft 9 months ago
parent f244e85b27
commit c221df5f02
  1. 36
      src/bot.ts
  2. 3
      src/commands/add.ts
  3. 53
      src/commands/list.ts
  4. 30
      src/commands/remove.ts
  5. 8
      src/player.ts

@ -18,10 +18,8 @@ export class UEMEloBot extends Client {
this.commands = commands; this.commands = commands;
const token = await this.login(); const token = await this.login();
console.log(`Discord Token: ${token}`); console.log(`Discord Token: ${token}`);
setInterval(this.updatePlayers.bind(this), 30 * 60 * 1000); setInterval(this.updatePlayers.bind(this), 5 * 60 * 1000);
await this.addPlayer("benjo", "tgm"); await this.updatePlayers();
await this.addPlayer("unclebenss", "euw");
await this.addPlayer("moché", "EUw");
}); });
} }
@ -54,21 +52,23 @@ export class UEMEloBot extends Client {
} }
async updatePlayers(){ async updatePlayers(){
console.log("Started full update...");
for (let p of this.players){ for (let p of this.players){
await p.updateFullName(); await p.updateFullName();
await p.updateCurrentElo(); await p.updateCurrentElo();
if (!p.startElo){ if (!p.startElo && p.currentElo){
p.startElo = p.currentElo; p.startElo = p.currentElo;
console.log(`Updated start elo for ${p}`); console.log(`Updated start elo for ${p}`);
} }
} }
console.log("Finished full update!");
this.savePlayersToFile(); this.savePlayersToFile();
} }
async addPlayer(gameName: string, tag: string){ async addPlayer(gameName: string, tagLine: string){
let player = await Player.TryCreateFrom(gameName, tag) as Player; let player = await Player.TryCreateFrom(gameName, tagLine) as Player;
if (player === undefined) if (!player)
return; return;
if (this.players.find(p => p.puuid === player.puuid)){ if (this.players.find(p => p.puuid === player.puuid)){
@ -82,6 +82,26 @@ export class UEMEloBot extends Client {
return player; return player;
} }
async removePlayer(gameName: string, tagLine: string){
let playerCopy = await Player.TryCreateFrom(gameName, tagLine);
if (!playerCopy){
console.error(`Tried to remove non-existent Riot ID ${gameName}#${tagLine}`)
return;
}
let player = this.players.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);
console.log(`Removed ${player}!`);
this.savePlayersToFile();
return player;
}
async onReady(readyClient: Client<true>){ async onReady(readyClient: Client<true>){
console.log(`Logged in as ${readyClient.user.tag}`); console.log(`Logged in as ${readyClient.user.tag}`);
} }

@ -9,6 +9,7 @@ class Add extends Command {
return option.setName("riot-id").setDescription("Riot ID: 'Name#Tag'").setRequired(true) return option.setName("riot-id").setDescription("Riot ID: 'Name#Tag'").setRequired(true)
}); });
} }
async execute(interaction: Interaction) { async execute(interaction: Interaction) {
if (!interaction.isChatInputCommand()) if (!interaction.isChatInputCommand())
return; return;
@ -20,7 +21,7 @@ class Add extends Command {
const player = await client.addPlayer(gameName, tagLine); const player = await client.addPlayer(gameName, tagLine);
if (player) if (player)
await interaction.reply({content: `${player} Hinzugefügt!`, ephemeral: true}); await interaction.reply({content: `${player} hinzugefügt!`, ephemeral: true});
else else
await interaction.reply({content: "Fehler!", ephemeral: true}); await interaction.reply({content: "Fehler!", ephemeral: true});
} }

@ -0,0 +1,53 @@
import {Interaction, EmbedBuilder, APIEmbedField, codeBlock} from "discord.js";
import {Command} from "../command";
import {UEMEloBot} from "../bot";
import {eloToNumber, Player} from "../player";
class List extends Command {
constructor() {
super("list", "Spieler auflisten");
}
async execute(interaction: Interaction) {
if (!interaction.isChatInputCommand())
return;
let players = (interaction.client as UEMEloBot).players;
const maxNameLength = players.reduce((max: number, next: Player) => Math.max(max, next.toString().length), 0);
const maxProgressDigits = players.reduce((max, next) => Math.max(max, Math.abs(next.getProgress()).toString().length), 0);
// sort by progress, then current elo, descending
players.sort((a, b) => {
const diff = b.getProgress() - a.getProgress();
if (diff != 0)
return diff;
return eloToNumber(b.currentElo) - eloToNumber(a.currentElo);
});
let ranking = players.reduce((before, player, index) => {
const placement = `${index + 1})`.padStart(3, '0');
const fill = "-".repeat(maxNameLength - `${player}`.length + 2);
const progress = Intl.NumberFormat(undefined, {
signDisplay: "always",
useGrouping: false,
}).format(player.getProgress()).padStart(maxProgressDigits + 1, " ");
return `${before}${placement} ${player} ${fill} ${progress} LP\n`;
}, "");
ranking = ranking.trimEnd();
const baseURL = "https://raw.communitydragon.org/latest/plugins/rcp-fe-lol-shared-components/global/default/";
const fileName = (players[0].currentElo?.tier.toLowerCase() ?? "unranked") + ".png";
const iconURL = `${baseURL}${fileName}`;
const embed = new EmbedBuilder()
.setTitle("UEM-Elo-Challenge Ranking")
.setFields([
{name: "Leader:", value: players[0].toString()},
{name: " ", value: codeBlock(ranking)}
])
.setThumbnail(iconURL);
await interaction.reply({embeds: [embed]});
}
}
export default new List();

@ -0,0 +1,30 @@
import {Interaction, PermissionsBitField} from "discord.js";
import {Command} from "../command";
import {UEMEloBot} from "../bot";
class Remove extends Command {
constructor() {
super("remove", "Spieler entfernen");
this.data.addStringOption(option => {
return option.setName("riot-id").setDescription("Riot ID: 'Name#Tag'").setRequired(true)
}).setDefaultMemberPermissions(PermissionsBitField.Flags.Administrator);
}
async execute(interaction: Interaction) {
if (!interaction.isChatInputCommand())
return;
let client = interaction.client as UEMEloBot;
const riotId = interaction.options.getString("riot-id", true);
const [gameName, tagLine] = riotId.split("#");
const player = await client.removePlayer(gameName, tagLine);
if (player)
await interaction.reply({content: `${player} entfernt!`, ephemeral: true});
else
await interaction.reply({content: "Fehler!", ephemeral: true});
}
}
export default new Remove();

@ -78,6 +78,10 @@ export class Player {
} }
} }
getProgress(){
return eloToNumber(this.currentElo) - eloToNumber(this.startElo);
}
toString() { toString() {
return `${this.gameName}#${this.tagLine}`; return `${this.gameName}#${this.tagLine}`;
} }
@ -99,7 +103,9 @@ interface Elo {
points: number points: number
} }
function eloToNumber(elo: Elo){ export function eloToNumber(elo: Elo | undefined){
if (!elo)
return 0;
let tiers: Record<string, number> = { let tiers: Record<string, number> = {
"CHALLENGER": 2800, "CHALLENGER": 2800,
"GRANDMASTER": 2800, "GRANDMASTER": 2800,

Loading…
Cancel
Save