Commit Graph

27 Commits

Author SHA1 Message Date
LemonNexus 4d9699c1a3 fix: Add missing QObject import to skill_scanner
BUG: name 'QObject' is not defined

CAUSE: SignalHelper class uses QObject but it wasn't imported.

FIX: Added QObject to PyQt6.QtCore imports.
2026-02-15 01:09:02 +00:00
LemonNexus 426f0a2ad3 fix: QObject signals issue - BasePlugin doesn't inherit from QObject
BUG: SkillScannerPlugin cannot be converted to PyQt6.QtCore.QObject

CAUSE: BasePlugin inherits from ABC, not QObject. Qt signals (pyqtSignal)
must be defined in a QObject subclass.

FIX:
1. Created SignalHelper(QObject) class to hold all signals:
   - hotkey_triggered
   - update_status_signal
   - update_session_table_signal
   - update_counters_signal
   - enable_scan_button_signal

2. In SkillScannerPlugin.initialize():
   - Create self._signals = SignalHelper()
   - Connect signals from self._signals (not self)

3. In get_ui():
   - Connect enable_scan_button_signal after scan_page_btn is created

4. Updated all signal emits to use self._signals.emit()

This allows the plugin to use Qt signals for thread-safe UI updates
without requiring BasePlugin to inherit from QObject (which would
break other plugins).
2026-02-15 01:01:31 +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 05f8c06312 fix: Replace all invokeMethod calls with Qt signals for thread-safety
BUG: QMetaObject.invokeMethod with Q_ARG doesn't work properly in PyQt6
and was causing TypeError exceptions.

FIX:
- Added proper Qt signals at class level:
  * update_status_signal(str, bool, bool)
  * update_session_table_signal(object)
  * update_counters_signal()
  * enable_scan_button_signal(bool)

- Connected all signals to slot methods in initialize()
- Replaced all invokeMethod calls with signal.emit()
- Thread callbacks now emit signals instead of calling invokeMethod
- UI updates happen in main Qt thread via signal/slot mechanism

This is the correct PyQt6 way to do cross-thread communication.
All UI updates are now thread-safe and won't cause TypeErrors.
2026-02-15 00:51:15 +00:00
LemonNexus d0ccb791f7 fix: Fix hotkey thread-safety issue in Skill Scanner
BUG: TypeError when using F12 hotkey - invokeMethod syntax was wrong
for PyQt6.

FIX:
1. Added hotkey_triggered = pyqtSignal() at class level
2. Connected signal to _scan_page_for_multi in initialize()
3. _hotkey_scan() now just emits the signal (thread-safe)
4. Signal ensures scan runs on main Qt thread

This is the proper Qt way to handle cross-thread communication.
The hotkey callback runs in keyboard library's thread, but the
scan must run in Qt's main thread to update UI safely.
2026-02-15 00:47:10 +00:00
LemonNexus e132a80f2b feat: Add Smart Auto-Scan with Hotkey Fallback to Skill Scanner
NEW FEATURE - Smart Multi-Page Scanning:

MODES:
1. 🤖 Smart Auto + Hotkey Fallback (default)
   - Tries to auto-detect page changes
   - Monitors page number area (1/12, 2/12, etc.)
   - If detection fails, falls back to F12 hotkey
   - User gets notified: 'Auto-detect unreliable. Use F12!'

2. ⌨️ Manual Hotkey Only
   - User navigates pages in EU
   - Presses F12 to scan each page
   - Simple and 100% reliable

3. 🖱️ Manual Click Only
   - Original click-based scanning
   - Click button, wait for beep, next page

SMART AUTO FEATURES:
- Checks page number area every 500ms
- Detects when page number changes (1→2, 2→3, etc.)
- Automatically triggers scan on page change
- Tracks failures - after 10 failures, falls back to hotkey
- Plays beep sound on successful auto-scan

HOTKEY FEATURES:
- F12 key registered globally
- Works even when EU-Utility not focused
- Triggers scan immediately
- Can be used as primary mode or fallback

UI UPDATES:
- Mode selector dropdown
- Dynamic instructions based on mode
- Hotkey info displayed (F12 = Scan)
- Status shows when auto-detect vs hotkey is active

TECHNICAL:
- Uses keyboard library for global hotkeys
- QTimer for auto-detection polling
- Tesseract OCR for page number reading
- Graceful fallback when auto fails

This gives users the best of both worlds:
- Try auto for convenience
- Fallback to hotkey for reliability
2026-02-15 00:42:37 +00:00
LemonNexus 482ec9aea4 feat: Add Multi-Page Scanner to Skill Scanner plugin
NEW FEATURE - Multi-Page Scanner:

WORKFLOW:
1. User positions Skills window to show skills
2. User clicks 'Scan Current Page'
3. App scans, shows checkmark , plays BEEP sound
4. Status shows: 'Page X scanned! Click Next Page in game →'
5. User manually clicks Next Page in EU
6. User clicks 'Scan Current Page' again
7. Repeat until all pages scanned
8. User clicks 'Save All' to store combined results

FEATURES:
-  Checkmark icon and green text on successful scan
- 🔊 Beep sound (Windows MessageBeep) to notify user
- 📊 Live counters: Pages scanned, Total skills
- 🗑 Clear Session button to start over
- 💾 Save All button merges session into main data
- 📝 Session table shows all skills collected so far

UI ELEMENTS:
- Instructions panel explaining the workflow
- Status label with color-coded feedback
- Pages: X counter
- Skills: X counter
- Three buttons: Scan Page, Save All, Clear Session
- Session table showing accumulated skills

TECHNICAL:
- current_scan_session dict accumulates skills across pages
- pages_scanned counter tracks progress
- Thread-safe UI updates via QMetaObject.invokeMethod
- Windows beep via winsound module (with fallback)

This gives users full control while guiding them through
multi-page scanning without any auto-clicking!
2026-02-15 00:35:50 +00:00
LemonNexus 46a76a91e8 fix: Parse ALL skills from window and clean category names
FIXES:
1. Changed from re.search (finds first) to re.finditer (finds ALL)
   - Now extracts all skills visible in the skills window
   - Not just the first skill

2. Added category name cleaning
   - Removes: Attributes, Combat, Design, Construction, etc.
   - Prevents 'Attributes Laser Weaponry Technology' issues
   - Now correctly extracts just 'Laser Weaponry Technology'

3. Normalizes whitespace after removing categories
   - Joins all text into single space-separated string
   - Helps with multi-line skill parsing

4. Added validation for skill name length
   - Must be more than 2 characters
   - Filters out false positives

ABOUT YOUR FEATURE REQUESTS:

Multi-Page Scanning:
- To scan all pages automatically would require:
  1. Detect the skills window is open
  2. Click the 'next page' button automatically
  3. Wait for page transition
  4. Repeat until last page (detect via page counter)
  5. This requires UI automation (pyautogui)
  6. Risk: Could interfere with gameplay

Progress Bar Detection:
- The green bars represent % progress to next level
- To measure them would require:
  1. Image processing (OpenCV) to detect bar length
  2. Comparing green pixels to total bar width
  3. Converting to percentage
  4. This is complex and computationally expensive
  5. Alternative: Track skill gains via chat.log instead

RECOMMENDATION:
For tracking skill progress precisely, the best approach is:
1. Use chat.log parsing (already implemented)
2. It catches every skill gain with exact values
3. No OCR needed - 100% accurate
4. Works in background automatically
2026-02-15 00:29:41 +00:00
LemonNexus 1538508b63 fix: Add Arch Master rank and Reset button to Skill Scanner
FIXES:
1. Added 'Arch Master' to the list of multi-word ranks
   - Multi-word ranks are now matched first to prevent partial matches
   - Changed rank matching order: ['Arch Master', 'Grand Master'] + single ranks
   - This fixes 'Laser Weaponry Technology Arch' being parsed incorrectly
   - Now correctly parses as: 'Laser Weaponry Technology', 'Arch Master', 8805

2. Added 'Reset Data' button to Skill Scanner plugin
   - Red button next to 'Scan Skills Window'
   - Shows confirmation dialog before clearing
   - Clears: skills_data, skill_gains, and the UI tables
   - Also clears the data file (skill_tracker.json)

3. Clean skill names by removing 'Skill' prefix
   - OCR sometimes reads 'Skill Laser Weaponry Technology'
   - Now strips 'Skill' or 'SKILL' prefix from skill names

4. Updated both Skill Scanner and Game Reader Test plugins
   - Both now use the same improved parsing logic
   - Both handle multi-word ranks correctly
2026-02-15 00:23:13 +00:00
LemonNexus bf42c2a1b7 fix: Add missing 'import re' to game_reader_test plugin
The _parse_skills_from_text method uses re (regex) but it was only
imported inside a nested function, not at module level.

Added 'import re' at the top of the file.
2026-02-15 00:18:54 +00:00
LemonNexus b0f3b0b00c feat: Add Skills Parser tab to Game Reader Test plugin
NEW FEATURES:

1. Skills Parser Tab:
   - Dedicated tab for parsing EU Skills window
   - Captures screen and extracts skills automatically
   - Shows results in a 3-column table (Skill Name, Rank, Points)
   - Displays raw OCR text for debugging
   - Shows count of parsed skills

2. Improved Skills Parsing:
   - Better pattern matching for skill names with spaces
   - Recognizes all EU skill ranks
   - Filters out headers and category names
   - Validates points are reasonable numbers

3. UI Improvements:
   - Clear instructions on how to use
   - Visual feedback during capture
   - Color-coded status (cyan = working, red = error)
   - Table auto-sizes columns

USAGE:
1. Open EU Skills window
2. Go to Game Reader Test → Skills Parser tab
3. Click 'Capture Skills Window'
4. View parsed skills in the table

This makes it much easier to test skill scanning and verify
that the OCR is parsing correctly!
2026-02-15 00:07:28 +00:00
LemonNexus a30bcbaba7 fix: Improve skill scanner parser for 3-column layout
The previous parser was too simple and couldn't handle the merged text
from OCR on the skills window.

IMPROVEMENTS:
1. Clean up common headers and category names from OCR text
2. Better regex pattern that handles merged text
3. Alternative parser as fallback for heavily merged text
4. Debug logging to show parsed skills
5. Validation to filter out bad matches

PARSING LOGIC:
- Finds pattern: SkillName Rank Points
- Handles multi-word skill names (e.g., 'Combat Reflexes')
- Recognizes all EU skill ranks (Newbie through Awesome)
- Validates points are reasonable numbers

This should correctly parse skills like:
  Aim Amazing 5524
  Combat Reflexes Incredible 5991
  Handgun Grand Master 8621
2026-02-15 00:05:05 +00:00
LemonNexus 8e49f4e45e fix: Add missing Path import to game_reader_test plugin
BUG: NameError: name 'Path' is not defined when browsing for image file.

The pathlib.Path import was missing. Added it to the imports section.
2026-02-14 23:55:02 +00:00
LemonNexus f9dbde1a95 fix: Remove duplicate code causing indentation error in game_reader_test plugin
The _check_backends method had leftover code from an old version
mixed with the new implementation, causing:
  unexpected indent (plugin.py, line 953)

Removed the duplicate/old code block.
2026-02-14 23:50:24 +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 d7b7b491b5 docs: Add OCR requirements section to README and improve error handling
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.
2026-02-14 20:27:31 +00:00
LemonNexus a80a9ccd06 feat: Add File Test tab to Game Reader Test plugin
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.
2026-02-14 20:07:47 +00:00
LemonNexus 345ec865e1 fix: Fix Log Parser Test plugin event field names
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.
2026-02-14 20:06: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 e62419a9fd fix: Replace bg_panel with bg_secondary in Dashboard plugin
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.
2026-02-14 19:46:14 +00:00
LemonNexus 219d0847b2 feat: Add Log Parser and Game Reader Test Plugins
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.
2026-02-14 19:08:17 +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