- tmdb_crypto: self-contained SHA1/HMAC, URL builder, response parse,
all verified against hashlib and Sony's live service in unit tests
- tmdb: plain-HTTP fetch with deadline plus 8-entry cache
- detect: TMDB in both resolve paths; artwork URL plumbed through
detect_last_art into presence assets (official Sony CDN, no uploads)
- remove appdb byte-scan: boundary ambiguity returned wrong names,
worse than raw IDs; also removes the multi-MB game-process read
- discord/daemon: full-URL artwork wins, pack URL next, asset key last
/data/GoldHEN/payloads/ is not an auto-load folder (PPPwn only loads
goldhen.bin; folder auto-load is unimplemented GoldHEN feature #296), so the
ELF payload never ran regardless of reboots. Replace that route with the
GoldHEN plugin loader, which auto-starts into the game process at every boot
via plugins.ini [default] with no PC involvement.
- daemon.c/h: extract the payload main() loop into a shared daemon_run()
usable from both the ELF entry (main.c thin wrapper) and the plugin
- detect.c/h: add detect_name_for_title() for the known-titleid plugin mode
- plugin/plugin.c: plugin_load() reads procInfo.titleid via sys_sdk_proc_info,
skips non-game (NPXS/system) titles, starts daemon thread; plugin_unload()
stops it cleanly
- plugin/Makefile: builds orbisrpc_plugin.prx against the GoldHEN SDK
(libGoldHEN_Hook.a + crtprx.o)
- deploy/SETUP.md: rewrite for the plugin route; add plugins.ini [default]
(plugin/plugins.ini.ps4)
- scripts/build.sh: include daemon.c
ws: SSL_connect on the non-blocking socket now polls WANT_READ/WANT_WRITE
with a deadline (previously it would fail the very first handshake);
handshake response read in chunks so the 5s deadline can't spuriously
trip; ws_send_text errors on oversized frames instead of silently
truncating; added ws_send_pong for RFC6455 server pings.
discord: heartbeat ack tracking -> reconnect on 2x-interval silence;
handle op 7 (reconnect) and op 9 (invalid session, clears session_id);
parse the sequence from the correct "s" field (was "seq", never
matched, heartbeat always sent d:0); READY captures session_id for
RESUME; reconnect now RESUMEs (op 6) when a session exists and falls
back to IDENTIFY on invalid-session; party size now emitted in the
activity; dropped the unused 'intent' arg; zeroed gateway-fetch buffer.
main: use config presence_state (was hardcoded); reset last_name after
reconnect so the current game is re-pushed immediately.
cfg: clamp poll_interval_s to [5,300]; atomic config save (tmp+rename).
log: seconds in timestamps; rotate log at 512 KB.
jsonlite: jl_obj_get/jl_arr_at return non-const (fixes const-drop
warnings); stringify emits proper "null" for missing pair values.
detect: trim whitespace around app.xml title; drop per-poll log spam.