atagen

malice

public
Star0
Watch0
38a9760b78e47d373dfb35d3882a586dc9587211
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: web/src/lib/message-sound-model.ts

c8d898e6eb59atagen2026-10-27 03:55 UTC1
import type { RoomSummary } from './types';
c8d898e6eb59atagen2026-10-27 03:55 UTC2
c8d898e6eb59atagen2026-10-27 03:55 UTC3
export type MessageSoundMode = 'all' | 'mentions_dms' | 'off';
c8d898e6eb59atagen2026-10-27 03:55 UTC4
c8d898e6eb59atagen2026-10-27 03:55 UTC5
export interface MessageSoundSettings {
c8d898e6eb59atagen2026-10-27 03:55 UTC6
  mode: MessageSoundMode;
c8d898e6eb59atagen2026-10-27 03:55 UTC7
  sound: string | null;
c8d898e6eb59atagen2026-10-27 03:55 UTC8
}
c8d898e6eb59atagen2026-10-27 03:55 UTC9
c8d898e6eb59atagen2026-10-27 03:55 UTC10
export const DEFAULT_MESSAGE_SOUND: MessageSoundSettings = { mode: 'mentions_dms', sound: null };
c8d898e6eb59atagen2026-10-27 03:55 UTC11
export const SOUND_MAX_BYTES = 1024 * 1024;
c8d898e6eb59atagen2026-10-27 03:55 UTC12
export const SOUND_THROTTLE_MS = 1500;
c8d898e6eb59atagen2026-10-27 03:55 UTC13
c8d898e6eb59atagen2026-10-27 03:55 UTC14
export function parseMessageSound(raw: unknown): MessageSoundSettings {
c8d898e6eb59atagen2026-10-27 03:55 UTC15
  if (typeof raw !== 'object' || raw === null) return DEFAULT_MESSAGE_SOUND;
c8d898e6eb59atagen2026-10-27 03:55 UTC16
  const { mode, sound } = raw as Record<string, unknown>;
c8d898e6eb59atagen2026-10-27 03:55 UTC17
  return {
c8d898e6eb59atagen2026-10-27 03:55 UTC18
    mode: mode === 'all' || mode === 'mentions_dms' || mode === 'off' ? mode : DEFAULT_MESSAGE_SOUND.mode,
c8d898e6eb59atagen2026-10-27 03:55 UTC19
    sound: typeof sound === 'string' && sound.startsWith('mxc://') ? sound : null
c8d898e6eb59atagen2026-10-27 03:55 UTC20
  };
c8d898e6eb59atagen2026-10-27 03:55 UTC21
}
c8d898e6eb59atagen2026-10-27 03:55 UTC22
c8d898e6eb59atagen2026-10-27 03:55 UTC23
export function shouldPlaySound(
c8d898e6eb59atagen2026-10-27 03:55 UTC24
  mode: MessageSoundMode,
c8d898e6eb59atagen2026-10-27 03:55 UTC25
  room: Pick<RoomSummary, 'direct'>,
c8d898e6eb59atagen2026-10-27 03:55 UTC26
  arrival: { mention: boolean },
c8d898e6eb59atagen2026-10-27 03:55 UTC27
  lastPlayedAt: number,
c8d898e6eb59atagen2026-10-27 03:55 UTC28
  now: number
c8d898e6eb59atagen2026-10-27 03:55 UTC29
): boolean {
c8d898e6eb59atagen2026-10-27 03:55 UTC30
  if (mode === 'off' || now - lastPlayedAt < SOUND_THROTTLE_MS) return false;
c8d898e6eb59atagen2026-10-27 03:55 UTC31
  return mode === 'all' || arrival.mention || room.direct;
c8d898e6eb59atagen2026-10-27 03:55 UTC32
}