From ad10d53077ab078efd632ea6557d899faf15ee8b Mon Sep 17 00:00:00 2001 From: qwerinope Date: Mon, 25 Aug 2025 15:13:56 +0200 Subject: [PATCH] decent implementation of alert system --- src/cheers/execute.ts | 8 ++- src/cheers/grenade.ts | 8 ++- src/cheers/tnt.ts | 13 ++-- src/items/grenade.ts | 8 ++- src/items/silverbullet.ts | 8 ++- src/items/tnt.ts | 5 ++ src/web/alerts/www/public/explosion2.ogg | Bin 0 -> 18326 bytes src/web/alerts/www/public/explosion3.ogg | Bin 0 -> 20252 bytes .../alerts/www/src/alerts/grenadeExplosion.ts | 57 ++++++++++++++++ src/web/alerts/www/src/alerts/index.ts | 6 +- src/web/alerts/www/src/alerts/tntExplosion.ts | 4 +- .../alerts/www/src/alerts/userExecution.ts | 64 ++++++++++++++++++ 12 files changed, 166 insertions(+), 15 deletions(-) create mode 100644 src/web/alerts/www/public/explosion2.ogg create mode 100644 src/web/alerts/www/public/explosion3.ogg create mode 100644 src/web/alerts/www/src/alerts/grenadeExplosion.ts create mode 100644 src/web/alerts/www/src/alerts/userExecution.ts diff --git a/src/cheers/execute.ts b/src/cheers/execute.ts index fb6ed21..f21710b 100644 --- a/src/cheers/execute.ts +++ b/src/cheers/execute.ts @@ -6,6 +6,7 @@ import { timeout } from "lib/timeout"; import { createTimeoutRecord } from "db/dbTimeouts"; import { parseCheerArgs } from "lib/parseCommandArgs"; import { createCheerEventRecord } from "db/dbCheerEvents"; +import { playAlert } from "web/alerts/serverFunctions"; const ITEMNAME = 'silverbullet'; @@ -20,7 +21,12 @@ export default new Cheer('execute', 6666, async (msg, user) => { if (result.status) await Promise.all([ sendMessage(`${target.displayName} RIPBOZO RIPBOZO RIPBOZO RIPBOZO RIPBOZO RIPBOZO RIPBOZO`), createTimeoutRecord(user, target, ITEMNAME), - createCheerEventRecord(user, ITEMNAME) + createCheerEventRecord(user, ITEMNAME), + playAlert({ + name: 'userExecution', + user: user.displayName, + target: target.displayName + }) ]); else { await handleNoTarget(msg, user, ITEMNAME); diff --git a/src/cheers/grenade.ts b/src/cheers/grenade.ts index 21282c7..f6e2aa6 100644 --- a/src/cheers/grenade.ts +++ b/src/cheers/grenade.ts @@ -6,6 +6,7 @@ import { getUserRecord } from "db/dbUser"; import { createTimeoutRecord } from "db/dbTimeouts"; import { createCheerEventRecord } from "db/dbCheerEvents"; import { Cheer, handleNoTarget } from "cheers"; +import { playAlert } from "web/alerts/serverFunctions"; const ITEMNAME = 'grenade'; @@ -22,6 +23,11 @@ export default new Cheer('grenade', 99, async (msg, user) => { redis.del(selection), sendMessage(`wybuh ${target?.displayName} got hit by ${user.displayName}'s grenade wybuh`), createTimeoutRecord(user, target!, ITEMNAME), - createCheerEventRecord(user, ITEMNAME) + createCheerEventRecord(user, ITEMNAME), + playAlert({ + name: 'grenadeExplosion', + user: user.displayName, + target: target?.displayName! + }) ]); }); diff --git a/src/cheers/tnt.ts b/src/cheers/tnt.ts index fd94277..78cacc9 100644 --- a/src/cheers/tnt.ts +++ b/src/cheers/tnt.ts @@ -24,16 +24,15 @@ export default new Cheer('tnt', 1000, async (msg, user) => { redis.del(`user:${targetid}:vulnerable`), sendMessage(`wybuh ${target?.displayName} got hit by ${user.displayName}'s TNT wybuh`), createTimeoutRecord(user, target!, ITEMNAME), - createCheerEventRecord(user, ITEMNAME) + createCheerEventRecord(user, ITEMNAME), + playAlert({ + name: 'tntExplosion', + user: user.displayName, + targets + }) ]); })); - playAlert({ - name: 'tntExplosion', - user: user.displayName, - targets - }); - await sendMessage(`RIPBOZO ${user.displayName} exploded ${targets.length} chatter${targets.length === 1 ? '' : 's'} with their TNT RIPBOZO`); }); diff --git a/src/items/grenade.ts b/src/items/grenade.ts index 3ab03c7..0be5c89 100644 --- a/src/items/grenade.ts +++ b/src/items/grenade.ts @@ -6,6 +6,7 @@ import User from "user"; import { getUserRecord } from "db/dbUser"; import { createTimeoutRecord } from "db/dbTimeouts"; import { createUsedItemRecord } from "db/dbUsedItems"; +import { playAlert } from "web/alerts/serverFunctions"; const ITEMNAME = 'grenade'; @@ -30,7 +31,12 @@ export default new Item(ITEMNAME, 'Grenade', 's', sendMessage(`wybuh ${target?.displayName} got hit by ${user.displayName}'s grenade wybuh`), changeItemCount(user, userObj, ITEMNAME), createTimeoutRecord(user, target!, ITEMNAME), - createUsedItemRecord(user, ITEMNAME) + createUsedItemRecord(user, ITEMNAME), + playAlert({ + name: 'grenadeExplosion', + user: user.displayName, + target: target?.displayName! + }) ]); await user.clearLock(); } diff --git a/src/items/silverbullet.ts b/src/items/silverbullet.ts index 9b3c61a..fe95317 100644 --- a/src/items/silverbullet.ts +++ b/src/items/silverbullet.ts @@ -5,6 +5,7 @@ import { createUsedItemRecord } from "db/dbUsedItems"; import { getUserRecord } from "db/dbUser"; import parseCommandArgs from "lib/parseCommandArgs"; import { timeout } from "lib/timeout"; +import { playAlert } from "web/alerts/serverFunctions"; import User from "user"; const ITEMNAME = 'silverbullet'; @@ -28,7 +29,12 @@ export default new Item(ITEMNAME, 'Silver bullet', 's', sendMessage(`${target.displayName} RIPBOZO RIPBOZO RIPBOZO RIPBOZO RIPBOZO RIPBOZO RIPBOZO`), changeItemCount(user, userObj, ITEMNAME), createTimeoutRecord(user, target, ITEMNAME), - createUsedItemRecord(user, ITEMNAME) + createUsedItemRecord(user, ITEMNAME), + playAlert({ + name: 'userExecution', + user: user.displayName, + target: target.displayName + }) ]); else { switch (result.reason) { diff --git a/src/items/tnt.ts b/src/items/tnt.ts index 33df92c..b3c84cd 100644 --- a/src/items/tnt.ts +++ b/src/items/tnt.ts @@ -31,6 +31,11 @@ export default new Item(ITEMNAME, 'TNT', 's', redis.del(`user:${targetid}:vulnerable`), sendMessage(`wybuh ${target?.displayName} got hit by ${user.displayName}'s TNT wybuh`), createTimeoutRecord(user, target!, ITEMNAME), + playAlert({ + name: 'tntExplosion', + user: user.displayName, + targets + }) ]); })); diff --git a/src/web/alerts/www/public/explosion2.ogg b/src/web/alerts/www/public/explosion2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..199c610313426fcc75f3b85bf558618118cd1ce3 GIT binary patch literal 18326 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 literal 0 HcmV?d00001 diff --git a/src/web/alerts/www/src/alerts/grenadeExplosion.ts b/src/web/alerts/www/src/alerts/grenadeExplosion.ts new file mode 100644 index 0000000..a0ce205 --- /dev/null +++ b/src/web/alerts/www/src/alerts/grenadeExplosion.ts @@ -0,0 +1,57 @@ +import { grenadeExplosionAlert } from "web/alerts/types"; +import { AlertRunner } from "./index"; + +const duration = 500; + +export default async function execute(alert: grenadeExplosionAlert): Promise { + const audio = new Audio("/alerts/public/explosion2.ogg"); + + const parentDiv = document.createElement('div'); + parentDiv.className = 'grenadeExplosionAlert'; + parentDiv.innerHTML = ` + + + ${alert.user} + + + ${alert.target} + + + `; + + const randomX = Math.floor(Math.random() * (window.innerWidth - 300)); + const randomY = Math.floor(Math.random() * (window.innerHeight - 300)); + + parentDiv.style.left = `${randomX}px`; + parentDiv.style.top = `${randomY}px`; + + audio.play(); + + return { blocking: false, duration, alertDiv: parentDiv }; +}; diff --git a/src/web/alerts/www/src/alerts/index.ts b/src/web/alerts/www/src/alerts/index.ts index d538b73..24dddc4 100644 --- a/src/web/alerts/www/src/alerts/index.ts +++ b/src/web/alerts/www/src/alerts/index.ts @@ -1,5 +1,7 @@ import { alert } from "web/alerts/types"; import userBlast from "./userBlast"; +import userExecution from "./userExecution"; +import grenadeExplosion from "./grenadeExplosion"; import tntExplosion from "./tntExplosion"; export type AlertRunner = { @@ -14,7 +16,7 @@ type AlertMap = { export default { 'userBlast': userBlast, - 'userExecute': userBlast, - 'grenadeExplosion': userBlast, + 'userExecution': userExecution, + 'grenadeExplosion': grenadeExplosion, 'tntExplosion': tntExplosion, } as AlertMap; diff --git a/src/web/alerts/www/src/alerts/tntExplosion.ts b/src/web/alerts/www/src/alerts/tntExplosion.ts index ebde2d2..7075bcd 100644 --- a/src/web/alerts/www/src/alerts/tntExplosion.ts +++ b/src/web/alerts/www/src/alerts/tntExplosion.ts @@ -1,9 +1,9 @@ -import { userBlastAlert } from "web/alerts/types"; +import { tntExplosionAlert } from "web/alerts/types"; import { AlertRunner } from "./index"; const duration = 1500; -export default async function execute(alert: userBlastAlert): Promise { +export default async function execute(alert: tntExplosionAlert): Promise { const parentDiv = document.createElement('div'); parentDiv.className = 'tntExplosionAlert'; parentDiv.innerHTML = ` diff --git a/src/web/alerts/www/src/alerts/userExecution.ts b/src/web/alerts/www/src/alerts/userExecution.ts new file mode 100644 index 0000000..cc12859 --- /dev/null +++ b/src/web/alerts/www/src/alerts/userExecution.ts @@ -0,0 +1,64 @@ +import { userExecutionAlert } from "web/alerts/types"; +import { AlertRunner } from "./index"; + +const duration = 3000; + +export default async function execute(alert: userExecutionAlert): Promise { + const parentDiv = document.createElement('div'); + parentDiv.className = 'userExecutionAlert'; + parentDiv.innerHTML = ` + + + ${alert.user} + + + ${alert.target} + + + `; + + const randomX = Math.floor(Math.random() * (window.innerWidth - 800)); + const randomY = Math.floor(Math.random() * (window.innerHeight - 800)); + + const audio1 = new Audio("/alerts/public/explosion1.ogg"); + const audio2 = new Audio("/alerts/public/explosion2.ogg"); + const audio3 = new Audio("/alerts/public/explosion3.ogg"); + + audio1.volume = 1.0; + audio2.volume = 1.0; + audio3.volume = 1.0; + audio1.play(); + audio2.play(); + audio3.play(); + + parentDiv.style.left = `${randomX}px`; + parentDiv.style.top = `${randomY}px`; + + return { blocking: false, duration, alertDiv: parentDiv }; +};