The auction-house bot account (ahouse) owns 9 mule characters that were
showing up in the armory alongside real players. One LIKE pattern could not
cover both it and RNDBOT%.
Replaces botAccountPattern with botAccountPatterns, a comma-separated list
of LIKE patterns, and builds the clause with Utils.botAccountFilter. An empty
list now disables the filter outright rather than emitting a clause that
matches nothing, so misconfiguration fails open instead of hiding everyone.
The stack default becomes "RNDBOT%,ahouse"; config.default.json keeps the
generic "RNDBOT%" so the fork stays upstreamable.
Verified against the live realm: 29 listed before, 20 after. The 9 excluded
are the ahouse mules.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NW2ooBP2KPqQVzdZZDMvZd
The bot-account filter joins acore_auth.account, which has its own `online`
column. The character query selected several columns unqualified, so `online`
became ambiguous and every character page returned a 500:
Error: Column 'online' in field list is ambiguous
at CharacterController.getCharacterData
Qualifies every column in that SELECT with `characters`, rather than only the
one that collided, so a future join cannot reintroduce this. The search and
guild listings were never affected: DataTablesSsp always qualifies its columns
with the base table, and only this hand-written query did not.
Verified against the live realm - the previously failing query for
Heavenlymagi now returns its row, and a bot name still returns none.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NW2ooBP2KPqQVzdZZDMvZd
Upstream hides GM accounts by default, which assumes GM means staff-only.
On this realm GM accounts belong to real players — Spinnaker, the highest
level character on the server, is gmlevel 3 — so the filter was hiding
people who should be listed.
Flips the stack default to 0 and documents both this and the bot filter.
ARMORY_HIDE_GMS=1 restores upstream behaviour.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NW2ooBP2KPqQVzdZZDMvZd
Playerbots are ordinary accounts, not game masters, so hideGameMasters does
not touch them. On a realm running mod-playerbots that means the armory is
almost entirely bots: 1,377 characters listed, of which about 1,350 are bots.
Adds two options, hideBotAccounts (default true) and botAccountPattern
(default "RNDBOT%"), applied the same way the game master filter already
works: left join the accounts we do not want, then require the join to have
missed. A realm without bots matches nothing, so the default is harmless.
Applied in the search listing, guild rosters, and the character lookup, so a
bot's page 404s rather than rendering.
The pattern is spliced into join clauses the query builder emits as raw SQL,
so it cannot be a bound parameter. It comes from the operator's own config
rather than from a request, but Utils.quoteSqlString quotes it so a stray
apostrophe cannot produce a broken query.
Verified against the live realm:
listed before 1377
listed after 27
Spinnaker, Kdog shown
Rarzosh (bot) hidden
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NW2ooBP2KPqQVzdZZDMvZd
The procedure created /opt/mythica-armory with sudo but then ran the curl
downloads as the normal user, so every one failed with "Permission denied /
Failure writing output to destination". Adds the chown and notes that user
ownership is fine, since the container reads the bind mount as root.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NW2ooBP2KPqQVzdZZDMvZd
Deploys this fork alongside the Mythica web page, reading the AzerothCore
databases over the LAN. Nothing runs on the game server itself.
docker-compose.mythica.yml differs from upstream's compose because Portainer
deploys from a git checkout it manages:
- Configuration comes from Portainer stack environment variables rather than
a .env file in the repo, which git stacks do not provide.
- Only the four large model-data directories are bind-mounted from the host,
so the DBC csv files stay versioned with the code in the image and a repo
re-clone cannot wipe the 2 GB of model data.
- The unused ac-network block is dropped.
The doc also records why the model data is a manual step: upstream's fetchdata
tool no longer works, because Zam reorganised the CDN and every character path
now 404s. A run appears to succeed while producing no character data, and the
app then fails at startup on meta/charactercustomization2/1_0.json. The v1.0.0
snapshot mirrored into this fork's release is the only remaining source.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NW2ooBP2KPqQVzdZZDMvZd