restructuring

sql-php-refactoring
Benjamin Kraft 3 months ago
parent 1b09e466e2
commit b8fffcdd25
  1. 97
      src/bot.ts
  2. 2
      src/commands/add.ts
  3. 2
      src/commands/list.ts
  4. 2
      src/commands/remove.ts
  5. 2
      src/commands/update.ts
  6. 98
      src/data.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<string, Command>();
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<RowDataPacket[]>(`SELECT * FROM accounts`);
let accounts = new Collection<string, Account>();
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<RowDataPacket[][]>(`
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<true>){
console.log(`Logged in as ${readyClient.user.tag}`);
}

@ -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

@ -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;

@ -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

@ -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!"});
}

@ -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<RowDataPacket[]>(`SELECT * FROM accounts`);
let accounts = new Collection<string, Account>();
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<RowDataPacket[][]>(`
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());
}
}
Loading…
Cancel
Save