Handler.ts iterated readdirSync(COMMANDS_PATH) without filtering, so
any .d.ts declaration file, .js.map source map, or non-class module
that landed in commands/ would crash startup with 'mod.default is not
a constructor'. Restrict loading to .ts/.js (excluding .d.ts and maps)
and skip modules without a default-exported constructor.
- New optional env SIGNATURE_HOST overrides the hardcoded
192.168.10.5:2967 (defaults preserved for back-compat).
- WebSocket now reconnects with exponential backoff (1s, 2s, 4s ...
capped at 30s) on close/error. Previously a dropped signature
server connection silently disabled signature playback until the
bot was restarted.
- Mention/emoji regexes used [(0-9)]{18}; '(' and ')' inside a character
class are literal so this matched the bracket chars themselves and
hard-fixed the ID length to 18. Discord snowflakes are 17-20 digits
(older 2015-2017 accounts are 17, 2024+ trend toward 19-20). Switch
to \\d{17,20} and capture the ID for member lookup.
- Tighten emoji regex name segment from .* (greedy, eats across emojis)
to [^:]+ so adjacent emojis no longer collapse into one match.
- Rename getSorce -> getSource.
stmt.user.update was issuing UPDATE guilds instead of UPDATE users,
so any DB.user.update() call would silently corrupt guild rows that
happened to share the same WHERE clause shape and never touch the
intended user row.