Added
- Run the container as your own user (#58) – set
PUIDandPGIDanddocker-entrypoint.shhands the data folder to that user once, then runs the screen, the viewer and the bot as it, so files in a mounted folder belong to you on the host. Leave them out and nothing changes. - Fanatical giveaways end up on your Steam account –
_claim_fanatical_game()insrc/stores/gamerpower.pychecks your Fanatical orders before and after a claim and reveals only that giveaway's key. WithsteaminSTORES,redeem_pending_keys()insrc/stores/steam.pyactivates it at the end of the run.
Changed
- The log says how long the IndieGala sign-in lasts – IndieGala keeps a sign-in for 14 days from the login and visits do not extend it, so the bot logs the end date and warns two days ahead that the next IndieGala giveaway will ask you for the captcha again.
- Chrome closes cleanly before it is killed (PR #60 by @zaryar) –
close_browser()insrc/core/claimer.pyasks Chrome to shut down first, so cookies and sessions reach the disk before the leftover processes are ended. Every store stayed signed in on the next run. - Microsoft always gets a window (PR #60 by @zaryar) –
src/stores/microsoft.pystarts Chrome visibly, like Epic, because Microsoft's account pages fail without one. It only matters whenSHOW=false. - Fab is opt-in –
fableftDEFAULT_STORESinmain.py, so like Unity it runs only whenSTORESnames it. If yourSTORESis empty and you want Fab's free assets, addSTORES=steam,epic,fab,prime,gog,microsoft,ubisoft,aliexpress. - Failed claims are in the summary by default –
NOTIFY_CLAIM_FAILSnow defaults totrue, so a game or check-in the bot could not take is listed with the reason instead of vanishing. That also makesNOTIFY_MISSING_BASEwork as described; setNOTIFY_CLAIM_FAILS=falseto hide failures again. - A shorter
.env.example– every setting keeps its line, now with a one-line hint instead of a paragraph; the full description is in the README table. Microsoft is no longer called off by default, and the notification switches lost their end-of-line comments, whichdocker run --env-filekept as part of the value. - Dependency updates –
sqlalchemyto>=2.1.0(Dependabot #64). Checked against a copy of a live database: reading, the bot's queries andget_or_create()behave exactly as on 2.0.
Removed
TIMEOUTis gone – it was meant as the wait for a page element, but only a helper no store ever called read it, so changing it did nothing. Every store keeps its own waits; aTIMEOUTleft in.envis named at startup as a setting the bot does not read.- The old
*_ENABLEstore switches are gone –FANATICAL_ENABLE,ITCHIO_ENABLE,INDIEGALA_ENABLEandALIENWARE_ENABLEwere replaced bySTORESin 1.9 and kept for one more release. They do nothing now and the log says so at startup; name the site inSTORES, e.g.STORES=...,fanatical, to keep it running.
Fixed
- IndieGala signs in and claims again –
_claim_indiegala_game()insrc/stores/gamerpower.pynever found IndieGala's e-mail field, and once signed in it took every giveaway as owned from a hint all its pages carry. It types the sign-in now, hands the login captcha to you over VNC, and counts a game only when the reloaded page says it is yours. - A quoted password works everywhere – a
.envvalue written as'secret'reached the bot with its quotes when the container was started withdocker run --env-fileor a NAS form, so sign-ins failed.src/core/config.pytakes one matching pair of quotes off every setting it knows; compose and a plain.envbehave as before. - A container started as another user gets its screen – NAS templates that set a user for the container left VNC without a home folder it could write, so the screen never came up.
docker-entrypoint.shgives such a user one in/tmp, so the bot runs whenever the data folder is writable. - A captcha in Epic's checkout now reaches you (#61) – after "Add to library" Epic sometimes shows an hCaptcha inside the checkout window, where the bot never looked.
_checkout_challenge_present()insrc/stores/epic.pylooks there too, asks you over VNC and finishes the order once it is solved. - An Epic claim that did not land is reported (#61) – when the store page does not confirm the game, the summary lists it as
notifiedwith a link instead of hiding it with the failures, so you can take it yourself. - Epic never ticks a consent box for you – the licence step in
_handle_new_checkout()ticked the first checkbox on the page, and after "Get" that can be "Share my email with Ubisoft". It only touches Epic's own licence box now. - Ubisoft's reCAPTCHA reaches you – when Ubisoft doubts a sign-in it shows a reCAPTCHA picture challenge that the captcha check in
src/core/claimer.pydid not recognise, so the bot gave up and asked you to sign in again. It now asks you to solve the challenge and waits on the same page. - Two more human checks are recognised (PR #60 by @zaryar) –
_human_challenge_present()also knows DataDome's captcha and Cloudflare's "review the security of your connection" page, so they reach you over VNC instead of stalling a store. - A failed Ubisoft sign-in shows up in the summary (PR #60 by @zaryar) – the giveaways it held back are listed as
failed:login-requiredinstead of disappearing. - Itch.io no longer asks you to sign in while you are signed in (#59) –
_itch_session_ready()insrc/stores/gamerpower.pyjudged the session while Cloudflare's "Just a moment" page was still up. It lets that page clear first, and the prompts for Itch.io, Fanatical and IndieGala name the site instead of "gamerpower". - A VNC password no longer stops the container (#67) – since 1.10
start-vnc.shleft the password file readable by everyone, TurboVNC refused it and the container restarted forever wheneverVNC_PASSWORDwas set. The file is private now. PUIDwith dropped capabilities explains itself (#58) – withcap_drop: ALLthe switch to your user failed silently and the container restarted forever.docker-entrypoint.shnow says to addCHOWN,SETUIDandSETGIDback withcap_addand keeps running as root until you do.- Unity finds the asset it bought – since 1 October the giveaway link carries only the asset's number, which
_package_id()insrc/stores/unity.pydid not read, so the bot could not check ownership: it reported its own claim as unconfirmed and then failed at the checkout every run. The name now comes from the asset page too. - A game Epic blocks in your region is no longer a failed claim – on Epic's "unavailable in your platform or region" page
_claim_game()insrc/stores/epic.pyreported that sentence as a failed game. It now keeps the real name, leaves a game you own as owned and skips the rest quietly, and checks a game GamerPower also lists only once. - Steam's "Remember me" is read properly (#65) – the login form draws it as a styled box, so
_do_login()insrc/stores/steam.pynever found it. It now leaves Steam's own tick alone and ticks the box only when it is off. - A GOG code that is mid-redemption is tried again (#66) – on "This code is currently being redeemed by someone"
_redeem_gog_code()insrc/stores/gog.pychecks the sign-in and tries once more, otherwise it keeps the code for the next run instead of asking you to check it by hand. - An itch.io sale that ended stays out of the summary – GamerPower keeps listing an itch.io giveaway after the price comes back, and the bot reported it as a failed claim every run. It now only notes in the log that the game is not free right now.
- The notification switches keep their word –
NOTIFY_SKIP_STOREStakes every nameSTOREStakes and also silences the GamerPower sites and the "Needed you" line.NOTIFY_ERRORS=falsestops the crash alert inmain.py, AliExpress and GOG failures followNOTIFY_CLAIM_FAILS, and Epic and AliExpress no longer send a failure twice. - Steam no longer adds a game's demo (#62) – checking a free DLC's base game,
_ensure_base_game()insrc/stores/steam.pycould click the demo's button, and the free check could take a demo block for the giveaway. Demo blocks are skipped everywhere now, and the "costs 0.00" check, which never matched, works.