Skip to content

Latest commit

 

History

History
276 lines (256 loc) · 10.8 KB

File metadata and controls

276 lines (256 loc) · 10.8 KB

Contributing to Rose

Contributions are welcome! Report bugs or suggest features via GitHub Issues, submit pull requests, or join our Discord for discussions.

Setting up dev environment

# Create conda environment with Python 3.11
conda create -n rose python=3.11 -y

# Activate the environment
conda activate rose

# Clone the repository
git clone https://github.com/Alban1911/Rose.git

# Navigate to project directory
cd Rose

# Create a feature branch (e.g. feat/skin-preview, fix/chroma-crash, docs/readme)
git checkout -b feat/your-feature-name

# Install all dependencies
pip install -r requirements.txt

# Ready to develop! Run main.py as administrator when testing

Building locally

Rose builds the Pengu Loader executable from the vendored source in vendor/PenguLoader-1.1.6/ during packaging. A prebuilt Pengu Loader.exe is intentionally not committed to the repository.

In addition to Python 3.11+ and the Python dependencies above, install Visual Studio Build Tools with the .NET desktop build tools, WPF support, and the .NET Framework 4.7.2 targeting pack. Install Inno Setup 6 only if you also want to build the Windows installer.

# Build Pengu Loader only
python scripts/build_pengu_loader.py

# Build Rose (rebuilds Pengu Loader automatically)
python scripts/build_pyinstaller.py

# Build Rose and the Windows installer
python scripts/build_all.py

scripts/build_pyinstaller.py is the canonical Rose package build entry point; it compiles the loader before invoking PyInstaller. Use it or scripts/build_all.py instead of invoking pyinstaller Rose.spec directly.

Project Structure

Rose/
├── main.py                 # Application entry point
├── config.py               # Configuration constants
├── requirements.txt        # Python dependencies
├── assets/                 # Application assets (icons, fonts, images)
│
├── main/                   # Main application package
│   ├── core/               # Core initialization and lifecycle
│   │   ├── initialization.py
│   │   ├── threads.py
│   │   ├── state.py
│   │   ├── signals.py
│   │   ├── lockfile.py
│   │   ├── lcu_handler.py
│   │   └── cleanup.py
│   ├── setup/              # Application setup and configuration
│   │   ├── console.py
│   │   ├── arguments.py
│   │   └── initialization.py
│   └── runtime/            # Main runtime loop
│       └── loop.py
│
├── injection/              # Skin injection system
│   ├── core/               # Core injection logic
│   │   ├── manager.py      # Injection manager & coordination
│   │   └── injector.py     # Skin injector
│   ├── game/               # Game detection and monitoring
│   │   ├── game_detector.py
│   │   └── game_monitor.py
│   ├── config/             # Configuration management
│   │   ├── config_manager.py
│   │   └── threshold_manager.py
│   ├── mods/               # Mod management
│   │   ├── mod_manager.py
│   │   └── zip_resolver.py
│   ├── overlay/            # Overlay process management
│   │   ├── overlay_manager.py
│   │   └── process_manager.py
│   └── tools/              # Injection tools (mod-tools.exe, etc.)
│       └── tools_manager.py
│
├── lcu/                    # League Client API integration
│   ├── core/               # Core LCU client components
│   │   ├── client.py       # Main LCU client orchestrator
│   │   ├── lcu_api.py      # LCU API wrapper
│   │   ├── lcu_connection.py
│   │   └── lockfile.py
│   ├── data/               # Data management
│   │   ├── skin_scraper.py
│   │   ├── skin_cache.py
│   │   ├── types.py
│   │   └── utils.py
│   └── features/           # LCU feature implementations
│       ├── lcu_properties.py
│       ├── lcu_skin_selection.py
│       ├── lcu_game_mode.py
│       └── lcu_swiftplay.py
│
├── threads/                # Background threads
│   ├── core/               # Core thread implementations
│   │   ├── websocket_thread.py
│   │   ├── phase_thread.py
│   │   └── lcu_monitor_thread.py
│   ├── handlers/            # Event handlers
│   │   ├── champ_thread.py
│   │   ├── champion_lock_handler.py
│   │   ├── game_mode_detector.py
│   │   ├── injection_trigger.py
│   │   ├── lobby_processor.py
│   │   ├── phase_handler.py
│   │   └── swiftplay_handler.py
│   ├── utilities/           # Thread utilities
│   │   ├── timer_manager.py
│   │   ├── loadout_ticker.py
│   │   └── skin_name_resolver.py
│   └── websocket/           # WebSocket components
│       ├── websocket_connection.py
│       └── websocket_event_handler.py
│
├── utils/                  # Utility modules
│   ├── core/               # Core utilities
│   │   ├── logging.py
│   │   ├── paths.py
│   │   ├── utilities.py
│   │   ├── validation.py
│   │   ├── normalization.py
│   │   ├── historic.py
│   │   ├── mod_historic.py
│   │   ├── issue_reporter.py
│   │   ├── junction.py
│   │   └── safe_extract.py
│   ├── crypto/             # Skin encryption
│   │   ├── skin_crypto.py
│   │   └── key_provider.py
│   ├── download/           # Download utilities
│   │   ├── skin_downloader.py
│   │   ├── smart_skin_downloader.py
│   │   ├── repo_downloader.py
│   │   ├── hashes_downloader.py
│   │   └── hash_updater.py
│   ├── integration/        # External integrations
│   │   ├── pengu_loader.py
│   │   ├── tray_manager.py
│   │   └── tray_settings.py
│   ├── system/             # System utilities
│   │   ├── admin_utils.py
│   │   ├── win32_base.py
│   │   ├── window_utils.py
│   │   └── resolution_utils.py
│   └── threading/          # Threading utilities
│       └── thread_manager.py
│
├── ui/                     # UI components
│   ├── core/               # Core UI management
│   │   ├── user_interface.py
│   │   └── lifecycle_manager.py
│   ├── chroma/             # Chroma selection UI
│   │   ├── selector.py
│   │   ├── ui.py
│   │   ├── panel.py
│   │   ├── preview_manager.py
│   │   ├── selection_handler.py
│   │   └── special_cases.py
│   └── handlers/           # UI feature handlers
│       ├── historic_mode_handler.py
│       ├── randomization_handler.py
│       └── skin_display_handler.py
│
├── pengu/                  # Pengu Loader integration
│   ├── core/               # Core Pengu functionality
│   │   ├── websocket_server.py
│   │   ├── http_handler.py
│   │   └── skin_monitor.py
│   ├── communication/      # Communication layer
│   │   ├── message_handler.py
│   │   └── broadcaster.py
│   └── processing/         # Data processing
│       ├── skin_processor.py
│       ├── skin_mapping.py
│       └── flow_controller.py
│
├── state/                  # Shared application state
│   └── core/
│       ├── shared_state.py
│       └── app_status.py
│
├── launcher/               # Application launcher and updater
│   ├── core/
│   │   └── launcher.py
│   ├── sequences/          # Launch sequences
│   │   ├── hash_check_sequence.py
│   │   └── skin_sync_sequence.py
│   ├── update/             # Update system
│   │   ├── update_sequence.py
│   │   ├── update_downloader.py
│   │   ├── update_installer.py
│   │   └── github_client.py
│   ├── ui/
│   │   └── update_dialog.py
│   └── updater.py
│
├── party/                  # Party mode (skin sharing)
│   ├── core/               # Party orchestration
│   │   ├── party_manager.py  # Main party mode orchestrator
│   │   └── party_state.py
│   ├── network/            # Networking layer
│   │   ├── ws_relay.py     # WebSocket relay client
│   │   ├── peer_connection.py
│   │   ├── stun_client.py
│   │   └── udp_transport.py
│   ├── protocol/           # Wire protocol
│   │   ├── crypto.py       # XOR cipher with dynamic keys
│   │   ├── message_types.py
│   │   └── token_codec.py
│   ├── discovery/          # Lobby and skin discovery
│   │   ├── lobby_matcher.py
│   │   └── skin_collector.py
│   └── integration/        # UI and injection hooks
│       ├── injection_hook.py
│       └── ui_bridge.py
│
├── relay-worker/           # Cloudflare Worker — party relay
│   ├── src/
│   │   ├── index.ts        # Worker entry point
│   │   └── room.ts         # Durable Object party room
│   └── wrangler.toml
│
├── skin-key-worker/        # Cloudflare Worker — skin key server
│   ├── src/
│   │   └── index.ts
│   └── wrangler.toml
│
├── analytics/              # Analytics and user tracking
│   └── core/
│       ├── install_id.py   # Pseudonymous persistent installation UUID
│       ├── analytics_client.py  # HTTP client for analytics and presence pings
│       └── analytics_thread.py  # Background thread for startup/heartbeat/close pings
│
└── Pengu Loader/           # Runtime loader files and plugins
    ├── Pengu Loader.exe    # Generated during builds from vendor/PenguLoader-1.1.6
    └── plugins/            # JavaScript plugins
        ├── ROSE-UI/
        ├── ROSE-SkinMonitor/
        ├── ROSE-ChromaWheel/
        ├── ROSE-FormsWheel/
        ├── ROSE-CustomWheel/
        ├── ROSE-SettingsPanel/
        ├── ROSE-RandomSkin/
        ├── ROSE-HistoricMode/
        ├── ROSE-PartyMode/
        └── ROSE-Jade/

Credits

Rose uses the official Pengu Loader project. Its source is vendored and built as part of Rose, with Rose-specific lifecycle integration added around the loader. See the official Pengu Loader license.