mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 12:09:51 +02:00
feat: cleaner /stats
This commit is contained in:
1 parent
ae650eeb38
commit
75fab881fd
18 files changed
+169
-151
No files matched your search
@@ -3,6 +3,7 @@ import packageJSON from '../../package.json' assert { type: 'json' };
|
|||||||
import { CommandRegistry } from '../behaviors/interactionCreate.js';
|
import { CommandRegistry } from '../behaviors/interactionCreate.js';
|
||||||
import { SKILLED_COLOR } from '../constants/colors.js';
|
import { SKILLED_COLOR } from '../constants/colors.js';
|
||||||
import { client } from '../index.js';
|
import { client } from '../index.js';
|
||||||
|
import cmdName from '../utilities/cmdName.js';
|
||||||
import getClientId from '../utilities/getClientId.js';
|
import getClientId from '../utilities/getClientId.js';
|
||||||
import { tankAverages } from '../utilities/tankAverages.js';
|
import { tankAverages } from '../utilities/tankAverages.js';
|
||||||
import { tankopedia } from '../utilities/tankopedia.js';
|
import { tankopedia } from '../utilities/tankopedia.js';
|
||||||
@@ -11,11 +12,11 @@ const executionStart = new Date().getTime();
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
inProduction: true,
|
inProduction: true,
|
||||||
inDevelopment: true,
|
inDevelopment: false,
|
||||||
inPublic: true,
|
inPublic: true,
|
||||||
|
|
||||||
command: new SlashCommandBuilder()
|
command: new SlashCommandBuilder()
|
||||||
.setName('debug')
|
.setName(cmdName('debug'))
|
||||||
.setDescription('Debug information about the bot'),
|
.setDescription('Debug information about the bot'),
|
||||||
|
|
||||||
async execute(interaction) {
|
async execute(interaction) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import { BlitzServer } from '../constants/servers.js';
|
|||||||
import addIGNOption from '../utilities/addIGNOption.js';
|
import addIGNOption from '../utilities/addIGNOption.js';
|
||||||
import addServerChoices from '../utilities/addServerChoices.js';
|
import addServerChoices from '../utilities/addServerChoices.js';
|
||||||
import blitzLinks from '../utilities/blitzLinks.js';
|
import blitzLinks from '../utilities/blitzLinks.js';
|
||||||
|
import cmdName from '../utilities/cmdName.js';
|
||||||
import getBlitzAccount from '../utilities/getBlitzAccount.js';
|
import getBlitzAccount from '../utilities/getBlitzAccount.js';
|
||||||
import getBlitzStarsAccount from '../utilities/getBlitzStarsAccount.js';
|
import getBlitzStarsAccount from '../utilities/getBlitzStarsAccount.js';
|
||||||
import poweredByBlitzStars from '../utilities/poweredByBlitzStars.js';
|
import poweredByBlitzStars from '../utilities/poweredByBlitzStars.js';
|
||||||
@@ -21,7 +22,7 @@ export default {
|
|||||||
inPublic: false,
|
inPublic: false,
|
||||||
|
|
||||||
command: new SlashCommandBuilder()
|
command: new SlashCommandBuilder()
|
||||||
.setName('eligible')
|
.setName(cmdName('eligible'))
|
||||||
.setDescription("Gets the user's eligibility for Skilled clans")
|
.setDescription("Gets the user's eligibility for Skilled clans")
|
||||||
.addStringOption((option) =>
|
.addStringOption((option) =>
|
||||||
option
|
option
|
||||||
@@ -47,7 +48,6 @@ export default {
|
|||||||
const blitzStarsAccount = await getBlitzStarsAccount(
|
const blitzStarsAccount = await getBlitzStarsAccount(
|
||||||
interaction,
|
interaction,
|
||||||
blitzAccount.account_id,
|
blitzAccount.account_id,
|
||||||
name,
|
|
||||||
);
|
);
|
||||||
if (!blitzStarsAccount) return;
|
if (!blitzStarsAccount) return;
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ export default {
|
|||||||
)}'s shortcomings for ${CLANS[clan].name} (${
|
)}'s shortcomings for ${CLANS[clan].name} (${
|
||||||
clan === 'sklld' ? '30 days stats' : 'career stats'
|
clan === 'sklld' ? '30 days stats' : 'career stats'
|
||||||
}):\n\n${issues.join('\n')}`
|
}):\n\n${issues.join('\n')}`
|
||||||
}\n\n${blitzLinks(blitzStarsAccount)}`,
|
}\n\n${blitzLinks(server, blitzAccount.nickname)}`,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -7,14 +7,15 @@ import {
|
|||||||
} from '../behaviors/interactionCreate.js';
|
} from '../behaviors/interactionCreate.js';
|
||||||
import { SKILLED_COLOR } from '../constants/colors.js';
|
import { SKILLED_COLOR } from '../constants/colors.js';
|
||||||
import { client } from '../index.js';
|
import { client } from '../index.js';
|
||||||
|
import cmdName from '../utilities/cmdName.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
inProduction: true,
|
inProduction: true,
|
||||||
inDevelopment: true,
|
inDevelopment: false,
|
||||||
inPublic: true,
|
inPublic: true,
|
||||||
|
|
||||||
command: new SlashCommandBuilder()
|
command: new SlashCommandBuilder()
|
||||||
.setName('help')
|
.setName(cmdName('help'))
|
||||||
.setDescription('All the help you need about the bot'),
|
.setDescription('All the help you need about the bot'),
|
||||||
|
|
||||||
async execute(interaction) {
|
async execute(interaction) {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { ClanInfo } from '../types/clanInfo.js';
|
|||||||
import { Clan } from '../types/clanList.js';
|
import { Clan } from '../types/clanList.js';
|
||||||
import addServerChoices from '../utilities/addServerChoices.js';
|
import addServerChoices from '../utilities/addServerChoices.js';
|
||||||
import { args } from '../utilities/args.js';
|
import { args } from '../utilities/args.js';
|
||||||
|
import cmdName from '../utilities/cmdName.js';
|
||||||
import getClan from '../utilities/getClan.js';
|
import getClan from '../utilities/getClan.js';
|
||||||
import getWargamingResponse from '../utilities/getWargamingResponse.js';
|
import getWargamingResponse from '../utilities/getWargamingResponse.js';
|
||||||
|
|
||||||
@@ -15,11 +16,11 @@ const DEFAULT_THRESHOLD = 7;
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
inProduction: true,
|
inProduction: true,
|
||||||
inDevelopment: true,
|
inDevelopment: false,
|
||||||
inPublic: true,
|
inPublic: true,
|
||||||
|
|
||||||
command: new SlashCommandBuilder()
|
command: new SlashCommandBuilder()
|
||||||
.setName('inactive')
|
.setName(cmdName('inactive'))
|
||||||
.setDescription('Lists all inactive players')
|
.setDescription('Lists all inactive players')
|
||||||
.addStringOption((option) => addServerChoices(option).setRequired(true))
|
.addStringOption((option) => addServerChoices(option).setRequired(true))
|
||||||
.addStringOption((option) =>
|
.addStringOption((option) =>
|
||||||
|
|||||||
@@ -6,15 +6,16 @@ import { Players } from '../types/players.js';
|
|||||||
import addIGNOption from '../utilities/addIGNOption.js';
|
import addIGNOption from '../utilities/addIGNOption.js';
|
||||||
import addServerChoices from '../utilities/addServerChoices.js';
|
import addServerChoices from '../utilities/addServerChoices.js';
|
||||||
import { args } from '../utilities/args.js';
|
import { args } from '../utilities/args.js';
|
||||||
|
import cmdName from '../utilities/cmdName.js';
|
||||||
import getWargamingResponse from '../utilities/getWargamingResponse.js';
|
import getWargamingResponse from '../utilities/getWargamingResponse.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
inDevelopment: true,
|
inDevelopment: false,
|
||||||
inProduction: true,
|
inProduction: true,
|
||||||
inPublic: true,
|
inPublic: true,
|
||||||
|
|
||||||
command: new SlashCommandBuilder()
|
command: new SlashCommandBuilder()
|
||||||
.setName('searchplayers')
|
.setName(cmdName('searchplayers'))
|
||||||
.setDescription('Search players in a Blitz server')
|
.setDescription('Search players in a Blitz server')
|
||||||
.addStringOption(addServerChoices)
|
.addStringOption(addServerChoices)
|
||||||
.addStringOption(addIGNOption)
|
.addStringOption(addIGNOption)
|
||||||
|
|||||||
+116
-104
@@ -4,11 +4,12 @@ import { CommandRegistry } from '../behaviors/interactionCreate.js';
|
|||||||
import { SKILLED_COLOR } from '../constants/colors.js';
|
import { SKILLED_COLOR } from '../constants/colors.js';
|
||||||
import { BlitzServer } from '../constants/servers.js';
|
import { BlitzServer } from '../constants/servers.js';
|
||||||
import { AccountInfo, AllStats } from '../types/accountInfo.js';
|
import { AccountInfo, AllStats } from '../types/accountInfo.js';
|
||||||
import { PeriodStatistics, PlayerStatistics } from '../types/statistics.js';
|
import { BlitzStartsComputedPeriodicStatistics } from '../types/statistics.js';
|
||||||
import addIGNOption from '../utilities/addIGNOption.js';
|
import addIGNOption from '../utilities/addIGNOption.js';
|
||||||
import addServerChoices from '../utilities/addServerChoices.js';
|
import addServerChoices from '../utilities/addServerChoices.js';
|
||||||
import { args } from '../utilities/args.js';
|
import { args } from '../utilities/args.js';
|
||||||
import blitzLinks from '../utilities/blitzLinks.js';
|
import blitzLinks from '../utilities/blitzLinks.js';
|
||||||
|
import cmdName from '../utilities/cmdName.js';
|
||||||
import getBlitzAccount from '../utilities/getBlitzAccount.js';
|
import getBlitzAccount from '../utilities/getBlitzAccount.js';
|
||||||
import getBlitzStarsAccount from '../utilities/getBlitzStarsAccount.js';
|
import getBlitzStarsAccount from '../utilities/getBlitzStarsAccount.js';
|
||||||
import getWargamingResponse from '../utilities/getWargamingResponse.js';
|
import getWargamingResponse from '../utilities/getWargamingResponse.js';
|
||||||
@@ -16,13 +17,20 @@ import poweredByBlitzStars from '../utilities/poweredByBlitzStars.js';
|
|||||||
|
|
||||||
type Period = 'today' | '30' | '90' | 'career';
|
type Period = 'today' | '30' | '90' | 'career';
|
||||||
|
|
||||||
|
const daysInPeriod: Record<Period, number> = {
|
||||||
|
today: 1 * 24 * 60 * 60,
|
||||||
|
30: 30 * 24 * 60 * 60,
|
||||||
|
90: 90 * 24 * 60 * 60,
|
||||||
|
career: Infinity,
|
||||||
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
inProduction: true,
|
inProduction: true,
|
||||||
inDevelopment: true,
|
inDevelopment: false,
|
||||||
inPublic: true,
|
inPublic: true,
|
||||||
|
|
||||||
command: new SlashCommandBuilder()
|
command: new SlashCommandBuilder()
|
||||||
.setName('stats')
|
.setName(cmdName('stats'))
|
||||||
.setDescription("Gets the user's in-game statistics")
|
.setDescription("Gets the user's in-game statistics")
|
||||||
.addStringOption((option) =>
|
.addStringOption((option) =>
|
||||||
option
|
option
|
||||||
@@ -44,88 +52,21 @@ export default {
|
|||||||
const name = interaction.options.getString('name')!;
|
const name = interaction.options.getString('name')!;
|
||||||
const server = interaction.options.getString('server') as BlitzServer;
|
const server = interaction.options.getString('server') as BlitzServer;
|
||||||
const blitzAccount = await getBlitzAccount(interaction, name, server);
|
const blitzAccount = await getBlitzAccount(interaction, name, server);
|
||||||
|
|
||||||
if (!blitzAccount) return;
|
if (!blitzAccount) return;
|
||||||
|
let stats: BlitzStartsComputedPeriodicStatistics;
|
||||||
const blitzStarsAccount = (await getBlitzStarsAccount(
|
const accountInfo = await getWargamingResponse<AccountInfo>(
|
||||||
|
`https://api.wotblitz.${server}/wotb/account/info/?application_id=${args['wargaming-application-id']}&account_id=${blitzAccount.account_id}`,
|
||||||
|
);
|
||||||
|
if (!accountInfo) return;
|
||||||
|
const blitzStarsAccount = await getBlitzStarsAccount(
|
||||||
interaction,
|
interaction,
|
||||||
blitzAccount.account_id,
|
blitzAccount.account_id,
|
||||||
name,
|
);
|
||||||
)) as PlayerStatistics;
|
|
||||||
if (!blitzStarsAccount) return;
|
if (!blitzStarsAccount) return;
|
||||||
|
|
||||||
async function reply(stats: PeriodStatistics) {
|
if (period === 'today') {
|
||||||
await interaction.editReply({
|
|
||||||
embeds: [
|
|
||||||
poweredByBlitzStars(
|
|
||||||
new EmbedBuilder()
|
|
||||||
.setColor(SKILLED_COLOR)
|
|
||||||
.setTitle(
|
|
||||||
`${markdownEscape(blitzStarsAccount.nickname)}'s ${
|
|
||||||
period === 'career' ? period : `${period} day`
|
|
||||||
} stats`,
|
|
||||||
)
|
|
||||||
.setDescription(
|
|
||||||
`${
|
|
||||||
period === 'today'
|
|
||||||
? '**⚠ "Today" stats are in development. Some stats are not available/wrong.**\n\n'
|
|
||||||
: ''
|
|
||||||
}${[
|
|
||||||
['Winrate', `${stats.special.winrate.toFixed(2)}%`],
|
|
||||||
['Survival', `${stats.special.survivalRate.toFixed(2)}%`],
|
|
||||||
[
|
|
||||||
'Accuracy',
|
|
||||||
`${((stats.all.hits / stats.all.shots) * 100).toFixed(2)}%`,
|
|
||||||
],
|
|
||||||
['WN8', stats.wn8.toFixed(0)],
|
|
||||||
['WN7', stats.wn7.toFixed(0)],
|
|
||||||
[],
|
|
||||||
['Battles', stats.all.battles],
|
|
||||||
['Wins', stats.all.wins],
|
|
||||||
['Losses', stats.all.losses],
|
|
||||||
['Average tier', stats.avg_tier.toFixed(2)],
|
|
||||||
[],
|
|
||||||
[
|
|
||||||
'Shots per battle',
|
|
||||||
(stats.all.shots / stats.all.battles).toFixed(2),
|
|
||||||
],
|
|
||||||
['Hits per battle', stats.special.hpb.toFixed(2)],
|
|
||||||
['Damage per battle', stats.special.dpb.toFixed(0)],
|
|
||||||
['Kills per battle', stats.special.kpb.toFixed(2)],
|
|
||||||
['Spots per battle', stats.special.spb.toFixed(2)],
|
|
||||||
[
|
|
||||||
'XP per battle',
|
|
||||||
(stats.all.xp / stats.all.battles).toFixed(0),
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
['Damage ratio', stats.special.damageRatio.toFixed(2)],
|
|
||||||
['Kills to death ratio', stats.special.kdr.toFixed(2)],
|
|
||||||
]
|
|
||||||
.filter((array) => array[1] !== `${-Infinity}`)
|
|
||||||
.map((array) =>
|
|
||||||
array.length === 0 ? '' : `**${array[0]}**: ${array[1]}`,
|
|
||||||
)
|
|
||||||
.join('\n')}\n\n${blitzLinks(blitzStarsAccount)}`,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log(`Showing ${blitzStarsAccount.nickname}'s ${period} stats`);
|
|
||||||
}
|
|
||||||
|
|
||||||
let stats: PeriodStatistics | null = null;
|
|
||||||
|
|
||||||
if (period === 'career') {
|
|
||||||
stats = blitzStarsAccount.statistics;
|
|
||||||
} else if (period === 'today') {
|
|
||||||
const accountInfo = await getWargamingResponse<AccountInfo>(
|
|
||||||
`https://api.wotblitz.${server}/wotb/account/info/?application_id=${args['wargaming-application-id']}&account_id=${blitzAccount.account_id}`,
|
|
||||||
);
|
|
||||||
|
|
||||||
const a1 = blitzStarsAccount.statistics;
|
const a1 = blitzStarsAccount.statistics;
|
||||||
const a2 = accountInfo[blitzAccount.account_id].statistics;
|
const a2 = accountInfo[blitzAccount.account_id].statistics;
|
||||||
|
|
||||||
const battles = a2.all.battles - a1.all.battles;
|
const battles = a2.all.battles - a1.all.battles;
|
||||||
|
|
||||||
function pb(value: (allStats: AllStats) => number) {
|
function pb(value: (allStats: AllStats) => number) {
|
||||||
@@ -159,41 +100,112 @@ export default {
|
|||||||
max_xp: pb((a) => a.max_xp),
|
max_xp: pb((a) => a.max_xp),
|
||||||
max_xp_tank_id: pb((a) => a.max_xp_tank_id),
|
max_xp_tank_id: pb((a) => a.max_xp_tank_id),
|
||||||
shots: diff((a) => a.shots),
|
shots: diff((a) => a.shots),
|
||||||
spotted: pb((a) => a.spotted),
|
spotted: diff((a) => a.spotted),
|
||||||
survived_battles: pb((a) => a.survived_battles),
|
survived_battles: diff((a) => a.survived_battles),
|
||||||
win_and_survived: pb((a) => a.win_and_survived),
|
win_and_survived: diff((a) => a.win_and_survived),
|
||||||
wins: diff((a) => a.wins),
|
wins: diff((a) => a.wins),
|
||||||
xp: diff((a) => a.xp),
|
xp: diff((a) => a.xp),
|
||||||
},
|
},
|
||||||
special: {
|
|
||||||
winrate: pb((a) => a.wins) * 100,
|
|
||||||
dpb: pb((a) => a.damage_dealt),
|
|
||||||
survivalRate: pb((a) => a.survived_battles) * 100,
|
|
||||||
damageRatio: span(
|
|
||||||
(a) => a.damage_dealt,
|
|
||||||
(a) => a.damage_received,
|
|
||||||
),
|
|
||||||
hitRate: pb((a) => a.hits / a.shots),
|
|
||||||
hpb: pb((a) => a.hits),
|
|
||||||
kdr:
|
|
||||||
diff((a) => a.frags) / diff((a) => a.battles - a.survived_battles),
|
|
||||||
kpb: pb((a) => a.frags),
|
|
||||||
spb: pb((a) => a.spotted),
|
|
||||||
},
|
|
||||||
|
|
||||||
avg_tier: -Infinity,
|
avg_tier: -Infinity,
|
||||||
pwp: -Infinity,
|
|
||||||
wn7: -Infinity,
|
wn7: -Infinity,
|
||||||
wn8: -Infinity,
|
wn8: -Infinity,
|
||||||
};
|
};
|
||||||
|
|
||||||
reply(stats);
|
|
||||||
} else {
|
} else {
|
||||||
stats = blitzStarsAccount[`period${period}d`];
|
stats =
|
||||||
|
period === 'career'
|
||||||
|
? blitzStarsAccount.statistics
|
||||||
|
: blitzStarsAccount[`period${period}d`];
|
||||||
}
|
}
|
||||||
|
if (!stats!) return;
|
||||||
|
|
||||||
if (stats) {
|
await interaction.editReply({
|
||||||
reply(stats);
|
embeds: [
|
||||||
}
|
poweredByBlitzStars(
|
||||||
|
new EmbedBuilder()
|
||||||
|
.setColor(SKILLED_COLOR)
|
||||||
|
.setTitle(
|
||||||
|
`${markdownEscape(blitzAccount.nickname)}'s ${
|
||||||
|
period === 'career' ? period : `${period} day`
|
||||||
|
} stats`,
|
||||||
|
)
|
||||||
|
.setDescription(
|
||||||
|
`${
|
||||||
|
period === 'today'
|
||||||
|
? '**⚠ "Today" stats are in development. Some stats are not available/wrong.**\n\n'
|
||||||
|
: ''
|
||||||
|
}${[
|
||||||
|
[
|
||||||
|
'Winrate',
|
||||||
|
`${(100 * (stats.all.wins / stats.all.battles)).toFixed(2)}%`,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'Survival',
|
||||||
|
`${(
|
||||||
|
100 *
|
||||||
|
(stats.all.survived_battles / stats.all.battles)
|
||||||
|
).toFixed(2)}%`,
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'Accuracy',
|
||||||
|
`${((stats.all.hits / stats.all.shots) * 100).toFixed(2)}%`,
|
||||||
|
],
|
||||||
|
['WN8', stats.wn8.toFixed(0)],
|
||||||
|
['WN7', stats.wn7.toFixed(0)],
|
||||||
|
[],
|
||||||
|
['Battles', stats.all.battles],
|
||||||
|
['Wins', stats.all.wins],
|
||||||
|
['Losses', stats.all.losses],
|
||||||
|
['Average tier', stats.avg_tier.toFixed(2)],
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
'Shots per battle',
|
||||||
|
(stats.all.shots / stats.all.battles).toFixed(2),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'Hits per battle',
|
||||||
|
(stats.all.hits / stats.all.battles).toFixed(2),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'Damage per battle',
|
||||||
|
(stats.all.damage_dealt / stats.all.battles).toFixed(0),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'Kills per battle',
|
||||||
|
(stats.all.frags / stats.all.battles).toFixed(2),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'Spots per battle',
|
||||||
|
(stats.all.spotted / stats.all.battles).toFixed(2),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'XP per battle',
|
||||||
|
(stats.all.xp / stats.all.battles).toFixed(0),
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
'Damage ratio',
|
||||||
|
(stats.all.damage_dealt / stats.all.damage_received).toFixed(
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'Kills to death ratio',
|
||||||
|
(
|
||||||
|
stats.all.frags /
|
||||||
|
(stats.all.battles - stats.all.survived_battles)
|
||||||
|
).toFixed(2),
|
||||||
|
],
|
||||||
|
]
|
||||||
|
.filter((array) => array[1] !== `${-Infinity}`)
|
||||||
|
.map((array) =>
|
||||||
|
array.length === 0 ? '' : `**${array[0]}**: ${array[1]}`,
|
||||||
|
)
|
||||||
|
.join('\n')}\n\n${blitzLinks(server, blitzAccount.nickname)}`,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(`Showing stats for ${blitzAccount.nickname}`);
|
||||||
},
|
},
|
||||||
} satisfies CommandRegistry;
|
} satisfies CommandRegistry;
|
||||||
@@ -7,6 +7,7 @@ import { TanksStats } from '../types/tanksStats.js';
|
|||||||
import addIGNOption from '../utilities/addIGNOption.js';
|
import addIGNOption from '../utilities/addIGNOption.js';
|
||||||
import addServerChoices from '../utilities/addServerChoices.js';
|
import addServerChoices from '../utilities/addServerChoices.js';
|
||||||
import { args } from '../utilities/args.js';
|
import { args } from '../utilities/args.js';
|
||||||
|
import cmdName from '../utilities/cmdName.js';
|
||||||
import getBlitzAccount from '../utilities/getBlitzAccount.js';
|
import getBlitzAccount from '../utilities/getBlitzAccount.js';
|
||||||
import getWargamingResponse from '../utilities/getWargamingResponse.js';
|
import getWargamingResponse from '../utilities/getWargamingResponse.js';
|
||||||
import { TANK_TYPE_EMOJIS, tankopedia } from '../utilities/tankopedia.js';
|
import { TANK_TYPE_EMOJIS, tankopedia } from '../utilities/tankopedia.js';
|
||||||
@@ -34,11 +35,11 @@ const COMP_TANKS = [
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
inProduction: true,
|
inProduction: true,
|
||||||
inDevelopment: true,
|
inDevelopment: false,
|
||||||
inPublic: true,
|
inPublic: true,
|
||||||
|
|
||||||
command: new SlashCommandBuilder()
|
command: new SlashCommandBuilder()
|
||||||
.setName('tanks')
|
.setName(cmdName('tanks'))
|
||||||
.setDescription("Shows a player's owned tanks")
|
.setDescription("Shows a player's owned tanks")
|
||||||
.addIntegerOption((option) =>
|
.addIntegerOption((option) =>
|
||||||
option
|
option
|
||||||
|
|||||||
@@ -8,16 +8,17 @@ import { PlayerClanData } from '../types/playerClanData.js';
|
|||||||
import addIGNOption from '../utilities/addIGNOption.js';
|
import addIGNOption from '../utilities/addIGNOption.js';
|
||||||
import addServerChoices from '../utilities/addServerChoices.js';
|
import addServerChoices from '../utilities/addServerChoices.js';
|
||||||
import { args } from '../utilities/args.js';
|
import { args } from '../utilities/args.js';
|
||||||
|
import cmdName from '../utilities/cmdName.js';
|
||||||
import getBlitzAccount from '../utilities/getBlitzAccount.js';
|
import getBlitzAccount from '../utilities/getBlitzAccount.js';
|
||||||
import getWargamingResponse from '../utilities/getWargamingResponse.js';
|
import getWargamingResponse from '../utilities/getWargamingResponse.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
inProduction: true,
|
inProduction: true,
|
||||||
inDevelopment: true,
|
inDevelopment: false,
|
||||||
inPublic: true,
|
inPublic: true,
|
||||||
|
|
||||||
command: new SlashCommandBuilder()
|
command: new SlashCommandBuilder()
|
||||||
.setName('verify')
|
.setName(cmdName('verify'))
|
||||||
.setDescription("Set's the user's username to their in-game name")
|
.setDescription("Set's the user's username to their in-game name")
|
||||||
.addStringOption(addServerChoices)
|
.addStringOption(addServerChoices)
|
||||||
.addStringOption(addIGNOption),
|
.addStringOption(addIGNOption),
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import errorEmbed from '../utilities/errorEmbed.js';
|
import errorEmbed from './errorEmbed.js';
|
||||||
|
|
||||||
export const badNicknameFormat = errorEmbed(
|
export const badNicknameFormat = errorEmbed(
|
||||||
'Bad nickname format',
|
'Bad nickname format',
|
||||||
|
|||||||
File renamed without changes.
@@ -1,4 +1,4 @@
|
|||||||
import errorEmbed from '../utilities/errorEmbed.js';
|
import errorEmbed from './errorEmbed.js';
|
||||||
|
|
||||||
export const noMember = errorEmbed(
|
export const noMember = errorEmbed(
|
||||||
'User of command is not a member',
|
'User of command is not a member',
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
import errorEmbed from './errorEmbed.js';
|
||||||
|
|
||||||
|
export const notTrackedByBlitzStars = errorEmbed(
|
||||||
|
'No data to display',
|
||||||
|
'Player is not tracked by BlitzStars.',
|
||||||
|
);
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { AllStats } from './accountInfo.js';
|
import { BlitzStartsComputedPeriodicStatistics } from './statistics.js';
|
||||||
|
|
||||||
export type PlayerStats = {
|
export type PlayerStats = {
|
||||||
clan: {
|
clan: {
|
||||||
@@ -6,12 +6,7 @@ export type PlayerStats = {
|
|||||||
name: string;
|
name: string;
|
||||||
tag: string;
|
tag: string;
|
||||||
};
|
};
|
||||||
statistics: {
|
statistics: BlitzStartsComputedPeriodicStatistics;
|
||||||
all: AllStats;
|
|
||||||
wn8: number;
|
|
||||||
wn7: number;
|
|
||||||
average_tier: number;
|
|
||||||
};
|
|
||||||
_id: string;
|
_id: string;
|
||||||
last_battle_time: number;
|
last_battle_time: number;
|
||||||
nickname: string;
|
nickname: string;
|
||||||
|
|||||||
@@ -1,16 +1,20 @@
|
|||||||
import { AllStats, SpecialStats } from './accountInfo.js';
|
import { AllStats, SpecialStats } from './accountInfo.js';
|
||||||
|
|
||||||
export interface PeriodStatistics {
|
export interface BlitzStartsComputedPeriodicStatistics {
|
||||||
all: AllStats;
|
all: AllStats;
|
||||||
special: SpecialStats;
|
|
||||||
|
|
||||||
wn7: number;
|
wn7: number;
|
||||||
wn8: number;
|
wn8: number;
|
||||||
avg_tier: number;
|
avg_tier: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PeriodStatistics
|
||||||
|
extends BlitzStartsComputedPeriodicStatistics {
|
||||||
|
special: SpecialStats;
|
||||||
pwp: number;
|
pwp: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PlayerStatistics {
|
export interface PlayerPeriodicStatsCollection {
|
||||||
statistics: PeriodStatistics;
|
statistics: PeriodStatistics;
|
||||||
period30d: PeriodStatistics;
|
period30d: PeriodStatistics;
|
||||||
period90d: PeriodStatistics;
|
period90d: PeriodStatistics;
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
import { PlayerStatistics } from '../types/statistics.js';
|
import { BlitzServer } from '../constants/servers.js';
|
||||||
|
|
||||||
export default function blitzLinks(data?: PlayerStatistics) {
|
export default function blitzLinks(server: BlitzServer, nickname: string) {
|
||||||
return `${
|
return `[View full stats](https://www.blitzstars.com/player/${server}/${nickname}) • [Support BlitzStars](https://www.blitzstars.com/supporters)`;
|
||||||
data
|
|
||||||
? `[View full stats](https://www.blitzstars.com/player/${data.region}/${data.nickname}) • `
|
|
||||||
: ''
|
|
||||||
}[Support BlitzStars](https://www.blitzstars.com/supporters)`;
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import isDev from './isDev.js';
|
||||||
|
|
||||||
|
export default function cmdName(name: string) {
|
||||||
|
return isDev() ? `${name}dev` : name;
|
||||||
|
}
|
||||||
@@ -1,34 +1,27 @@
|
|||||||
import { CacheType, ChatInputCommandInteraction } from 'discord.js';
|
import { CacheType, ChatInputCommandInteraction } from 'discord.js';
|
||||||
import markdownEscape from 'markdown-escape';
|
|
||||||
import fetch from 'node-fetch';
|
import fetch from 'node-fetch';
|
||||||
import { PlayerStatistics } from '../types/statistics.js';
|
import { notTrackedByBlitzStars } from '../embeds/notTrackedByBlitzStars.js';
|
||||||
import errorEmbed from './errorEmbed.js';
|
import { PlayerPeriodicStatsCollection } from '../types/statistics.js';
|
||||||
|
|
||||||
export default async function getBlitzStarsAccount(
|
export default async function getBlitzStarsAccount(
|
||||||
interaction: ChatInputCommandInteraction<CacheType>,
|
interaction: ChatInputCommandInteraction<CacheType>,
|
||||||
accountId: number,
|
accountId: number,
|
||||||
name: string,
|
|
||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
`https://www.blitzstars.com/api/top/player/${accountId}`,
|
`https://www.blitzstars.com/api/top/player/${accountId}`,
|
||||||
);
|
);
|
||||||
const parsed = (await response.json()) as PlayerStatistics;
|
const parsed = (await response.json()) as PlayerPeriodicStatsCollection;
|
||||||
|
|
||||||
if (parsed.statistics) {
|
if (parsed.statistics) {
|
||||||
return parsed;
|
return parsed;
|
||||||
} else throw new Error('No data to display');
|
} else throw new Error('No data to display');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
await interaction.editReply({
|
await interaction.editReply({
|
||||||
embeds: [
|
embeds: [notTrackedByBlitzStars],
|
||||||
errorEmbed(
|
|
||||||
'No data to display',
|
|
||||||
`${markdownEscape(name)} is not tracked by BlitzStars.`,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log(`${name} is not tracked by BlitzStars.`);
|
console.log(`Not tracked by BlitzStars.`);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ export default async function getWargamingResponse<Data extends object>(
|
|||||||
if (parsed.status === 'ok') {
|
if (parsed.status === 'ok') {
|
||||||
return parsed.data;
|
return parsed.data;
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`Wargaming response status ${parsed.status}`);
|
console.error(`Wargaming response status ${parsed.status}`);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user