Compare commits
No commits in common. "424d65233bc62c741dd1c41d475be08038d8f4fd" and "ffdeacc0c4f80624fd2cc9e49b7ed4a46615625f" have entirely different histories.
424d65233b
...
ffdeacc0c4
8 changed files with 3 additions and 72 deletions
|
|
@ -9,8 +9,6 @@
|
||||||
},
|
},
|
||||||
"loadDbcs": true,
|
"loadDbcs": true,
|
||||||
"hideGameMasters": true,
|
"hideGameMasters": true,
|
||||||
"hideBotAccounts": true,
|
|
||||||
"botAccountPattern": "RNDBOT%",
|
|
||||||
"transmogModule": false,
|
"transmogModule": false,
|
||||||
"useZamCdn": false,
|
"useZamCdn": false,
|
||||||
"realms": [
|
"realms": [
|
||||||
|
|
|
||||||
|
|
@ -40,16 +40,7 @@ services:
|
||||||
|
|
||||||
# --- behaviour -----------------------------------------------------
|
# --- behaviour -----------------------------------------------------
|
||||||
ACORE_ARMORY_LOAD_DBCS: ${ARMORY_LOAD_DBCS:-1}
|
ACORE_ARMORY_LOAD_DBCS: ${ARMORY_LOAD_DBCS:-1}
|
||||||
# Off by default here: GM accounts on this realm belong to real
|
ACORE_ARMORY_HIDE_GAME_MASTERS: ${ARMORY_HIDE_GMS:-1}
|
||||||
# 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_TRANSMOG_MODULE: ${ARMORY_TRANSMOG:-0}
|
ACORE_ARMORY_TRANSMOG_MODULE: ${ARMORY_TRANSMOG:-0}
|
||||||
|
|
||||||
# 0 = serve 3D model assets from the local data directory.
|
# 0 = serve 3D model assets from the local data directory.
|
||||||
|
|
|
||||||
|
|
@ -129,10 +129,5 @@ FLUSH PRIVILEGES;
|
||||||
page rather than shipping both.
|
page rather than shipping both.
|
||||||
- **The Dockerfile builds from `node:16`**, which is end-of-life. It builds and
|
- **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.
|
runs fine; bumping it is a separate change from getting this deployed.
|
||||||
- **`hideGameMasters` is off** in this stack, unlike upstream. GM accounts on
|
- **`hideGameMasters` defaults to on** here, so GM characters are hidden from
|
||||||
this realm belong to real players — `Spinnaker` among them — so hiding them
|
search and return 404.
|
||||||
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.
|
|
||||||
|
|
|
||||||
|
|
@ -31,8 +31,6 @@ export class Config {
|
||||||
public iframeMode: IIframeModeConfig;
|
public iframeMode: IIframeModeConfig;
|
||||||
public loadDbcs: boolean;
|
public loadDbcs: boolean;
|
||||||
public hideGameMasters: boolean;
|
public hideGameMasters: boolean;
|
||||||
public hideBotAccounts: boolean;
|
|
||||||
public botAccountPattern: string;
|
|
||||||
public transmogModule: boolean;
|
public transmogModule: boolean;
|
||||||
public useZamCdn: boolean;
|
public useZamCdn: boolean;
|
||||||
public realms: IRealmConfig[];
|
public realms: IRealmConfig[];
|
||||||
|
|
|
||||||
|
|
@ -60,17 +60,4 @@ export class Utils {
|
||||||
background: obj.background.toString().padStart(padLength, "0"),
|
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, "\\'")}'`;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -342,16 +342,6 @@ export class CharacterController {
|
||||||
|
|
||||||
private async getCharacterData(realm: IRealmConfig, character: string | number): Promise<ICharacterData> {
|
private async getCharacterData(realm: IRealmConfig, character: string | number): Promise<ICharacterData> {
|
||||||
const where = typeof character === "string" ? "LOWER(`characters`.`name`) = LOWER(?)" : "`characters`.`guid` = ?";
|
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({
|
const [rows] = await this.armory.getCharactersDb(realm.name).query({
|
||||||
sql: `
|
sql: `
|
||||||
SELECT \`characters\`.\`guid\`, \`characters\`.\`name\`, \`race\`, \`class\`, \`gender\`, \`level\`, \`skin\`, \`face\`, \`hairStyle\`, \`hairColor\`, \`facialStyle\`, \`playerFlags\`, \`online\`, \`guild\`.\`name\` AS \`guild\`
|
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_member\` ON \`guild_member\`.\`guid\` = \`characters\`.\`guid\`
|
||||||
LEFT JOIN \`guild\` ON \`guild\`.\`guildid\` = \`guild_member\`.\`guildid\`
|
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
|
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
|
||||||
${where}
|
${where}
|
||||||
AND (\`account_access\`.\`id\` IS NULL OR ? = 0)
|
AND (\`account_access\`.\`id\` IS NULL OR ? = 0)
|
||||||
${botWhere}
|
|
||||||
`,
|
`,
|
||||||
values: [character, this.armory.config.hideGameMasters ? 1 : 0],
|
values: [character, this.armory.config.hideGameMasters ? 1 : 0],
|
||||||
timeout: this.armory.config.dbQueryTimeout,
|
timeout: this.armory.config.dbQueryTimeout,
|
||||||
|
|
|
||||||
|
|
@ -93,19 +93,6 @@ export class GuildController {
|
||||||
ssp = ssp.where("`account_access`.`id` IS NULL");
|
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 result = await ssp.where("`guildid` = ?", guildId).where("`deleteInfos_Account` IS NULL").run(this.armory.config.dbQueryTimeout);
|
||||||
|
|
||||||
const ranks = await this.getGuildRanks(realm, guildId);
|
const ranks = await this.getGuildRanks(realm, guildId);
|
||||||
|
|
|
||||||
|
|
@ -55,19 +55,6 @@ export class IndexController {
|
||||||
ssp = ssp.where("`account_access`.`id` IS NULL");
|
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);
|
const result = await ssp.where("`deleteInfos_Account` IS NULL").run(this.armory.config.dbQueryTimeout);
|
||||||
|
|
||||||
res.json({
|
res.json({
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue