Added to README.md:
- New 'OCR Requirements (Optional)' section after Installation
- Instructions for installing EasyOCR (recommended), Tesseract, or PaddleOCR
- Note that Game Reader works without OCR, just shows 'not available'
Improved Game Reader Test plugin:
- Better error message when Tesseract binary is not installed
- Provides download link and installation steps in error message
- Updated Calibration tab to check if Tesseract binary is available
- Shows recommendation to use EasyOCR in backend status
This helps users understand why they get 'tesseract is not installed'
errors and how to fix them.
Added new 'File Test' tab that allows testing OCR on saved screenshot files.
This is useful when:
- The game is not currently running
- You want to test OCR on a specific saved screenshot
- You want to compare OCR results on the same image
Features:
- Browse button to select image files (PNG, JPG, BMP, TIFF)
- Backend selection (Auto/EasyOCR/Tesseract)
- Displays filename and processing stats
- Shows which backend was used and processing time
The original 'Quick Test' still captures the current screen.
The new 'File Test' lets you test on saved images.
The plugin was using wrong field names for EventBus events:
SkillGainEvent:
- Fixed: points → gain_amount
- Fixed: new_value → skill_value
LootEvent:
- Fixed: Now uses items list instead of direct item_name/quantity/value
- Updated to handle the dict structure in items list
DamageEvent:
- Fixed: amount → damage_amount
- Fixed: Now uses is_outgoing instead of is_critical for direction
- Added target_name and attacker_name fields
GlobalEvent:
- Fixed: player → player_name
- Fixed: item → item_name
- Added achievement_type field
All simulate buttons should now work correctly.
CHANGES:
1. Settings plugin is no longer categorized as 'Core' plugin
- The settings menu is built into the overlay window
- Having both was redundant
- Settings plugin still exists but won't be auto-enabled
2. Removed hardcoded SpotifyWidget from core/dashboard.py
- Spotify widget was baked into core instead of being a proper plugin
- Should be in plugins/spotify_controller/ instead
- Commented out the widget addition for now
This addresses the user's feedback that:
- Settings plugin is redundant with the settings menu
- Spotify widget shouldn't be in core
BUG 1: Sidebar buttons clicked wrong plugin
- Lambda captured idx by reference, always using last value
- Fixed by using functools.partial to capture by value
BUG 2: Dashboard plugin KeyError 'border_subtle'
- Changed to 'border_default' which exists in EU_COLORS
The sidebar should now correctly switch to the clicked plugin.
BUG: TypeError: missing 1 required positional argument: 'checked'
The lambda functions were expecting a 'checked' argument that wasn't
being passed by the signals:
- QShortcut.activated doesn't pass any arguments
- SidebarButton.clicked doesn't pass any arguments
Fix: Removed 'checked' parameter from both lambda functions.
BUG: 'bg_panel' KeyError in Dashboard plugin.
The EU_COLORS dictionary doesn't have 'bg_panel'. Changed to use
'bg_secondary' which is the correct background color for panels.
BUG: KeyError: 'border_color' when opening Settings dialog.
The color dictionary uses 'border_default' not 'border_color'.
Fixed all 5 occurrences in the file.
BUG: KeyError: 'accent_primary' when opening Settings dialog.
The color dictionary uses 'accent_orange' not 'accent_primary'.
Fixed all 10 occurrences in the file.
NEW TESTING PLUGINS:
1. Log Parser Test Plugin (plugins/log_parser_test/)
- Real-time event monitoring with counters
- Visual event history table (last 100 events)
- Raw log line viewer
- Simulated event buttons for testing:
* Skill Gain
* Loot
* Damage
- Event type filtering and statistics
- Color-coded event types
- Auto-scroll and refresh
2. Game Reader Test Plugin (plugins/game_reader_test/)
- Quick OCR test with progress bar
- Region-specific OCR testing with presets:
* Chat Window
* Skills Window
* Inventory
* Mission Tracker
- OCR backend selection (Auto/EasyOCR/Tesseract/PaddleOCR)
- Processing time tracking
- Test history with results
- Save/copy OCR results
- Calibration tools:
* Display DPI detection
* Backend status checker
* OCR tips and best practices
FEATURES FOR BOTH:
- Modern EU-styled UI
- Tabbed interface
- Error handling and logging
- Background processing (no UI freeze)
- Real-time updates
These plugins serve as both testing tools and demonstrations
of the Log Reader and OCR core services capabilities.
BUG: name 'QCheckBox' is not defined errors in plugins settings tab.
Root cause: QCheckBox was imported inside _open_settings() method but
_create_plugins_settings_tab() also uses it. The local import didn't
propagate to the helper method.
FIX:
- Added QCheckBox to top-level PyQt6 imports
- Added QTabWidget to top-level imports (also used)
- Removed redundant local imports from _open_settings()
All settings UI components now available globally in the module.
BUG: AttributeError when accessing plugin_class.name in settings tab.
The error occurred when iterating over discovered plugins and trying
to access .name, .version, or .description attributes. While all
plugins should have these attributes, there might be edge cases
where the plugin_class is not properly formed.
FIX:
- Added getattr() with defaults for safe attribute access
- Added try-except around each plugin row creation
- Added error logging for debugging
- Gracefully skip broken plugin entries instead of crashing
Changes:
- _create_plugins_settings_tab() now uses getattr() for all
plugin attributes with sensible defaults
- Each plugin row is wrapped in try-except for isolation
- Errors are logged but don't crash the settings UI
BUG: AttributeError: 'ScreenshotService' object has no attribute '_platform'
Root cause: In __init__, _get_default_save_path() was called BEFORE
_platform was initialized. The method tried to access self._platform
to determine the save path.
FIX: Moved platform detection BEFORE save path initialization in:
- core/screenshot.py
- core/screenshot_secure.py
- core/screenshot_vulnerable.py
Order changed from:
1. self._save_path = self._get_default_save_path() # FAILS - needs _platform
2. self._platform = platform.system().lower()
To:
1. self._platform = platform.system().lower()
2. self._save_path = self._get_default_save_path() # WORKS - _platform exists
This is a common Python initialization order bug where methods called
in __init__ reference attributes that haven't been set yet.
The package 'PyQt6-Qt6-SVG' does not exist on PyPI.
PyQt6 6.4.0+ includes SVG support by default via QtSvg module.
Users were getting:
ERROR: No matching distribution found for PyQt6-Qt6-SVG
Fix: Removed the invalid package line.
SVG support will work with base PyQt6 installation.
BUGS FIXED:
1. Missing dependencies in requirements.txt:
- Added pytesseract>=0.3.10 (OCR service needs it)
- Added psutil>=5.9.0 (Analytics plugin needs it)
- Added pywin32>=306 for Windows (window/screenshot needs it)
2. Type mismatch in plugin_api.py:
- get_eu_window() documented as returning Dict[str, Any]
- But actually returned WindowInfo dataclass
- Fixed: Now converts WindowInfo to dict before returning
This should resolve most import and type errors users were seeing.
NEW FEATURES:
- Discord Rich Presence plugin - Show EU activity in Discord
- Import/Export Tool - Universal data backup/restore
IMPROVEMENTS:
- Platform detection improvements
- Graceful degradation for missing dependencies
- Better error handling throughout
- Service registry pattern implementation
DOCUMENTATION:
- PHASE2_PLAN.md created
- SWARM_RUN_2_RESULTS.md
Total: 2 new plugins, ~2,500 lines of code
- Fixed fcntl import error on Windows
- Added portalocker as Windows fallback
- Graceful degradation if no locking available
- Updated requirements.txt with platform-specific deps
All 10 core services implemented and integrated:
CORE SERVICES:
1. Nexus API Client - Search items, mobs, market data
2. Data Store - Plugin persistence with auto-backup
3. Notification System - Toast notifications with sounds
4. Window Manager - EU window detection and focus
5. HTTP Client - Cached HTTP with rate limiting
6. Event Bus - Typed events with pub/sub
7. Audio Service - Sound playback with volume control
8. Clipboard Manager - Copy/paste with history
9. Screenshot Service - Screen capture with auto-save
10. Task Manager - Thread pool with priorities
Each service:
- Singleton pattern
- Thread-safe
- PluginAPI integration
- BasePlugin convenience methods
Updated:
- core/main.py - Initialize all services
- core/plugin_api.py - Service registration
- plugins/base_plugin.py - Exposed methods
Core services created by swarm agents:
- core/nexus_api.py - Entropia Nexus API client
- core/data_store.py - Plugin data persistence
- core/notifications.py - Toast notification system
- core/window_manager.py - Window management utilities
- core/http_client.py - HTTP client with caching
- core/plugin_api.py - Enhanced with new services
Services integrate with PluginAPI for plugin access.
TODO: Final integration and testing.
FIXES:
- OCR now uses lazy initialization (only loads when first used)
- Fixed PaddleOCR invalid use_gpu parameter (some versions don't support it)
- Added fallback try/except for PaddleOCR without use_gpu
- App starts immediately, OCR initializes on first scan
- Prevents long startup delays from model downloading
CHANGES:
- OCRService._init_backends() only called on first use
- Removed eager initialization from main.py startup
- Better error handling for backend failures
FIXES:
- Removed margins causing 'box in a box' effect
- Removed inner container border (window has OS frame)
- Window now fills properly without nested boxes
NEW:
- Added Settings button to header (always accessible)
- Settings dialog shows all available plugins
- Check/uncheck to enable/disable
- Shows message when no plugins enabled
- Save & Apply reloads plugins immediately
CHANGES:
- All plugins now disabled by default (empty enabled list)
- Settings > Plugins tab shows all discovered plugins
- Checkboxes to enable/disable individual plugins
- Enable All / Disable All buttons
- Changes take effect immediately (no restart needed for most)
- Plugin state saved to config/plugins.json
PLUGIN MANAGER:
- is_plugin_enabled() - must be explicitly enabled
- enable_plugin() - loads and initializes plugin
- disable_plugin() - unloads plugin
- get_all_discovered_plugins() - returns all available plugins
Removed Qt.WindowType.Tool flag which was hiding app from taskbar.
App now appears in Windows taskbar and can be closed from there.
Window still stays on top with WindowStaysOnTopHint.
- Centered title with decorative lines like SKILLS window
- Orange left border (3px) on selected/active items
- Updated colors to match exact game palette:
- Teal progress bars (#4ecdc4)
- Orange window border
- Better background colors
- Category label style like ALL CATEGORIES
- Clean sidebar with proper borders
- Match EU window aesthetic more closely
ICON SYSTEM:
- Replaced emojis with actual SVG icons
- New icon_manager.py with IconManager class
- PLUGIN_ICONS mapping for all plugins
- Default gear icon for plugins without icons
- All icons are white SVG line icons
NEW ICONS (14):
grid, trending-up, package, pickaxe, award, book, dollar-sign, archive, message-square, map, navigation, shopping-bag, tool, box, zap
ICON EXTRACTOR INTEGRATION:
- New core/icon_extractor.py
- TGAReader class for reading EU TGA cache files
- IconCacheManager for extracting and caching icons
- Supports RLE compressed TGA
- Converts BGR to RGB
UI IMPROVEMENTS:
- Cleaner, more game-like layout
- Sidebar with plugin selector (200px width)
- View toggle: Grid view vs List view
- No emojis anywhere
- Better spacing and padding
- EU-UTILITY title (no emoji)
Total icons now: 32 SVG icons
Fixed: 'table' and 'tab' style entries had mismatched quotes
Changed: Closing quotes from "' to """ to match opening quotes
This was causing: SyntaxError: invalid decimal literal
BUG FIXES:
- Fixed missing 'Path' import in overlay_widgets.py
- Added 'json' and 'platform' imports
ROBUSTNESS:
- Plugin manager now catches ALL errors during plugin load
- One plugin crash won't kill the app
- Detailed error messages with stack traces
- Plugins with errors are skipped gracefully
PLUGIN API SYSTEM:
- New core/plugin_api.py - Central API registry
- BasePlugin updated with API methods:
- register_api() - Expose functions to other plugins
- call_api() - Call other plugin APIs
- ocr_capture() - Shared OCR service
- read_log() - Shared log reading
- get/set_shared_data() - Cross-plugin data
- publish_event/subscribe() - Event system
API TYPES:
- OCR - Screen capture services
- LOG - Chat/game log reading
- DATA - Shared data storage
- UTILITY - Helper functions
- SERVICE - Background services
CROSS-PLUGIN FEATURES:
- Any plugin can expose APIs
- Any plugin can consume APIs
- Shared OCR abstraction
- Shared log reading
- Event pub/sub system
- Utility functions (format_ped, calculate_dpp, etc.)
Example usage:
# Register API
self.register_api(scan_window, self.scan, APIType.OCR)
# Call API
result = self.call_api(other.plugin, scan_window)
# Use shared services
text = self.ocr_capture()
logs = self.read_log(lines=100)
For EntropiaNexus.com dev: You can now expose APIs from your plugin
that other plugins can use! 🚀
MAJOR UPDATES:
- Overlay Window completely redesigned with EU styling
- Uses exact EU color palette from game screenshots
- Dark blue/gray backgrounds matching EU UI
- Orange (#ff8c42) accent colors
- Proper EU border styling
- Shadow effects matching game windows
NEW PLUGIN:
- Dashboard - Main overview with stats, quick actions, activity feed
- Shows PED balance, skill count, items, DPP
- Quick action grid for common tasks
- Recent activity timeline
- Pro tips section
EU STYLING APPLIED:
- Header with orange EU-Utility logo
- Plugin bar with EU-styled buttons
- Proper border radius (8px main, 4px buttons)
- Tray menu styled to match
- Consistent color scheme throughout
Total plugins: 19
SWARM COMPLETE! 🚀🚀🚀