Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
bbcd90a
feat!: Switch to Cyclopts for CLI
JuneStepp Nov 5, 2025
f790256
fix: FHS run
JuneStepp Nov 5, 2025
a3eac03
feat: Add `log_verbosity` option
JuneStepp Nov 6, 2025
48f3d57
feat: Sort old worlds to bottom of worlds list
JuneStepp Nov 6, 2025
ce6f443
fix: Improve UI label buddies and tab order
JuneStepp Nov 6, 2025
3ae41a1
docs: Remove README banner image in BBCode conversion
JuneStepp Nov 6, 2025
072eb97
fix: Include system environment when starting standard game launcher
JuneStepp Nov 6, 2025
052903f
fix: styling on MacOS
JuneStepp Nov 7, 2025
0671fb9
fix: Don't pass sys.argv to QApplication.
JuneStepp Nov 7, 2025
cbce2dc
feat: update WINE and DXVK, switch to WINE wow64
JuneStepp Nov 8, 2025
e5daffc
fix: make game started log consistent with others
JuneStepp Nov 8, 2025
e45debd
feat: Mac WINE support
JuneStepp Nov 8, 2025
5a54a38
build: add macOS
JuneStepp Nov 8, 2025
87cc8b8
build: update GitHub Actions Nuitka caching
JuneStepp Nov 8, 2025
8c39161
feat: support MacOS native menu bar
JuneStepp Nov 9, 2025
132ec1f
feat: add MacOS Crossover to setup wizard search dirs
JuneStepp Nov 9, 2025
764fd75
tests: skip case-sensitive only tests on macOS
JuneStepp Nov 11, 2025
b8b5bbd
fix: don't skip CaseInsensitiveAbsolutePath on Windows
JuneStepp Nov 11, 2025
26304fa
fix: explicitly don't enable ESYNC and FSYNC on macOS
JuneStepp Nov 13, 2025
41bf5e4
refactor(addon_manager): add `AddonType`, misc
JuneStepp Nov 16, 2025
2872fdc
fix(addon_manager): `getAddonObjectFromRow` with no interface ID
JuneStepp Nov 16, 2025
700cd6c
fix(addon_manager): uninstall with addons button from remote table
JuneStepp Nov 16, 2025
7f433f0
fix(addon_manager): `getSelectedAddons` with remote table
JuneStepp Nov 16, 2025
efd37a6
fix(addon_manager): duplication and DB clear issues from using `isTab…
JuneStepp Nov 16, 2025
5e34d11
fix(addon_manager): use `self.tables_laoded` instead of `self.isTable…
JuneStepp Nov 16, 2025
b06ac5f
fix(addon_manager): updating multiple addons at once
JuneStepp Nov 16, 2025
acf4b32
fix: handle empty `queueurls`
JuneStepp Dec 4, 2025
5122676
feat: update Linux WINE
JuneStepp Dec 5, 2025
607f176
refactor(wine): reorder methods
JuneStepp Dec 5, 2025
f6560ae
fix(wine): use patched MoltenVK
JuneStepp Dec 6, 2025
53c85b8
fix: don't pre-format log messages
JuneStepp Dec 9, 2025
d81893e
refactor: use `trio.run_process` instead of `QProcess`
JuneStepp Dec 13, 2025
c6c9e68
tests: don't log to file during testing
JuneStepp Dec 13, 2025
119711d
fix: still check for updates on dev releases
JuneStepp Dec 13, 2025
ecbd1dd
style: move function comment to doc string
JuneStepp Dec 13, 2025
5def265
feat: get rid of start game window
JuneStepp Dec 13, 2025
7fe88db
ci: add status checks
JuneStepp Dec 13, 2025
c5a991f
test(cli): update mocking to remove `QApplication` initialization
JuneStepp Dec 13, 2025
5ad8239
ci: update `build.yml`
JuneStepp Dec 14, 2025
238b853
ci: add spell checker
JuneStepp Dec 14, 2025
dd9eda6
ci: pin actions to specific commits
JuneStepp Dec 14, 2025
39dece6
fix(wine): replace reference to `Wine` with `WINE`
JuneStepp Dec 14, 2025
918ea1c
feat(wine): use sikarugir WINE on macOS
JuneStepp Dec 14, 2025
3575946
feat(patch_game): log patching phase
JuneStepp Dec 15, 2025
a6ecc0f
refactor: use attrs for `GameLauncherConfig`
JuneStepp Dec 15, 2025
788875e
refactor: use tuples for official domain constants
JuneStepp Dec 17, 2025
b47c6e5
feat: support initial data and splashscreen patching
JuneStepp Dec 17, 2025
1b18cf2
fix(setup_wizard): search for games non-blocking from start
JuneStepp Dec 21, 2025
1ad3efb
fix(patch_game): fix akamai patching with Nuitka
JuneStepp Dec 21, 2025
61c2613
fix: restrict keyboard interupts to checkpoints
JuneStepp Dec 21, 2025
c9773f4
refactor: raise `RelativePathError` in `CaseInsensitiveAbsolutePath`
JuneStepp Dec 22, 2025
f6621d4
refactor: move `Progress` from `patch_game.py` to `utilities.py`
JuneStepp Dec 22, 2025
3c10176
refactor: `patch_game_window.py` -> `ui/patch_game.py`
JuneStepp Dec 22, 2025
2b33958
refactor: `ui/patching_window.ui` -> `ui/patch_game.ui`
JuneStepp Dec 22, 2025
f91e280
feat: log messages shown with `show_warning_message`
JuneStepp Dec 22, 2025
c079a3f
refactor: `ui_utilities.py` -> `ui/utilities.py`
JuneStepp Dec 22, 2025
c73c7e5
docs(settings_window): update tooltip
JuneStepp Dec 22, 2025
b5d2b08
fix(settings_window): close before showing other windows post setup w…
JuneStepp Dec 22, 2025
0b04529
refactor: `qtapp.py` -> `ui/qtapp.py`
JuneStepp Dec 22, 2025
f085dc4
fix(patch_game): create target directories for download files
JuneStepp Dec 22, 2025
566b772
fix(patch_game): don't warn about 404 errors in akamai patching
JuneStepp Dec 22, 2025
e07d733
fix(setup_wizard): keep open while settings are being saved
JuneStepp Dec 23, 2025
a786e9d
fix(setup_wizard): set `checked=True` for user added game dirs
JuneStepp Dec 23, 2025
21d7094
fix(setup_wizard): improve QFileDialog usage
JuneStepp Dec 23, 2025
90a612d
refactor: use `onelauncher/external` directory for `run_ptch_client.exe`
JuneStepp Dec 23, 2025
5e35bac
fix: don't start game when there are world queue errors
JuneStepp Dec 23, 2025
b6f7861
feat: game install support
JuneStepp Dec 23, 2025
cff90d0
build(deps): upgrade nuitka
JuneStepp Dec 23, 2025
94ec9a6
fix(install_game): downloading with Nuitka
JuneStepp Dec 23, 2025
b5c0450
feat(logs): log data dir
JuneStepp Dec 23, 2025
d937bc0
build(nix): don't use private tmp in FHS env
JuneStepp Dec 24, 2025
5156e91
fix: cancel app on uncaught exception
JuneStepp Dec 24, 2025
4416af6
docs: mention using fhs-run for source OneLauncher
JuneStepp Dec 24, 2025
4c7fefb
fix(config_manager): add `exclude_install_dir` option to `delete_game…
JuneStepp Dec 24, 2025
bd802af
fix(main_window): prevent game launch when patching is needed
JuneStepp Dec 24, 2025
2dccda5
refactor: standardize UI naming around `*_window`
JuneStepp Dec 24, 2025
4695102
feat(start_game): set important `UserPreferences.ini` values
JuneStepp Dec 24, 2025
5c49f69
build(deps): update
JuneStepp Dec 24, 2025
0edf6d7
feat: remove patch client filename option from settings window
JuneStepp Dec 25, 2025
b8079d7
fix: handle when there is no system keyring or it fails to unlock
JuneStepp Dec 25, 2025
2bc1ca1
feat(settings_window): use icons for select from file browser buttons
JuneStepp Dec 26, 2025
d510098
fix(login_account): handle username or password too short errors
JuneStepp Dec 26, 2025
a1b0209
feat: add message to preview newsfeeds linking to where latest info is
JuneStepp Dec 26, 2025
10a0418
fix: remove custom official servers ciphers config
JuneStepp Dec 26, 2025
f4f64f4
fix(world_login_queue): better handle HRESULT 0x80004005
JuneStepp Dec 26, 2025
34da153
feat: compare product tokens with world allowed/denied billing roles
JuneStepp Dec 26, 2025
a2c9c9e
docs: add macOS installation section
JuneStepp Dec 28, 2025
b09bc80
build: use `--sequesterRsrc` with `ditto`
JuneStepp Dec 29, 2025
4ce544c
fix(patch_game): adjust limits and timeouts
JuneStepp Dec 30, 2025
c9123a5
refactor: remove `processEvents` call for game banner
JuneStepp Dec 30, 2025
c6a5b46
feat: add `on_game_start="close"` option
JuneStepp Dec 30, 2025
3bd7008
fix(cli): fix help page entries for parameters using `_cattrs_converter`
JuneStepp Dec 30, 2025
9a92261
docs: add note for macOS players that first load may have brief stutters
JuneStepp Dec 30, 2025
520b9e2
build(nuitka_compile): improve how output dir is specified
JuneStepp Dec 31, 2025
cc3f6eb
build(nuitka_compile): don't exclude asyncio
JuneStepp Dec 31, 2025
8b756dd
docs: improve readme
JuneStepp Dec 31, 2025
9bc4ff8
fix(patch_game): remove old file before renaming
JuneStepp Dec 31, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 105 additions & 23 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
name: build
name: Build

permissions:
contents: write # For making release
permissions: {}

on:
push:
Expand All @@ -11,102 +10,185 @@ on:

jobs:
build:
name: Build for ${{ matrix.os }}
name: ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04, windows-latest]
os: [ubuntu-22.04, macos-14, macos-15-intel, windows-latest]
include:
- os: ubuntu-22.04
artifact_path_name: onelauncher.bin
artifact_rename: OneLauncher-Linux.bin
- os: macos-14
artifact_path_name: onelauncher.zip
artifact_rename: OneLauncher-macOS-ARM64.zip
- os: macos-15-intel
artifact_path_name: onelauncher.zip
artifact_rename: OneLauncher-macOS-x86_64.zip
- os: windows-latest
artifact_path_name: OneLauncher.msi
artifact_rename: OneLauncher-Windows.msi

steps:
- uses: actions/checkout@v4
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false

# `run_patch_client` C code
- name: Install mingw-w64 on Linux
if: runner.os == 'Linux'
run: sudo apt-get install mingw-w64
- name: Install mingw-w64 on macOS
if: runner.os == 'macOS'
run: brew install mingw-w64
- name: Build `run_patch_client`
if: runner.os != 'Windows'
run: make -C src/run_patch_client
- name: Install mingw-w64 on Windows
if: runner.os == 'Windows'
uses: msys2/setup-msys2@v2
uses: msys2/setup-msys2@4f806de0a5a7294ffabaff804b38a9b435a73bda # v2.30.0
with:
msystem: MINGW32
install: mingw-w64-i686-toolchain make
- name: Build `run_patch_client` on Windows
if: runner.os == 'Windows'
shell: msys2 {0}
run: make -C src/run_patch_client
- name: Move `run_ptch_client` to `onelauncher/external` dir
run: mv src/run_patch_client/run_ptch_client.exe src/onelauncher/external/

# innoextract
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
if: runner.os != 'Windows'
with:
repository: dscharrer/innoextract
ref: 6e9e34ed0876014fdb46e684103ef8c3605e382e
path: innoextract
persist-credentials: false
- name: Patch innoextract to fix build with boost 1.89.0
if: runner.os != 'Windows'
run: |
pushd innoextract

curl https://github.com/dscharrer/innoextract/commit/882796e0e9b134b02deeaae4bbfe92920adb6fe2.patch \
| git apply

popd
- name: Install innoextract dependencies on Linux
if: runner.os == 'Linux'
run: sudo apt-get install libboost-all-dev liblzma-dev
- name: Install innoextract dependencies on macOS
if: runner.os == 'macOS'
run: brew install boost
- name: Build innoextract on macOS
if: runner.os == 'macOS'
run: |
mkdir innoextract/build
pushd innoextract/build

# uv
LDFLAGS="-L$(brew --prefix zstd)/lib -L$(brew --prefix icu4c@78)/lib" cmake ..
make

popd
ln -s $PWD/innoextract/build/innoextract src/onelauncher/external/innoextract
- name: Build innoextract on Linux
if: runner.os == 'Linux'
run: |
mkdir innoextract/build
pushd innoextract/build

cmake .. -DUSE_STATIC_LIBS=ON
make

popd
ln -s $PWD/innoextract/build/innoextract src/onelauncher/external/innoextract

# Python
# Can't use uv python with Nuitka yet
# See https://github.com/Nuitka/Nuitka/issues/3331
- name: Install Python
uses: actions/setup-python@v5
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
with:
python-version: "3.11"
python-version-file: "pyproject.toml"
- name: Install uv
uses: astral-sh/setup-uv@v6
uses: astral-sh/setup-uv@681c641aba71e4a1c380be3ab5e12ad51f415867 # v7.1.6
with:
activate-environment: true
- run: uv sync --locked --no-dev --group build

# Nuitka cache
- name: Install ccache for Nuitka
# Nuitka cache. Based on <https://github.com/Nuitka/Nuitka-Action/blob/main/action.yml>.
- name: Install ccache for Nuitka on Linux
if: runner.os == 'Linux'
run: sudo apt-get install -y ccache
- name: Install ccache for Nuitka on MacOS
if: runner.os == 'macOS'
run: brew install ccache
- name: Setup Nuitka env variables
shell: bash
run: |
echo "NUITKA_CACHE_DIR=nuitka/cache" >> $GITHUB_ENV
echo "PYTHON_VERSION=$(python --version | awk '{print $2}' | cut -d '.' -f 1,2)" >> $GITHUB_ENV
- name: Cache Nuitka cache directory
if: ${{ !inputs.disable-cache }}
uses: actions/cache@v4
uses: actions/cache@9255dc7a253b0ccc959486e2bca901246202afeb # v5.0.1
with:
path: ${{ env.NUITKA_CACHE_DIR }}
key: ${{ runner.os }}-${{ runner.arch }}-python-${{ env.PYTHON_VERSION }}-nuitka-${{ github.sha }}
key: nuitka-caching-${{ runner.os }}-${{ runner.arch }}-python-${{ env.PYTHON_VERSION }}-nuitka-${{ github.sha }}
restore-keys: |
${{ runner.os }}-${{ runner.arch }}-python-${{ env.PYTHON_VERSION }}-
${{ runner.os }}-${{ runner.arch }}-python-
${{ runner.os }}-${{ runner.arch }}-
nuitka-caching-${{ runner.os }}-${{ runner.arch }}-python-${{ env.PYTHON_VERSION }}-
nuitka-${{ runner.os }}-${{ runner.arch }}-python-${{ env.PYTHON_VERSION }}-
nuitka-${{ runner.os }}-${{ runner.arch }}-

- name: Setup dotnet for building Windows installer
if: runner.os == 'Windows'
uses: actions/setup-dotnet@v4
uses: actions/setup-dotnet@2016bd2012dba4e32de620c46fe006a3ac9f0602 # v5.0.1
with:
dotnet-version: 8.0.x

- name: Build
run: python -m build
- name: Verify build
shell: bash
run: |
if [ "${{ runner.os }}" == "macOS" ]; then
distDir="build/out/onelauncher.app/Contents/MacOS"
else
distDir="build/out/onelauncher.dist"
fi

test -x $distDir/onelauncher/external/run_ptch_client.exe && \
echo run_ptch_client.exe found

if [ "${{ runner.os }}" != "Windows" ]; then
test -x $distDir/onelauncher/external/innoextract && \
echo innoextract found
fi
- name: Make app zip on MacOS
if: runner.os == 'macOS'
run: ditto -c -k --sequesterRsrc --keepParent build/out/onelauncher.app build/out/onelauncher.zip
- name: Rename artifact
run: mv build/out/${{ matrix.artifact_path_name }} build/out/${{ matrix.artifact_rename }}
- name: Upload build artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: ${{ matrix.artifact_rename }}
path: build/out/${{ matrix.artifact_rename }}
if-no-files-found: error
release:
# Only make a release for new tags
# Only make a release for new tags.
if: startsWith(github.ref, 'refs/tags/')
needs: [build]
runs-on: ubuntu-latest
name: Make draft release and upload artifacts
permissions:
contents: write # For making the release.
steps:
- name: Download build artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
with:
path: build_artifacts/
- name: Release
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@aec2ec56f94eb8180ceec724245f64ef008b89f5 # v2.4.0
with:
draft: true
fail_on_unmatched_files: true
Expand Down
44 changes: 44 additions & 0 deletions .github/workflows/status_checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: Status checks
on:
push:
pull_request:

permissions: {}

jobs:
status_checks:
name: ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, macos-15-intel, windows-latest]

steps:
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false

- name: Install Python
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
with:
python-version-file: "pyproject.toml"
- name: Install uv
uses: astral-sh/setup-uv@681c641aba71e4a1c380be3ab5e12ad51f415867 # v7.1.6
with:
activate-environment: true
- run: uv sync --locked

- name: Install PySide6 dependencies on Linux
if: runner.os == 'Linux'
run: sudo apt-get install libegl1

- name: Lint
run: ruff check --output-format=github
- name: Type check
run: mypy .
- name: Unit test
run: pytest
- name: Check for spelling mistakes
run: typos
- name: Check formatting
run: ruff format --check --output-format=github
2 changes: 1 addition & 1 deletion AUTHORS.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Credits

Lord of the Rings Online and Dungeons & Dragons Online
Launcher for Linux, Mac OS X, and Windows.
Launcher for Linux, macOS, and Windows.

- [OneLauncher](https://github.com/JuneStepp/OneLauncher)
(C) 2019-2025 June Stepp \<contact@junestepp.me\>
Expand Down
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ This update has quite a few small fixes and improvements. The full changelog is

### Testing

- Add `test_allow_uknown_config_keys`
- Add `test_allow_unknown_config_keys`
- Increase strictness of pytest config

## 2.0.1 (2024-08-03)
Expand Down
5 changes: 3 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,14 @@ Contributions and questions are always welcome! Here's just a couple of things t

OneLauncher uses [uv](https://docs.astral.sh/uv/getting-started/installation/) for dependency management. Run `uv run onelauncher` in the root folder of this repository to install and start OneLauncher. Alternatively, [Nix can be used](#nix).

For game patching support, extra C code must be compiled. Run `make -C src/run_patch_client` with mingw-w64 installed. Your mingw-w64 installation must have support for i686 builds.
For game patching support, extra C code must be compiled with mingw-w64. Run `make -C src/run_patch_client && mv src/run_patch_client/run_ptch_client.exe src/onelauncher/external/`. Your mingw-w64 installation must have support for i686 builds.
innoextract is needed for game installation support.

### Nix

OneLauncher comes with a [Nix](https://nixos.org/) flake for easily replicating the standard development environment. It can be used with [direnv](https://github.com/direnv/direnv) or the `nix develop` command.

The compiled builds can be tested on NixOS with `nix run .#fhs-run build/out/onelauncher.bin`.
The compiled builds can be tested on NixOS with `nix run .#fhs-run build/out/onelauncher.bin`. Similarly, `nix run .#fhs-run onelauncher` can be used while in the development shell to start OneLauncher from source with support for the WINE binaries it downloads.

## Building

Expand Down
Loading
Loading