Skip to content
Merged

Deploy #1726

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
40 changes: 39 additions & 1 deletion apps/backend/Helpers/UserUploadCharacterProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1455,7 +1455,27 @@ private void HandleWeekly()
_character.Weekly.Vault.RaidProgress = null;
_character.Weekly.Vault.WorldProgress = null;

if (_characterData.Vault != null)
if (_characterData.VaultV2 != null)
{
if (_characterData.VaultV2.TryGetValue("t1", out var activityVault))
{
_character.Weekly.Vault.MythicPlusActivities = ConvertVaultActivities(activityVault.Activities);
_character.Weekly.Vault.MythicPlusProgress = ConvertVault(activityVault.Tiers);
}

if (_characterData.VaultV2.TryGetValue("t3", out var raidVault))
{
_character.Weekly.Vault.RaidActivities = ConvertVaultActivities(raidVault.Activities);
_character.Weekly.Vault.RaidProgress = ConvertVault(raidVault.Tiers);
}

if (_characterData.VaultV2.TryGetValue("t6", out var worldVault))
{
_character.Weekly.Vault.WorldActivities = ConvertVaultActivities(worldVault.Activities);
_character.Weekly.Vault.WorldProgress = ConvertVault(worldVault.Tiers);
}
}
else if (_characterData.Vault != null)
{
if (_characterData.Vault.TryGetValue("t1", out var activityVault))
{
Expand Down Expand Up @@ -1508,6 +1528,24 @@ private static List<PlayerCharacterWeeklyVaultProgress> ConvertVault(UploadChara
return ret;
}

private List<PlayerCharacterWeeklyVaultActivity> ConvertVaultActivities(string[] activityStrings)
{
var ret = new List<PlayerCharacterWeeklyVaultActivity>();

foreach (string activityString in activityStrings.EmptyIfNull())
{
string[] parts = activityString.Split(':');
if (parts.Length == 3 &&
int.TryParse(parts[0], out int tierId) &&
int.TryParse(parts[1], out int difficulty) &&
int.TryParse(parts[2], out int progress))
{
ret.Add(new PlayerCharacterWeeklyVaultActivity(tierId, difficulty, progress));
}
}

return ret;
}
}

public record struct WorldQuestReportKey(short Expansion, int ZoneId, int QuestId, short Faction, short Class);
Expand Down
3 changes: 3 additions & 0 deletions apps/backend/Models/Uploads/UploadCharacter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ public class UploadCharacter

[JsonConverter(typeof(DefaultOnErrorConverter<Dictionary<string, UploadCharacterVault[]>>))]
public Dictionary<string, UploadCharacterVault[]> Vault { get; set; }

[JsonConverter(typeof(DefaultOnErrorConverter<Dictionary<string, UploadCharacterVaultV2>>))]
public Dictionary<string, UploadCharacterVaultV2> VaultV2 { get; set; }
}

public class UploadCharacterAchievement
Expand Down
6 changes: 6 additions & 0 deletions apps/backend/Models/Uploads/UploadCharacterVault.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,9 @@ public class UploadCharacterVault

public List<string> Rewards { get; set; }
}

public class UploadCharacterVaultV2
{
public string[] Activities { get; set; }
public UploadCharacterVault[] Tiers { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
<td
class="sortable sorted-{getSortState(fullTaskName)} {customExpiry || ''}"
data-task={taskName}
style:--scale="0.9"
onclick={() => setSortState(fullTaskName)}
use:componentTooltip={{
component: Tooltip,
Expand All @@ -60,7 +61,7 @@
>
{#if chore}
{#if chore.icon}
<IconifyWrapper icon={chore.icon} scale="0.9" />
<IconifyWrapper icon={chore.icon} />
{/if}
{:else}
<ParsedText text={task.shortName} />
Expand Down
8 changes: 4 additions & 4 deletions apps/frontend/components/items/convertible/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,31 +13,31 @@ export const modifierToTier: Record<number, number> = {
export const currentUpgrade1: ConvertibleCategoryUpgrade[] = [
{
upgradeId: 3341,
upgradeCost: 15,
upgradeCost: 20,
achievementId: 42767, // Veteran of the Dawn
achievementUpgradeCost: 10,
},
];
export const currentUpgrade2: ConvertibleCategoryUpgrade[] = [
{
upgradeId: 3343,
upgradeCost: 15,
upgradeCost: 20,
achievementId: 42768, // Champion of the Dawn
achievementUpgradeCost: 10,
},
];
export const currentUpgrade3: ConvertibleCategoryUpgrade[] = [
{
upgradeId: 3345,
upgradeCost: 15,
upgradeCost: 20,
achievementId: 42769, // Hero of the Dawn
achievementUpgradeCost: 10,
},
];
export const currentUpgrade4: ConvertibleCategoryUpgrade[] = [
{
upgradeId: 3347,
upgradeCost: 15,
upgradeCost: 20,
achievementId: 42770, // Myth of the Dawn
achievementUpgradeCost: 10,
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,53 +6,75 @@
import { leftPad } from '@/utils/formatting';
import { getNextWeeklyResetFromTime } from '@/utils/get-next-reset';
import { getWorldTier } from '@/utils/vault/get-world-tier';
import type { Character } from '@/types';
import type { CharacterProps } from '@/types/props';

import Progress from './Progress.svelte';
import Rewards from './Rewards.svelte';

export let character: Character;
let { character }: CharacterProps = $props();

$: progress = character.weekly?.vault?.worldProgress || [];
let progress = $derived(character.weekly?.vault?.worldProgress || []);

let improve = $derived.by(() => {
const ret: [string, number, number][] = [];

let improve: [string, number, number][];
$: {
const [currentItemLevel] = getWorldTier(progress[0].level);
const betterOptions = worldVaultItemLevel.filter(
([, itemLevel]) => itemLevel > currentItemLevel,
([, itemLevel]) => itemLevel > currentItemLevel
);
improve = [];
for (let i = betterOptions.length - 1; i >= 0; i--) {
const [betterTier, betterItemLevel, quality] = betterOptions[i];
let tierRange = betterTier.toString();
if (betterOptions[i - 1] && betterOptions[i - 1][0] - betterTier > 1) {
tierRange = `${betterTier} - ${betterOptions[i - 1][0] - 1}`;
}

improve.push([tierRange, betterItemLevel, quality]);
if (improve.length === 3) {
ret.push([tierRange, betterItemLevel, quality]);
if (ret.length === 3) {
break;
}
}
}

let runs: [number, string][];
$: {
runs = [];
if (character.weekly?.delves) {
return ret;
});

let runs = $derived.by(() => {
let ret: [number, string][] = [];

if (character.weekly?.vault?.worldActivities?.length > 0) {
for (const activity of character.weekly.vault.worldActivities) {
for (let i = 0; i < activity.amount; i++) {
ret.push([
activity.level,
activityTier[activity.tierId] || `Tier ${activity.tierId}`,
]);
}
}
} else if (character.weekly?.delves) {
const nextReset = getNextWeeklyResetFromTime(
$timeStore,
character.realm.region,
character.realm.region
).toUnixInteger();

if (Math.abs(character.weekly.delveWeek - nextReset) < 5) {
runs = sortBy(character.weekly.delves, ([level]) => leftPad(11 - level, 2, '0'));
ret = sortBy(character.weekly.delves, ([level]) => leftPad(11 - level, 2, '0'));
}

for (let i = runs.length; i < progress[2].progress; i++) {
runs.push([1, 'Activities/Delves']);
for (let i = ret.length; i < progress[2].progress; i++) {
ret.push([1, 'Activities/Delves']);
}
}
}

return ret;
});

const activityTier: Record<number, string> = {
104: 'World Activity',
105: 'Delve',
112: 'Normal Prey',
115: 'Hard Prey',
116: 'Nightmare Prey',
};

function getRunCount(index: number): number {
if (progress[index]) {
Expand Down
8 changes: 4 additions & 4 deletions apps/frontend/data/tasks/11-midnight/prey.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export const midPrey: Task = {
{
key: 'preyNormal',
name: 'Normal - {item:257023}',
icon: iconLibrary.notoClownFace,
icon: iconLibrary.mdiDog,
alwaysStarted: true,
questCount: 2,
questReset: DbResetType.Weekly,
Expand All @@ -53,7 +53,7 @@ export const midPrey: Task = {
{
key: 'preyHard',
name: 'Hard - {item:257026}',
icon: iconLibrary.notoCowboyHatFace,
icon: iconLibrary.gameBearFace,
minimumLevel: 90,
alwaysStarted: true,
questCount: 2,
Expand All @@ -68,7 +68,7 @@ export const midPrey: Task = {
{
key: 'preyNightmare',
name: 'Nightmare - {item:262346}',
icon: iconLibrary.notoAngryFaceWithHorns,
icon: iconLibrary.gameCrownedSkull,
minimumLevel: 90,
alwaysStarted: true,
questCount: 2,
Expand All @@ -83,7 +83,7 @@ export const midPrey: Task = {
{
key: 'preyNightmarishTask',
name: 'A Nightmarish Task',
icon: iconLibrary.notoV1AngryFaceWithHorns,
icon: iconLibrary.fluentAngryFaceWithHorns,
minimumLevel: 90,
questReset: DbResetType.Weekly,
questIds: [94446],
Expand Down
19 changes: 11 additions & 8 deletions apps/frontend/shared/components/images/IconifyWrapper.svelte
Original file line number Diff line number Diff line change
@@ -1,17 +1,26 @@
<script lang="ts">
import { iconScale } from '@/shared/icons/scale';
import type { Icon } from '@/types/icons';

type Props = {
icon: Icon;
cls?: string;
dropShadow?: boolean;
onclick?: (e: Event) => void;
scale?: string;
tooltip?: string;
onclick?: (e: Event) => void;
};
let { icon, cls, dropShadow, onclick, scale, tooltip }: Props = $props();

let IconComponent = $derived(icon);

// we can't get the FILENAME symbol from Svelte internals, boo
let filename = $derived.by(() => {
const symbols = Object.getOwnPropertySymbols(icon);
// @ts-expect-error fixing the typing for this is awful
return icon[symbols.find((sym) => sym.description === 'filename')];
});
let derivedScale = $derived(scale || iconScale[filename]);
</script>

<style lang="scss">
Expand All @@ -21,18 +30,12 @@
transform: scale(var(--scale, 1));
}
}
svg {
height: 24px;
margin-top: var(--image-margin-top, 0);
width: 24px;
transform: scale(var(--scale, 1));
}
</style>

<span
class={cls}
class:drop-shadow-single={dropShadow}
style:--scale={scale}
style:--scale={derivedScale}
data-tooltip={tooltip}
>
<IconComponent {onclick} />
Expand Down
6 changes: 6 additions & 0 deletions apps/frontend/shared/icons/library.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@ export { default as emojiZzz } from '~icons/emojione-monotone/zzz';

export { default as faDungeon } from '~icons/fa-solid/dungeon';

export { default as fluentAngryFaceWithHorns } from '~icons/fluent-emoji-high-contrast/angry-face-with-horns';

export { default as gameAnimalHide } from '~icons/game-icons/animal-hide';
export { default as gameAnvil } from '~icons/game-icons/anvil';
export { default as gameBabyFace } from '~icons/game-icons/baby-face';
export { default as gameBackpack } from '~icons/game-icons/backpack';
export { default as gameBarbecue } from '~icons/game-icons/barbecue';
export { default as gameBarbute } from '~icons/game-icons/barbute';
Expand All @@ -17,6 +20,7 @@ export { default as gameBeamsAura } from '~icons/game-icons/beams-aura';
export { default as gameBearFace } from '~icons/game-icons/bear-face';
export { default as gameBeltArmor } from '~icons/game-icons/belt-armor';
export { default as gameBigDiamondRing } from '~icons/game-icons/big-diamond-ring';
export { default as gameBladeBite } from '~icons/game-icons/blade-bite';
export { default as gameBlunderbuss } from '~icons/game-icons/blunderbuss';
export { default as gameBracer } from '~icons/game-icons/bracer';
export { default as gameBrassKnuckles } from '~icons/game-icons/brass-knuckles';
Expand Down Expand Up @@ -53,6 +57,7 @@ export { default as gameHeartPlus } from '~icons/game-icons/heart-plus';
export { default as gameHouse } from '~icons/game-icons/house';
export { default as gameJigsawBox } from '~icons/game-icons/jigsaw-box';
export { default as gameKnapsack } from '~icons/game-icons/knapsack';
export { default as gameLabradorHead } from '~icons/game-icons/labrador-head';
export { default as gameLockedFortress } from '~icons/game-icons/locked-fortress';
export { default as gameMetalBoot } from '~icons/game-icons/metal-boot';
export { default as gameNightSky } from '~icons/game-icons/night-sky';
Expand Down Expand Up @@ -124,6 +129,7 @@ export { default as mdiCloud } from '~icons/mdi/cloud';
export { default as mdiCogOutline } from '~icons/mdi/cog-outline';
export { default as mdiCurrencyUsd } from '~icons/mdi/currency-usd';
export { default as mdiDiceMultiple } from '~icons/mdi/dice-multiple';
export { default as mdiDog } from '~icons/mdi/dog';
export { default as mdiDuck } from '~icons/mdi/duck';
export { default as mdiEmoticonDevilOutline } from '~icons/mdi/emoticon-devil-outline';
export { default as mdiExclamationThick } from '~icons/mdi/exclamation-thick';
Expand Down
6 changes: 6 additions & 0 deletions apps/frontend/shared/icons/scale.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// icon path => scale value
export const iconScale: Record<string, string> = {
'~icons/mdi/dog.svelte': '1.4',
'~icons/game-icons/bear-face.svelte': '1.2',
'~icons/game-icons/crowned-skull.svelte': '1.2',
};
Loading
Loading