diff --git a/config.default.json b/config.default.json index 2860cad..3c65a39 100644 --- a/config.default.json +++ b/config.default.json @@ -9,8 +9,6 @@ }, "loadDbcs": true, "hideGameMasters": true, - "hideBotAccounts": true, - "botAccountPattern": "RNDBOT%", "transmogModule": false, "useZamCdn": false, "realms": [ diff --git a/docker-compose.mythica.yml b/docker-compose.mythica.yml index c1cbb8c..cfaef68 100644 --- a/docker-compose.mythica.yml +++ b/docker-compose.mythica.yml @@ -40,16 +40,7 @@ services: # --- behaviour ----------------------------------------------------- ACORE_ARMORY_LOAD_DBCS: ${ARMORY_LOAD_DBCS:-1} - # Off by default here: GM accounts on this realm belong to real - # players who should appear in the armory like anyone else. Set to - # 1 to hide them from search and 404 their character pages. - ACORE_ARMORY_HIDE_GAME_MASTERS: ${ARMORY_HIDE_GMS:-0} - - # 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. - ACORE_ARMORY_HIDE_BOT_ACCOUNTS: ${ARMORY_HIDE_BOTS:-1} - ACORE_ARMORY_BOT_ACCOUNT_PATTERN: ${ARMORY_BOT_PATTERN:-RNDBOT%} + ACORE_ARMORY_HIDE_GAME_MASTERS: ${ARMORY_HIDE_GMS:-1} 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 d146f1a..299abc0 100644 --- a/docs/mythica-deploy.md +++ b/docs/mythica-deploy.md @@ -129,10 +129,5 @@ FLUSH PRIVILEGES; page rather than shipping both. - **The Dockerfile builds from `node:16`**, which is end-of-life. It builds and runs fine; bumping it is a separate change from getting this deployed. -- **`hideGameMasters` is off** in this stack, unlike upstream. GM accounts on - 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. -- **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. +- **`hideGameMasters` defaults to on** here, so GM characters are hidden from + search and return 404. diff --git a/src/armory/Config.ts b/src/armory/Config.ts index 4bbafe2..4ae6283 100644 --- a/src/armory/Config.ts +++ b/src/armory/Config.ts @@ -31,8 +31,6 @@ export class Config { public iframeMode: IIframeModeConfig; public loadDbcs: boolean; public hideGameMasters: boolean; - public hideBotAccounts: boolean; - 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 67f92dd..366f5c9 100644 --- a/src/armory/Utils.ts +++ b/src/armory/Utils.ts @@ -60,17 +60,4 @@ export class Utils { background: obj.background.toString().padStart(padLength, "0"), }; } - - /** - * Quote a configuration-supplied string for inline use in SQL. - * - * The bot-account filter has to be spliced into join clauses that the query - * builder emits as raw SQL, so it cannot be passed as a bound parameter the - * way a normal value would be. The value comes from the operator's own - * config rather than from a request, but quoting it keeps a stray apostrophe - * from producing a broken or surprising query. - */ - public static quoteSqlString(value: string): string { - return `'${String(value).replace(/\\/g, "\\\\").replace(/'/g, "\\'")}'`; - } } diff --git a/src/armory/controllers/CharacterController.ts b/src/armory/controllers/CharacterController.ts index 2a9f682..cbef2b8 100644 --- a/src/armory/controllers/CharacterController.ts +++ b/src/armory/controllers/CharacterController.ts @@ -342,16 +342,6 @@ export class CharacterController { private async getCharacterData(realm: IRealmConfig, character: string | number): Promise { const where = typeof character === "string" ? "LOWER(`characters`.`name`) = LOWER(?)" : "`characters`.`guid` = ?"; - - // Bot accounts are hidden the same way game masters are: left join the - // 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 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 botWhere = this.armory.config.hideBotAccounts ? "AND `bot_account`.`id` IS NULL" : ""; - const [rows] = await this.armory.getCharactersDb(realm.name).query({ sql: ` SELECT \`characters\`.\`guid\`, \`characters\`.\`name\`, \`race\`, \`class\`, \`gender\`, \`level\`, \`skin\`, \`face\`, \`hairStyle\`, \`hairColor\`, \`facialStyle\`, \`playerFlags\`, \`online\`, \`guild\`.\`name\` AS \`guild\` @@ -359,11 +349,9 @@ export class CharacterController { LEFT JOIN \`guild_member\` ON \`guild_member\`.\`guid\` = \`characters\`.\`guid\` LEFT JOIN \`guild\` ON \`guild\`.\`guildid\` = \`guild_member\`.\`guildid\` LEFT JOIN \`${realm.authDatabase}\`.\`account_access\` ON \`account_access\`.\`id\` = \`characters\`.\`account\` AND \`account_access\`.\`RealmID\` IN (-1, ${realm.realmId}) AND \`account_access\`.\`gmlevel\` > 0 - ${botJoin} WHERE ${where} AND (\`account_access\`.\`id\` IS NULL OR ? = 0) - ${botWhere} `, values: [character, this.armory.config.hideGameMasters ? 1 : 0], timeout: this.armory.config.dbQueryTimeout, diff --git a/src/armory/controllers/GuildController.ts b/src/armory/controllers/GuildController.ts index 441cc6e..c7eb65d 100644 --- a/src/armory/controllers/GuildController.ts +++ b/src/armory/controllers/GuildController.ts @@ -93,19 +93,6 @@ export class GuildController { ssp = ssp.where("`account_access`.`id` IS NULL"); } - if (this.armory.config.hideBotAccounts) { - ssp.joins.push({ - table1: "characters", - column1: "account", - table2: "account", - column2: "id", - database2: realm.authDatabase, - kind: "LEFT", - where: `AND \`${realm.authDatabase}\`.\`account\`.\`username\` LIKE ${Utils.quoteSqlString(this.armory.config.botAccountPattern)}`, - }); - ssp = ssp.where(`\`${realm.authDatabase}\`.\`account\`.\`id\` IS NULL`); - } - const result = await ssp.where("`guildid` = ?", guildId).where("`deleteInfos_Account` IS NULL").run(this.armory.config.dbQueryTimeout); const ranks = await this.getGuildRanks(realm, guildId); diff --git a/src/armory/controllers/IndexController.ts b/src/armory/controllers/IndexController.ts index de776af..0a72dd3 100644 --- a/src/armory/controllers/IndexController.ts +++ b/src/armory/controllers/IndexController.ts @@ -55,19 +55,6 @@ export class IndexController { ssp = ssp.where("`account_access`.`id` IS NULL"); } - if (this.armory.config.hideBotAccounts) { - ssp.joins.push({ - table1: "characters", - column1: "account", - table2: "account", - column2: "id", - database2: realm.authDatabase, - kind: "LEFT", - where: `AND \`${realm.authDatabase}\`.\`account\`.\`username\` LIKE ${Utils.quoteSqlString(this.armory.config.botAccountPattern)}`, - }); - ssp = ssp.where(`\`${realm.authDatabase}\`.\`account\`.\`id\` IS NULL`); - } - const result = await ssp.where("`deleteInfos_Account` IS NULL").run(this.armory.config.dbQueryTimeout); res.json({