Skip to content

Commit

Permalink
Add elite game stats
Browse files Browse the repository at this point in the history
  • Loading branch information
oglimmer committed Feb 3, 2024
1 parent d13fe6e commit 686761f
Show file tree
Hide file tree
Showing 5 changed files with 166 additions and 0 deletions.
30 changes: 30 additions & 0 deletions src/buttons/elite-stats-page1.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, EmbedBuilder } from 'discord.js'
import { EliteGameDataStorage } from '../service/eliteGameDataStorage'
import { createRow } from '../commands/elite-stats'

export default {
buttonId: /elite-stats-page1/,
async execute(interaction: ButtonInteraction): Promise<void> {
const stats = await EliteGameDataStorage.instance().loadWinnersStats(365)
const rows = Array.from({ length: Math.min(11, stats.length) }, (_, index) => createRow(stats, index))
await interaction.update({
embeds: [
new EmbedBuilder()
.setTitle('365 days winners')
.addFields(rows)
.setFooter({
text: 'Seite 1/3'
})
],
components: [
new ActionRowBuilder<ButtonBuilder>().addComponents(
new ButtonBuilder()
.setLabel('Nächste Seite')
.setEmoji('▶️')
.setStyle(ButtonStyle.Primary)
.setCustomId('elite-stats-page2')
)
]
})
}
}
35 changes: 35 additions & 0 deletions src/buttons/elite-stats-page2.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, EmbedBuilder } from 'discord.js'
import { EliteGameDataStorage } from '../service/eliteGameDataStorage'
import { createRow } from '../commands/elite-stats'

export default {
buttonId: /elite-stats-page2/,
async execute(interaction: ButtonInteraction): Promise<void> {
const stats = await EliteGameDataStorage.instance().loadWinnersStats(14)
const rows = Array.from({ length: Math.min(11, stats.length) }, (_, index) => createRow(stats, index))
await interaction.update({
embeds: [
new EmbedBuilder()
.setTitle('14 days winners')
.addFields(rows)
.setFooter({
text: 'Seite 2/3'
})
],
components: [
new ActionRowBuilder<ButtonBuilder>().addComponents(
new ButtonBuilder()
.setLabel('Vorherige Seite')
.setEmoji('◀️')
.setStyle(ButtonStyle.Primary)
.setCustomId('elite-stats-page1'),
new ButtonBuilder()
.setLabel('Nächste Seite')
.setEmoji('▶️')
.setStyle(ButtonStyle.Primary)
.setCustomId('elite-stats-page3')
)
]
})
}
}
39 changes: 39 additions & 0 deletions src/buttons/elite-stats-page3.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, EmbedBuilder } from 'discord.js'
import { EliteGameDataStorage } from '../service/eliteGameDataStorage'

function createRow(stats: any, i: number): any {
if (stats.length > i) {
return {
name: `No. ${i + 1}`,
value: `<@${stats[i].userId}>`,
inline: false
}
}
}

export default {
buttonId: /elite-stats-page3/,
async execute(interaction: ButtonInteraction): Promise<void> {
const stats = await EliteGameDataStorage.instance().loadTodaysPlayers()
const rows = Array.from({ length: Math.min(11, stats.length) }, (_, index) => createRow(stats, index))
await interaction.update({
embeds: [
new EmbedBuilder()
.setTitle('Todays participants')
.addFields(rows)
.setFooter({
text: 'Seite 3/3'
})
],
components: [
new ActionRowBuilder<ButtonBuilder>().addComponents(
new ButtonBuilder()
.setLabel('Vorherige Seite')
.setEmoji('◀️')
.setStyle(ButtonStyle.Primary)
.setCustomId('elite-stats-page2')
)
]
})
}
}
47 changes: 47 additions & 0 deletions src/commands/elite-stats.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import {
ActionRowBuilder,
ButtonBuilder,
ButtonStyle,
CommandInteraction,
EmbedBuilder,
SlashCommandBuilder
} from 'discord.js'
import { EliteGameDataStorage } from '../service/eliteGameDataStorage'

export function createRow(stats: any, i: number): any {
if (stats.length > i) {
return {
name: `No. ${i + 1} : ${stats[i].count} wins`,
value: `<@${stats[i].userId}>`,
inline: false
}
}
}

export default {
data: new SlashCommandBuilder().setName('elite-stats').setDescription('Shows stats for the elite game.'),
async execute(interaction: CommandInteraction): Promise<void> {
const stats = await EliteGameDataStorage.instance().loadWinnersStats(365)
const rows = Array.from({ length: Math.min(11, stats.length) }, (_, index) => createRow(stats, index))
await interaction.reply({
embeds: [
new EmbedBuilder()
.setTitle('365 days winners')
.addFields(rows)
.setFooter({
text: 'Seite 1/3'
})
],
components: [
new ActionRowBuilder<ButtonBuilder>().addComponents(
new ButtonBuilder()
.setLabel('Nächste Seite')
.setEmoji('▶️')
.setStyle(ButtonStyle.Primary)
.setCustomId('elite-stats-page2')
)
],
ephemeral: true
})
}
}
15 changes: 15 additions & 0 deletions src/service/eliteGameDataStorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,19 @@ export class EliteGameDataStorage {
}
await this.db.runAsync(`DELETE FROM elite_game_rank where rank != ? and player = ?`, [rank, userId])
}

public async loadWinnersStats(days: number): Promise<Array<{ userId: string, count: number }>> {
if (!this.db) {
throw Error('initEliteGame was not called!')
}
return await this.db.allAsyncT<{ userId: string, count: number }>(`select player as userId, count(identifier) as count from elite_game_winner where play_timestamp > ? group by player order by count(identifier) desc`,
[Date.now() - days * 24 * 60 * 60 * 1000])
}

public async loadTodaysPlayers(): Promise<Array<{ userId: string }>> {
if (!this.db) {
throw Error('initEliteGame was not called!')
}
return await this.db.allAsyncT<{ userId: string }>(`select player as userId from elite_game where register_date = (select max(register_date) from elite_game) and player != "\uFFFF" order by play_timestamp desc`, [])
}
}

0 comments on commit 686761f

Please sign in to comment.