From b8fffcdd252b98c724542e3ff566a8dae66aceda Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Thu, 13 Jun 2024 00:55:39 +0200 Subject: [PATCH] restructuring --- src/bot.ts | 97 +---------------------------------------- src/commands/add.ts | 2 +- src/commands/list.ts | 2 +- src/commands/remove.ts | 2 +- src/commands/update.ts | 2 +- src/data.ts | 98 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 104 insertions(+), 99 deletions(-) create mode 100644 src/data.ts diff --git a/src/bot.ts b/src/bot.ts index a547372..4273283 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,13 +1,12 @@ import {Client, Collection, Events, GatewayIntentBits, Interaction} from "discord.js" -import {Account} from "./account"; import {Command, loadCommands} from "./command"; -import {getMySQLConnection} from "./util"; -import {RowDataPacket} from "mysql2/promise"; +import {DataManager} from "./data"; require("./util.js"); export class UEMEloBot extends Client { commands = new Collection(); + data = new DataManager(); constructor() { super({intents: [GatewayIntentBits.Guilds]}); @@ -32,98 +31,6 @@ export class UEMEloBot extends Client { await command.execute(interaction); } - async updateAccounts(){ - let accounts = await this.getProgressedAccountList(); - for (let account of accounts){ - await account.update(); - } - } - - async addAccount(gameName: string, tagLine: string) { - let account = await Account.fetchFromRiotID(gameName, tagLine); - if (!account) - return; - - if (!await account.isAdded()){ - await account.addToDB(); - await account.update(); - return account; - } else { - console.error(`Account ${account} already added.`); - return; - } - } - - async removeAccount(gameName: string, tagLine: string) { - let account = await Account.fetchFromRiotID(gameName, tagLine); - if (!account) - return; - - if (await account.isAdded()){ - await account.removeFromDB(); - return account; - } else { - console.error(`Account ${account} was not added.`); - return; - } - } - - async getAccountMap(){ - const conn = await getMySQLConnection(); - - const [sqlAccounts] = await conn.query(`SELECT * FROM accounts`); - - let accounts = new Collection(); - - for (const sqlAccount of sqlAccounts){ - let account = new Account(sqlAccount["puuid"]); - account.gameName = sqlAccount["gameName"]; - account.tagLine = sqlAccount["tagLine"]; - accounts.set(account.puuid, account); - } - - return accounts; - } - - async getProgressedAccountList() { - const conn = await getMySQLConnection(); - - const [[, starts, ends]] = await conn.query(` - CREATE TEMPORARY TABLE borders AS - SELECT MIN(date) AS start, MAX(date) AS end, accountId, gameName, tagLine, puuid - FROM accounts JOIN elo_entries ON id = accountId - GROUP BY accountId, gameName, tagLine, puuid; - - SELECT tier, \`rank\`, points, gameName, tagLine, puuid - FROM elo_entries JOIN borders ON elo_entries.date = start AND borders.accountId = elo_entries.accountId; - - SELECT tier, \`rank\`, points, gameName, tagLine, puuid - FROM elo_entries JOIN borders ON elo_entries.date = end AND borders.accountId = elo_entries.accountId; - `); - - let accounts = await this.getAccountMap(); - - for (const start of starts){ - let account = accounts.get(start["puuid"]) as Account; - account.startElo = { - rank: start["rank"], - tier: start["tier"], - points: start["points"] - }; - } - - for (const end of ends){ - let account = accounts.get(end["puuid"]) as Account; - account.currentElo = { - rank: end["rank"], - tier: end["tier"], - points: end["points"] - }; - } - - return Array.from(accounts.values()); - } - async onReady(readyClient: Client){ console.log(`Logged in as ${readyClient.user.tag}`); } diff --git a/src/commands/add.ts b/src/commands/add.ts index d1c36df..eb9fd20 100644 --- a/src/commands/add.ts +++ b/src/commands/add.ts @@ -18,7 +18,7 @@ class Add extends Command { const riotId = interaction.options.getString("riot-id", true); const [gameName, tagLine] = riotId.split("#"); - const account = await client.addAccount(gameName, tagLine); + const account = await client.data.addAccount(gameName, tagLine); if (account) await interaction.reply({content: `${account} hinzugefĆ¼gt!`, ephemeral: true}); else diff --git a/src/commands/list.ts b/src/commands/list.ts index a4e6e83..a669d22 100644 --- a/src/commands/list.ts +++ b/src/commands/list.ts @@ -11,7 +11,7 @@ class List extends Command { async execute(interaction: ChatInputCommandInteraction) { console.log("List command used"); - let accounts = await (interaction.client as UEMEloBot).getProgressedAccountList(); + let accounts = await (interaction.client as UEMEloBot).data.getProgressedAccountList(); if (accounts.length === 0){ await interaction.reply("0 Spieler registriert!"); return; diff --git a/src/commands/remove.ts b/src/commands/remove.ts index 3559008..990a84c 100644 --- a/src/commands/remove.ts +++ b/src/commands/remove.ts @@ -18,7 +18,7 @@ class Remove extends Command { const riotId = interaction.options.getString("riot-id", true); const [gameName, tagLine] = riotId.split("#"); - const account = await client.removeAccount(gameName, tagLine); + const account = await client.data.removeAccount(gameName, tagLine); if (account) await interaction.reply({content: `${account} entfernt!`, ephemeral: true}); else diff --git a/src/commands/update.ts b/src/commands/update.ts index 01105eb..b672b54 100644 --- a/src/commands/update.ts +++ b/src/commands/update.ts @@ -12,7 +12,7 @@ class Update extends Command { await interaction.deferReply({ephemeral: true}); let client = interaction.client as UEMEloBot; - await client.updateAccounts(); + await client.data.updateAllAccounts(); await interaction.editReply({content: "Aktualisiert!"}); } diff --git a/src/data.ts b/src/data.ts new file mode 100644 index 0000000..5109037 --- /dev/null +++ b/src/data.ts @@ -0,0 +1,98 @@ +import {Account} from "./account"; +import {getMySQLConnection} from "./util"; +import {RowDataPacket} from "mysql2/promise"; +import {Collection} from "discord.js"; + +export class DataManager { + async updateAllAccounts(){ + let accounts = await this.getProgressedAccountList(); + for (let account of accounts){ + await account.update(); + } + } + + async addAccount(gameName: string, tagLine: string) { + let account = await Account.fetchFromRiotID(gameName, tagLine); + if (!account) + return; + + if (!await account.isAdded()){ + await account.addToDB(); + await account.update(); + return account; + } else { + console.error(`Account ${account} already added.`); + return; + } + } + + async removeAccount(gameName: string, tagLine: string) { + let account = await Account.fetchFromRiotID(gameName, tagLine); + if (!account) + return; + + if (await account.isAdded()){ + await account.removeFromDB(); + return account; + } else { + console.error(`Account ${account} was not added.`); + return; + } + } + + async getAccountMap(){ + const conn = await getMySQLConnection(); + + const [sqlAccounts] = await conn.query(`SELECT * FROM accounts`); + + let accounts = new Collection(); + + for (const sqlAccount of sqlAccounts){ + let account = new Account(sqlAccount["puuid"]); + account.gameName = sqlAccount["gameName"]; + account.tagLine = sqlAccount["tagLine"]; + accounts.set(account.puuid, account); + } + + return accounts; + } + + async getProgressedAccountList() { + const conn = await getMySQLConnection(); + + const [[, starts, ends]] = await conn.query(` + CREATE TEMPORARY TABLE limits AS + SELECT MIN(date) AS start, MAX(date) AS end, accountId, gameName, tagLine, puuid + FROM accounts JOIN elo_entries ON id = accountId + GROUP BY accountId, gameName, tagLine, puuid; + + SELECT tier, \`rank\`, points, gameName, tagLine, puuid + FROM elo_entries JOIN limits ON elo_entries.date = start AND limits.accountId = elo_entries.accountId; + + SELECT tier, \`rank\`, points, gameName, tagLine, puuid + FROM elo_entries JOIN limits ON elo_entries.date = end AND limits.accountId = elo_entries.accountId; + `); + + let accounts = await this.getAccountMap(); + + for (const start of starts){ + let account = accounts.get(start["puuid"]) as Account; + account.startElo = { + rank: start["rank"], + tier: start["tier"], + points: start["points"] + }; + } + + for (const end of ends){ + let account = accounts.get(end["puuid"]) as Account; + account.currentElo = { + rank: end["rank"], + tier: end["tier"], + points: end["points"] + }; + } + + return Array.from(accounts.values()); + } +} \ No newline at end of file