Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
94 changes: 94 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,99 @@
# Changelog

## 2.1.0 (2026-01-01)

Plenty of fixes and improvements. A few of the most notable are first-class macOS support, splash screens and initial data patching support, new game installation on macOS and Linux, and an option to close OneLauncher once a game is started. The full changelog is below.

### Features

- [**breaking**] Switch to Cyclopts for CLI
- Options with choices use hyphens. Example: `--game lotro_preview` ->
`--game lotro-preview`
- `--startup-script` -> `--startup-scripts`
- Shell completions need to be reinstalled.
- Add option to close OneLauncher once a game is started
- Add `log_verbosity` option
- Sort old worlds to bottom of worlds list
- Update WINE and DXVK, switch to WINE wow64
- Support macOS native menu bar
- Add macOS Crossover to setup wizard search dirs
- Mac WINE support
- Add macOS building
- Add macOS installation section to README.md
- Get rid of the start game window. Running the game is done fully from the main window now.
- Support patching for splash screens and initial data
- Allow creating new game installations. This is disabled on Windows for now pending testing.
- Set important `UserPreferences.ini` values
- Remove patch client filename option from settings window
- Use icons for select from file browser buttons
- Add message to preview client newsfeeds linking to where the latest info is
- Compare product tokens with world allowed/denied billing roles

### Fixes

- *(newsfeed)* Remove extra spaces in "..." link
- *(nix)* FHS run
- Improve UI label buddies and tab order
- Include system environment when starting standard game launcher
- Styling on macOS
- Don't pass sys.argv to QApplication.
- Don't skip CaseInsensitiveAbsolutePath processing on Windows
- *(addon_manager)* `getAddonObjectFromRow` with no interface ID
- *(addon_manager)* Uninstall with addons button from remote table
- *(addon_manager)* `getSelectedAddons` with remote table
- *(addon_manager)* Duplication and DB clear issues from using `isTableEmpty`
- *(addon_manager)* Use `self.tables_loaded` instead of `self.isTableEmpty`
- *(addon_manager)* Updating multiple addons at once
- *(addon_manager)* Strip search text
- *(addon_manager)* Correct `.plugin{compendium}` invalid XML error
- *(addon_manager)* Don't install plugin if it has invalid `.plugin` files
- Handle empty `queueurls`
- Still check for updates on dev releases
- Restrict keyboard interrupts to checkpoints
- Cancel app on uncaught exception
- *(settings_window)* Close before showing other windows post setup wizard
- *(setup_wizard)* Search for games non-blocking from start
- *(setup_wizard)* Keep open while settings are being saved
- *(setup_wizard)* Both select and check user-added game directories
- *(setup_wizard)* Improve QFileDialog usage
- Prevent game launch when initial data patching is needed
- Handle when there is no system keyring or it fails to unlock
- Don't the start game when there are world queue errors
- Handle username or password too short errors
- *(world_login_queue)* Better handle HRESULT 0x80004005
- Improve world status error messages
- Remove custom official servers ciphers config. It is no longer necessary.
- Windows installer when some DLL versions are lowered
- Don't create window for `run_ptch_client.exe` on Windows

### Internal

- Update dependencies
- Log more information.
- Don't pre-format log messages
- Don't log to file during testing
- *(addon_manager)* Add `AddonType`, misc
- *(wine)* Reorder methods
- Use `trio.run_process` instead of `QProcess`
- Use attrs for `GameLauncherConfig`
- Use tuples for official domain constants
- Raise `RelativePathError` in `CaseInsensitiveAbsolutePath`
- Use `onelauncher/external` directory for `run_ptch_client.exe`
- Standardize UI naming around `*_window`
- Move all current UI only code to `ui/`
- Remove `processEvents` call for game banner
- Remove README banner image in BBCode conversion
- Mention using fhs-run for source OneLauncher
- Skip case-sensitive-only tests on macOS
- *(nix)* Don't use private tmp in FHS env
- *(nuitka_compile)* Improve how output dir is specified
- *(nuitka_compile)* Don't exclude asyncio
- Add status checks to CI
- Add spell checker
- Pin GitHub actions to specific commits
- Update GitHub Actions Nuitka caching
- Update `build.yml`

## 2.0.2 (2025-06-03)

This update has quite a few small fixes and improvements. The full changelog is below.
Expand Down
3 changes: 3 additions & 0 deletions build/windows_installer/Package.wxs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
in the MSI version field. -->
<MajorUpgrade AllowSameVersionUpgrades="true"
DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
<!-- Always reinstall files, ignoring version and checksum. You'd think this would
already be the case, since it's a major upgrade, but no. -->
<Property Id="REINSTALLMODE" Value="amus" />

Check warning on line 23 in build/windows_installer/Package.wxs

View workflow job for this annotation

GitHub Actions / windows-latest

ICE40: REINSTALLMODE is defined in the Property table. This may cause difficulties.

<Property Id="ARPURLINFOABOUT" Value="$(env.WEBSITE)" />
<!-- <Property Id="DiskPrompt" Value="$(env.PRODUCT_NAME) Installation" /> -->
Expand Down Expand Up @@ -45,7 +48,7 @@

<StandardDirectory Id="ProgramFiles6432Folder">
<Directory Id="INSTALLDIR" Name="$(env.PRODUCT_NAME)" FileSource="$(env.DIST_PATH)">
<Files Include=".\**"></Files>

Check warning on line 51 in build/windows_installer/Package.wxs

View workflow job for this annotation

GitHub Actions / windows-latest

ICE60: The file flseLrLUIpJ0bVxVO0KJwgn3juIGA4 is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.

Check warning on line 51 in build/windows_installer/Package.wxs

View workflow job for this annotation

GitHub Actions / windows-latest

ICE60: The file flsIWUkTYcCSbE3pNNtR1Kgy4dESOk is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.

Check warning on line 51 in build/windows_installer/Package.wxs

View workflow job for this annotation

GitHub Actions / windows-latest

ICE60: The file flsjD7nAt6Rfu8ZZbYvtMuANqviBC0 is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.

Check warning on line 51 in build/windows_installer/Package.wxs

View workflow job for this annotation

GitHub Actions / windows-latest

ICE60: The file flsPab9NBAJqxQd85gPVFjSKC.Nchc is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.

Check warning on line 51 in build/windows_installer/Package.wxs

View workflow job for this annotation

GitHub Actions / windows-latest

ICE60: The file flszozHaSuPBCp36.fhwPVnTkWWAZY is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.

Check warning on line 51 in build/windows_installer/Package.wxs

View workflow job for this annotation

GitHub Actions / windows-latest

ICE60: The file flsB2XGC.Bxxb2nU9r2dRlfwWRN.DU is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.

Check warning on line 51 in build/windows_installer/Package.wxs

View workflow job for this annotation

GitHub Actions / windows-latest

ICE60: The file flsNLlvAeT0FuGuJu5jgjfrsGlLB1I is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.

Check warning on line 51 in build/windows_installer/Package.wxs

View workflow job for this annotation

GitHub Actions / windows-latest

ICE60: The file fls2qBvaNd00GcUs.CY_xaoXqh5oOQ is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.

Check warning on line 51 in build/windows_installer/Package.wxs

View workflow job for this annotation

GitHub Actions / windows-latest

ICE60: The file flsguXoqktQM2sEZZcFzfWmbqCE7HE is not a Font, and its version is not a companion file reference. It should have a language specified in the Language column.
</Directory>
</StandardDirectory>

Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "OneLauncher"
version = "2.0.2"
version = "2.1.0"
description = "The OneLauncher to rule them all"
authors = [{ name = "June Stepp", email = "contact@junestepp.me" }]
requires-python = ">=3.11,<3.12"
Expand Down
8 changes: 7 additions & 1 deletion src/onelauncher/addon_manager_window.py
Original file line number Diff line number Diff line change
Expand Up @@ -577,7 +577,7 @@ def parseCompendiumFile(self, file: Path, tag: str) -> AddonInfo | None:
try:
doc = defusedxml.minidom.parse(str(file))
except ExpatError:
logger.exception("Compendium file has invalid XML: %s", file)
logger.exception("`%s` has invalid XML", file.name)
return None
nodes = doc.getElementsByTagName(tag)[0].childNodes
for node in nodes:
Expand Down Expand Up @@ -843,6 +843,11 @@ def install_plugin(
# will be ignored by both me and the game.
plugin_files = list(author_folder.glob("*.plugin"))

# Don't install if there are invalid `.plugin` files.
for plugin_file in plugin_files:
if self.parseCompendiumFile(plugin_file, "Information") is None:
return

existing_compendium_file = self.get_existing_compendium_file(author_folder)
if existing_compendium_file is False:
return
Expand Down Expand Up @@ -1294,6 +1299,7 @@ def searchDB(self, table: QtWidgets.QTableWidget, text: str) -> None:
table.clearContents()
table.setRowCount(0)

text = text.strip()
if text:
for word in text.split():
search_word = f"%{word}%"
Expand Down
49 changes: 27 additions & 22 deletions src/onelauncher/patch_game.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import logging
import os
import subprocess
import sys
from functools import partial
from pathlib import Path
from types import MappingProxyType
Expand Down Expand Up @@ -347,7 +348,7 @@ async def patch_game(
)
environment = MappingProxyType(os.environ)

if os.name == "nt":
if sys.platform == "win32":
# The directory with TTEPatchClient.dll has to be in the PATH for
# patchclient.dll to find it when OneLauncher is compiled with Nuitka.
environment = MappingProxyType(
Expand Down Expand Up @@ -383,29 +384,33 @@ async def patch_game(
progress.progress_text_suffix = (
f" Phase {i + 2}/{len(PATCHCLIENT_PATCH_PHASES) + 1}"
)
process: trio.Process = await nursery.start(
partial(
trio.run_process,
(
*command,
# `run_ptch_client.exe` takes everything that will get
# passed to `patchclient.dll` as a single argument.
" ".join(
get_patchclient_arguments(
phase=phase,
patch_server_url=patch_server_url,
game_id=game_id,
config_manager=config_manager,
)
),
run_patching = partial(
trio.run_process,
(
*command,
# `run_ptch_client.exe` takes everything that will get
# passed to `patchclient.dll` as a single argument.
" ".join(
get_patchclient_arguments(
phase=phase,
patch_server_url=patch_server_url,
game_id=game_id,
config_manager=config_manager,
)
),
check=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=environment,
cwd=game_config.game_directory,
)
),
check=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
env=environment,
cwd=game_config.game_directory,
)
if sys.platform == "win32":
process: trio.Process = await nursery.start(
partial(run_patching, creationflags=subprocess.CREATE_NO_WINDOW)
)
else:
process: trio.Process = await nursery.start(run_patching)
if process.stdout is None or process.stderr is None:
raise TypeError("Process pipe is `None`")

Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.