From d59bbd3690b9cb82f66088007388b6f02b2c538f Mon Sep 17 00:00:00 2001 From: qwerinope Date: Thu, 27 Nov 2025 20:39:17 +0100 Subject: [PATCH] add factorio destruction sound alert, add command and cheer parser tests --- src/__tests__/argsparse.test.ts | 46 ++++++++++++++++++++ src/pointRedeems/sfxFactorioAlert.ts | 17 ++++++++ src/web/alerts/types.ts | 6 ++- src/web/alerts/www/public/factorioalert.ogg | Bin 0 -> 10738 bytes 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/__tests__/argsparse.test.ts create mode 100644 src/pointRedeems/sfxFactorioAlert.ts create mode 100755 src/web/alerts/www/public/factorioalert.ogg diff --git a/src/__tests__/argsparse.test.ts b/src/__tests__/argsparse.test.ts new file mode 100644 index 0000000..e88418a --- /dev/null +++ b/src/__tests__/argsparse.test.ts @@ -0,0 +1,46 @@ +import { describe, expect, test } from "bun:test"; +import parseCommandArgs, { parseCheerArgs } from "lib/parseCommandArgs"; + +describe("command argument parser", () => { + test("split command into chunks", () => { + expect(parseCommandArgs("!execute eponirewq")).toEqual(["eponirewq"]); + expect(parseCommandArgs("!getloot")).toEqual([]); + expect(parseCommandArgs("!inv qwerinope")).toEqual(["qwerinope"]); + expect(parseCommandArgs("!admingive qwerinope silverbullet 67")).toEqual([ + "qwerinope", + "silverbullet", + "67", + ]); + }); + + test("handle the !use command", () => { + expect(parseCommandArgs("!use silverbullet albeees")).toEqual(["albeees"]); + expect(parseCommandArgs("!use grenade")).toEqual([]); + }); + + test("handle special aliases", () => { + expect(parseCommandArgs("i blast mrockstar20", "i")).toEqual([ + "mrockstar20", + ]); + expect(parseCommandArgs("blastin sefi", "blastin")).toEqual(["sefi"]); + expect(parseCommandArgs("i grenade", "i")).toEqual([]); + }); +}); + +describe("cheer argument parser", () => { + test("basic parsing", () => { + expect(parseCheerArgs("cheer99")).toEqual([]); + expect(parseCheerArgs("grenade out! cheer99")).toEqual(["grenade", "out!"]); + expect(parseCheerArgs("cheer666 albeees")).toEqual(["albeees"]); + expect(parseCheerArgs("albeees cheer666")).toEqual(["albeees"]); + }); + + test("Remove all cheers", () => { + expect(parseCheerArgs("cheer1 cheer1 cheer1")).toEqual([]); + expect(parseCheerArgs("TAKE CHEER1 THIS chEEr1 SPAM CheeR6969")).toEqual([ + "take", + "this", + "spam", + ]); + }); +}); diff --git a/src/pointRedeems/sfxFactorioAlert.ts b/src/pointRedeems/sfxFactorioAlert.ts new file mode 100644 index 0000000..0fc0eb0 --- /dev/null +++ b/src/pointRedeems/sfxFactorioAlert.ts @@ -0,0 +1,17 @@ +import PointRedeem from "pointRedeems"; +import { playAlert } from "web/alerts/serverFunctions"; + +export default new PointRedeem({ + name: "sfxFactorioAlert", + title: "Factorio Building Destroyed", + cost: 100, + color: "#A020F0", + prompt: 'Play the Factorio "Building Destroyed" sound effect', + sfxredeem: true, + execution: async (msg) => + await playAlert({ + name: "sound", + user: msg.userDisplayName, + sound: "factorioalert", + }), +}); diff --git a/src/web/alerts/types.ts b/src/web/alerts/types.ts index cc8028d..cb0f736 100644 --- a/src/web/alerts/types.ts +++ b/src/web/alerts/types.ts @@ -21,7 +21,11 @@ export type tntExplosionAlert = alertBase<"tntExplosion"> & { targets: string[]; }; -export type soundAlerts = "mrockmadhouse" | "eddiescream" | "ripbozo"; +export type soundAlerts = + | "mrockmadhouse" + | "eddiescream" + | "ripbozo" + | "factorioalert"; export type soundAlert = alertBase<"sound"> & { sound: soundAlerts; diff --git a/src/web/alerts/www/public/factorioalert.ogg b/src/web/alerts/www/public/factorioalert.ogg new file mode 100755 index 0000000000000000000000000000000000000000..80798a20d8139aac8e1bcd179dae904e152285e9 GIT binary patch literal 10738 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 z