fix: no cross-bot imports

This commit is contained in:
TrèsAbhi committed 2024-09-07 23:00:56 -05:00
1 parent 6c0b46725d
commit 7c6f381bbe
58 files changed
+233 -252

No files matched your search

@@ -0,0 +1,45 @@
import { tankDefinitions, tankNames } from '@blitzkit/core';
import { Locale } from 'discord.js';
import { go } from 'fuzzysort';
import markdownEscape from 'markdown-escape';
import { UserError } from '../../../../website/src/hooks/userError';
import { tankNamesTechTreeOnly } from '../discord/autocompleteTanks';
import { translator } from '../localization/translator';
export default async function resolveTankId(
tank: string | number,
locale: Locale,
techTreeOnly = false,
) {
const { translate } = translator(locale);
const number = typeof tank === 'string' ? Number(tank) : tank;
if (Number.isNaN(number)) {
const searchResult = go(
`${tank}`,
await (techTreeOnly ? tankNamesTechTreeOnly : tankNames),
{
keys: ['searchableName', 'searchableNameDeburr', 'camouflages'],
limit: 1,
},
);
if (searchResult.length === 0) {
throw new UserError(
translate('bot.common.errors.tank_name_not_found', [
markdownEscape(`${tank}`),
]),
);
} else {
return searchResult[0].obj.id;
}
} else {
if ((await tankDefinitions)[number]) {
return number;
} else {
throw new UserError(
translate('bot.common.errors.tank_id_not_found', [`${number}`]),
);
}
}
}
@@ -0,0 +1,32 @@
import {
StatFilters,
tankDefinitions,
Tier,
TIER_ROMAN_NUMERALS,
} from '@blitzkit/core';
import { Locale } from 'discord.js';
import { translator } from '../localization/translator';
export async function filtersToDescription(
{ nation, tier, tankType, treeType, tank }: StatFilters,
locale: Locale,
) {
const { translate } = translator(locale);
const awaitedTankDefinitions = await tankDefinitions;
const info: string[] = [];
// TODO: somehow localize tank names?
if (tank) return awaitedTankDefinitions[tank].name;
if (nation) info.push(translate(`common.nations.${nation}`));
if (tier) {
info.push(
translate('bot.common.filters.tier', [TIER_ROMAN_NUMERALS[tier as Tier]]),
);
}
if (tankType) info.push(translate(`common.tank_class_short.${tankType}`));
if (treeType) info.push(translate(`common.tree_type.${treeType}`));
return info.length === 0
? translate('bot.common.filters.none')
: info.join(', ');
}
@@ -0,0 +1,29 @@
import { usersDatabase } from '@blitzkit/core';
import { client } from '../discord/client';
const EXIT_EVENTS = [
'beforeExit',
'exit',
'SIGINT',
'SIGTERM',
'SIGUSR1',
'SIGUSR2',
];
async function cleanup() {
console.log('Cleaning up...');
await Promise.all([usersDatabase.$disconnect(), client.destroy()]);
console.log('Gracefully exiting...');
EXIT_EVENTS.forEach((event) => process.off(event, cleanup));
process.exit(0);
}
export function registerProcesses() {
process.on('uncaughtException', console.error);
client.on('error', console.error);
EXIT_EVENTS.forEach((event) => process.on(event, cleanup));
}
@@ -0,0 +1,18 @@
import { Region } from '@blitzkit/core';
import { getAccountInfo } from '../../../../website/src/core/blitz/getAccountInfo';
import buttonLink from '../discord/buttonLink';
export async function getBlitzStarsLinkButton(
region: Region,
id: number,
tankId?: number,
) {
const { nickname } = await getAccountInfo(region, id);
return buttonLink(
`https://www.blitzstars.com/player/${region}/${nickname}${
tankId ? `/tank/${tankId!}` : ''
}`,
'BlitzStars',
);
}
@@ -0,0 +1,63 @@
import { Region, emptyAllStats } from '@blitzkit/core';
import { getAccountInfo } from '../../../../website/src/core/blitz/getAccountInfo';
import {
GetHistoriesOptions,
Histories,
History,
getHistoriesDefaultOptions,
} from '../../types/histories';
import { PlayerStats } from './getPlayerStats';
export default async function getPlayerHistories(
server: Region,
id: number,
options?: Partial<GetHistoriesOptions>,
) {
const mergedOptions = { ...getHistoriesDefaultOptions, ...options };
const response = await fetch(
`https://www.blitzstars.com/api/playerstats/${id}`,
);
const playerHistories = ((await response.json()) as PlayerStats).map(
(history) =>
({
all: history.statistics.all,
last_battle_time: history.last_battle_time,
}) satisfies History,
);
let lastNonCompliantIndex = -1;
let hasCompliedOnce = false;
const filtered = playerHistories.filter(({ last_battle_time }, index) => {
const complies =
last_battle_time >= mergedOptions.start &&
last_battle_time <= mergedOptions.end;
if (complies && !hasCompliedOnce) hasCompliedOnce = true;
if (!hasCompliedOnce) lastNonCompliantIndex = index;
return complies;
});
const latestNodes: Histories = [];
if (mergedOptions.includeLatestHistories) {
const { last_battle_time, statistics } = await getAccountInfo(server, id);
latestNodes.push({ all: statistics.all, last_battle_time });
}
const previousNodes: Histories = [];
if (mergedOptions.includePreviousHistories) {
if (lastNonCompliantIndex !== -1) {
previousNodes.push(
playerHistories[lastNonCompliantIndex] ??
({
all: emptyAllStats,
last_battle_time: -Infinity,
} satisfies History),
);
}
}
return [...latestNodes, ...filtered, ...previousNodes] satisfies Histories;
}
@@ -0,0 +1,37 @@
import { BlitzStats, Region } from '@blitzkit/core';
interface IndividualPlayerStats {
clan: { clan_id: number; name: string; tag: string };
statistics: {
all: BlitzStats;
wn8: number;
wn7: number;
average_tier: number;
};
last_battle_time: number;
nickname: string;
account_id: number;
achievements: {
account_id: number;
[key: string]: number;
};
region: Region;
}
export type PlayerStats = IndividualPlayerStats[];
export async function getPlayerStats<
Ids extends number | number[],
ReturnType = Ids extends number ? PlayerStats : PlayerStats[],
>(region: Region, ids: Ids) {
const stats = await Promise.all(
((typeof ids === 'number' ? [ids] : ids) as number[]).map((id) =>
fetch(`https://www.blitzstars.com/api/playerstats/${id}`).then(
(response) => response.json() as Promise<PlayerStats>,
),
),
);
if (typeof ids === 'number') return stats[0] as ReturnType;
return stats as ReturnType;
}
@@ -1,4 +1,5 @@
import { BlitzStats, emptyAllStats, Region } from '@blitzkit/core';
import { DiffedTankStats } from '@blitzkit/core/src/statistics/filterStats';
import { Locale } from 'discord.js';
import getTankHistories, {
TankHistories,
@@ -14,11 +15,6 @@ const emptyTankHistoryNode: TankHistoryRaw = {
all: emptyAllStats,
};
export interface DiffedTankStats {
diff: Record<number, BlitzStats>;
order: number[];
}
// BIG TODO: merge this neatly with diffNormalizedTankStats
export default async function getStatsInPeriod(
server: Region,
@@ -1,9 +1,9 @@
import searchClansAcrossRegions from '@blitzkit/core/src/blitz/searchClansAcrossRegions';
import {
ApplicationCommandOptionChoiceData,
AutocompleteInteraction,
CacheType,
} from 'discord.js';
import searchClansAcrossRegions from '../../../../../website/src/core/blitz/searchClansAcrossRegions';
import { translator } from '../../localization/translator';
import { DISCORD_CHOICES_MAX_NAME_SIZE, OVERFLOW_SUFFIX } from './constants';
@@ -1,6 +1,6 @@
import { StatFilters, TreeType } from '@blitzkit/core';
import { ChatInputCommandInteraction } from 'discord.js';
import resolveTankId from '../../../../website/src/core/blitz/resolveTankId';
import resolveTankId from '../blitz/resolveTankId';
export async function getFiltersFromCommand(
interaction: ChatInputCommandInteraction,
@@ -1,7 +1,7 @@
import { Region } from '@blitzkit/core';
import searchClansAcrossRegions from '@blitzkit/core/src/blitz/searchClansAcrossRegions';
import { ChatInputCommandInteraction } from 'discord.js';
import markdownEscape from 'markdown-escape';
import searchClansAcrossRegions from '../../../../website/src/core/blitz/searchClansAcrossRegions';
import { UserError } from '../../../../website/src/hooks/userError';
import { translator } from '../localization/translator';
import { serverAndIdPattern } from './resolvePlayerFromCommand/constants';