When MATRIX_USE_THREADS=true, deals are posted into dedicated threads
instead of the room timeline:
- 🎮 Game Deals — CheapShark + ITAD type=game
- 🧩 DLC Deals — ITAD type=dlc
- 🆓 Epic Free Games — current and upcoming Epic free games
- 📦 Non-Game Deals — ITAD non-game content (software, courses, etc.)
Thread roots are created on first use and persisted in the database.
When threads are disabled (default), behaviour is unchanged.
Key changes:
- New threads.py module with ThreadCategory enum and routing logic
- ITADDeal now carries deal_type; type filter moved from fetcher to bot
- MatrixDealsClient gains send_deal_in_thread() and create_thread_root()
- Database gets thread_roots table for storing root event IDs
- Bot routes each deal to the appropriate thread via _send_to_thread_or_room()
https://claude.ai/code/session_01EfPjktyrF24DBNHWsY1KBP