2026-05-01 14:56:53 +01:00
# Anti Prestige Tool v0.9.0
2026-05-01 10:26:41 +01:00
2026-05-01 14:18:16 +01:00
Queue-position reader for Arma Reforger on Linux Wayland.
2026-05-01 10:26:41 +01:00
2026-05-01 14:18:16 +01:00
The tool captures a user-selected Reforger window through xdg-desktop-portal/PipeWire, crops the queue-number region, and reads the orange UI digits with bundled real-game digit templates. Normal use does not require external OCR libraries, desktop-specific screenshot hooks, or a specific installed font.
2026-05-01 10:26:41 +01:00
2026-05-01 13:05:49 +01:00
## Install
Install system dependencies:
2026-05-01 10:26:41 +01:00
```bash
2026-05-01 13:05:49 +01:00
# Arch example
sudo pacman -S --needed base-devel uv qt6-base gstreamer gst-plugins-base gst-plugin-pipewire imagemagick xdg-desktop-portal
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:18:16 +01:00
Install the portal backend for your desktop:
2026-05-01 10:26:41 +01:00
```text
2026-05-01 13:05:49 +01:00
KDE: xdg-desktop-portal-kde
GNOME: xdg-desktop-portal-gnome
wlr: xdg-desktop-portal-wlr
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:18:16 +01:00
Set up the Python environment and build the portal helper:
2026-05-01 10:26:41 +01:00
```bash
2026-05-01 14:18:16 +01:00
uv sync
2026-05-01 13:05:49 +01:00
make
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:18:16 +01:00
No sudo install step is required.
2026-05-01 13:25:01 +01:00
2026-05-01 14:56:53 +01:00
## Standard Run
2026-05-01 10:26:41 +01:00
2026-05-01 14:56:53 +01:00
Watch the selected Reforger window and alert when the queue position reaches `5` or lower:
```bash
uv run reforger_queue_read.py --watch --portal-window
```
On first run, your desktop should show a window-sharing picker. Select the Arma Reforger window. Later runs try to reuse that selection.
Read the queue once:
```bash
uv run reforger_queue_read.py --portal-window
```
Force the window picker again if the saved selection is stale or wrong:
```bash
uv run reforger_queue_read.py --portal-window --portal-reselect
```
Run once with crop and OCR details while tuning or checking accuracy:
2026-05-01 10:26:41 +01:00
2026-05-01 13:05:49 +01:00
```bash
uv run reforger_queue_read.py --portal-window --show-crop --debug
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:56:53 +01:00
The saved portal restore token lives here:
2026-05-01 10:26:41 +01:00
```text
2026-05-01 13:05:49 +01:00
~/.local/state/anti-prestige-tool/portal-window-restore-token
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:56:53 +01:00
## Watch Behavior
Default watch mode:
```text
poll interval: 15 seconds
alert threshold: 5, inclusive
alerts: once per newly detected position
notification urgency: critical
```
Each poll prints a timestamp, the detected queue number, and whether an alert fired:
```text
2026-05-01T14:44:05+01:00 number=5 alert=yes
2026-05-01T14:44:20+01:00 number=5 alert=no
```
If no digits are found, the watcher logs that and keeps running.
## Optional Flags
Common flags:
```text
--watch keep polling instead of reading once
--watch-interval SECONDS poll delay; default 15
--alert-threshold N alert when position is < = N; default 5
--portal-reselect ignore the saved portal selection and pick again
--show-crop print the resolved crop
--debug print OCR match details
--save-input PATH save the captured portal frame
--notify-command COMMAND notification command; default notify-send
```
Input and test flags:
```text
--image PATH read an existing screenshot
--dataset DIR read every image in a dataset directory
--expect-filenames compare dataset results to numeric filenames
--font FONT debug with synthetic font templates
--crop X,Y,W,H override the crop
--cropped treat input image as already cropped
```
## Examples
Alert at queue position `10` or lower:
2026-05-01 10:26:41 +01:00
2026-05-01 13:05:49 +01:00
```bash
2026-05-01 14:56:53 +01:00
uv run reforger_queue_read.py --watch --portal-window --alert-threshold 10
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:56:53 +01:00
Poll every 5 seconds:
2026-05-01 10:26:41 +01:00
```bash
2026-05-01 14:56:53 +01:00
uv run reforger_queue_read.py --watch --portal-window --watch-interval 5
2026-05-01 10:26:41 +01:00
```
2026-05-01 13:05:49 +01:00
Save the captured input image while debugging:
2026-05-01 10:26:41 +01:00
2026-05-01 13:05:49 +01:00
```bash
uv run reforger_queue_read.py --portal-window --save-input /tmp/apt-portal-window.png --show-crop --debug
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:56:53 +01:00
Test watcher alerting against a fixture without sending a real notification:
2026-05-01 14:45:16 +01:00
```bash
2026-05-01 14:56:53 +01:00
uv run reforger_queue_read.py --watch --image datasets/regression-test-set/3.png --watch-interval 1 --notify-command true
2026-05-01 14:45:16 +01:00
```
2026-05-01 14:56:53 +01:00
Read an existing screenshot:
2026-05-01 14:45:16 +01:00
```bash
2026-05-01 14:56:53 +01:00
uv run reforger_queue_read.py --image /path/to/screenshot.png --show-crop --debug
2026-05-01 14:45:16 +01:00
```
2026-05-01 14:18:16 +01:00
## Validation
2026-05-01 10:26:41 +01:00
2026-05-01 14:18:16 +01:00
Run the regression set:
2026-05-01 10:26:41 +01:00
2026-05-01 13:05:49 +01:00
```bash
2026-05-01 14:18:16 +01:00
uv run reforger_queue_read.py --dataset datasets/regression-test-set --expect-filenames
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:18:16 +01:00
Expected result:
2026-05-01 10:26:41 +01:00
2026-05-01 14:18:16 +01:00
```text
summary: 21 passed, 0 failed
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:18:16 +01:00
Run the smaller smoke dataset:
2026-05-01 10:26:41 +01:00
```bash
2026-05-01 14:18:16 +01:00
uv run reforger_queue_read.py --dataset datasets/scootz-dataset --show-crop
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:18:16 +01:00
Expected output:
2026-05-01 10:26:41 +01:00
```text
2026-05-01 14:18:16 +01:00
datasets/scootz-dataset/1920x1080.png crop=788,465,75,45
datasets/scootz-dataset/1920x1080.png 22
datasets/scootz-dataset/2160x1440.png crop=1050,620,100,60
datasets/scootz-dataset/2160x1440.png 24
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:18:16 +01:00
## Debug Options
2026-05-01 10:26:41 +01:00
2026-05-01 14:18:16 +01:00
The default matcher uses bundled templates from:
2026-05-01 13:51:43 +01:00
```text
2026-05-01 14:18:16 +01:00
templates/reforger_digits.json
2026-05-01 13:51:43 +01:00
```
2026-05-01 14:18:16 +01:00
Font mode is only for debugging. Known-good overrides:
2026-05-01 10:26:41 +01:00
```bash
2026-05-01 14:18:16 +01:00
uv run reforger_queue_read.py --portal-window --font Roboto-Condensed --show-crop --debug
uv run reforger_queue_read.py --portal-window --font Adwaita-Sans --show-crop --debug
2026-05-01 10:26:41 +01:00
```
2026-05-01 13:05:49 +01:00
Default crop reference:
2026-05-01 10:26:41 +01:00
2026-05-01 13:05:49 +01:00
```text
reference-size: 2560x1440
reference-crop: 1050,620,100,60
scale-mode: width
2026-05-01 10:26:41 +01:00
```
2026-05-01 14:18:16 +01:00
Portal restore behavior depends on the desktop portal. If the selected window disappears after an Arma restart, the portal may show the picker again.