Commit Graph

5993 Commits

Author SHA1 Message Date
seavor 371b74732e feat: register cockatrice:// and cockatrice-oracle:// protocol handlers
Adds OS-level URL-scheme handlers so users can click a link in a browser,
chat client, or third-party tool to launch Cockatrice straight into a
server / game / Oracle update.

Supported URL forms:
  cockatrice://joingame?hostname=H&port=P&roomid=R&gameid=G[&spectate=1]
  cockatrice-oracle://update[?spoilers=1]

Credentials passed via URL (username/password query params) are deliberately
ignored — URLs leak through shell history, browser history, EDR capture, etc.
If the target server requires auth and no saved credentials match, the Connect
dialog opens pre-filled with the URL's host/port so the user types their
password locally.

OS integration
- Linux: MimeType=x-scheme-handler/cockatrice (and -oracle) added to the
  .desktop files; Exec=cockatrice %u passes the URL through.
- Windows: NSIS installer writes HKCR\cockatrice and HKCR\cockatrice-oracle
  registry entries; uninstaller removes them.
- macOS: per-app Info.cockatrice.plist / Info.oracle.plist declare
  CFBundleURLTypes; a QFileOpenEvent filter is installed on QApplication
  before any nested event loop so cold-start URLs aren't lost.

New abstractions
- Intent (libcockatrice_utility/libcockatrice/utility/intent.h): abstract base
  for chained async actions.  Guarantees finished() fires at most once,
  execute() is idempotent, self-deletes via deleteLater, and
  startTimeoutSafetyNet() arms a configurable per-stage deadline.  Concrete
  intents (IntentConnectToServer, IntentLogin, IntentJoinServerRoom,
  IntentJoinServerGame) compose the joingame flow via UrlParser.
- SingleInstanceManager: async per-user local-socket primary/secondary
  handshake; URL forwarded from secondary to primary with QDataStream framing
  both ways.  shared_ptr-backed resolved flag survives every lambda capture.
- UrlSchemeEventFilter (new libcockatrice_utility_gui sibling library): QObject
  event filter that translates macOS QFileOpenEvent into a urlReceived(QString)
  signal.  Lives in its own Gui-bearing lib so libcockatrice_utility stays
  Core+Network only and doesn't drag Qt::Gui into servatrice.
- UrlUtils (header-only): pure URL parsing, fully unit-tested.

Wiring
- MainWindow::handleUrl(QString) — single entry point for any URL source.
- DlgConnect::prefillNewHost(host, port) — pre-fills new-host inputs.
- ServersSettings::findSavedCredsByHostPort — case-insensitive saved-creds
  lookup.
- TabSupervisor::requestJoinRoom + roomJoinedById / roomJoinFailedById signals,
  TabServer::roomAlreadyJoined for the short-circuit "already in this room"
  path — single source of truth for duplicate-join handling.

Tests
- 36 new unit tests across four single-purpose targets in tests/:
  - url_utils_test (22 tests) — scheme matching, port/room/game validation,
    spectator flag, credentials ignored, case-insensitivity.
  - url_scheme_event_filter_test (3 tests) — QFileOpenEvent capture.
  - intent_test (7 tests) — self-delete, abort propagation, parent-destruction-
    mid-flight, finish-once gate, execute() idempotence.
  - single_instance_manager_test (4 tests) — per-user socket naming, becoming-
    primary alone, forwarding to an existing primary, single-emission of
    roleResolved.

Build tooling (incidental)
- Dockerfile.format, docker-compose.format.yml, Makefile — a docker-based
  runner for format.sh that mirrors CI's desktop-lint step.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 19:40:05 -05:00
RickyRister 762e742be0 [Game] Implement action to automatically take damage from creatures (#6869)
* [Game] Implement action to automatically take damage from creatures

* cleanup
2026-05-13 15:03:41 -07:00
RickyRister 67f6ab66f0 [DeckLoader] Don't modify text deck files on load (#6888)
* [DeckLoader] Don't modify text deck files on load

* formatter
2026-05-13 11:32:05 -07:00
tooomm 7507103bb2 CI: Update trigger for doc builds (#6871)
* Update trigger

* use `published` trigger

* narrow deploy step filter

* re-add deployments on manual runs
2026-05-13 14:54:47 +02:00
RickyRister fe12f4cbb9 [VisualDeckEditor] Highlight searchEdit after add card (#6876) 2026-05-11 20:23:44 -07:00
RickyRister d18f3bce47 [VisualDatabaseDisplayWidget] Refactor: Make all fields private (#6875) 2026-05-11 20:23:29 -07:00
RickyRister b66743c83c [DeckEditor] Refactor searchEdit highlighting after add card (#6874)
* [DeckEditor] Refactor searchEdit highlighting after add card

* make searchEdit private
2026-05-11 20:23:12 -07:00
DawnFire42 1a62f82aee Refactor vertical card stacking with clip containers for variable zone sizes (#6774)
* Refactor vertical card stacking with opt-in overflow for variable zone sizes

Introduce a shared vertical stacking layout system in SelectZone that replaces the old divideCardSpaceInZone() free function with structured layout computation (StackLayoutParams, ZoneLayout, computeZoneLayout).

By default, cards are guaranteed to fit within zone bounds (no overflow). Zones can opt-in to bottom overflow via allowBottomOverflow flag, with sqrt-scaled compression for smooth visual transitions. A clip container mechanism is available for future zones that need visual clipping.

  Key changes:
  - SelectZone: new layout engine with allowBottomOverflow opt-in; clip container infrastructure for future zones needing visual clipping
  - StackZone: uses new layout (no overflow); adds setHeight() for dynamic resizing capabilities
  - HandZone: vertical layout delegates to SelectZone's shared stacking
  - AbstractCardItem: preserves hover z-value during layout passes; invalidates scene rect on hover exit for proper sibling repainting
  - CardZone::onCardAdded made virtual for clip container reparenting
  - Zone widths updated to CardDimensions::WIDTH_F * 1.5

* Changed anonymous namespace for static and braced functions

* CI tests re-run
2026-05-10 19:10:14 -07:00
tooomm 5735a44a9a Update Dockerfile to 26.04 (#6861) 2026-05-10 14:53:59 +02:00
BruebachL dbaf5f2e05 [GameSelector] Don't conditionally initialize gamesListProxyModel (#6870)
Took 44 seconds

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-05-10 11:35:17 +02:00
RickyRister 9c53dad4b8 [Game] Refactor: add selectedCards method to GameScene (#6859) 2026-05-09 17:03:48 -07:00
RickyRister 7814204fe2 [Game] Refactor: explicitly pass params from card counter actions (#6780) 2026-05-09 13:20:33 -07:00
RickyRister cdb171f201 [Game] Refactor: move setCardAttrHelper to PlayerEventHandler (#6772) 2026-05-09 13:10:56 -07:00
RickyRister 48e21aad38 [Game] Refactor: move parsePT to a static method (#6860) 2026-05-09 12:55:11 -07:00
tooomm f223ff387e bump vcpkg to 2026.04.27 release (#6855)
* bump vcpkg to 2026.04.27

* remove hint
2026-05-09 14:49:58 +02:00
RickyRister 8845a75627 [GameSelector] Fix bug with hideNotBuddyCreatedGames checkbox (#6858) 2026-05-09 04:08:30 -07:00
BruebachL caf2bb9ded Pull client networking out of window_main and into remote_connection_controller (#6796)
* Pull client networking out of window_main and into remote_connection_controller

Took 2 minutes

* Things.

Took 13 minutes

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-05-09 12:50:53 +02:00
RickyRister 985936a917 [GameModel] Refactor game filters options into struct (#6856) 2026-05-09 02:45:33 -07:00
ebbit1q 2c51054e77 update version number after update (#6853) 2026-05-08 20:40:39 -04:00
SlightlyCircuitous f7eeaeddcb Drop builds for Debian 11 and Ubuntu 22.04 (#6643)
* Delete .ci/Debian11 directory

* Delete .ci/Servatrice_Debian11 directory

* Delete .ci/Ubuntu22.04 directory

* Update desktop-build.yml

* Update release_template.md

* Add servatrice debian 12

* Update desktop-build.yml
2026-05-09 00:28:03 +02:00
SlightlyCircuitous 6cace2a8e6 Bump minimum required cmake to 3.10 in gtest (#6851)
* Bump minimum_required to 3.5 and GoogleTest to 1.12

GoogleTest 1.12 is the oldest version that sets cmake_minimum_required() to 3.5 in the CMakeLists files it provides

* code style changes

* Use 1.17.0

* Set minimum to 3.10 to make top-level CMakeLists

* New hash

Co-authored-by: tooomm <tooomm@users.noreply.github.com>

* Update cmake/gtest-CMakeLists.txt.in

Co-authored-by: tooomm <tooomm@users.noreply.github.com>

---------

Co-authored-by: tooomm <tooomm@users.noreply.github.com>
Co-authored-by: ebbit1q <ebbit1q@gmail.com>
2026-05-09 00:05:10 +02:00
tooomm 6b5f341e10 Fix toc link (#6854) 2026-05-09 00:04:16 +02:00
ZeldaZach 63143f9416 Fix triplet source for macOS13 Intel 2026-05-08-Release-3.0.0 2026-05-08 11:02:50 -04:00
ZeldaZach efe52b5412 Fix windows copying over CMakeFiles to themes 2026-05-08 10:28:14 -04:00
ZeldaZach 0e014c0e5c Use dash instead of underscore 2026-05-08 10:13:40 -04:00
ZeldaZach 511ccae738 Replace spaces with underscore for release name file names 2026-05-08 10:10:39 -04:00
Zach H 0672603755 Support spaces in release name (#6849) 2026-05-08 09:53:33 -04:00
Zach H f5f326f65b Update Repo URL for Webatrice 2026-05-08 09:22:17 -04:00
Jeremy Letto c5702cc8b6 Remove webclient (extracted to Webatrice repo) (#6848)
The webclient has been extracted to https://github.com/seavor/Webatrice
and the Playwright e2e suite has moved to Sockatrice. Cockatrice keeps
no copy.

Deleted:
- webclient/ (entire tree, 349 files)
- .github/workflows/web-build.yml, web-lint.yml
- .husky/pre-commit (the only tracked husky hook; managed entirely
  from webclient's package.json which no longer exists)

Edited:
- .tx/config: dropped the webclient resource block; Webatrice/.tx/config
  now manages its own translations
- .github/workflows/translations-pull.yml: removed webclient locales
  from add-paths
- .github/workflows/desktop-build.yml, desktop-lint.yml: removed dead
  '!webclient/**' and '!.husky/**' path-filter exclusions
- .github/dependabot.yml: removed commented-out npm/webclient block
- Doxyfile: removed webclient/ from EXCLUDE list
- .ci/release_template.md: dropped Webatrice section (Webatrice now
  cuts its own releases)
- README.md: dropped 'first work on a webclient' line, added Webatrice
  to Related Repositories, updated translation paragraph and build
  badges

History preserved: every webclient commit remains recoverable via
git log on master before this commit.
2026-05-08 09:14:53 -04:00
BruebachL 4f2f942121 Use Qt 6.11.0 (#6846)
* Use Qt 6.10.*

Took 3 hours 1 minute

* Remove workaround.

Took 10 minutes

* Pin to 6.11.0 for now.

Took 3 minutes

* Revert "Remove workaround."

This reverts commit 71584d1e50.


Took 4 seconds

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-05-08 15:10:17 +02:00
BruebachL a4c2b1411f Utility method to check if a theme is supposed to be in dark or light mode. (#6785)
* Utility method to check if a theme is supposed to be in dark or light mode.

Took 22 minutes

Took 4 seconds

* Method is public.

Took 3 minutes

* Add a utility method to check if we're using a built-in theme

Took 3 minutes

Took 3 seconds

* Use built-in theme detection for home screen.

Took 6 minutes

* Re-polish on theme change

Took 2 minutes

* Fetch background on theme change.

Took 4 minutes

Took 6 seconds

* No need to double polish.

Took 4 minutes

* No need to repaint.

Took 32 seconds

* Only repolish visible widgets.

Took 5 minutes

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-05-08 13:47:14 +02:00
DawnFire42 43bee2316e Fix Fedora 44 build: suppress -Werror=sfinae-incomplete for GCC 16+ (#6843)
Qt MOC and protobuf forward declarations trigger this warning in GCC 16.
  Re-enable Fedora 44 CI build now that it compiles successfully.
2026-05-06 01:00:13 +02:00
RickyRister 19dbb17fb9 [SettingsManager] Properly handle multithreaded access again (#6844)
* [SettingsManager] Properly handle multithreaded access again

* Add comment

* Add batch write function

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-05-05-Development-3.0.0-beta.63
2026-05-05 21:03:01 +02:00
BruebachL 7c9fbe2be0 Don't queue connection (#6842)
Took 5 minutes

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-05-04-Development-2.11.0-beta.62
2026-05-04 15:44:48 +02:00
BruebachL d30690236a Reload card db and notify enabled sets change on "Manage Sets" dialog save (#6837)
* Reload card db and notify enabled sets change on "Manage Sets" dialog save

Took 1 hour 18 minutes

Took 6 seconds

* Extract to method, also notify on "Reload db" and "new sets found"

Took 3 minutes

Took 4 seconds

* Add an "always enable new sets" fuse to "new sets found" dialog

Took 11 minutes

* Always debounce modelDirty() with dirty() timer.

Took 29 minutes

Took 3 minutes

* Performance improvements for settings by not constructing a new settings object on every single set() call (this forced a sync to/from fs but it seems fine to just rely on Qts own periodic sync?)

Took 23 minutes

Took 3 seconds

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-05-03 03:11:10 +02:00
tooomm ac2e995f15 add annotations level (#6840) 2026-04-30 23:51:53 +02:00
SlightlyCircuitous dac611f0f1 Add Fedora 44 build and drop Fedora 42 build (#6836)
* Add Fedora 44; Drop Fedora 42

* Delete .ci/Fedora42 directory

* Create Dockerfile

* Update release_template.md

* Skip debug
2026-04-30 21:09:49 +02:00
ebbit1q 45ab2602c6 ensure judges are omniscient when not spectating (#6831) 2026-04-30 14:31:28 +02:00
tooomm 5101cc3d74 CI: Ensure Docker runs + publishes images only on stable releases (#6839)
* Update docker-release.yml

* Update docker-release.yml

* Update docker-release.yml

* Update docker-release.yml

* Update docker-release.yml
2026-04-30 14:30:51 +02:00
BruebachL 9ac9a0c73a [Game] Add a coinflip shortcut. (#6829)
Took 18 minutes

Took 6 seconds

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-04-29 22:09:30 +02:00
BruebachL 314a577807 Do not allow users to remove VDE functionality by closing tabs (#6838)
* Do not allow users to remove VDE functionality by closing tabs.

Took 6 minutes

* Set filter toolbar visible on delayed initialization.

Took 5 minutes

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-04-29 12:37:47 +02:00
tooomm c5ace60f26 Bump Doxygen to 1.16.1 (#6752)
* Bump Doxygen version to 1.16.1

* Update Doxyfile

* Enable parallel processing
2026-04-29 09:40:18 +02:00
transifex-integration[bot] 8953ae3c67 Updates for project Cockatrice and language de (#6833)
* Translate cockatrice/cockatrice_en@source.ts in de

100% translated source file: 'cockatrice/cockatrice_en@source.ts'
on 'de'.

* Translate cockatrice/cockatrice_en@source.ts in de

100% translated source file: 'cockatrice/cockatrice_en@source.ts'
on 'de'.

---------

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-04-27 21:16:10 +02:00
ebbit1q b1fe4c85d3 fix sending decks to tappedout (#6832) 2026-04-23 02:28:12 +02:00
Vorliz a20f3c0fb4 Fix #6659: Correct logging for bottom-of-library card moves (#6764)
* Fix #6659:  Correct logging for bottom-of-library card moves

Cause:
- This issue happens due to logic of moving the card from the top of the
  deck being reused when moving from the bottom of the deck, in a way
  that makes it impossible to check if the card came from the bottom.

Resolution:
- Updated the logging logic in the client for card moves.
- Added a gRPC parameter ('is_from_bottom') for card moves.
- Updates the server logic to reverse the order of the card move if the
'is_from_bottom' parameter is true.
- Added a test to show the expected behaviour of the fix.

NOTE: While the changes in this patch seem big, this is due to changing
the loop in the moveCard function to a helper function, in order to make
the bug fix change. The only change to the loop was to pass a
variable attribution to the moveCard function because it was redundant
to be in the loop.

* chore: run format on test

* refactor: new way to check if a move is from the bottom of the deck

* refactor: change isFromBottom check to static function

* update comments

Co-authored-by: ebbit1q <ebbit1q@gmail.com>

---------

Co-authored-by: ebbit1q <ebbit1q@gmail.com>
2026-04-21 19:05:31 +02:00
BruebachL 9226bc9ddd [TabArchidekt] Place sideboard categories into the sideboard. (#6824)
Took 35 minutes

Took 3 seconds

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-04-21-Development-2.11.0-beta.61
2026-04-21 08:09:39 +02:00
ebbit1q 501c4b96d4 clear all players when closing game tab (#6828)
this prevents issues caused by items in play when using the player
destructor in the wrong order
2026-04-21 08:09:20 +02:00
ebbit1q 6ab947418c add an isEmpty method to printing info (#6805)
no reason, I just find it easier to understand
2026-04-21 01:26:08 +02:00
BruebachL 6765831b92 Change button colors to be palette aware. (#6821)
* Change button colors to be palette aware.

Took 13 minutes


Took 41 seconds

Took 15 seconds

* Change button style.

Took 24 minutes

Took 4 seconds

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-04-20 17:47:15 +02:00
BruebachL 98c4e829f8 [GameSelector/Filters] Properly sync toolbar and dialog. (#6822)
Took 59 minutes

Took 2 minutes

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-04-20 13:19:29 +02:00