From f13bfd7b07a3f2079d6e22494cbf80ba43a30e00 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 28 Feb 2026 23:42:54 +0000 Subject: [PATCH] Default ITAD_DEALS_LIMIT to 200 (API max) to maximise deal coverage Since the ITAD API only sorts by discount or price (no time-based sort), fetching the full 200-deal window per country ensures our client-side filtering sees every available deal rather than just the top N by discount. The dedup database already prevents reposting, so the extra data is cheap. https://claude.ai/code/session_01EfPjktyrF24DBNHWsY1KBP --- .env.example | 2 +- README.md | 2 +- gaming_deals_bot/config.py | 2 +- gaming_deals_bot/itad_deals.py | 9 +++++++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index 4ad0663..f70b443 100644 --- a/.env.example +++ b/.env.example @@ -31,7 +31,7 @@ EXTRA_CURRENCIES=CAD,EUR,GBP # (Falls back to shared MIN_DISCOUNT_PERCENT / MAX_PRICE if not set) #ITAD_MIN_DISCOUNT=50 #ITAD_MAX_PRICE=20 -#ITAD_DEALS_LIMIT=100 +#ITAD_DEALS_LIMIT=200 # Shared filter defaults (used when source-specific values are not set) MIN_DISCOUNT_PERCENT=50 diff --git a/README.md b/README.md index 92ae4f8..f66e29b 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ Each deal source has its own filter settings. Source-specific values take priori | `CHEAPSHARK_MAX_PRICE` | CheapShark | 20 | Maximum sale price (USD) | | `ITAD_MIN_DISCOUNT` | ITAD | 50 | Minimum discount percentage | | `ITAD_MAX_PRICE` | ITAD | 20 | Maximum sale price (USD, prices from other regions are converted) | -| `ITAD_DEALS_LIMIT` | ITAD | 100 | Number of deals to fetch per country (max 200) | +| `ITAD_DEALS_LIMIT` | ITAD | 200 | Number of deals to fetch per country (max 200) | | `MIN_DISCOUNT_PERCENT` | Shared | 50 | Fallback minimum discount when source-specific value is not set | | `MAX_PRICE` | Shared | 20 | Fallback maximum price when source-specific value is not set | diff --git a/gaming_deals_bot/config.py b/gaming_deals_bot/config.py index c65947e..98c424f 100644 --- a/gaming_deals_bot/config.py +++ b/gaming_deals_bot/config.py @@ -60,7 +60,7 @@ class Config: self.itad_max_price = float( os.environ.get("ITAD_MAX_PRICE", _max_price) ) - self.itad_deals_limit = int(os.environ.get("ITAD_DEALS_LIMIT", "100")) + self.itad_deals_limit = int(os.environ.get("ITAD_DEALS_LIMIT", "200")) # Intro message on startup self.send_intro_message = os.environ.get( diff --git a/gaming_deals_bot/itad_deals.py b/gaming_deals_bot/itad_deals.py index 37d1e7f..19f7528 100644 --- a/gaming_deals_bot/itad_deals.py +++ b/gaming_deals_bot/itad_deals.py @@ -50,10 +50,15 @@ async def fetch_deals( countries: list[str] | None = None, max_price: float = 20, min_discount: float = 50, - limit: int = 100, + limit: int = 200, ) -> list[ITADDeal]: """Fetch current deals from IsThereAnyDeal across one or more countries. + Defaults to the API maximum of 200 deals per country so that client-side + filtering (discount, price, type) has the widest possible pool to work + with — this avoids missing deals that wouldn't appear in a smaller window + sorted only by discount. + Deals are fetched per-country, merged (first country in the list wins when the same game+shop appears in multiple regions), and finally sorted by timestamp so that the newest deals appear first. @@ -105,7 +110,7 @@ async def _fetch_country_deals( country: str = "US", max_price: float = 20, min_discount: float = 50, - limit: int = 100, + limit: int = 200, ) -> list[ITADDeal]: """Fetch deals for a single country from the ITAD ``/deals/v2`` endpoint.""" params: dict = {