diff --git a/README.md b/README.md
index 1c1b1b110..329d658aa 100644
--- a/README.md
+++ b/README.md
@@ -61,7 +61,7 @@ any help with getting started, I'm available most days.
1. Install Docker and Docker Compose - [Windows install instructions](https://docs.docker.com/docker-for-windows/install/)
-1. Install the dotnet SDK, currently 8.x
+1. Install the dotnet SDK, currently 9.x
1. Log in or sign up for a [Battle.Net Developer](https://develop.battle.net) account
@@ -119,7 +119,7 @@ any help with getting started, I'm available most days.
1. Start the initial data import/build, this will take a while:
```bash
- cd app/tool/
+ cd apps/tool/
dotnet run all
```
diff --git a/apps/frontend/components/tooltips/character-filter/TooltipCharacterFilter.svelte b/apps/frontend/components/tooltips/character-filter/TooltipCharacterFilter.svelte
index 30c37b930..f173eeb87 100644
--- a/apps/frontend/components/tooltips/character-filter/TooltipCharacterFilter.svelte
+++ b/apps/frontend/components/tooltips/character-filter/TooltipCharacterFilter.svelte
@@ -48,6 +48,11 @@
level=60 | <=,<,=,>,>=
+
seen<=7 | <=,<,=,>,>=
+ ilevel>=400 | <=,<,=,>,>=
diff --git a/apps/frontend/user-home/components/settings/sections/views/Sorting.svelte b/apps/frontend/user-home/components/settings/sections/views/Sorting.svelte
index 221d20921..1143caed4 100644
--- a/apps/frontend/user-home/components/settings/sections/views/Sorting.svelte
+++ b/apps/frontend/user-home/components/settings/sections/views/Sorting.svelte
@@ -23,6 +23,7 @@
{ id: 'gold', name: 'Gold' },
{ id: 'itemlevel', name: 'Item level' },
{ id: 'level', name: 'Level' },
+ { id: 'seen', name: 'Last seen' },
];
let sortByChoices: SettingsChoice[] = $derived([
diff --git a/apps/frontend/utils/characters/use-character-filter.ts b/apps/frontend/utils/characters/use-character-filter.ts
index 45172aff8..f9566ddd4 100644
--- a/apps/frontend/utils/characters/use-character-filter.ts
+++ b/apps/frontend/utils/characters/use-character-filter.ts
@@ -61,6 +61,19 @@ export function useCharacterFilter(
);
}
+ // Last seen (in days)
+ match = part.match(/^seen(<|<=|=|>=|>)(\d+)$/);
+ if (match) {
+ const now = Math.floor(Date.now() / 1000);
+ const days = parseInt(match[2]);
+ const diff = (now - char.lastSeenAddonUnix) / 86400;
+ return compareValues(
+ match[1].toString(),
+ diff,
+ days
+ );
+ }
+
// Item level
match = part.match(/^(itemlevel|ilevel|ilvl)(<|<=|=|>=|>)(\d+)$/);
if (match) {
diff --git a/apps/frontend/utils/get-character-sort-func.ts b/apps/frontend/utils/get-character-sort-func.ts
index 8346887e8..a61823aac 100644
--- a/apps/frontend/utils/get-character-sort-func.ts
+++ b/apps/frontend/utils/get-character-sort-func.ts
@@ -86,6 +86,8 @@ export const getCharacterSortFunc = (prefixFunc?: SortValueFunction, viewSortBy?
'0'
)
);
+ } else if (thing === 'seen') {
+ out.push(leftPad(2000000000 - char.lastSeenAddonUnix, 10, '0'));
} else if (thing === 'level') {
// in descending order
const levelData = getCharacterLevel(char);