Added
- Ubisoft giveaways (
src/stores/ubisoft.py) – the bot could not see Ubisoft's occasional full-game giveaways. The new store reads the feed on ubisoft.com/games/free and claims onregister.ubisoft.comusingUBI_EMAIL/UBI_PASSWORD(UBI_OTPKEYfor codes); aliasesubisoftandubi. Giveaways share thegametrialtype with ordinary trials, so the filter also demands a real promotion window and the claim page decides before any click. - Fab limited-time free assets (
src/stores/epic_fab.py) – Fab, Epic's asset marketplace, gives paid assets away every week. The new store readsfab.com/i/blades/free_content_bladeand claims them; aliasesfabandepic-fab. Only the blade'sisLimitedFreeContentflag authorises a claim: listings keep their original price, and the search API ignores unknown filters. Sign-in reuses Epic's profile, so no second login;FAB_ACCEPT_EULA=falsestops before the licence prompts. - Public noVNC address for notification links (
VNC_URL, #3) – the one-click link in every "manual action needed" alert was fixed tohttp://<VNC_IP>:<NOVNC_PORT>/, which does not fit a reverse proxy.VNC_URL=https://fgc.example.tldnow yieldshttps://fgc.example.tld/?autoconnect=true, keeping your scheme and path. It replacesVNC_IPandNOVNC_PORTin the link only; unset, nothing changes.
Fixed
- Every store's browser advertised a language list no real Chrome produces –
claimer.pylaunched Chrome with--accept-lang=en-US,en;q=0.9, and Chrome copies that flag intonavigator.languages, so pages read["en-US", "en;q=0.9"]. No real browser exposes an HTTP quality value there, which makes it a reliable automation signal: Ubisoft's DataDome answered sign-in with403until the flag became--accept-lang=en-US,en. Affects every store.