Skip to content
Merged

Deploy #1817

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 49 additions & 22 deletions apps/backend/Jobs/User/UserUploadJob.cs
Original file line number Diff line number Diff line change
Expand Up @@ -443,7 +443,12 @@ private async Task Process(string luaData) {
// Reputations
try
{
await HandleAccountReputations(accountAddonData, parsed.ScanTimes.EmptyIfNull(), parsed.Reputations);
await HandleAccountReputations(
accountAddonData,
parsed.ScanTimes.EmptyIfNull(),
parsed.Paragons,
parsed.Reputations
);
}
catch (Exception ex)
{
Expand Down Expand Up @@ -718,37 +723,59 @@ private async Task HandleBattlePets(int accountId, Dictionary<long, string> pars
private async Task HandleAccountReputations(
PlayerAccountAddonData accountAddonData,
Dictionary<string, int> globalScanTimes,
Dictionary<int, string> paragons,
List<string> reputations
) {
var localContext = Context;

if (globalScanTimes.TryGetValue("reputations", out int reputationsTimestamp))
if (!globalScanTimes.TryGetValue("reputations", out int reputationsTimestamp))
{
var reputationsScannedAt = reputationsTimestamp.AsUtcDateTime();
if (reputationsScannedAt > accountAddonData.ReputationsScannedAt)
{
accountAddonData.ReputationsScannedAt = reputationsScannedAt;
accountAddonData.Reputations ??= new();
return;
}

foreach (string repString in reputations)
{
string[] parts = repString.Split(":");
if (parts.Length == 2 &&
int.TryParse(parts[0], out int factionId) &&
int.TryParse(parts[1], out int value))
{
accountAddonData.Reputations[factionId] = value;
}
}
var reputationsScannedAt = reputationsTimestamp.AsUtcDateTime();
if (reputationsScannedAt <= accountAddonData.ReputationsScannedAt)
{
return;
}

// Change detection for this is obnoxious, just update it
localContext.Entry(accountAddonData)
.Property(aad => aad.Reputations)
.IsModified = true;
accountAddonData.ReputationsScannedAt = reputationsScannedAt;

await localContext.SaveChangesAsync(CancellationToken);
accountAddonData.Paragons ??= new();
foreach ((int factionId, string paragonString) in paragons.EmptyIfNull())
{
string[] parts = paragonString.Split(':');
if (parts.Length >= 2 &&
long.TryParse(parts[0], out long totalRep) &&
int.TryParse(parts[1], out int perLevel))
{
int count = (int)(totalRep / perLevel);
int remainder = (int)(totalRep % perLevel);
accountAddonData.Paragons[factionId] = [count, perLevel, remainder];
}
}

accountAddonData.Reputations ??= new();
foreach (string repString in reputations.EmptyIfNull())
{
string[] parts = repString.Split(":");
if (parts.Length == 2 &&
int.TryParse(parts[0], out int factionId) &&
int.TryParse(parts[1], out int value))
{
accountAddonData.Reputations[factionId] = value;
}
}

// Change detection for this is obnoxious, just update it
localContext.Entry(accountAddonData)
.Property(aad => aad.Paragons)
.IsModified = true;
localContext.Entry(accountAddonData)
.Property(aad => aad.Reputations)
.IsModified = true;

await localContext.SaveChangesAsync(CancellationToken);
}

private async Task HandleDecor(PlayerAccountAddonData accountAddonData, Dictionary<string, int> globalScanTimes, Dictionary<int, string> decorData)
Expand Down
1 change: 1 addition & 0 deletions apps/backend/Models/Uploads/Upload.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class Upload
public Dictionary<int, string> Decor { get; set; }
public List<string> Delves { get; set; }
public List<int> Illusions { get; set; }
public Dictionary<int, string> Paragons { get; set; }
public List<int> Quests { get; set; }
public Dictionary<int, int> QuestsV2 { get; set; }
public List<string> Reputations { get; set; }
Expand Down
2 changes: 1 addition & 1 deletion apps/frontend/components/tooltips/reputation/hacks.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export function nazjatarHack(levelString: string): number {
const level = parseInt(levelString.split(' ').at(-1));
return level === 30 ? 0 : 6 - Math.max(0, Math.floor(level / 5));
return level === 30 ? 1 : 4 - Math.floor(level / 10);
}

export function brannHack(levelString: string): number {
Expand Down
2 changes: 1 addition & 1 deletion apps/frontend/data/tasks/11-midnight/12-0.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ export const midChores12_0: Task = {
key: 'midHopeUnity',
name: 'Hope/Unity',
icon: aliasedIcons.planet,
questReset: DbResetType.Weekly,
questReset: DbResetType.Custom,
showQuestName: true,
sumObjectives: true,
customExpiryFunc: (char, scannedAt) => customResetPeriod(char, scannedAt, 1079, 2),
Expand Down
26 changes: 25 additions & 1 deletion apps/frontend/types/user-data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ import { DateTime } from 'luxon';
import parseApiTime from '@/utils/parse-api-time';

import type { Account } from './account';
import type { Character, CharacterArray, CharacterLockout } from './character';
import type {
Character,
CharacterArray,
CharacterLockout,
CharacterReputationParagon,
} from './character';
import type { InstanceDifficulty } from './dungeon';
import type { Guild, GuildArray } from './guild';
import type { HasNameAndRealm, UserItem } from './shared';
Expand All @@ -23,6 +28,7 @@ export interface UserData {
guildsRaw: GuildArray[];
heirlooms: Record<number, number>;
illusionIds: number[];
paragons: Record<number, UserDataParagonArray>;
raiderIoScoreTiers: Record<number, UserDataRaiderIoScoreTiers>;
reputations: Record<number, number>;
warbankItems: WarbankItem[];
Expand Down Expand Up @@ -112,6 +118,24 @@ export class UserDataCurrentPeriod {
}
}

export class UserDataParagon {
constructor(
public count: number,
public perLevel: number,
public value: number
) {}

get asCharacterReputationParagon(): CharacterReputationParagon {
return {
rewardAvailable: false,
current: this.value,
max: this.perLevel,
received: this.count,
};
}
}
export type UserDataParagonArray = ConstructorParameters<typeof UserDataParagon>;

export class UserDataPet {
constructor(
public level: number,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@
</div>
</div>

{#if renownMax && renownCurrent === renownMax && characterParagon}
{#if characterParagon && ((renownMax && renownCurrent === renownMax) || repTier?.tier === 1)}
<ProgressBar
title="Paragon"
have={characterParagon.current}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,10 @@ export function getRenownData({
ret.renownCurrent = repValue / (ret.dataRep.maxValues[0] || 2500);
ret.cls = `quality${1 + Math.floor(ret.renownCurrent / (ret.renownMax / 4))}`;

ret.characterParagon = actualCharacter.paragons?.[ret.characterRep.reputationId];
ret.characterParagon = ret.dataRep.accountWide
? userState.general.paragons[ret.characterRep.reputationId]
?.asCharacterReputationParagon
: actualCharacter.paragons?.[ret.characterRep.reputationId];

let tier = ret.renownCurrent;
if (ret.characterParagon) {
Expand Down Expand Up @@ -127,20 +130,16 @@ export function getRenownData({
ret.renownLevel = `${ret.repTier.percent}%`;

if (ret.dataRep.paragonId) {
ret.characterParagon = actualCharacter.paragons?.[ret.dataRep.id];
ret.characterParagon = ret.dataRep.accountWide
? userState.general.paragons[ret.characterRep.reputationId]
?.asCharacterReputationParagon
: actualCharacter.paragons?.[ret.dataRep.id];
if (ret.repTier.tier === 1) {
ret.cls = 'reputation0 reputation0-border';
}
}
}
}

if (
(ret.dataRep?.id >= 2375 && ret.dataRep?.id <= 2377) ||
(ret.dataRep?.id >= 2388 && ret.dataRep?.id < 2390)
) {
console.log(ret);
}

return ret;
}
9 changes: 9 additions & 0 deletions apps/frontend/user-home/state/user/general.svelte.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
Character,
Guild,
UserDataCurrentPeriod,
UserDataParagon,
UserDataPet,
type Account,
type CharacterLockout,
Expand Down Expand Up @@ -52,6 +53,7 @@ export class DataUserGeneral {
public currentPeriod: Record<number, UserDataCurrentPeriod> = $state({});
public decor: Record<number, [number, number]> = $state({});
public guildById: Record<number, Guild> = $state({});
public paragons: Record<number, UserDataParagon> = $state({});
public petsById: Record<number, UserDataPet[]> = $state({});
public reputations: Record<number, number> = $state({});
public warbankItems: WarbankItem[] = $state([]);
Expand Down Expand Up @@ -211,6 +213,13 @@ export class DataUserGeneral {
.filter(([, [a, b]]) => a + b > 0)
.map(([decorId]) => decorId)
);

this.paragons = Object.fromEntries(
getNumberKeyedEntries(userData.paragons || {}).map(([factionId, paragonArray]) => [
factionId,
new UserDataParagon(...paragonArray),
])
);
this.reputations = cloneDeep(userData.reputations || {});

this.honorCurrent = userData.honorCurrent;
Expand Down
9 changes: 8 additions & 1 deletion apps/web/Controllers/ApiController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -451,13 +451,19 @@ await _cacheService.CreateOrUpdateTransmogCacheAsync(
timer.AddPoint("RaiderIO");

// Reputations
var paragons = new Dictionary<int, List<int>>();
var reputations = new Dictionary<int, int>();
var repAccounts = accounts
.Where(account => account.AddonData?.Reputations != null)
.OrderBy(account => account.AddonData.ReputationsScannedAt);
foreach (var account in repAccounts)
{
foreach ((int factionId, int value) in account.AddonData.Reputations)
foreach ((int factionId, var values) in account.AddonData.Paragons.EmptyIfNull())
{
paragons[factionId] = values;
}

foreach ((int factionId, int value) in account.AddonData.Reputations.EmptyIfNull())
{
reputations[factionId] = value;
}
Expand Down Expand Up @@ -528,6 +534,7 @@ await _cacheService.CreateOrUpdateTransmogCacheAsync(
HonorLevel = maxHonorAccount?.AddonData?.HonorLevel ?? 0,
HonorMax = maxHonorAccount?.AddonData?.HonorMax ?? 0,
Images = images,
Paragons = paragons,
Public = apiResult.Public,
RaiderIoScoreTiers = raiderIoScoreTiers,
Reputations = reputations,
Expand Down
1 change: 1 addition & 0 deletions apps/web/Models/Api/User/ApiUser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public class ApiUser
public Dictionary<string, GlobalDailies> GlobalDailies { get; set; }
public Dictionary<int, int> Heirlooms { get; set; }
public Dictionary<string, string> Images { get; set; }
public Dictionary<int, List<int>> Paragons { get; set; }
public Dictionary<int, RedisRaiderIoScoreTiers> RaiderIoScoreTiers { get; set; }
public Dictionary<int, int> Reputations { get; set; }

Expand Down
Loading
Loading