feat(character/pvp): add pvp page

This commit is contained in:
Axel Cocat 2022-03-09 14:28:21 +01:00
parent 4c051e316c
commit 05706007f1
145 changed files with 302 additions and 107 deletions

View file

@ -138,6 +138,7 @@ export class Armory {
app.get("/character/:realm/:name/talents", this.wrapRoute(charsController.talents.bind(charsController)));
app.get("/character/:realm/:name/achievements", this.wrapRoute(charsController.achievements.bind(charsController)));
app.get("/character/:realm/:character/achievements/data", this.wrapRoute(charsController.achievementsData.bind(charsController)));
app.get("/character/:realm/:name/pvp", this.wrapRoute(charsController.pvp.bind(charsController)));
const guildsController = new GuildController(this);
app.get("/guild/:realm/:name", this.wrapRoute(guildsController.guild.bind(guildsController)));

View file

@ -3,6 +3,14 @@ export enum EFaction {
Alliance = 1,
}
export interface IEmblem {
icon: string;
iconColor: string;
border: string;
borderColor: string;
background: string;
}
export class Utils {
public static raceNames = {
1: "human",
@ -32,4 +40,15 @@ export class Utils {
public static getFactionFromRaceId(race: number): EFaction {
return [1, 3, 4, 7, 11].includes(race) ? EFaction.Alliance : EFaction.Horde;
}
public static makeEmblemObject(obj: any, padWithZeroes: boolean = true): IEmblem {
const padLength = padWithZeroes ? 2 : 0;
return {
icon: obj.emblemStyle.toString().padStart(padLength, "0"),
iconColor: obj.emblemColor.toString().padStart(padLength, "0"),
border: obj.borderStyle.toString().padStart(padLength, "0"),
borderColor: obj.borderColor.toString().padStart(padLength, "0"),
background: obj.background.toString().padStart(padLength, "0"),
};
}
}

View file

@ -178,9 +178,9 @@ export class CharacterController {
const mounts = await this.getMounts(realmName, charData.guid);
res.render("character.hbs", {
title: `Armory - ${charName}`,
title: `Armory - ${charData.name}`,
...this.makeSharedDataObject(realm, charData),
data: JSON.stringify({
data: {
race: charData.race,
gender: charData.gender,
class: charData.class,
@ -189,7 +189,7 @@ export class CharacterController {
customizationOptions: customization,
equipment,
mounts,
}),
},
});
this.armory.gc();
@ -212,13 +212,13 @@ export class CharacterController {
}
res.render("character-talents.hbs", {
title: `Armory - ${charName} - Talents`,
title: `Armory - ${charData.name} - Talents`,
...this.makeSharedDataObject(realm, charData),
data: JSON.stringify({
data: {
talents: await this.getTalents(realm.name, charData.guid),
trees: await this.getTalentTrees(charData.class),
glyphs: await this.getGlyphs(realm.name, charData.guid),
}),
},
});
}
@ -239,7 +239,7 @@ export class CharacterController {
}
res.render("character-achievements.hbs", {
title: `Armory - ${charName} - Achievements`,
title: `Armory - ${charData.name} - Achievements`,
...this.makeSharedDataObject(realm, charData),
});
}
@ -266,6 +266,31 @@ export class CharacterController {
});
}
public async pvp(req: express.Request, res: express.Response, next: express.NextFunction): Promise<void> {
const realmName = req.params.realm;
const charName = req.params.name;
const realm = this.armory.getRealm(realmName);
if (realm === undefined) {
// Could not find realm
return next(404);
}
const charData = await this.getCharacterData(realm, charName);
if (charData === null) {
// Could not find character
return next(404);
}
res.render("character-pvp.hbs", {
title: `Armory - ${charData.name} - PvP`,
...this.makeSharedDataObject(realm, charData),
faction: Utils.getFactionFromRaceId(charData.race),
kills: await this.getPvpKills(realm.name, charData.guid),
arenaTeams: await this.getArenaTeams(realm.name, charData.guid),
});
}
private makeSharedDataObject(realm: IRealmConfig, charData: ICharacterData) {
return {
realm: realm.name,
@ -323,7 +348,7 @@ export class CharacterController {
FROM character_spell
WHERE guid = ? AND spell IN (?)
`,
values:[charGuid, this.mountSpells],
values: [charGuid, this.mountSpells],
timeout: this.armory.config.dbQueryTimeout,
});
@ -770,4 +795,44 @@ export class CharacterController {
earned,
};
}
private async getPvpKills(realm: string, charGuid: number): Promise<{ total: number, today: number, yesterday: number }> {
const [rows, fields] = await this.armory.getCharactersDb(realm).query({
sql: `
SELECT totalKills, todayKills, yesterdayKills
FROM characters
WHERE guid = ?
`,
values: [charGuid],
timeout: this.armory.config.dbQueryTimeout,
});
const row = rows[0];
return {
total: row.totalKills,
today: row.todayKills,
yesterday: row.yesterdayKills,
};
}
private async getArenaTeams(realm: string, charGuid: number): Promise<any[]> {
const [rows, fields] = await this.armory.getCharactersDb(realm).query({
sql: `
SELECT
arena_team.arenaTeamId AS id, arena_team.name, arena_team.type, arena_team.rating, arena_team.seasonWins, arena_team.seasonGames,
arena_team.backgroundColor AS background, arena_team.emblemStyle, arena_team.emblemColor, arena_team.borderStyle, arena_team.borderColor
FROM arena_team_member
LEFT JOIN arena_team ON arena_team_member.arenaTeamId = arena_team.arenaTeamId
WHERE guid = ?
ORDER BY arena_team.type ASC
`,
values: [charGuid],
timeout: this.armory.config.dbQueryTimeout,
});
return (rows as RowDataPacket[]).map(row => {
row.emblem = Utils.makeEmblemObject(row, false);
return row;
});
}
}

View file

@ -133,13 +133,7 @@ export class GuildController {
name: guild.name,
leader: leader.name,
faction: Utils.getFactionFromRaceId(leader.race),
emblem: {
icon: guild.emblemStyle.toString().padStart(2, "0"),
iconColor: guild.emblemColor.toString().padStart(2, "0"),
border: guild.borderStyle.toString().padStart(2, "0"),
borderColor: guild.borderColor.toString().padStart(2, "0"),
background: guild.background.toString().padStart(2, "0"),
},
emblem: Utils.makeEmblemObject(guild),
membersCount,
};
}