add reputation page
This commit is contained in:
parent
0a04f3bc81
commit
56732a68c1
7 changed files with 712 additions and 0 deletions
402
data/Factions.csv
Normal file
402
data/Factions.csv
Normal file
|
|
@ -0,0 +1,402 @@
|
|||
ID,ReputationID,Name
|
||||
1,-1,"PLAYER, Human"
|
||||
2,-1,"PLAYER, Orc"
|
||||
3,-1,"PLAYER, Dwarf"
|
||||
4,-1,"PLAYER, Night Elf"
|
||||
5,-1,"PLAYER, Undead"
|
||||
6,-1,"PLAYER, Tauren"
|
||||
7,-1,Creature
|
||||
8,-1,"PLAYER, Gnome"
|
||||
9,-1,"PLAYER, Troll"
|
||||
14,-1,Monster
|
||||
15,-1,"Defias Brotherhood"
|
||||
16,-1,"Gnoll - Riverpaw"
|
||||
17,-1,"Gnoll - Redridge"
|
||||
18,-1,"Gnoll - Shadowhide"
|
||||
19,-1,Murloc
|
||||
20,-1,"Undead, Scourge"
|
||||
21,1,"Booty Bay"
|
||||
22,-1,"Beast - Spider"
|
||||
23,-1,"Beast - Boar"
|
||||
24,-1,Worgen
|
||||
25,-1,Kobold
|
||||
26,-1,"Troll, Bloodscalp"
|
||||
27,-1,"Troll, Skullsplitter"
|
||||
28,-1,Prey
|
||||
29,-1,"Beast - Wolf"
|
||||
30,-1,"Defias Brotherhood Traitor"
|
||||
31,-1,Friendly
|
||||
32,-1,Trogg
|
||||
33,-1,"Troll, Frostmane"
|
||||
34,-1,"Orc, Blackrock"
|
||||
35,-1,Villian
|
||||
36,-1,Victim
|
||||
37,-1,"Beast - Bear"
|
||||
38,-1,Ogre
|
||||
39,-1,"Kurzen's Mercenaries"
|
||||
40,-1,Escortee
|
||||
41,-1,"Venture Company"
|
||||
42,-1,"Beast - Raptor"
|
||||
43,-1,Basilisk
|
||||
44,-1,"Dragonflight, Green"
|
||||
45,-1,"Lost Ones"
|
||||
46,29,"Blacksmithing - Armorsmithing"
|
||||
47,20,Ironforge
|
||||
48,-1,"Dark Iron Dwarves"
|
||||
49,-1,"Human, Night Watch"
|
||||
50,-1,"Dragonflight, Red"
|
||||
51,-1,"Gnoll - Mosshide"
|
||||
52,-1,"Orc, Dragonmaw"
|
||||
53,-1,"Gnome - Leper"
|
||||
54,18,"Gnomeregan Exiles"
|
||||
55,-1,Leopard
|
||||
56,-1,"Scarlet Crusade"
|
||||
57,-1,"Gnoll - Rothide"
|
||||
58,-1,"Beast - Gorilla"
|
||||
59,4,"Thorium Brotherhood"
|
||||
60,-1,Naga
|
||||
61,-1,Dalaran
|
||||
62,-1,"Forlorn Spirit"
|
||||
63,-1,Darkhowl
|
||||
64,-1,Grell
|
||||
65,-1,Furbolg
|
||||
66,-1,"Horde Generic"
|
||||
67,12,Horde
|
||||
68,17,Undercity
|
||||
69,21,Darnassus
|
||||
70,6,Syndicate
|
||||
71,-1,"Hillsbrad Militia"
|
||||
72,19,Stormwind
|
||||
73,-1,Demon
|
||||
74,-1,Elemental
|
||||
75,-1,Spirit
|
||||
76,14,Orgrimmar
|
||||
77,-1,Treasure
|
||||
78,-1,"Gnoll - Mudsnout"
|
||||
79,-1,"HIllsbrad, Southshore Mayor"
|
||||
80,-1,"Dragonflight, Black"
|
||||
81,16,"Thunder Bluff"
|
||||
82,-1,"Troll, Witherbark"
|
||||
83,23,"Leatherworking - Elemental"
|
||||
84,-1,"Quilboar, Razormane"
|
||||
85,-1,"Quilboar, Bristleback"
|
||||
86,22,"Leatherworking - Dragonscale"
|
||||
87,0,"Bloodsail Buccaneers"
|
||||
88,-1,Blackfathom
|
||||
89,-1,Makrura
|
||||
90,-1,"Centaur, Kolkar"
|
||||
91,-1,"Centaur, Galak"
|
||||
92,2,"Gelkis Clan Centaur"
|
||||
93,3,"Magram Clan Centaur"
|
||||
94,-1,Maraudine
|
||||
108,-1,Theramore
|
||||
109,-1,"Quilboar, Razorfen"
|
||||
110,-1,"Quilboar, Razormane 2"
|
||||
111,-1,"Quilboar, Deathshead"
|
||||
128,-1,Enemy
|
||||
148,-1,Ambient
|
||||
168,-1,"Nethergarde Caravan"
|
||||
169,10,"Steamwheedle Cartel"
|
||||
189,-1,"Alliance Generic"
|
||||
209,-1,Nethergarde
|
||||
229,-1,"Wailing Caverns"
|
||||
249,-1,Silithid
|
||||
269,-1,"Silvermoon Remnant"
|
||||
270,51,"Zandalar Tribe"
|
||||
289,30,"Blacksmithing - Weaponsmithing"
|
||||
309,-1,Scorpid
|
||||
310,-1,"Beast - Bat"
|
||||
311,-1,Titan
|
||||
329,-1,"Taskmaster Fizzule"
|
||||
349,5,Ravenholdt
|
||||
369,7,Gadgetzan
|
||||
389,-1,"Gnomeregan Bug"
|
||||
409,-1,Harpy
|
||||
429,-1,"Burning Blade"
|
||||
449,-1,"Shadowsilk Poacher"
|
||||
450,-1,"Searing Spider"
|
||||
469,11,Alliance
|
||||
470,9,Ratchet
|
||||
471,8,"Wildhammer Clan"
|
||||
489,-1,"Goblin, Dark Iron Bar Patron"
|
||||
509,53,"The League of Arathor"
|
||||
510,52,"The Defilers"
|
||||
511,-1,Giant
|
||||
529,13,"Argent Dawn"
|
||||
530,15,"Darkspear Trolls"
|
||||
531,-1,"Dragonflight, Bronze"
|
||||
532,-1,"Dragonflight, Blue"
|
||||
549,24,"Leatherworking - Tribal"
|
||||
550,26,"Engineering - Goblin"
|
||||
551,25,"Engineering - Gnome"
|
||||
569,33,"Blacksmithing - Hammersmithing"
|
||||
570,31,"Blacksmithing - Axesmithing"
|
||||
571,32,"Blacksmithing - Swordsmithing"
|
||||
572,-1,"Troll, Vilebranch"
|
||||
573,-1,"Southsea Freebooters"
|
||||
574,34,"Caer Darrow"
|
||||
575,-1,"Furbolg, Uncorrupted"
|
||||
576,35,"Timbermaw Hold"
|
||||
577,28,Everlook
|
||||
589,27,"Wintersaber Trainers"
|
||||
609,36,"Cenarion Circle"
|
||||
629,-1,"Shatterspear Trolls"
|
||||
630,-1,"Ravasaur Trainers"
|
||||
649,-1,"Majordomo Executus"
|
||||
669,-1,"Beast - Carrion Bird"
|
||||
670,-1,"Beast - Cat"
|
||||
671,-1,"Beast - Crab"
|
||||
672,-1,"Beast - Crocilisk"
|
||||
673,-1,"Beast - Hyena"
|
||||
674,-1,"Beast - Owl"
|
||||
675,-1,"Beast - Scorpid"
|
||||
676,-1,"Beast - Tallstrider"
|
||||
677,-1,"Beast - Turtle"
|
||||
678,-1,"Beast - Wind Serpent"
|
||||
679,-1,"Training Dummy"
|
||||
689,-1,"Dragonflight, Black - Bait"
|
||||
709,-1,"Battleground Neutral"
|
||||
729,41,"Frostwolf Clan"
|
||||
730,40,"Stormpike Guard"
|
||||
749,42,"Hydraxian Waterlords"
|
||||
750,-1,"Sulfuron Firelords"
|
||||
769,-1,"Gizlock's Dummy"
|
||||
770,-1,"Gizlock's Charm"
|
||||
771,-1,Gizlock
|
||||
789,-1,Moro'gai
|
||||
790,-1,"Spirit Guide - Alliance"
|
||||
809,44,Shen'dralar
|
||||
829,-1,"Ogre (Captain Kromcrush)"
|
||||
849,-1,"Spirit Guide - Horde"
|
||||
869,-1,Jaedenar
|
||||
889,46,"Warsong Outriders"
|
||||
890,45,"Silverwing Sentinels"
|
||||
891,47,"Alliance Forces"
|
||||
892,48,"Horde Forces"
|
||||
893,-1,"Revantusk Trolls"
|
||||
909,50,"Darkmoon Faire"
|
||||
910,54,"Brood of Nozdormu"
|
||||
911,55,"Silvermoon City"
|
||||
912,-1,"Might of Kalimdor"
|
||||
914,-1,"PLAYER, Blood Elf"
|
||||
915,-1,"Armies of C'Thun"
|
||||
916,-1,"Silithid Attackers"
|
||||
917,-1,"The Ironforge Brigade"
|
||||
918,-1,"RC Enemies"
|
||||
919,-1,"RC Objects"
|
||||
920,-1,Red
|
||||
921,-1,Blue
|
||||
922,56,Tranquillien
|
||||
923,-1,Farstriders
|
||||
924,-1,DEPRECATED
|
||||
925,-1,Sunstriders
|
||||
926,-1,"Magister's Guild"
|
||||
927,-1,"PLAYER, Draenei"
|
||||
928,-1,"Scourge Invaders"
|
||||
929,-1,"Bloodmaul Clan"
|
||||
930,49,Exodar
|
||||
931,-1,"Test Faction (not a real faction)"
|
||||
932,58,"The Aldor"
|
||||
933,60,"The Consortium"
|
||||
934,62,"The Scryers"
|
||||
935,39,"The Sha'tar"
|
||||
936,59,"Shattrath City"
|
||||
937,-1,"Troll, Forest"
|
||||
938,-1,"The Omenai"
|
||||
939,-1,DEPRECATED
|
||||
940,-1,"The Sons of Lothar"
|
||||
941,61,"The Mag'har"
|
||||
942,64,"Cenarion Expedition"
|
||||
943,-1,"Fel Orc"
|
||||
944,-1,"Fel Orc Ghost"
|
||||
945,-1,"Sons of Lothar Ghosts"
|
||||
946,38,"Honor Hold"
|
||||
947,37,Thrallmar
|
||||
948,86,"Test Faction 2"
|
||||
949,85,"Test Faction 1"
|
||||
950,-1,"ToWoW - Flag"
|
||||
951,-1,"ToWoW - Flag Trigger Alliance (DND)"
|
||||
952,87,"Test Faction 3"
|
||||
953,-1,"Test Faction 4"
|
||||
954,-1,"ToWoW - Flag Trigger Horde (DND)"
|
||||
955,-1,Broken
|
||||
956,-1,Ethereum
|
||||
957,-1,"Earth Elemental"
|
||||
958,-1,"Fighting Robots"
|
||||
959,-1,"Actor Good"
|
||||
960,-1,"Actor Evil"
|
||||
961,-1,"Stillpine Furbolg"
|
||||
962,-1,"Crazed Owlkin"
|
||||
963,-1,"Chess Alliance"
|
||||
964,-1,"Chess Horde"
|
||||
965,-1,"Monster Spar"
|
||||
966,-1,"Monster Spar Buddy"
|
||||
967,63,"The Violet Eye"
|
||||
968,-1,Sunhawks
|
||||
969,-1,"Hand of Argus"
|
||||
970,65,Sporeggar
|
||||
971,-1,"Fungal Giant"
|
||||
972,-1,"Spore Bat"
|
||||
973,-1,"Monster, Predator"
|
||||
974,-1,"Monster, Prey"
|
||||
975,-1,"Void Anomaly"
|
||||
976,-1,"Hyjal Defenders"
|
||||
977,-1,"Hyjal Invaders"
|
||||
978,66,Kurenai
|
||||
979,-1,"Earthen Ring"
|
||||
980,43,"The Burning Crusade"
|
||||
981,-1,Arakkoa
|
||||
982,-1,"Zangarmarsh Banner (Alliance)"
|
||||
983,-1,"Zangarmarsh Banner (Horde)"
|
||||
984,-1,"Zangarmarsh Banner (Neutral)"
|
||||
985,-1,"Caverns of Time - Thrall"
|
||||
986,-1,"Caverns of Time - Durnholde"
|
||||
987,-1,"Caverns of Time - Southshore Guards"
|
||||
988,-1,"Shadow Council Covert"
|
||||
989,67,"Keepers of Time"
|
||||
990,57,"The Scale of the Sands"
|
||||
991,-1,"Dark Portal Defender, Alliance"
|
||||
992,-1,"Dark Portal Defender, Horde"
|
||||
993,-1,"Dark Portal Attacker, Legion"
|
||||
994,-1,"Inciter Trigger"
|
||||
995,-1,"Inciter Trigger 2"
|
||||
996,-1,"Inciter Trigger 3"
|
||||
997,-1,"Inciter Trigger 4"
|
||||
998,-1,"Inciter Trigger 5"
|
||||
999,-1,"Mana Creature"
|
||||
1000,-1,"Khadgar's Servant"
|
||||
1001,-1,"Bladespire Clan"
|
||||
1002,-1,"Ethereum Sparbuddy"
|
||||
1003,-1,Protectorate
|
||||
1004,-1,"Arcane Annihilator (DNR)"
|
||||
1005,68,"Friendly, Hidden"
|
||||
1006,-1,"Kirin'Var - Dathric"
|
||||
1007,-1,"Kirin'Var - Belmara"
|
||||
1008,-1,"Kirin'Var - Luminrath"
|
||||
1009,-1,"Kirin'Var - Cohlien"
|
||||
1010,-1,"Servant of Illidan"
|
||||
1011,69,"Lower City"
|
||||
1012,70,"Ashtongue Deathsworn"
|
||||
1013,-1,"Spirits of Shadowmoon 1"
|
||||
1014,-1,"Spirits of Shadowmoon 2"
|
||||
1015,71,Netherwing
|
||||
1016,-1,Wyrmcult
|
||||
1017,-1,Treant
|
||||
1018,-1,"Leotheras Demon I"
|
||||
1019,-1,"Leotheras Demon II"
|
||||
1020,-1,"Leotheras Demon III"
|
||||
1021,-1,"Leotheras Demon IV"
|
||||
1022,-1,"Leotheras Demon V"
|
||||
1023,-1,Azaloth
|
||||
1024,-1,"Rock Flayer"
|
||||
1025,-1,"Flayer Hunter"
|
||||
1026,-1,"Shadowmoon Shade"
|
||||
1027,-1,"Legion Communicator"
|
||||
1028,-1,"Ravenswood Ancients"
|
||||
1029,-1,"Chess, Friendly to All Chess"
|
||||
1030,-1,"Black Temple Gates - Illidari"
|
||||
1031,72,"Sha'tari Skyguard"
|
||||
1032,-1,"Area 52"
|
||||
1033,-1,Maiev
|
||||
1034,-1,"Skettis Shadowy Arakkoa"
|
||||
1035,-1,"Skettis Arakkoa"
|
||||
1036,-1,"Dragonmaw Enemy"
|
||||
1037,88,"Alliance Vanguard"
|
||||
1038,73,"Ogri'la"
|
||||
1039,-1,Ravager
|
||||
1040,-1,REUSE
|
||||
1041,-1,Frenzy
|
||||
1042,-1,"Skyguard Enemy"
|
||||
1043,-1,"Skunk, Petunia"
|
||||
1044,-1,"Theramore Deserter"
|
||||
1045,-1,Vrykul
|
||||
1046,-1,"Northsea Pirates"
|
||||
1047,-1,Tuskarr
|
||||
1048,-1,UNUSED
|
||||
1049,-1,"Troll, Amani"
|
||||
1050,74,"Valiance Expedition"
|
||||
1051,-1,UNUSED
|
||||
1052,75,"Horde Expedition"
|
||||
1053,-1,Westguard
|
||||
1054,-1,"Spotted Gryphon"
|
||||
1055,-1,"Tamed Plaguehound"
|
||||
1056,-1,"Vrykul (Ancient Spirit 1)"
|
||||
1057,-1,"Vrykul (Ancient Siprit 2)"
|
||||
1058,-1,"Vrykul (Ancient Siprit 3)"
|
||||
1059,-1,"CTF - Flag - Alliance"
|
||||
1060,-1,Test
|
||||
1061,-1,vrykul
|
||||
1062,-1,"Vrykul Gladiator"
|
||||
1063,-1,"Valgarde Combatant"
|
||||
1064,76,"The Taunka"
|
||||
1065,-1,"Monster, Zone Force Reaction 1"
|
||||
1066,-1,"Monster, Zone Force Reaction 2"
|
||||
1067,77,"The Hand of Vengeance"
|
||||
1068,78,"Explorers' League"
|
||||
1069,-1,"Ram Racing Powerup DND"
|
||||
1070,-1,"Ram Racing Trap DND"
|
||||
1071,-1,"Craig's Squirrels"
|
||||
1072,-1,REUSE
|
||||
1073,79,"The Kalu'ak"
|
||||
1074,-1,"Holiday - Water Barrel"
|
||||
1075,-1,"Holiday - Generic"
|
||||
1076,-1,"Iron Dwarves"
|
||||
1077,80,"Shattered Sun Offensive"
|
||||
1078,-1,"Fighting Vanity Pet"
|
||||
1079,-1,"Murloc, Winterfin"
|
||||
1080,-1,"Friendly, Force Reaction"
|
||||
1081,-1,"Object, Force Reaction"
|
||||
1082,82,REUSE
|
||||
1083,-1,REUSE
|
||||
1084,-1,"Vrykul, Sea"
|
||||
1085,81,"Warsong Offensive"
|
||||
1086,-1,Poacher
|
||||
1087,-1,"Holiday Monster"
|
||||
1088,-1,"Furbolg, Redfang"
|
||||
1089,-1,"Furbolg, Frostpaw"
|
||||
1090,84,"Kirin Tor"
|
||||
1091,83,"The Wyrmrest Accord"
|
||||
1092,-1,"Azjol-Nerub"
|
||||
1093,-1,REUSE
|
||||
1094,90,"The Silver Covenant"
|
||||
1095,-1,"Grizzly Hills Trapper"
|
||||
1096,-1,REUSE
|
||||
1097,89,"Wrath of the Lich King"
|
||||
1098,91,"Knights of the Ebon Blade"
|
||||
1099,-1,"Wrathgate Scourge"
|
||||
1100,-1,"Wrathgate Alliance"
|
||||
1101,-1,"Wrathgate Horde"
|
||||
1102,-1,"CTF - Flag - Horde"
|
||||
1103,-1,"CTF - Flag - Neutral"
|
||||
1104,92,"Frenzyheart Tribe"
|
||||
1105,93,"The Oracles"
|
||||
1106,94,"Argent Crusade"
|
||||
1107,-1,"Troll, Drakkari"
|
||||
1108,-1,"CoT Arthas"
|
||||
1109,-1,"CoT Stratholme Citizen"
|
||||
1110,-1,"CoT Scourge"
|
||||
1111,-1,Freya
|
||||
1112,-1,"Mount - Taxi - Alliance"
|
||||
1113,-1,"Mount - Taxi - Horde"
|
||||
1114,-1,"Mount - Taxi - Neutral"
|
||||
1115,-1,"Elemental, Water"
|
||||
1116,-1,"Elemental, Air"
|
||||
1117,95,"Sholazar Basin"
|
||||
1118,96,Classic
|
||||
1119,97,"The Sons of Hodir"
|
||||
1120,-1,"Iron Giants"
|
||||
1121,-1,"Frost Vrykul"
|
||||
1122,-1,Earthen
|
||||
1123,-1,"Monster Referee"
|
||||
1124,98,"The Sunreavers"
|
||||
1125,-1,Hyldsmeet
|
||||
1126,99,"The Frostborn"
|
||||
1127,-1,"Orgrimmar (Alex Test)"
|
||||
1136,100,"Tranquillien Conversion"
|
||||
1137,101,"Wintersaber Conversion"
|
||||
1145,-1,"Hates Everything"
|
||||
1154,102,"Silver Covenant Conversion"
|
||||
1155,103,"Sunreavers Conversion"
|
||||
1156,104,"The Ashen Verdict"
|
||||
1159,-1,"CTF - Flag - Alliance 2"
|
||||
1160,-1,"CTF - Flag - Horde 2"
|
||||
|
|
|
@ -154,6 +154,7 @@ export class Armory {
|
|||
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)));
|
||||
app.get("/character/:realm/:name/reputation", this.wrapRoute(charsController.reputation.bind(charsController)));
|
||||
|
||||
const guildsController = new GuildController(this);
|
||||
app.get("/guild/:realm/:name", this.wrapRoute(guildsController.guild.bind(guildsController)));
|
||||
|
|
|
|||
|
|
@ -308,6 +308,111 @@ export class CharacterController {
|
|||
});
|
||||
}
|
||||
|
||||
public async reputation(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) {
|
||||
return next(404);
|
||||
}
|
||||
|
||||
const charData = await this.getCharacterData(realm, charName);
|
||||
if (charData === null) {
|
||||
return next(404);
|
||||
}
|
||||
|
||||
const reputations = await this.getReputations(realm.name, charData.guid);
|
||||
// Group reputations by expansion/category
|
||||
const classicReps = reputations.filter(rep => rep.expansionId === 0);
|
||||
const tbcReps = reputations.filter(rep => rep.expansionId === 1);
|
||||
const wotlkReps = reputations.filter(rep => rep.expansionId === 2);
|
||||
|
||||
res.render("character-reputation.hbs", {
|
||||
title: `Armory - ${charData.name} - Reputation`,
|
||||
...this.makeSharedDataObject(realm, charData),
|
||||
data: {
|
||||
classic: classicReps,
|
||||
tbc: tbcReps,
|
||||
wotlk: wotlkReps
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
private async getReputations(realm: string, character: number): Promise<any[]> {
|
||||
const [rows] = await this.armory.getCharactersDb(realm).query({
|
||||
sql: `
|
||||
SELECT faction, standing, flags
|
||||
FROM character_reputation
|
||||
WHERE guid = ?
|
||||
AND flags NOT IN (0, 4, 8)
|
||||
AND standing != 0
|
||||
`,
|
||||
values: [character],
|
||||
timeout: this.armory.config.dbQueryTimeout,
|
||||
});
|
||||
|
||||
const reputations = [];
|
||||
for (const row of rows as RowDataPacket[]) {
|
||||
const factionInfo = await this.armory.dbc.faction().find(f => f.id === row.faction);
|
||||
if (factionInfo && factionInfo.reputationId >= 0) {
|
||||
reputations.push({
|
||||
id: row.faction,
|
||||
name: factionInfo.name,
|
||||
standing: this.getReputationStanding(row.standing),
|
||||
value: row.standing,
|
||||
valueInGrade: this.getReputationInGrade(row.standing),
|
||||
max: this.getReputationMax(row.standing),
|
||||
expansionId: this.getExpansionId(row.faction)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return reputations;
|
||||
}
|
||||
|
||||
private getReputationStanding(value: number): string {
|
||||
if (value < -6000) return 'Hated'; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < -3000) return 'Hostile'; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < 0) return 'Unfriendly'; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < 1000) return 'Neutral'; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < 6000) return 'Friendly';
|
||||
if (value < 19000) return 'Honored';
|
||||
if (value < 40000) return 'Revered';
|
||||
return 'Exalted'; // These are probably not correct, but I don't have a character to test against
|
||||
}
|
||||
|
||||
private getReputationMax(value: number): number {
|
||||
if (value < -6000) return -6000; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < -3000) return -3000; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < 0) return 0; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < 1000) return 1000; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < 6000) return 6000;
|
||||
if (value < 12000) return 12000;
|
||||
if (value < 21000) return 21000;
|
||||
return 40000; // This might not be right, but I dont have an exalted character to test against
|
||||
}
|
||||
|
||||
private getReputationInGrade(value: number): number {
|
||||
if (value < -6000) return value + 3000; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < -3000) return value; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < 0) return value; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < 1000) return value - 1000; // These are probably not correct, but I don't have a character to test against
|
||||
if (value < 6000) return value - 1000;
|
||||
if (value < 12000) return value - 5900; // For some reason I needed to remove an extra 100 from this one to get it to match the client
|
||||
if (value < 21000) return value - 16900; // For some reason I needed to remove an extra 100 from this one to get it to match the client
|
||||
return value - 21100; // This might not be right, but I dont have an exalted character to test against
|
||||
}
|
||||
|
||||
private getExpansionId(factionId: number): number {
|
||||
// Classic factions
|
||||
if (factionId < 900) return 0;
|
||||
// TBC factions
|
||||
if (factionId < 1100) return 1;
|
||||
// WotLK factions
|
||||
return 2;
|
||||
}
|
||||
|
||||
public async achievements(req: express.Request, res: express.Response, next: express.NextFunction): Promise<void> {
|
||||
const realmName = req.params.realm;
|
||||
const charName = req.params.name;
|
||||
|
|
|
|||
|
|
@ -112,6 +112,12 @@ export interface ITalentTab {
|
|||
classMask: number;
|
||||
}
|
||||
|
||||
export interface IFactionDbc {
|
||||
id: number;
|
||||
reputationId: number;
|
||||
name: string;
|
||||
}
|
||||
|
||||
interface IAsyncGeneratorWithArrayMethods<T> {
|
||||
[Symbol.asyncIterator](): AsyncGenerator<T>;
|
||||
toArray(): Promise<T[]>;
|
||||
|
|
@ -315,6 +321,7 @@ const dir = path.join(process.cwd(), "data");
|
|||
export const DbcFiles = {
|
||||
achievement: path.join(dir, "Achievement_3.3.5_12340.csv"),
|
||||
achievementCategory: path.join(dir, "AchievementCategory_3.3.5_12340.csv"),
|
||||
faction: path.join(dir, "Factions.csv"),
|
||||
glyphProperties: path.join(dir, "GlyphProperties_3.3.5_12340.csv"),
|
||||
item: path.join(dir, "Item_3.3.5_12340.csv"),
|
||||
itemRetail: path.join(dir, "Item_9.2.0_41462.csv"),
|
||||
|
|
@ -360,12 +367,14 @@ const dbcFields = {
|
|||
"prereqRank0",
|
||||
],
|
||||
talentTab: ["id", "nameLang0", "spellIconId", "classMask"],
|
||||
faction: ["id", "reputationId", "name"],
|
||||
};
|
||||
|
||||
export class DbcManager {
|
||||
private _achievement: IAchievement[];
|
||||
private _achievementCategory: IAchievementCategory[];
|
||||
private _glyphProperties: IGlyphProperties[];
|
||||
private _faction: IFactionDbc[];
|
||||
private _item: IItemDbc[];
|
||||
private _itemRetail: IItemRetailDbc[];
|
||||
private _itemAppearance: IItemAppearanceDbc[];
|
||||
|
|
@ -416,6 +425,10 @@ export class DbcManager {
|
|||
return this.getLoadedDataOrRead(DbcFiles.achievementCategory, this._achievementCategory, dbcFields.achievementCategory);
|
||||
}
|
||||
|
||||
public faction() {
|
||||
return this.getLoadedDataOrRead(DbcFiles.faction, this._faction, dbcFields.faction);
|
||||
}
|
||||
|
||||
public glyphProperties() {
|
||||
return this.getLoadedDataOrRead(DbcFiles.glyphProperties, this._glyphProperties, dbcFields.glyphProperties);
|
||||
}
|
||||
|
|
|
|||
82
static/character-reputation.hbs
Normal file
82
static/character-reputation.hbs
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
<link rel="stylesheet" type="text/css" href="{{websiteRoot}}/css/character-reputation.css">
|
||||
{{> icons }}
|
||||
<script type="application/javascript">
|
||||
const aowow_tooltips = { "renamelinks": true, };
|
||||
</script>
|
||||
|
||||
{{> character-header }}
|
||||
|
||||
<div class="reputation-table" style="margin-bottom: 20px;">
|
||||
<h2 class="is-size-4">Classic Reputations</h2>
|
||||
<table class="table is-striped is-hoverable is-fullwidth">
|
||||
<tbody>
|
||||
{{#each data.classic}}
|
||||
<tr>
|
||||
<!-- Faction ID: {{this.id}} -->
|
||||
<td>
|
||||
<div class="reputation-row">
|
||||
<span class="faction-name">{{this.name}}</span>
|
||||
<div class="progress-section">
|
||||
<div class="progress-bar-container">
|
||||
<div class="progress-bar {{this.standing}}" style="width: {{multiply (divide this.valueInGrade this.max) 100}}%;"></div>
|
||||
<span class="standing-text">{{this.standing}}</span>
|
||||
<span class="value-text">{{this.valueInGrade}} / {{this.max}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="reputation-table" style="margin-bottom: 20px;">
|
||||
<h2 class="is-size-4">The Burning Crusade</h2>
|
||||
<table class="table is-striped is-hoverable is-fullwidth">
|
||||
<tbody>
|
||||
{{#each data.tbc}}
|
||||
<tr>
|
||||
<!-- Faction ID: {{this.id}} -->
|
||||
<td>
|
||||
<div class="reputation-row">
|
||||
<span class="faction-name">{{this.name}}</span>
|
||||
<div class="progress-section">
|
||||
<div class="progress-bar-container">
|
||||
<div class="progress-bar {{this.standing}}" style="width: {{multiply (divide this.valueInGrade this.max) 100}}%;"></div>
|
||||
<span class="standing-text">{{this.standing}}</span>
|
||||
<span class="value-text">{{this.valueInGrade}} / {{this.max}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="reputation-table" style="margin-bottom: 20px;">
|
||||
<h2 class="is-size-4">Wrath of the Lich King</h2>
|
||||
<table class="table is-striped is-hoverable is-fullwidth">
|
||||
<tbody>
|
||||
{{#each data.wotlk}}
|
||||
<tr>
|
||||
<!-- Faction ID: {{this.id}} -->
|
||||
<td>
|
||||
<div class="reputation-row">
|
||||
<span class="faction-name">{{this.name}}</span>
|
||||
<div class="progress-section">
|
||||
<div class="progress-bar-container">
|
||||
<div class="progress-bar {{this.standing}}" style="width: {{multiply (divide this.valueInGrade this.max) 100}}%;"></div>
|
||||
<span class="standing-text">{{this.standing}}</span>
|
||||
<span class="value-text">{{this.valueInGrade}} / {{this.max}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{{/each}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
108
static/css/character-reputation.css
Normal file
108
static/css/character-reputation.css
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
.reputation-table {
|
||||
max-width: 500px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.reputation-table h2 {
|
||||
color: #FFD700; /* Gold color for section titles */
|
||||
}
|
||||
|
||||
.reputation-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.faction-name {
|
||||
min-width: 150px;
|
||||
font-weight: bold;
|
||||
color: white; /* White color for faction names */
|
||||
}
|
||||
|
||||
.progress-section {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.progress-bar-container {
|
||||
flex: 1;
|
||||
background-color: #020018;
|
||||
border-radius: 5px;
|
||||
overflow: hidden;
|
||||
height: 20px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.progress-bar-container:hover .standing-text {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.progress-bar-container:hover .value-text {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.progress-bar {
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
/* Reputation colors */
|
||||
.progress-bar.Neutral {
|
||||
background-color: #B8A44A; /* More muted yellow */
|
||||
}
|
||||
|
||||
.progress-bar.Friendly,
|
||||
.progress-bar.Honored,
|
||||
.progress-bar.Revered,
|
||||
.progress-bar.Exalted {
|
||||
background-color: #4CAF50; /* More muted green */
|
||||
}
|
||||
|
||||
.progress-bar.Hostile,
|
||||
.progress-bar.Hated {
|
||||
background-color: #D32F2F; /* More muted red */
|
||||
}
|
||||
|
||||
.progress-text {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 10px;
|
||||
transform: translateY(-50%);
|
||||
z-index: 2;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.standing-text {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
z-index: 2;
|
||||
color: white;
|
||||
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.7);
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.value-text {
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
z-index: 2;
|
||||
color: white;
|
||||
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.7);
|
||||
font-size: 12px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.gold-text {
|
||||
color: #FFD700;
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@
|
|||
<a href="{{websiteRoot}}/character/{{realm}}/{{name}}">Character</a> 
|
||||
<a href="{{websiteRoot}}/character/{{realm}}/{{name}}/talents">Talents</a> 
|
||||
<a href="{{websiteRoot}}/character/{{realm}}/{{name}}/skills">Skills</a> 
|
||||
<a href="{{websiteRoot}}/character/{{realm}}/{{name}}/reputation">Reputation</a> 
|
||||
<a href="{{websiteRoot}}/character/{{realm}}/{{name}}/achievements">Achievements</a> 
|
||||
<a href="{{websiteRoot}}/character/{{realm}}/{{name}}/pvp">PvP</a> 
|
||||
<br>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue