Commit Graph

74 Commits

Author SHA1 Message Date
LemonNexus fe7b4c9d94 feat: Core framework components - Settings, Dashboard, Search, Updater, Backup
BUILT-IN FRAMEWORK COMPONENTS (not plugins):

1. core/ui/settings_view.py
   - Settings interface with 6 tabs:
     * General (appearance, behavior)
     * Plugin Store (browse/install)
     * My Plugins (enable/disable)
     * Hotkeys (dynamic from plugins)
     * Data & Backup (import/export)
     * Updates (auto-updater settings)

2. core/ui/dashboard_view.py
   - Built-in dashboard with plugin hooks
   - Welcome widget
   - Quick stats
   - Plugin widget registration API
   - Grid layout for widgets

3. core/ui/search_view.py
   - Universal search interface
   - Plugin search provider registration
   - Debounced search
   - Quick access (Ctrl+Shift+F)

4. core/updater.py
   - Auto-updater (disabled by default)
   - Core and plugin update checking
   - Notification-only mode
   - Manual check button

5. core/backup.py
   - Backup manager for import/export
   - Full data backup/restore
   - ZIP-based format
   - Pre-operation backups

6. core/dependency_helper.py
   - Dependency checking
   - Missing package detection
   - Install helper
   - Troubleshooting dialog

7. core/ui/__init__.py
   - Module exports

REMOVED FROM plugins/:
- settings/ (now in core/ui)
- plugin_store_ui/ (now in core)
- dashboard/ (now in core/ui)
- universal_search/ (now in core/ui)
- import_export/ (now in core/backup.py)
- auto_updater/ (now in core/updater.py)

PLUGIN REPO UPDATED:
- Removed 6 plugins now built-in
- 17 optional plugins remain

Architecture now matches the vision:
- Core = Framework + Essential UI
- Plugins = Optional functionality
- Plugin Store = Distribution mechanism
2026-02-15 02:09:20 +00:00
LemonNexus 725590e247 feat: Plugin Store - Framework-only architecture
BREAKING CHANGE: EU-Utility is now a framework-only application.
All user-facing features have been moved to separate plugin repository.

NEW FEATURES:

1. Plugin Store Core Module (core/plugin_store.py)
   - PluginStoreWorker: Background operations (fetch, download, updates)
   - PluginStoreUI: Grid-based plugin browser with cards
   - PluginInfo dataclass for plugin metadata
   - Fetches from remote git repository

2. Plugin Store UI Features:
   - Grid layout with plugin cards (300x200px each)
   - Search/filter by name, description, tags
   - Category filter dropdown
   - Visual indicators:
     * 📦 Plugin icon (emoji-based)
     * Version badge
     * Status badges ( Enabled, 📦 Installed)
     * Tag display
     * 🔗 Dependency count with tooltip
   - Install/Enable/Disable/Uninstall buttons
   - Progress bar for operations
   - Refresh and Check Updates buttons

3. Settings Integration:
   - New 'Plugin Store' tab in Settings
   - Moved plugin management to 'My Plugins' tab
   - Plugin Store uses core module directly

4. Plugin Store UI Plugin (plugins/plugin_store_ui/):
   - Standalone plugin for overlay integration
   - Hotkey: Ctrl+Shift+P (configurable)

ARCHITECTURE CHANGES:

- EU-Utility Core: Framework only (PluginAPI, services, overlay)
- Plugin Repository: https://git.lemonlink.eu/impulsivefps/EU-Utility-Plugins-Repo
- Plugins installed via Store → user plugins/ directory
- Local plugins/ folder still supported for development

MANIFEST FORMAT:

USER WORKFLOW:
1. Open Settings → Plugin Store
2. Browse/search available plugins
3. Click Install (with dependency confirmation)
4. Restart EU-Utility
5. Enable plugin in 'My Plugins' tab

DEVELOPER WORKFLOW:
1. Develop plugin locally in plugins/
2. Test with core framework
3. Submit to plugin repository
4. Users install via Store

This enables limitless modularity - users only install
what they need, developers can publish independently.
2026-02-15 01:43:25 +00:00
LemonNexus 0155eb0be0 feat: Constrain skill scanner to only Entropia game window
BUG: OCR was reading text from Discord, EU-Utility UI, and other windows.

FIX:
1. Added find_entropia_window() - Uses win32gui + psutil on Windows to find
   the game window by process name 'Entropia.exe' and window title containing
   'Entropia Universe'. Returns (left, top, width, height).

2. Added capture_entropia_region() - Captures only the game window region,
   falls back to full screen if window not found.

3. Added is_valid_skill_text() - Filters out non-game text patterns:
   - Discord, Event Bus, Game Reader, Test, Page Scanner, HOTKEY MODE
   - UI elements like 'Skill Tracker', 'Calculator', 'Nexus Search'
   - Debug text like '[SkillScanner]', 'Parsed:', 'Cleared'
   - Process names like 'Entropia.exe', 'Client (64 bit)', 'Arkadia'
   - Lines with >10 words (skills aren't that long)

4. Added recognize_image() method to OCRService for convenience.

5. Modified SkillOCRThread.run() to:
   - Capture only Entropia window
   - Filter text before parsing
   - Use _parse_skills_filtered() which validates each line

6. Added _parse_skills_filtered() method that:
   - Splits text by lines
   - Only keeps lines containing a valid rank
   - Validates each line with is_valid_skill_text()
   - Logs filtered lines for debugging

RESULT:
- Scanner now ONLY reads from the game window
- Invalid text (Discord, UI, debug) is filtered out
- Much cleaner skill parsing results

Note: Window title varies by location (e.g., '[Arkadia]', '[Calypso]')
but process name is always 'Entropia.exe'.
2026-02-15 00:55:37 +00:00
LemonNexus 419b0cb523 fix: Disable Spotify widget by default
The Spotify 'Now Playing' overlay widget was appearing even when
the Spotify Controller plugin was not enabled.

CHANGES:
- Set 'spotify' overlay widget to enabled: False in default settings
- Removed Spotify from dashboard default widgets
- Both settings.py and settings_secure.py updated

The widget can still be manually enabled by users who want it:
1. Edit config/settings.json
2. Set overlay_widgets.spotify.enabled to true
3. Or use the overlay widget controls

This fixes the issue where the Spotify widget appeared even when
the plugin wasn't enabled.
2026-02-15 00:14:35 +00:00
LemonNexus 88f112dfa2 fix: Fix invalid escape sequence warning in ocr_backend_manager.py
The string contained C:\Program Files\Tesseract-OCR which Python
interpreted as escape sequences (\P is invalid).

Fixed by escaping backslashes: C:\Program Files\Tesseract-OCR
2026-02-14 23:52:05 +00:00
LemonNexus 0bdb3ce189 feat: Add plugin-to-plugin dependencies support
Plugins can now declare dependencies on other plugins.

NEW FEATURES:
- dependencies['plugins'] = ['plugin_id1', 'plugin_id2']
- Separates pip packages (auto-installed) from plugin dependencies (user enabled)
- Settings dialog shows which plugins need to be enabled first
- PluginDependencyCheck tracks installed/enabled status

EXAMPLE:
dependencies = {
    'pip': ['requests'],
    'plugins': ['plugins.dashboard.plugin.DashboardPlugin']
}
2026-02-14 23:49:13 +00:00
LemonNexus 706a5710a9 feat: Auto-install plugin dependencies when enabling plugins
NEW FEATURES:

1. Plugin Dependency Declaration (BasePlugin):
   - Added 'dependencies' class attribute
   - Format: {'pip': ['package1', 'package2'], 'optional': {...}}
   - Plugins can declare required pip packages

2. Plugin Dependency Manager (core/plugin_dependency_manager.py):
   - Checks if declared dependencies are installed
   - Installs missing packages via pip
   - Tracks installation status
   - Shows progress dialog during installation

3. Settings Dialog Integration:
   - When enabling a plugin with dependencies, shows dialog
   - Lists missing dependencies
   - Asks user if they want to install
   - Shows progress bar during installation
   - Handles installation failures gracefully

4. Example: Game Reader Test plugin:
   - Declares dependencies: pillow, numpy
   - Optional: easyocr, pytesseract, paddleocr
   - When enabled, prompts to install if missing

WORKFLOW:
1. User enables a plugin in Settings → Plugins
2. System checks if plugin has dependencies
3. If dependencies missing, shows dialog
4. User clicks Yes to install
5. Progress dialog shows installation progress
6. Plugin loads after dependencies installed

This eliminates manual pip install steps for plugins!
2026-02-14 23:46:01 +00:00
LemonNexus 6931c4b039 fix: Fix HTTPClient, Dashboard, and Log Parser errors
BUG FIXES:

1. HTTPClient '_generate_cache_key' AttributeError:
   - The method definition was missing, only had docstring and body
   - Added proper method signature: def _generate_cache_key(self, url, params)

2. Dashboard 'bg_dark' KeyError:
   - EU_COLORS doesn't have 'bg_dark'
   - Changed to 'bg_secondary' which is the correct color

3. Log Parser 'maximum recursion depth exceeded':
   - read_log() was calling itself instead of parent method
   - Changed to super().read_log() to call BasePlugin's method

These fixes resolve:
- Universal Search not working
- API errors
- Dashboard customize dialog crash
- Log Parser infinite recursion
2026-02-14 23:40:09 +00:00
LemonNexus 999bdfca35 feat: Fix OCR errors and add backend installation/management
BUG FIXES:
1. EasyOCR 'Invalid input type' error:
   - PIL Images must be converted to numpy arrays
   - Added np.array() conversion before passing to EasyOCR

2. PaddleOCR 'Unknown argument: show_log' error:
   - Some versions don't support show_log parameter
   - Added try/except to handle both versions
   - Falls back to creating PaddleOCR without show_log

NEW FEATURES:
1. OCR Backend Manager (core/ocr_backend_manager.py):
   - Detects installed OCR backends
   - Checks Windows Registry for Tesseract installation
   - Searches common installation paths
   - Auto-configures pytesseract with found binary

2. Calibration Tab Improvements:
   - Added 'Install EasyOCR' button (pip install easyocr)
   - Added 'Install Tesseract Package' button (pip install pytesseract)
   - Added 'Auto-Detect Tesseract' button (checks registry/paths)
   - Added 'Install PaddleOCR' button (pip install paddleocr)
   - Shows which backends are available and where they're installed

3. Better Error Messages:
   - Clear instructions when backends are missing
   - Direct links to download pages
   - Shows detected installation paths

The app now:
- Automatically finds Tesseract from registry
- Allows installing backends from within the UI
- Properly handles all OCR input formats
2026-02-14 23:38:18 +00:00
LemonNexus 899b74fe62 fix: Remove redundant Settings plugin and baked-in Spotify widget
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
2026-02-14 19:58:18 +00:00
LemonNexus de63d8895a fix: Fix sidebar plugin switching and Dashboard border color
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.
2026-02-14 19:53:51 +00:00
LemonNexus 539f07e713 fix: Fix lambda function argument errors in overlay_window.py
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.
2026-02-14 19:49:03 +00:00
LemonNexus 5fc8d85df5 fix: Replace border_color with border_default in overlay_window.py
BUG: KeyError: 'border_color' when opening Settings dialog.

The color dictionary uses 'border_default' not 'border_color'.
Fixed all 5 occurrences in the file.
2026-02-14 19:29:30 +00:00
LemonNexus 0d740c3621 fix: Replace accent_primary with accent_orange in overlay_window.py
BUG: KeyError: 'accent_primary' when opening Settings dialog.

The color dictionary uses 'accent_orange' not 'accent_primary'.
Fixed all 10 occurrences in the file.
2026-02-14 19:22:06 +00:00
LemonNexus 92e528b5b6 feat: Fix system tray and add configurable hotkeys
SYSTEM TRAY FIXES:
- Added fallback icon search paths
- Falls back to standard system icon if no custom icon found
- Better error handling for missing icon files
- System tray should now show in Windows taskbar

HOTKEY MANAGEMENT:
- New HotkeyManager class (core/hotkey_manager.py)
  - JSON-based configuration storage
  - 10 configurable global hotkeys
  - 2 local hotkeys
  - Validation for key combinations
  - Conflict detection
  - Reset to defaults

HOTKEYS TAB:
- Added 'Hotkeys' tab to Settings dialog
- Categorized by scope: Global/Local/Overlay
- Shows current key bindings
- Enable/disable toggles
- Visual styling with color-coded sections
- Reset to defaults button

DEFAULT HOTKEYS:
  Global:
  - Ctrl+Shift+U: Toggle overlay
  - Ctrl+Shift+H: Hide overlays
  - Ctrl+Shift+F: Universal search
  - Ctrl+Shift+N: Nexus search
  - Ctrl+Shift+C: Calculator
  - Ctrl+Shift+M: Spotify
  - Ctrl+Shift+R: Game reader (OCR)
  - Ctrl+Shift+S: Skill scanner
  - Ctrl+Shift+L: Loot tracker
  - Ctrl+Shift+P: Screenshot

  Local:
  - Ctrl+T: Toggle theme

  Overlay:
  - ESC: Close overlay
2026-02-14 19:17:42 +00:00
LemonNexus db0eb5bf65 feat: Redesign Plugins Settings tab with categorization
IMPROVED PLUGINS SETTINGS UI:

1. Visual Improvements:
   - Added header with plugin management info
   - Added color-coded legend (Core/Test/Other)
   - Styled plugin rows with hover effects
   - Version badges with orange accent color
   - Scrollable plugin list for large numbers
   - Better spacing and visual hierarchy

2. Plugin Categorization:
   - Core Plugins (teal): skill_scanner, loot_tracker, mining_helper,
     chat_logger, global_tracker, nexus_search, universal_search,
     calculator, settings, dashboard
   - Test Plugins (orange): game_reader_test, log_parser_test
   - Other Plugins (gray): All remaining plugins

3. Naming Convention:
   - Core plugins prefixed with 'Core-'
   - Test plugins prefixed with 'Test-'
   - Other plugins have no prefix

4. Technical Changes:
   - Added QScrollArea import
   - New _add_plugin_row() helper method
   - Grouped plugins by category
   - Styled checkboxes with EU theme
   - Added author attribution display
2026-02-14 19:14:22 +00:00
LemonNexus 8aad153c11 fix: Add missing QCheckBox import to overlay_window.py
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.
2026-02-14 18:56:04 +00:00
LemonNexus 1c619d40c6 fix: Add error handling to plugins settings tab
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
2026-02-14 18:54:16 +00:00
LemonNexus 721b5e14a6 fix: Fix initialization order bug in ScreenshotService
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.
2026-02-14 18:50:45 +00:00
LemonNexus 1ccd7d2e61 fix: Add missing dependencies and fix type mismatch
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.
2026-02-14 18:16:56 +00:00
LemonNexus 92bb7d8f61 fix: Add missing register_window_service to PluginAPI
BUG: App crashed on startup with AttributeError:
'PluginAPI' object has no attribute 'register_window_service'

FIX:
- Added register_window_service() method to PluginAPI
- Added get_eu_window() convenience method
- Added is_eu_focused() convenience method
- Added is_eu_visible() convenience method
- Added bring_eu_to_front() convenience method

All window manager methods accessible via PluginAPI:
- api.get_eu_window()
- api.is_eu_focused()
- api.is_eu_visible()
- api.bring_eu_to_front()

App now starts correctly on Windows.
2026-02-14 17:13:47 +00:00
LemonNexus d64cf8da1f fix: Clean repository - remove workspace pollution
Removed workspace files that should not be in EU-Utility repo:
- AGENTS.md, SOUL.md, BOOTSTRAP.md (workspace config)
- memory/ (session logs)
- skills/ (OpenClaw skills)
- projects/ (other projects)
- tests/ (workspace tests)
- ui/ (old UI files)

Now EU-Utility repo contains ONLY EU-Utility code:
- core/ (12 services)
- plugins/ (31 plugins)
- docs/ (15 documentation files)
- tests/ (42 test cases)
- assets/ (icons, sounds)

Repository is now clean and focused.
2026-02-14 03:34:04 +00:00
LemonNexus e841390fd3 feat: Complete PluginAPI with full developer support
ADDED TO BASEPLUGIN:
- DataStore methods: save_data(), load_data(), delete_data(), get_all_data_keys()
- Window Manager: get_eu_window(), is_eu_focused(), is_eu_visible(), bring_eu_to_front()
- Clipboard: copy_to_clipboard(), paste_from_clipboard(), get_clipboard_history()
- Notifications: notify(), notify_info(), notify_success(), notify_warning(), notify_error(), close_notification(), close_all_notifications()
- Settings: get_setting(), set_setting()
- Logging: log_debug(), log_info(), log_warning(), log_error()

DOCUMENTATION:
- docs/PLUGIN_DEVELOPMENT_GUIDE.md - Complete guide with examples
- API reference for all 40+ methods
- Best practices and coding standards
- 3 complete example plugins
- Plugin template for quick starts

Now anyone can create plugins with full access to:
- 12 core services
- Typed event system
- Data persistence
- HTTP requests
- Screen capture/OCR
- Audio/clipboard/notifications
- Background tasks
2026-02-14 02:16:08 +00:00
LemonNexus 6d1a17cc30 feat: Complete Core Services Suite
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
2026-02-13 19:19:27 +00:00