Files
sendou.ink/docs/dev/scripts.md
2026-10-10 16:23:17 +03:00

5.1 KiB

Scripts

Note: These are mostly useful if you are running the site in production as an admin, not typically for development.


Add new badge to the database

pnpm exec vite-node scripts/add-badge.ts fire_green "Octofin Eliteboard"

Rename display name of a badge

pnpm exec vite-node scripts/rename-badge.ts 10 "New 4v4 Sundaes"

Add many badge owners

pnpm exec vite-node scripts/add-badge-winners.ts 10 "750705955909664791,79237403620945920"

Converting gifs (badges) to thumbnail (.png)

sips -s format png ./sundae.gif --out .

Convert many .png files to .avif

While in the folder with the images:

for i in *.png; do pnpm dlx @squoosh/cli --avif '{"cqLevel":33,"cqAlphaLevel":-1,"denoiseLevel":0,"tileColsLog2":0,"tileRowsLog2":0,"speed":6,"subsample":1,"chromaDeltaQ":false,"sharpness":0,"tune":0}' $i; done

Note: it only works with Node 16.

Doing monthly update

  1. Drop the whole splat3 repository into /scripts/dicts/splat3 (pull before).
  2. If the dump's shape changed, update /scripts/splat3-types.ts to match (the dump is gitignored, so these types are hand-maintained rather than inferred from the JSON).
  3. Update all CURRENT_SEASON constants
  4. Update CURRENT_PATCH constants
  5. Update PATCHES constant with the late patch + remove the oldest
  6. Update the stage list in stage-ids.ts and create-misc-json.ts. Add images from Lean's repository and avify them.
  7. pnpm exec vite-node scripts/create-misc-json.ts
  8. pnpm exec vite-node scripts/create-gear-json.ts
  9. pnpm exec vite-node scripts/create-analyzer-json.ts 8a. Double check that no hard-coded special damages changed
  10. pnpm exec vite-node scripts/create-object-dmg-json.ts (also writes damage-rate-history.json for the params page directly into app/features/params/data)
  11. pnpm exec vite-node scripts/sync-weapon-params.ts (writes the weapon/sub/special param histories for the params page, see Sync weapon params)
  12. Fill new weapon IDs by category to weapon-ids.ts (easy to take from the diff of English weapons.json)
  13. Get gear IDs for each slot from /output folder and update gear-ids.ts.
  14. Replace object-dmg.json with the object-dmg.json in /output folder
  15. Replace weapon-params.ts with the params.json in /output folder
  16. Delete all images inside main-weapons, main-weapons-outlined, main-weapons-outlined-2 and gear folders.
  17. Replace with images from Lean's repository.
  18. Run the pnpm exec vite-node scripts/replace-img-names.ts command
  19. Run the pnpm exec vite-node scripts/replace-weapon-names.ts command
  20. Run the .avif generating command in each image folder.
  21. Update manually any languages that use English gear.json and weapons.json files

Deploy to Render.com

pnpm run deploy:prod

Puts the service in maintenance mode, triggers a deploy and polls it every 10 seconds until it is live. Then pings /health on the new instance over SSH (public traffic only sees Render's 503 maintenance page) every 10 seconds until it returns 200, and finally turns maintenance mode off. On success it prints the pnpm run changelog:image <sha> command with the commit of the previous release filled in.

If the build fails the previous version is still running, so maintenance mode is turned off again. Any other failure or timeout leaves maintenance mode on to be handled from the Render dashboard.

Needs RENDER_API_KEY (Render Dashboard -> Account Settings -> API Keys), RENDER_SERVICE_ID and PROD_SSH_TARGET (see the one-time setup below) in .env.

Download the production database from Render.com

Note: This is only useful if you have access to a production running on Render.com

pnpm run download-prod-db

Takes a VACUUM INTO snapshot of the live database (compacted, and consistent unlike a cp of a WAL database), streams it down gzipped, and archives it as ../backups/db-<timestamp>.sqlite3.gz. Once the snapshot has been verified it replaces db-snapshot.sqlite3 in every local sendou.ink checkout, deletes the stale db-sandbox.sqlite3 files, and rebuilds db-sandbox.sqlite3 in the checkout you ran it from (pnpm run sandbox:reset does that rebuild on its own).

Flags: --dry-run prints what would happen, --yes skips the confirmation, --keep <n> prunes all but the newest n archives.

One-time setup

  1. Add your public key at Render Dashboard -> Account Settings -> SSH Keys.
  2. Set PROD_SSH_TARGET in .env to the address in Render Dashboard -> the service -> SSH, e.g. srv-xxxxxxxx@ssh.frankfurt.render.com.
  3. Run ssh $PROD_SSH_TARGET 'echo ok' once to accept the host key.

Doing it by hand

If SSH is unavailable, the same thing through the dashboard "Shell" tab:

  1. cd /var/data
  2. sqlite3 -readonly db.sqlite3 "VACUUM INTO '/var/data/db-snapshot.sqlite3'"
  3. gzip db-snapshot.sqlite3
  4. wormhole send db-snapshot.sqlite3.gz
  5. On the receiving computer use the command shown.
  6. gunzip db-snapshot.sqlite3.gz in the checkout root, then pnpm run sandbox:reset
  7. rm db-snapshot.sqlite3.gz on the server, it is sharing the disk with production