diff --git a/config.default.json b/config.default.json index 70f9fcb..2860cad 100644 --- a/config.default.json +++ b/config.default.json @@ -10,7 +10,7 @@ "loadDbcs": true, "hideGameMasters": true, "hideBotAccounts": true, - "botAccountPatterns": "RNDBOT%", + "botAccountPattern": "RNDBOT%", "transmogModule": false, "useZamCdn": false, "realms": [ diff --git a/docker-compose.mythica.yml b/docker-compose.mythica.yml index 4153f7e..c1cbb8c 100644 --- a/docker-compose.mythica.yml +++ b/docker-compose.mythica.yml @@ -48,11 +48,8 @@ services: # Playerbots are ordinary accounts, not game masters, so the GM # filter does not touch them. Without this the armory lists ~1350 # bots against ~29 real characters. - # Comma-separated LIKE patterns. RNDBOT% covers the Playerbots - # accounts; ahouse is the auction-house bot, which owns 9 mule - # characters. Add further service accounts here as they appear. ACORE_ARMORY_HIDE_BOT_ACCOUNTS: ${ARMORY_HIDE_BOTS:-1} - ACORE_ARMORY_BOT_ACCOUNT_PATTERNS: ${ARMORY_BOT_PATTERNS:-RNDBOT%,ahouse} + ACORE_ARMORY_BOT_ACCOUNT_PATTERN: ${ARMORY_BOT_PATTERN:-RNDBOT%} ACORE_ARMORY_TRANSMOG_MODULE: ${ARMORY_TRANSMOG:-0} # 0 = serve 3D model assets from the local data directory. diff --git a/docs/mythica-deploy.md b/docs/mythica-deploy.md index 2b67642..d146f1a 100644 --- a/docs/mythica-deploy.md +++ b/docs/mythica-deploy.md @@ -133,8 +133,6 @@ FLUSH PRIVILEGES; this realm belong to real players — `Spinnaker` among them — so hiding them would hide people who should be listed. Set `ARMORY_HIDE_GMS=1` to restore upstream behaviour. -- **Service accounts are hidden** via `hideBotAccounts` / `botAccountPatterns`, - a comma-separated list of LIKE patterns defaulting to `RNDBOT%,ahouse` — the - Playerbots accounts and the auction-house bot, which owns 9 mule characters. - None of them are game masters, so the GM filter never touched them. Add more - with `ARMORY_BOT_PATTERNS`, or set `ARMORY_HIDE_BOTS=0` to show them all. +- **Playerbots are hidden** via `hideBotAccounts` / `botAccountPattern` + (`RNDBOT%`). They are ordinary accounts rather than game masters, so the GM + filter never touched them. `ARMORY_HIDE_BOTS=0` shows them again. diff --git a/src/armory/Config.ts b/src/armory/Config.ts index fc0bc80..4bbafe2 100644 --- a/src/armory/Config.ts +++ b/src/armory/Config.ts @@ -32,7 +32,7 @@ export class Config { public loadDbcs: boolean; public hideGameMasters: boolean; public hideBotAccounts: boolean; - public botAccountPatterns: string; + public botAccountPattern: string; public transmogModule: boolean; public useZamCdn: boolean; public realms: IRealmConfig[]; diff --git a/src/armory/Utils.ts b/src/armory/Utils.ts index 6e0a062..67f92dd 100644 --- a/src/armory/Utils.ts +++ b/src/armory/Utils.ts @@ -73,24 +73,4 @@ export class Utils { public static quoteSqlString(value: string): string { return `'${String(value).replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`; } - - /** - * Build the LIKE test that identifies non-player accounts. - * - * `patterns` is a comma-separated list, so a realm can name several service - * accounts at once — Playerbots plus an auction-house bot, say. Returns an - * empty string when nothing is configured, which callers treat as "do not - * filter" rather than emitting an always-false clause. - */ - public static botAccountFilter(column: string, patterns: string): string { - const list = String(patterns ?? "") - .split(",") - .map((p) => p.trim()) - .filter((p) => p.length > 0); - - if (list.length === 0) { - return ""; - } - return `(${list.map((p) => `${column} LIKE ${Utils.quoteSqlString(p)}`).join(" OR ")})`; - } } diff --git a/src/armory/controllers/CharacterController.ts b/src/armory/controllers/CharacterController.ts index 1623502..4ff44eb 100644 --- a/src/armory/controllers/CharacterController.ts +++ b/src/armory/controllers/CharacterController.ts @@ -347,14 +347,10 @@ export class CharacterController { // rows we do not want, then require the join to have missed. Keeping the // pattern inline rather than bound avoids disturbing the positional // values below. - const botFilter = this.armory.config.hideBotAccounts - ? Utils.botAccountFilter("`bot_account`.`username`", this.armory.config.botAccountPatterns) + const botJoin = this.armory.config.hideBotAccounts + ? `LEFT JOIN \`${realm.authDatabase}\`.\`account\` AS \`bot_account\` ON \`bot_account\`.\`id\` = \`characters\`.\`account\` AND \`bot_account\`.\`username\` LIKE ${Utils.quoteSqlString(this.armory.config.botAccountPattern)}` : ""; - const botJoin = - botFilter === "" - ? "" - : `LEFT JOIN \`${realm.authDatabase}\`.\`account\` AS \`bot_account\` ON \`bot_account\`.\`id\` = \`characters\`.\`account\` AND ${botFilter}`; - const botWhere = botFilter === "" ? "" : "AND `bot_account`.`id` IS NULL"; + const botWhere = this.armory.config.hideBotAccounts ? "AND `bot_account`.`id` IS NULL" : ""; const [rows] = await this.armory.getCharactersDb(realm.name).query({ sql: ` diff --git a/src/armory/controllers/GuildController.ts b/src/armory/controllers/GuildController.ts index e7ca050..441cc6e 100644 --- a/src/armory/controllers/GuildController.ts +++ b/src/armory/controllers/GuildController.ts @@ -93,10 +93,7 @@ export class GuildController { ssp = ssp.where("`account_access`.`id` IS NULL"); } - const botFilter = this.armory.config.hideBotAccounts - ? Utils.botAccountFilter(`\`${realm.authDatabase}\`.\`account\`.\`username\``, this.armory.config.botAccountPatterns) - : ""; - if (botFilter !== "") { + if (this.armory.config.hideBotAccounts) { ssp.joins.push({ table1: "characters", column1: "account", @@ -104,7 +101,7 @@ export class GuildController { column2: "id", database2: realm.authDatabase, kind: "LEFT", - where: `AND ${botFilter}`, + where: `AND \`${realm.authDatabase}\`.\`account\`.\`username\` LIKE ${Utils.quoteSqlString(this.armory.config.botAccountPattern)}`, }); ssp = ssp.where(`\`${realm.authDatabase}\`.\`account\`.\`id\` IS NULL`); } diff --git a/src/armory/controllers/IndexController.ts b/src/armory/controllers/IndexController.ts index 16c9052..de776af 100644 --- a/src/armory/controllers/IndexController.ts +++ b/src/armory/controllers/IndexController.ts @@ -55,10 +55,7 @@ export class IndexController { ssp = ssp.where("`account_access`.`id` IS NULL"); } - const botFilter = this.armory.config.hideBotAccounts - ? Utils.botAccountFilter(`\`${realm.authDatabase}\`.\`account\`.\`username\``, this.armory.config.botAccountPatterns) - : ""; - if (botFilter !== "") { + if (this.armory.config.hideBotAccounts) { ssp.joins.push({ table1: "characters", column1: "account", @@ -66,7 +63,7 @@ export class IndexController { column2: "id", database2: realm.authDatabase, kind: "LEFT", - where: `AND ${botFilter}`, + where: `AND \`${realm.authDatabase}\`.\`account\`.\`username\` LIKE ${Utils.quoteSqlString(this.armory.config.botAccountPattern)}`, }); ssp = ssp.where(`\`${realm.authDatabase}\`.\`account\`.\`id\` IS NULL`); }