Add socket event handling foundations and an updateSands event in anticipation of hasty rolls

This commit is contained in:
Eldritch-Oliver 2025-10-06 23:25:27 -06:00
parent 7c0fb75e0f
commit c0a9731b02
5 changed files with 73 additions and 1 deletions

View file

@ -34,6 +34,7 @@ import { Logger } from "../utils/Logger.mjs";
import { registerCustomComponents } from "../Apps/components/_index.mjs";
import { registerDevSettings } from "../settings/devSettings.mjs";
import { registerMetaSettings } from "../settings/metaSettings.mjs";
import { registerSockets } from "../sockets/_index.mjs";
import { registerUserSettings } from "../settings/userSettings.mjs";
import { registerWorldSettings } from "../settings/worldSettings.mjs";
@ -127,6 +128,7 @@ Hooks.once(`init`, () => {
CONFIG.Actor.trackableAttributes.hero = HeroData.trackableAttributes;
// #endregion
registerSockets();
registerCustomComponents();
Handlebars.registerHelper(helpers);
});

27
module/sockets/_index.mjs Normal file
View file

@ -0,0 +1,27 @@
import { localizer } from "../utils/Localizer.mjs";
import { Logger } from "../utils/Logger.mjs";
import { updateSands } from "./updateSands.mjs";
const events = {
updateSands,
};
export function registerSockets() {
Logger.info(`Setting up socket listener`);
game.socket.on(`system.${game.system.id}`, (data, userID) => {
const { event, payload } = data ?? {};
if (event == null || payload === undefined) {
ui.notifications.error(localizer(`RipCrypt.notifs.error.invalid-socket`));
return;
};
if (events[event] == null) {
ui.notifications.error(localizer(`RipCrypt.notifs.error.unknown-socket-event`, { event }));
return;
};
const user = game.users.get(userID);
events[event](payload, user);
});
};

View file

@ -0,0 +1,36 @@
import { clamp } from "../utils/clamp.mjs";
import { localizer } from "../utils/Localizer.mjs";
export function updateSands(payload) {
if (!game.user.isActiveGM) { return };
// Assert payload validity
const { value, delta } = payload;
if (value == null && delta == null) {
ui.notifications.error(localizer(
`RipCrypt.notifs.error.malformed-socket-payload`,
{
event: `updateSands`,
details: `Either value or delta must be provided`,
},
));
return;
};
// Take action
if (value != null) {
const initial = game.settings.get(game.system.id, `sandsOfFateInitial`);
let sands = clamp(0, value, initial);
if (sands === 0) {
ui.delveDice.alertCrypticEvent();
sands = initial;
};
game.settings.set(
game.system.id,
`sandsOfFate`,
sands,
);
} else if (delta != null) {
ui.delveDice.sandsOfFateDelta(delta);
};
};

3
module/utils/clamp.mjs Normal file
View file

@ -0,0 +1,3 @@
export function clamp(min, ideal, max) {
return Math.max(min, Math.min(ideal, max));
};