On first startup, _populate_initial_state() was marking current Epic free
games as "posted" without actually sending them to the room. This meant
users had to wait until the next cycle of new games before seeing anything.
Now only CheapShark deals are silently recorded on first run (there can be
dozens). Epic free games are left for check_epic_free_games() to pick up
and post immediately, since they are few in number and time-limited.
https://claude.ai/code/session_017eMsVwUopgmnEyd6JJedpV
When SEND_INTRO_MESSAGE=true, the bot sends "The deals must flow." as
an m.notice to the Matrix room right after startup, before the first
scheduled deal checks. Defaults to off.
https://claude.ai/code/session_017eMsVwUopgmnEyd6JJedpV
The bot polls periodically for new deals, but sorting by "Deal Rating"
meant it always returned the same top-rated deals and would never
discover new listings that aren't in the top 10 by rating. Sorting by
"recent" ensures newly added or updated deals are seen on each poll.
https://claude.ai/code/session_017eMsVwUopgmnEyd6JJedpV
Two bugs fixed:
1. Function signature used old 0-100 scale defaults (min_rating: int = 80)
but dealRating from CheapShark is 0-10. Updated to float = 8.0.
2. Deals with dealRating of 0.0 (unrated/insufficient data) were being
filtered out as "poorly rated". Now treats 0.0 as unrated and skips
the rating check, so games like Leisure Suit Larry that lack a
CheapShark deal rating aren't incorrectly excluded.
https://claude.ai/code/session_017eMsVwUopgmnEyd6JJedpV
Log the raw deal count before filtering and log each filtered-out
deal with the reason (savings too low, rating too low) at DEBUG level.
Use --debug flag to enable verbose output for troubleshooting.
https://claude.ai/code/session_01LPpSZFfyh6vdV5HGFWjoQX
The previous 0-100 scale with a * 10 conversion was confusing —
CheapShark returns deal ratings as floats (e.g. 9.8, 7.5) so the
config should match. Default is now 8.0 instead of 80.
https://claude.ai/code/session_01LPpSZFfyh6vdV5HGFWjoQX
Running directly with `python -m gaming_deals_bot` didn't pick up
variables from .env — only the Docker path (--env-file) did. Now
dotenv is loaded before config parsing so both workflows work.
https://claude.ai/code/session_01LPpSZFfyh6vdV5HGFWjoQX
`python -m gaming_deals_bot --check` tests each external dependency
before starting the bot:
- Matrix: verifies access token (whoami) and room membership
- CheapShark: hits the deals endpoint
- Epic Games Store: hits the free-games endpoint
- Frankfurter: fetches exchange rates
- IsThereAnyDeal: validates the API key (skipped if not set)
Exits 0/1 so it works in CI pipelines and Docker health-checks.
https://claude.ai/code/session_01LPpSZFfyh6vdV5HGFWjoQX
Fetches live exchange rates from the Frankfurter API (ECB data, free,
no API key) and displays converted prices alongside USD in every deal
message. Rates are cached in memory and auto-refreshed hourly.
https://claude.ai/code/session_01LPpSZFfyh6vdV5HGFWjoQX
Implements a Matrix bot that posts PC gaming deals and free game alerts:
- CheapShark API integration (Steam, GOG, Humble, GMG) polled every 2 hours
- Epic Games Store free games detection polled daily
- IsThereAnyDeal historical low price flagging (optional)
- SQLite deduplication with 30-day pruning
- First-run population (records existing deals without posting)
- Matrix-flavored HTML + plain text fallback messages
- Dockerfile for containerized deployment
https://claude.ai/code/session_01LPpSZFfyh6vdV5HGFWjoQX