Compare commits

...
30 Commits
Author SHA1 Message Date
tresabhi 4e513998a9 feat: logs 2024-12-13 16:14:16 -06:00
tresabhi df34226a22 feat: more features 2024-12-13 16:11:43 -06:00
tresabhi 2f7f2362bb feat: auction command 2024-12-13 10:58:16 -06:00
TrèsAbhi a78543c60f Update rating-eu.yml 2024-12-08 00:51:35 -06:00
TrèsAbhi 00783749ba Update rating-asia.yml 2024-12-08 00:51:15 -06:00
TrèsAbhi 9aba91a773 Update rating-na.yml 2024-12-08 00:50:54 -06:00
TrèsAbhi dd3c86aa5b Update rating-na.yml 2024-12-02 13:43:26 -06:00
TrèsAbhi f770ba0e5e Update rating-eu.yml 2024-12-02 13:43:06 -06:00
TrèsAbhi c444210294 Update rating-asia.yml 2024-12-02 13:42:50 -06:00
TrèsAbhi 84dcfe4a14 Update rating-na.yml 2024-11-30 20:11:48 -06:00
TrèsAbhi 7a3541439b Update rating-eu.yml 2024-11-30 20:11:32 -06:00
TrèsAbhi 7ab8a01fb6 Update rating-asia.yml 2024-11-30 20:11:17 -06:00
TrèsAbhi 88729e0eca Update host-bot.yml 2024-11-29 23:26:21 -06:00
tresabhi 63a6e47878 fix: let's see 2024-11-29 19:12:52 -06:00
tresabhi 984dad4111 fix: let's see 2024-11-29 19:11:16 -06:00
TrèsAbhi 2540b71fb7 Merge pull request #131 from tresabhi/l10n_main
New Crowdin updates
2024-11-29 17:19:15 -06:00
tresabhi 80fca2e53a fix: react 2024-11-29 12:50:15 -06:00
tresabhi 4d0ca1cd1a fix: preserve jsx 2024-11-29 12:45:03 -06:00
tresabhi 50aeb01e0a fix: env 2024-11-29 12:37:32 -06:00
tresabhi a1a218c325 fix: isntall sharp 2024-11-29 12:33:26 -06:00
tresabhi e560754bb6 feat: external sharp 2024-11-29 12:28:36 -06:00
tresabhi dbc23c6473 fix: PUBLIC_ASSET_BRANCH 2024-11-29 12:15:30 -06:00
tresabhi a2bd62da92 fix: PUBLIC_ASSET_REPO 2024-11-29 12:13:58 -06:00
tresabhi c0d16b51de fix: use import.meta.env. 2024-11-29 12:11:51 -06:00
tresabhi d68870c254 fix: move env up 2024-11-29 12:10:37 -06:00
TrèsAbhi d91b46d730 New translations en-us.json (Croatian (disambiguation)) 2024-11-29 12:10:10 -06:00
TrèsAbhi 0758f0d8aa New translations en-us.json (Spanish) 2024-11-29 12:10:09 -06:00
tresabhi eacd63d472 feat: non-discrete json 2024-11-29 12:06:23 -06:00
tresabhi 39240e908d fix: locale 2024-11-29 12:01:21 -06:00
tresabhi 2f734c237b fix: include langs 2024-11-29 11:56:22 -06:00
29 changed files with 227 additions and 39 deletions

No files matched your search

+17 -10
View File
@@ -13,14 +13,22 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }}
PUBLIC_ASSET_BRANCH: ${{ secrets.PUBLIC_ASSET_BRANCH }}
PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }}
jobs:
host:
runs-on: ubuntu-latest
steps:
- uses: oven-sh/setup-bun@v1
with:
bun-version: 1.1.33
# with:
# bun-version: 1.1.33
- name: Download release assets
run: |
@@ -32,12 +40,11 @@ jobs:
mkdir -p dist/bot
unzip bot.zip -d dist/bot
- name: Install sharp
run: bun init -y && bun add sharp
- name: Move directories
run: mv dist/bot/prisma .
- name: Run bot
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }}
run: |
mv dist/bot/prisma .
bun dist/bot/main.js
run: bun run dist/bot/main.js
+2
View File
@@ -19,8 +19,10 @@ jobs:
- name: Generate leaderboard
env:
PUBLIC_ASSET_BRANCH: main
PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }}
DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }}
run: bun build:ratingleaderboard --region=asia
+2
View File
@@ -19,8 +19,10 @@ jobs:
- name: Generate leaderboard
env:
PUBLIC_ASSET_BRANCH: main
PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }}
DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }}
run: bun build:ratingleaderboard --region=eu
+2
View File
@@ -19,8 +19,10 @@ jobs:
- name: Generate leaderboard
env:
PUBLIC_ASSET_BRANCH: main
PUBLIC_ASSET_REPO: ${{ secrets.PUBLIC_ASSET_REPO }}
DISCORD_CLIENT_ID: ${{ secrets.DISCORD_CLIENT_ID }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
DISCORD_TOKEN: ${{ secrets.DISCORD_TOKEN }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
PUBLIC_WARGAMING_APPLICATION_ID: ${{ secrets.PUBLIC_WARGAMING_APPLICATION_ID }}
run: bun build:ratingleaderboard --region=com
BIN
View File
Binary file not shown.
+9
View File
@@ -0,0 +1,9 @@
# BlitzKit 1.26.1
The auctions are here!
## Features
- Added the `/auction` command
- No need to login or go to the official website, just use `/auction`
- Everything built into Discord, one step at a time!
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "blitzkit",
"private": true,
"version": "1.26.0",
"version": "1.26.1",
"description": "🎉 Tools for everything World of Tanks Blitz",
"type": "module",
"types": "./types.d.ts",
+1 -1
View File
@@ -7,7 +7,7 @@
"@blitzkit/core": "workspace:*",
"satori": "^0.10.14",
"@resvg/resvg-js": "^2.6.2",
"discord.js": "^14.15.3",
"discord.js": "^14.16.3",
"react": "^18.3.1",
"@radix-ui/colors": "^3.0.0",
"fuzzysort": "^2.0.4",
+128
View File
@@ -0,0 +1,128 @@
import {
BlitzTankClass,
Region,
regionToRegionSubdomain,
} from '@blitzkit/core';
import { tankDefinitions } from '../core/blitzkit/nonBlockingPromises';
import { createLocalizedCommand } from '../core/discord/createLocalizedCommand';
import { translator } from '../core/localization/translator';
import { CommandRegistry } from '../events/interactionCreate';
interface Auction {
count: number;
has_next: boolean;
results: Result[];
}
type Result =
| {
id?: number;
type: 'vehicle';
countable?: boolean;
entity?: Entity;
initial_count?: number;
current_count?: number;
saleable?: boolean;
available_from?: Date;
available_before?: Date;
price?: Price;
next_price?: Price | null;
available: true;
display?: boolean;
next_price_datetime: Date;
next_price_timestamp: number;
}
| {
available: false;
type: 'vehicle';
};
interface Entity {
id: number;
name: string;
nation: string;
subnation: string;
use_subnation_flag: boolean;
type_slug: BlitzTankClass;
level: number;
roman_level: string;
user_string: string;
image_url: string;
preview_image_url: string;
is_premium: boolean;
is_collectible: boolean;
}
interface Price {
currency: Currency;
value: number;
}
interface Currency {
name: 'gold';
count: number;
title: 'Gold';
image_url: string;
sizes: unknown;
type: 'currency';
}
export const auctionCommand = new Promise<CommandRegistry>((resolve) => {
resolve({
command: createLocalizedCommand('auction'),
async handler(interaction) {
const { t, translate } = translator(interaction.locale);
const awaitedTankDefinitions = await tankDefinitions;
const region: Region = 'com';
const pageSize = 80;
const saleable = true;
const data = await fetch(
`https://${regionToRegionSubdomain(
region,
)}.wotblitz.com/en/api/events/items/auction/?page_size=${
pageSize
}&type[]=vehicle&saleable=${saleable}`,
).then((response) => response.json() as Promise<Auction>);
const saleableTanks = data.results.filter((result) => result.available);
if (saleableTanks.length === 0) {
return t`bot.commands.auction.errors.no_auction`;
}
const nextPricesTimestamp = saleableTanks[0].next_price_timestamp;
const title = `# ${t`bot.commands.auction.body.title`}`;
const subtitle = `${translate('bot.commands.auction.body.subtitle', [
`${saleableTanks.length} / ${data.results.length}`,
`<t:${nextPricesTimestamp}:R>`,
'<https://wotblitz.com/auction/>',
])}`;
const body = saleableTanks
.map((data, index) => {
const tank = awaitedTankDefinitions.tanks[data.entity!.id];
if (!tank) return '';
const name = `[${tank.name}](<https://blitzkit.app/tools/tankopedia/${
tank.id
}>)`;
const next = translate('bot.commands.auction.body.next', [
`<:gold:1317173197082333244> ${data.next_price!.value.toLocaleString(
interaction.locale,
)}`,
]);
return `${
index + 1
}. ${name} <:gold:1317173197082333244> ${data.price!.value.toLocaleString(
interaction.locale,
)}\n-# ${next}`;
})
.join('\n\n');
const content = `${title}\n${subtitle}\n\n${body}`;
return content;
},
});
});
+1 -1
View File
@@ -1,4 +1,4 @@
import packageJSON from '../../../../package.json' assert { type: 'json' };
import packageJSON from '../../../../package.json';
import { client } from '../core/discord/client';
import { createLocalizedCommand } from '../core/discord/createLocalizedCommand';
import { translator } from '../core/localization/translator';
+1 -1
View File
@@ -2,5 +2,5 @@ import { assertSecret } from '@blitzkit/core';
import { ShardingManager } from 'discord.js';
export const manager = new ShardingManager('dist/bot/workers/bot.js', {
token: assertSecret(process.env.DISCORD_TOKEN),
token: assertSecret(import.meta.env.DISCORD_TOKEN),
});
@@ -13,7 +13,7 @@ export const translations = SUPPORTED_LOCALES.reduce<
>(
(table, locale) => ({
...table,
[locale]: require(`@blitzkit/core/lang/${locale}.json`),
[locale]: require(`../../../../../core/lang/${locale}.json`),
}),
{},
);
@@ -15,6 +15,7 @@ import {
SlashCommandSubcommandsOnlyBuilder,
} from 'discord.js';
import { aboutCommand } from '../../commands/about';
import { auctionCommand } from '../../commands/auction';
import { breakdownCommand } from '../../commands/breakdown';
import { debugCommand } from '../../commands/debug';
import { evolutionCommand } from '../../commands/evolution';
@@ -76,6 +77,7 @@ interface CommandRegistryExplicit extends CommandRegistryBase {
export type CommandRegistry = CommandRegistryImplicit | CommandRegistryExplicit;
export const COMMANDS_RAW: Promise<CommandRegistry>[] = [
auctionCommand,
permissionsCommand,
debugCommand,
aboutCommand,
@@ -115,7 +117,7 @@ export const commands = Promise.allSettled(COMMANDS_RAW).then((rawCommands) => {
);
});
const rest = new REST().setToken(assertSecret(process.env.DISCORD_TOKEN));
const rest = new REST().setToken(assertSecret(import.meta.env.DISCORD_TOKEN));
commands.then((awaitedCommands) => {
const body = Object.values(awaitedCommands).map((registry) =>
@@ -123,7 +125,7 @@ commands.then((awaitedCommands) => {
);
rest.put(
Routes.applicationCommands(assertSecret(process.env.DISCORD_CLIENT_ID)),
Routes.applicationCommands(assertSecret(import.meta.env.DISCORD_CLIENT_ID)),
{
body,
},
+4
View File
@@ -1,8 +1,12 @@
import { manager } from './core/discord/manager';
console.log('pre manager event listeners and spawn');
manager
.on('shardCreate', (shard) => {
console.log(`🟡 Launching shard ${shard.id}`);
shard.on('ready', () => console.log(`🟢 Launched shard ${shard.id}`));
})
.spawn();
console.log('post manager event listeners and spawn');
+5 -1
View File
@@ -6,4 +6,8 @@ console.log(`🟡 Launching bot ${client.shard?.ids[0]}`);
registerProcesses();
client.login(assertSecret(process.env.DISCORD_TOKEN));
console.log(`post register processes on shard ${client.shard?.ids[0]}`);
client.login(assertSecret(import.meta.env.DISCORD_TOKEN));
console.log(`post client login on shard ${client.shard?.ids[0]}`);
+2
View File
@@ -7,3 +7,5 @@ parentPort?.on('message', async (svg: string) => {
const png = svgToPng(svg);
parentPort?.postMessage(png);
});
console.log(`post render thread parent port on thread ${threadId}`);
+17
View File
@@ -291,6 +291,23 @@
},
"commands": {
"auction": {
"$": "auction",
"description": "Tanks available right now in the auction",
"body": {
"title": "Blitz Auction",
"subtitle": "%s available • next prices %s\nBid now: %s",
"next": "Next price: %s"
},
"errors": {
"no_auction": "# No ongoing auction\n\nCurrently, there are no tanks available for purchase in the auction. If you think this is an error, please report this discrepancy in [the official Discord Server](https://discord.gg/nDt7AjGJQH)."
},
"actions": {
"bid": "Bid now"
}
},
"replay": {
"$": "replay",
"description": "Display replay results"
+3 -3
View File
@@ -323,9 +323,9 @@
"$": "zonas-horarias",
"description": "Cómo Blitzkrieg infiere y utiliza tu zona horaria"
},
"creators": {
"$": "creadores",
"description": "Personas que han trabajado en el bot"
"credits": {
"$": "credits",
"description": "People who have helped BlitzKit"
}
}
},
+3 -3
View File
@@ -323,9 +323,9 @@
"$": "vremenske zone",
"description": "Kako \"Blitzkrieg\" koristi podatke o tvojoj vremenskoj zoni"
},
"creators": {
"$": "stvarači",
"description": "Ljudi koji su radili na robotu"
"credits": {
"$": "credits",
"description": "People who have helped BlitzKit"
}
}
},
+5
View File
@@ -0,0 +1,5 @@
export type BlitzTankClass =
| 'lightTank'
| 'mediumTank'
| 'heavyTank'
| 'AT-SPG';
+1
View File
@@ -1,5 +1,6 @@
export * from './canSplash';
export * from './clans';
export * from './classes';
export * from './constants';
export * from './equipmentPrice';
export * from './fetchBlitz';
+1 -1
View File
@@ -11,7 +11,7 @@ export async function isValidBlitzId(id: number, token?: string) {
const json = await fetch(
`https://api.wotblitz.${region}/wotb/account/info/?account_id=${id}&application_id=${assertSecret(
process.env.PUBLIC_WARGAMING_APPLICATION_ID,
import.meta.env.PUBLIC_WARGAMING_APPLICATION_ID,
)}${
token === undefined ? '' : `&access_token=${token}`
}&fields=account_id%2C-account_id`,
@@ -17,7 +17,7 @@ export async function getArchivedLatestSeasonNumber() {
const regionsURL = (
(await fetch(
`https://api.github.com/repos/tresabhi/${assertSecret(
process.env.PUBLIC_ASSET_REPO,
import.meta.env.PUBLIC_ASSET_REPO,
)}/git/trees/main`,
).then((response) => response.json())) as GitHubTrees
).tree.find(({ path }) => path === 'regions')!.url;
+5 -5
View File
@@ -1,3 +1,4 @@
import { assertSecret } from '@blitzkit/core';
import { mkdir, writeFile } from 'fs/promises';
import { parse as parsePath } from 'path';
import ProgressBar from 'progress';
@@ -6,7 +7,6 @@ import { dvp } from '../../../submodules/blitzkit-closed/src/dvp';
import { readStringDVPL } from '../src/core/blitz/readStringDVPL';
import { DATA } from './buildAssets/constants';
import { readYAMLDVPL } from './core/blitz/readYAMLDVPL';
import { assertSecret } from '@blitzkit/core';
import { writeDVPL } from './core/blitz/writeDVPL';
const versionTextFile = await readStringDVPL(`${DATA}/version.txt.dvpl`);
@@ -22,7 +22,7 @@ let patchIndex = 1;
while (true) {
const response = await fetch(
`${assertSecret(
process.env.WOTB_DLC_CDN,
import.meta.env.WOTB_DLC_CDN,
)}/dlc/s${currentVersion}_${patchIndex}.yaml`,
);
@@ -31,10 +31,10 @@ while (true) {
const data = parseYaml(await response.text());
const dvpm = await fetch(
`${assertSecret(process.env.WOTB_DLC_CDN)}/dlc/${data.dx11}`,
`${assertSecret(import.meta.env.WOTB_DLC_CDN)}/dlc/${data.dx11}`,
).then((response) => response.arrayBuffer());
const dvpd = await fetch(
`${assertSecret(process.env.WOTB_DLC_CDN)}/dlc/${data.dx11.replace(
`${assertSecret(import.meta.env.WOTB_DLC_CDN)}/dlc/${data.dx11.replace(
'.dvpm',
'.dvpd',
)}`,
@@ -63,7 +63,7 @@ while (true) {
console.log('Found dynamic content localizations; patching...');
const localizationsResponse = await fetch(
`${assertSecret(process.env.WOTB_DLC_CDN)}/dlc/${
`${assertSecret(import.meta.env.WOTB_DLC_CDN)}/dlc/${
data.dynamicContentLocalizationsDir
}/en.yaml`,
);
@@ -35,9 +35,9 @@ export async function currencies() {
}),
);
const glossary = await fetch(assertSecret(process.env.WOTB_GLOSSARY)).then(
(response) => response.json() as Promise<BlitzGlossary>,
);
const glossary = await fetch(
assertSecret(import.meta.env.WOTB_GLOSSARY),
).then((response) => response.json() as Promise<BlitzGlossary>);
await Promise.all(
Object.entries(glossary)
@@ -1,6 +1,7 @@
import {
Armor,
assertSecret,
BlitzTankClass,
CamouflageDefinitions,
Consumable,
ConsumableDefinitions,
@@ -70,7 +71,6 @@ const blitzTankFilterDefinitionCategoryToBlitzkit: Record<
function vector3TupleToBlitzkit(tuple: Vector3Tuple) {
return { x: tuple[0], y: tuple[1], z: tuple[2] } satisfies Vector3;
}
type BlitzTankClass = 'lightTank' | 'mediumTank' | 'heavyTank' | 'AT-SPG';
const blitzTankClassToBlitzkit: Record<BlitzTankClass, TankClass> = {
lightTank: TankClass.LIGHT,
'AT-SPG': TankClass.TANK_DESTROYER,
@@ -514,7 +514,7 @@ export async function definitions() {
const wargamingTankopedia = (await fetch(
`https://api.wotblitz.com/wotb/encyclopedia/vehicles/?application_id=${assertSecret(
process.env.PUBLIC_WARGAMING_APPLICATION_ID,
import.meta.env.PUBLIC_WARGAMING_APPLICATION_ID,
)}&fields=description`,
).then((response) => response.json())) as {
data: { [key: number]: { description: null | string } };
+3
View File
@@ -25,10 +25,13 @@ build({
'.node': 'empty',
'.json': 'json',
},
external: ['sharp'],
minifyIdentifiers: false, // causes goofy ahh issues
minifySyntax: !dev,
minifyWhitespace: !dev,
sourcemap: !dev,
jsxImportSource: 'react',
jsx: 'automatic',
});
for (const module of await readdir(`${modulesRoot}/@resvg`)) {
@@ -7,8 +7,8 @@ export async function commitAssets(message: string, changes: FileChange[]) {
if (changes.length === 0) return;
await commitMultipleFiles(
assertSecret(process.env.PUBLIC_ASSET_REPO),
assertSecret(process.env.PUBLIC_ASSET_BRANCH),
assertSecret(import.meta.env.PUBLIC_ASSET_REPO),
assertSecret(import.meta.env.PUBLIC_ASSET_BRANCH),
`${message} - ${new Date().toDateString()}`,
changes,
);
+1 -1
View File
@@ -5,5 +5,5 @@ import { Octokit } from '@octokit/rest';
Octokit.plugin(throttling);
export const octokit = new Octokit({
auth: assertSecret(process.env.GH_TOKEN),
auth: assertSecret(import.meta.env.GH_TOKEN),
});