- Added .github and .vscode to .gitignore - Created Docs folder with comprehensive documentation - Added CODEBASE_ANALYSIS.md: Detailed analysis of existing bot architecture - Added PROJECT_ROADMAP.md: Project goals and development roadmap - Project goal: Transform Channel Points Miner into Twitch Drops Miner
12 KiB
Twitch Channel Points Miner v2 - Codebase Analysis
Date: February 17, 2026
Purpose: Understanding the existing codebase before converting to a Twitch Drops-focused bot
Original Project: https://github.com/rdavydov/Twitch-Channel-Points-Miner-v2
📋 Executive Summary
This bot is a Python-based application designed to automatically watch Twitch streams to earn channel points. It includes existing drops functionality that we can leverage and expand upon for our Twitch Drops-focused implementation.
Key Finding: The bot already has a solid drops infrastructure including:
- Drop claiming mechanisms
- Campaign tracking
- Inventory synchronization
- Drop progress monitoring
🏗️ Architecture Overview
Core Components
1. TwitchChannelPointsMiner (Main Entry Point)
- Location:
TwitchChannelPointsMiner/TwitchChannelPointsMiner.py - Purpose: Main orchestrator class that manages the entire bot lifecycle
- Key Features:
- Handles authentication via
Twitchclass - Manages multiple streamers simultaneously
- Coordinates WebSocket connections for real-time updates
- Implements priority system for streamer selection
- Spawns threads for monitoring and synchronization
- Handles authentication via
Important Parameters:
- username: Twitch account username
- password: Optional password (prompts if not provided)
- claim_drops_startup: Auto-claim all drops on startup (Boolean)
- priority: List defining watch priority [STREAK, DROPS, ORDER, etc.]
- enable_analytics: Track statistics (Boolean)
- logger_settings: Logging configuration
- streamer_settings: Default settings for all streamers
2. Twitch Class (API Handler)
- Location:
TwitchChannelPointsMiner/classes/Twitch.py - Purpose: Handles all Twitch API interactions via GraphQL
- Key Methods for Drops:
claim_drop(drop)- Claims a single dropclaim_all_drops_from_inventory()- Claims all available drops from inventorysync_campaigns(streamers, chunk_size)- Synchronizes campaign data every 30 minutes__get_inventory()- Fetches user's drops inventory__get_drops_dashboard(status)- Gets active/expired campaigns__get_campaigns_details(campaigns)- Gets detailed campaign information__sync_campaigns(campaigns)- Updates campaign progress
3. Drop Entity
- Location:
TwitchChannelPointsMiner/classes/entities/Drop.py - Purpose: Represents a single drop reward
- Properties:
- id: Unique drop identifier - name: Drop name - benefit: Reward description - minutes_required: Watch time needed - current_minutes_watched: Progress - percentage_progress: Completion percentage - is_claimable: Whether drop can be claimed - is_claimed: Whether drop has been claimed - drop_instance_id: Instance identifier for claiming
4. Campaign Entity
- Location:
TwitchChannelPointsMiner/classes/entities/Campaign.py - Purpose: Represents a Twitch Drops campaign
- Properties:
- id: Campaign identifier - game: Associated game information - name: Campaign name - status: Campaign status (ACTIVE, EXPIRED, etc.) - drops: List of Drop objects - channels: Eligible channel IDs - start_at/end_at: Campaign timeframe - Key Methods:
clear_drops()- Removes expired/claimed dropssync_drops(drops, callback)- Updates drop progress
5. Priority System
- Location:
TwitchChannelPointsMiner/classes/Settings.py - Enum Values:
Priority.STREAK # Watch streak priority Priority.DROPS # Drops collection priority Priority.ORDER # Custom ordering Priority.SUBSCRIBED # Subscribed channels first Priority.POINTS_ASCENDING / POINTS_DESCENDING
🔄 Workflow & Data Flow
Current Bot Flow:
-
Initialization
- Authenticate with Twitch
- Load streamer list
- Configure logger and settings
- Check for updates
-
Startup Phase
- If
claim_drops_startup=True, claim all available drops - Initialize WebSocket pool for real-time updates
- Start analytics server (if enabled)
- If
-
Main Loop
-
Streamer Selection: Choose streamer based on priority system
Priority.STREAK: Prioritize maintaining watch streaksPriority.DROPS: Prioritize streamers with active drop campaignsPriority.ORDER: Use custom ordering
-
Watching: Join stream via WebSocket, simulate viewing
-
Background Threads:
minute_watcher_thread: Tracks watch time, handles bonusessync_campaigns_thread: Syncs drops every 30 minutes
-
-
Drop Handling (Current Implementation)
Every 30 minutes: └─ sync_campaigns() ├─ claim_all_drops_from_inventory() ├─ Fetch active campaigns from dashboard ├─ Update campaign/drop progress ├─ Check if drops are claimable └─ Auto-claim claimable drops -
Events & Notifications
- Events fired:
Events.DROP_CLAIM,Events.DROP_STATUS - Notifications via: Discord, Telegram, Matrix, Pushover, Gotify, Webhook
- Events fired:
📊 Key Files & Directory Structure
TwitchBot/
├── TwitchChannelPointsMiner/
│ ├── TwitchChannelPointsMiner.py # Main orchestrator
│ ├── classes/
│ │ ├── Twitch.py # API handler
│ │ ├── TwitchLogin.py # Authentication
│ │ ├── TwitchWebSocket.py # WebSocket handling
│ │ ├── WebSocketsPool.py # Socket pool manager
│ │ ├── Chat.py # Chat interaction
│ │ ├── Settings.py # Global settings & enums
│ │ ├── AnalyticsServer.py # Flask analytics server
│ │ ├── entities/
│ │ │ ├── Drop.py # Drop model
│ │ │ ├── Campaign.py # Campaign model
│ │ │ ├── Streamer.py # Streamer model
│ │ │ ├── Stream.py # Stream model
│ │ │ ├── Bet.py # Betting model
│ │ │ └── ...
│ │ └── [Notification classes] # Discord, Telegram, etc.
│ ├── constants.py # API endpoints & constants
│ ├── logger.py # Logging configuration
│ └── utils.py # Helper functions
├── example.py # Configuration template
├── requirements.txt # Dependencies
└── Docs/ # Documentation (new)
🎯 Current Drops Implementation Details
How Drops Currently Work:
-
Campaign Discovery:
- Fetches active campaigns from Twitch Drops Dashboard
- Filters campaigns by date range (start_at < now < end_at)
- Associates campaigns with eligible streamers
-
Progress Tracking:
- Watches are tracked via WebSocket "watching" messages
- Progress updates come from inventory sync (every 30 min)
- Drop progress calculated:
currentMinutesWatched / minutesRequired
-
Claiming Logic:
- Drop becomes claimable when:
currentMinutesWatched >= minutesRequiredhasPreconditionsMet == truedrop_instance_idis available
- Claim via GraphQL mutation:
DropsPage_ClaimDropRewards - Automatic retry with 5-10 second random delay
- Drop becomes claimable when:
-
Per-Streamer Configuration:
StreamerSettings( claim_drops=True, # Enable drops for this streamer ... )
Current Limitations for Our Use Case:
-
Primary Focus: Channel points, not drops
- Drops are secondary to point mining
- Priority system favors streaks over drops
- Limited drop-specific logging
-
Fixed Sync Interval: 30-minute campaign sync
- Could miss time-sensitive drops
- Not optimized for drop-focused workflow
-
Limited Drop Intelligence:
- No prediction of drop completion times
- No optimization for multi-campaign scenarios
- No handling of channel-specific drop requirements
-
Streamer Selection:
- Priority system doesn't optimize for drop efficiency
- No automatic discovery of best streams for active campaigns
🔍 Dependencies Analysis
Core Dependencies:
requests # HTTP requests
websocket-client # WebSocket connections
pillow # Image processing (for OCR?)
python-dateutil # Date parsing
emoji # Emoji support
millify # Number formatting
colorama # Colored terminal output
flask # Analytics server
irc # IRC chat (minimal usage)
pandas # Analytics data
pytz # Timezone handling
validators # Input validation
pre-commit # Development tool
All dependencies are standard and well-maintained.
🎨 Notification System
The bot supports multiple notification channels for events:
- Discord - Via webhook
- Telegram - Via bot API
- Matrix - Matrix protocol
- Pushover - Push notifications
- Gotify - Self-hosted notifications
- Webhook - Generic webhooks
Relevant Events for Drops:
Events.DROP_CLAIM- Drop claimedEvents.DROP_STATUS- Drop progress update
💡 Recommendations for Drops-Focused Bot
What to Keep:
✅ Drop & Campaign entity models (well-designed)
✅ Twitch API/GraphQL integration (solid)
✅ WebSocket infrastructure (essential)
✅ Notification system (useful for alerts)
✅ Logger system (comprehensive)
✅ Authentication mechanism (working)
What to Modify:
🔧 Priority system → Make drops the primary focus
🔧 Sync interval → Reduce to ~5-10 minutes for drops
🔧 Streamer selection → Algorithm optimized for drop campaigns
🔧 Progress tracking → More granular, per-campaign insights
🔧 Configuration → Simplify for drops-only use case
What to Remove/Deprecate:
❌ Betting system (not needed for drops)
❌ Channel points tracking (secondary concern)
❌ Community goals (not relevant)
❌ Watch streak priority (not needed)
❌ Analytics system (or simplify significantly)
New Features to Add:
➕ Campaign prioritization algorithm
➕ Automatic discovery of best streams per campaign
➕ Drop progress predictions & ETA
➕ Multi-account support for faster farming
➕ Campaign completion tracking
➕ Smart switching between campaigns
➕ Detailed drop statistics dashboard
🚀 Next Steps
-
Phase 1: Configuration & Setup
- Create drops-focused default config
- Update example.py for drops use case
- Simplify unnecessary features
-
Phase 2: Core Logic Modifications
- Implement drops-first priority system
- Reduce campaign sync interval
- Enhance drop progress logging
-
Phase 3: New Features
- Campaign optimizer
- Smart streamer selection
- Drop ETA predictions
-
Phase 4: Testing & Documentation
- Test with active campaigns
- Document new usage patterns
- Create user guide
📝 Technical Notes
GraphQL Operations Used:
DropsPage_ClaimDropRewards- Claim dropInventory- Get user inventoryViewerDropsDashboard- Get campaignsDropCampaignDetails- Get campaign details
WebSocket Topics:
video-playback-by-id- Stream eventspredictions-channel-v1- Predictions- Drops progress updates come via API polling, not WebSocket
Authentication:
- Uses OAuth login flow
- Stores auth token and cookies
- Handles token refresh automatically
🎓 Conclusion
The codebase is well-structured and maintainable. The existing drops functionality provides a solid foundation. Our main task is to shift focus from channel points to drops, optimize the workflow, and add drop-specific enhancements.
Confidence Level: High - The codebase is ready for modification with minimal breaking changes needed.
Document created during initial codebase review - February 17, 2026