Compare commits

...

6 Commits

Author SHA1 Message Date
Kvan7
1245ef96d6 Fixes error and adds basic price check (#37)
* bump for updating branding

* Bugfix/testing-potential-fix (#31)

* removes the problem

* sdfhgdf

* change to no-referrer-when-downgrade

* Start of fixes for price check (#36)

* feat: Adds new trade web api

Adds types for trade api

* fix lint

* push edits

* Add basic items to items.ndjson

* Added images from old items files

* Fix armor values

* WOOO

* bump version
2024-12-13 00:07:53 -06:00
Kvan7
ab93c8b96a Update issue templates 2024-12-12 21:31:36 -06:00
Kvan7
ab7cb30588 Update issue templates 2024-12-12 21:28:23 -06:00
kvan7
f7d686291f Add release steps to DEVELOPING 2024-12-12 07:10:08 -06:00
kvan7
4b8e2ae8cf bump to prove im not (completely) insane 2024-12-12 06:20:22 -06:00
Kvan7
3450f39381 Update README.md 2024-12-11 21:08:34 -06:00
24 changed files with 7369 additions and 10492 deletions

View File

@@ -0,0 +1,21 @@
---
name: An error occurred while parsing the item
about: This is probably a bug and you can report it on GitHub.
title: "[Parse Error] - item name here"
labels: bug, parse error
assignees: ''
---
## Parse Error
***Put name of item here, and in the title***
### Item Text
***Please provide the item's description***
- Can be copied with `ctrl`+`shift`+`c`
- Can also be copied from below the error message
```
Please paste it HERE
```

View File

@@ -1,7 +1,7 @@
---
name: Something Broken in PoE2
about: Use this for things that worked in PoE 1 and do not in PoE 2
title: "[PoE2]"
title: "[PoE2] - Summary"
labels: bug
assignees: Kvan7

22
.github/ISSUE_TEMPLATE/unknown-item.md vendored Normal file
View File

@@ -0,0 +1,22 @@
---
name: Unknown Item
about: If this Item was introduced in this League, it will likely be supported in
the next app update.
title: "[Unknown Item] - item name here"
labels: bug, missing item
assignees: ''
---
## Unknown Item
***Put name of item here, and in the title***
### Item Text
***Please provide the item's description***
- Can be copied with `ctrl`+`shift`+`c`
- Can also be copied from below the error message
```
Please paste it HERE
```

View File

@@ -41,3 +41,15 @@ npm run build
# install without errors
CSC_NAME="Certificate name in Keychain" yarn package
```
# How to release a build
1. Commit all changes
2. Bump version in `main/package.json`
3. `npm i` in renderer & main (update `package-lock.json` with new version)
4. `npm run build` in renderer & main
5. Stage & commit bumped version
6. `git push`
7. `git tag vX.X.X`
8. `git push origin vX.X.X`
9. Open release page, create release with tag & title as text of tag & save as draft

View File

@@ -6,11 +6,17 @@
- Currently only Windows is supported
- Only available as pre-release right now
2. Run installer
3. Copy `apt-data` from `%APPDATA%\awakened-poe-trade` to `%APPDATA%\exiled-exchange-2` to copy your previous settings
3. Run Exiled Exchange 2
4. Launch PoE2 to generate correct files
5. Copy `apt-data` from `%APPDATA%\awakened-poe-trade` to `%APPDATA%\exiled-exchange-2` to copy your previous settings
- Resulting directory structure should look like this:
- `%APPDATA%\exiled-exchange-2\apt-data\`
- `config.json`
4. Run Exiled Exchange 2
6. Restart Exiled Exchange 2
#### Updating from 0.0.1 -> 0.0.10
Follow same steps as tranfering from PoE1, instead of copying from `%APPDATA%\awakened-poe-trade` to `%APPDATA%\exiled-exchange-2` instead copy from `%APPDATA%\awakened-poe2-trade` or `%APPDATA%\awakened-poe2-trade2` to `%APPDATA%\exiled-exchange-2`. After copying files feel free to run the uninstaller for `awakened-poe2-trade` to remove old executables, or delete `%APPDATA%\awakened-poe2-trade` and `Local\Programs\awakened-poe2-trade`
## Tool showcase

View File

@@ -28,6 +28,15 @@
"editor.insertSpaces": true,
"conventionalCommits.scopes": [
"Update to 2"
],
"cSpell.words": [
"edps",
"ilvl",
"nonunique",
"onlineleague",
"pdps",
"uniquefoil",
"WAYSTONE"
]
}
}

11302
main/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,38 +1,38 @@
{
"name": "exiled-exchange-2",
"version": "0.0.10",
"private": true,
"scripts": {
"dev": "node build/script.mjs",
"build": "tsc --noEmit && node build/script.mjs --prod",
"package": "electron-builder build",
"lint": "eslint src",
"fix": "eslint src --fix"
},
"author": {
"name": "Garrett Parker"
},
"repository": {
"type": "git",
"url": "https://github.com/Kvan7/exiled-exchange-2.git"
},
"main": "dist/main.js",
"dependencies": {
"electron-overlay-window": "3.3.0",
"uiohook-napi": "1.5.x"
},
"devDependencies": {
"@types/ini": "^4.1.0",
"@types/node": "20.x.x",
"@types/ws": "^8.5.3",
"@wokwi/bmp-ts": "^3.0.0",
"comlink": "^4.3.1",
"electron": "33.2.1",
"electron-builder": "25.1.8",
"electron-updater": "^6.3.0",
"esbuild": "^0.24.0",
"ini": "^5.0.0",
"typescript": "5.6.x",
"ws": "^8.16.0"
}
"name": "exiled-exchange-2",
"version": "0.0.12",
"private": true,
"scripts": {
"dev": "node build/script.mjs",
"build": "tsc --noEmit && node build/script.mjs --prod",
"package": "electron-builder build",
"lint": "eslint src",
"fix": "eslint src --fix"
},
"author": {
"name": "Garrett Parker"
},
"repository": {
"type": "git",
"url": "https://github.com/Kvan7/exiled-exchange-2.git"
},
"main": "dist/main.js",
"dependencies": {
"electron-overlay-window": "3.3.0",
"uiohook-napi": "1.5.x"
},
"devDependencies": {
"@types/ini": "^4.1.0",
"@types/node": "20.x.x",
"@types/ws": "^8.5.3",
"@wokwi/bmp-ts": "^3.0.0",
"comlink": "^4.3.1",
"electron": "33.2.1",
"electron-builder": "25.1.8",
"electron-updater": "^6.3.0",
"esbuild": "^0.24.0",
"ini": "^5.0.0",
"typescript": "5.6.x",
"ws": "^8.16.0"
}
}

View File

@@ -36,7 +36,8 @@ export class HttpProxy {
...req.headers,
'user-agent': app.userAgentFallback
},
useSessionCookies: true
useSessionCookies: true,
referrerPolicy: 'no-referrer-when-downgrade'
})
proxyReq.addListener('response', (proxyRes) => {
const resHeaders = { ...proxyRes.headers }

View File

@@ -50,6 +50,7 @@
"elemental_dps": "Elemental DPS: {0}",
"crit": "Critical Strike Chance: {0}%",
"aps": "Attacks per Second: {0}",
"spirit": "Spirit: {0}",
"has_empty_modifier": "1 Empty or Crafted Modifier",
"has_empty_affix": "Any",
"has_empty_prefix": "Prefix",
@@ -63,6 +64,8 @@
"white_sockets": "White: {0}",
"quality": "Quality: {0}",
"gem_level": "Level: {0}",
"gem_sockets": "Sockets: {0}",
"rune_sockets": "Sockets: {0}",
"sentinel_charge": "Charge: {0}",
"find_in_stash": "Find in Stash",
"parse_error": "An error occurred while parsing the item",

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

View File

@@ -48,6 +48,9 @@ export enum ItemCategory {
Tincture = 'Tincture',
Charm = 'Charm',
Crossbow = 'Crossbow',
SkillGem = 'Skill Gem',
SupportGem = 'Support Gem',
MetaGem = 'Meta Gem',
}
export const WEAPON_ONE_HANDED_MELEE = new Set([
@@ -76,6 +79,7 @@ export const WEAPONE_TWO_HANDED_MELEE = new Set([
export const WEAPON = new Set([
ItemCategory.FishingRod,
ItemCategory.Bow,
ItemCategory.Crossbow,
...WEAPON_ONE_HANDED,
...WEAPONE_TWO_HANDED_MELEE
])

View File

@@ -8,7 +8,7 @@
:class="$style.starredItem"
@click="starredItemClick($event, item)">
<ItemQuickPrice
:item-img="item.info.icon"
:item-img="item.info.icon === '%NOT_FOUND%' || item.info.icon === '' ? '/images/404.png' : item.info.icon"
:price="item.price"
currency-text
></ItemQuickPrice>

View File

@@ -4,9 +4,9 @@
<price-prediction v-if="showPredictedPrice" class="mb-4" :item="item" />
<price-trend v-else :item="item" :filters="itemFilters" />
<filters-block ref="filtersComponent" :filters="itemFilters" :stats="itemStats" :item="item" :presets="presets"
@preset="selectPreset" @submit="doSearch = true" />
@preset="selectPreset" @submit="doSearch = true" />
<trade-listing v-if="tradeAPI === 'trade' && doSearch" ref="tradeService" :filters="itemFilters" :stats="itemStats"
:item="item" />
:item="item" />
<trade-bulk v-if="tradeAPI === 'bulk' && doSearch" ref="tradeService" :filters="itemFilters" :item="item" />
<div v-if="!doSearch" class="flex justify-between items-center">
<div class="flex w-40" @mouseenter="handleSearchMouseenter">

View File

@@ -5,7 +5,7 @@
>
<template #item>
<div class="flex">
<img v-for="icon in result.icons" class="w-8 h-8" :src="icon">
<img v-for="icon in result.icons" class="w-8 h-8" :src="icon === '%NOT_FOUND%' || icon === '' ? '/images/404.png' : icon">
</div>
</template>
</item-quick-price>

View File

@@ -48,6 +48,19 @@
: t('filters.selected_none')"
/>
</div>
<!-- Warning that many stats may not work -->
<div v-if="!statsVisibility.disabled && hasStats" class="mb-4 text-center bg-teal-800 rounded-xl" :class="(presets.length > 1) ? 'mt-1' : 'mt-4'" >
Not all stats may load (WIP)
</div>
<!-- Handled parse error -->
<div v-if="!hasStats && item.rarity !== undefined && item.rarity !== 'Normal'" class="mb-4 text-center bg-purple-800 rounded-xl" :class="(presets.length > 1) ? 'mt-1' : 'mt-4'" >
For some reason this item's stats did not parse. <br/> It likely has a mod that is not supported yet. <br/>(Potentially new or changed wording from poe1)
</div>
<!-- Warning that bulk exchange does not work -->
<div v-if="!hasStats && item.category === 'Currency'" class="mb-4 text-center bg-teal-900 rounded-xl" :class="(presets.length > 1) ? 'mt-1' : 'mt-4'" >
Bulk exchange rates are not implemented yet
</div>
<div v-if="!statsVisibility.disabled && hasStats" class="mb-4" :class="(presets.length > 1) ? 'mt-1' : 'mt-4'">
<div class="flex" v-if="presets.length > 1">
<div class="w-5 border-b border-gray-700" />
@@ -134,6 +147,8 @@ export default defineComponent({
statsVisibility.disabled = false
})
console.log(props.item)
const showUnknownMods = computed(() =>
props.item.unknownModifiers.length &&
props.item.category !== ItemCategory.Sentinel &&

View File

@@ -116,7 +116,8 @@ export const INTERNAL_TRADE_IDS = [
'item.elemental_dps',
'item.crit',
'item.aps',
'item.has_empty_modifier'
'item.has_empty_modifier',
'item.spirit'
] as const
export type InternalTradeId = typeof INTERNAL_TRADE_IDS[number]

View File

@@ -13,7 +13,7 @@
<div class="flex items-center pb-4">
<item-quick-price class="flex-1 text-base justify-center"
:price="price"
:item-img="item.info.icon"
:item-img="item.info.icon === '%NOT_FOUND%' || item.info.icon === '' ? '/images/404.png' : item.info.icon"
:item-base="item.info"
approx
/>

View File

@@ -8,7 +8,7 @@
:class="{ 'bg-gray-700': item.highlight }" class="rounded px-1">
<item-quick-price currency-text fraction class="text-base"
:price="item.price"
:item-img="item.icon" />
:item-img="item.icon === '%NOT_FOUND%' || item.icon === '' ? '/images/404.png' : item.icon" />
<div class="text-left text-gray-600 mb-1 whitespace-nowrap overflow-hidden">{{ item.name }}</div>
</div>
</div>
@@ -16,7 +16,7 @@
<div v-for="item in result.items" :key="item.name">
<item-quick-price currency-text fraction class="text-base"
:price="item.price"
:item-img="item.icon" />
:item-img="item.icon === '%NOT_FOUND%' || item.icon === '' ? '/images/404.png' : item.icon" />
<div class="text-left text-gray-600 mb-1 whitespace-nowrap overflow-hidden">{{ item.name }}</div>
</div>
</div>

View File

@@ -22,6 +22,7 @@ export type TradeResponse<T> = (T & { error?: null }) | {
}
export function apiToSatisfySearch (item: ParsedItem, stats: StatFilter[], filters: ItemFilters): 'trade' | 'bulk' {
console.log('item', item, 'filter', filters, 'stats', stats)
if (stats.some(s => !s.disabled)) {
return 'trade'
}

View File

@@ -1,4 +1,4 @@
import { ItemInfluence, ItemCategory, ParsedItem, ItemRarity } from '@/parser'
import { ItemCategory, ParsedItem, ItemRarity } from '@/parser'
import {
ItemFilters,
StatFilter,
@@ -60,7 +60,11 @@ export const CATEGORY_TO_TRADE_ID = new Map([
[ItemCategory.Trinket, 'accessory.trinket'],
[ItemCategory.SanctumRelic, 'sanctum.relic'],
[ItemCategory.Tincture, 'tincture'],
[ItemCategory.Charm, 'azmeri.charm']
[ItemCategory.Charm, 'azmeri.charm'],
[ItemCategory.Crossbow, 'weapon.crossbow'],
[ItemCategory.SkillGem, 'gem.activegem'],
[ItemCategory.SupportGem, 'gem.supportgem'],
[ItemCategory.MetaGem, 'gem.metagem']
])
const TOTAL_MODS_TEXT = {
@@ -77,14 +81,14 @@ const TOTAL_MODS_TEXT = {
TOTAL_MODIFIERS: ['# Modifiers', '# Prefix Modifiers', '# Suffix Modifiers']
}
const INFLUENCE_PSEUDO_TEXT = {
[ItemInfluence.Shaper]: 'Has Shaper Influence',
[ItemInfluence.Crusader]: 'Has Crusader Influence',
[ItemInfluence.Hunter]: 'Has Hunter Influence',
[ItemInfluence.Elder]: 'Has Elder Influence',
[ItemInfluence.Redeemer]: 'Has Redeemer Influence',
[ItemInfluence.Warlord]: 'Has Warlord Influence'
}
// const INFLUENCE_PSEUDO_TEXT = {
// [ItemInfluence.Shaper]: 'Has Shaper Influence',
// [ItemInfluence.Crusader]: 'Has Crusader Influence',
// [ItemInfluence.Hunter]: 'Has Hunter Influence',
// [ItemInfluence.Elder]: 'Has Elder Influence',
// [ItemInfluence.Redeemer]: 'Has Redeemer Influence',
// [ItemInfluence.Warlord]: 'Has Warlord Influence'
// }
interface FilterBoolean {
option?: 'true' | 'false'
@@ -123,72 +127,64 @@ interface TradeRequest {
category?: {
option?: string
}
ilvl?: FilterRange
quality?: FilterRange
}
}
socket_filters?: {
equipment_filters?: {
filters: {
links?: FilterRange
sockets?: {
w?: number
}
// Attacks per Second
aps?: FilterRange
// Armor Rating
ar?: FilterRange
// Block
block?: FilterRange
// Critical Strike Chance
crit?: FilterRange
// Damage (not used)
// damage?: FilterRange
// Damage per Second
dps?: FilterRange
// Elemental Damage per Second
edps?: FilterRange
// Energy Shield
es?: FilterRange
// Evasion Rating
ev?: FilterRange
// Physical Damage per Second
pdps?: FilterRange
// Rune Slots
rune_sockets?: FilterRange
// Spirit
spirit?: FilterRange
}
}
req_filters?: {
filters: {
dex?: FilterRange
int?: FilterRange
lvl?: FilterRange
str?: FilterRange
}
}
// WILL PROBABLY BE REMOVED SOON
map_filters?: {
filters: {
map_bonus?: FilterRange
map_tier?: FilterRange
}
}
misc_filters?: {
filters: {
ilvl?: FilterRange
quality?: FilterRange
gem_level?: FilterRange
corrupted?: FilterBoolean
fractured_item?: FilterBoolean
mirrored?: FilterBoolean
identified?: FilterBoolean
stack_size?: FilterRange
}
}
armour_filters?: {
filters: {
ar?: FilterRange
es?: FilterRange
ev?: FilterRange
ward?: FilterRange
block?: FilterRange
base_defence_percentile?: FilterRange
}
}
weapon_filters?: {
filters: {
dps?: FilterRange
pdps?: FilterRange
edps?: FilterRange
crit?: FilterRange
aps?: FilterRange
}
}
map_filters?: {
filters: {
map_tier?: FilterRange
map_blighted?: FilterBoolean
map_uberblighted?: FilterBoolean
alternate_art?: FilterBoolean
area_level?: FilterRange
}
}
heist_filters?: {
filters: {
heist_wings?: FilterRange
heist_agility?: FilterRange
heist_brute_force?: FilterRange
heist_counter_thaumaturgy?: FilterRange
heist_deception?: FilterRange
heist_demolition?: FilterRange
heist_engineering?: FilterRange
heist_lockpicking?: FilterRange
heist_perception?: FilterRange
heist_trap_disarmament?: FilterRange
}
}
sentinel_filters?: {
filters: {
sentinel_durability?: FilterRange
corrupted?: FilterBoolean
gem_level?: FilterRange
gem_sockets?: FilterRange
identified?: FilterBoolean
mirrored?: FilterBoolean
sanctum_gold?: FilterRange
unidentified_tier?: FilterRange
}
}
trade_filters?: {
@@ -320,6 +316,16 @@ export function createTradeRequest (
query.type = nameToQuery(activeSearch.baseType, filters)
}
// TYPE FILTERS
if (activeSearch.category) {
const id = CATEGORY_TO_TRADE_ID.get(activeSearch.category)
if (id) {
propSet(query.filters, 'type_filters.filters.category.option', id)
} else {
throw new Error(`Invalid category: ${activeSearch.category}`)
}
}
if (filters.foil && !filters.foil.disabled) {
propSet(query.filters, 'type_filters.filters.rarity.option', 'uniquefoil')
} else if (filters.rarity) {
@@ -330,15 +336,65 @@ export function createTradeRequest (
)
}
if (activeSearch.category) {
const id = CATEGORY_TO_TRADE_ID.get(activeSearch.category)
if (id) {
propSet(query.filters, 'type_filters.filters.category.option', id)
} else {
throw new Error(`Invalid category: ${activeSearch.category}`)
if (filters.itemLevel && !filters.itemLevel.disabled) {
propSet(
query.filters,
'type_filters.filters.ilvl.min',
filters.itemLevel.value
)
if (filters.itemLevel.max) {
propSet(
query.filters,
'type_filters.filters.ilvl.max',
filters.itemLevel.max
)
}
}
if (filters.quality && !filters.quality.disabled) {
propSet(
query.filters,
'type_filters.filters.quality.min',
filters.quality.value
)
}
// EQUIPMENT FILTERS
// REQ FILTERS
// MAP (WAYSTONE) FILTERS
if (filters.mapTier && !filters.mapTier.disabled) {
propSet(
query.filters,
'map_filters.filters.map_tier.min',
filters.mapTier.value
)
propSet(
query.filters,
'map_filters.filters.map_tier.max',
filters.mapTier.value
)
}
// MISC FILTERS
if (filters.gemLevel && !filters.gemLevel.disabled) {
propSet(
query.filters,
'misc_filters.filters.gem_level.min',
filters.gemLevel.value
)
}
if (filters.unidentified && !filters.unidentified.disabled) {
propSet(
query.filters,
'misc_filters.filters.identified.option',
String(false)
)
}
if (filters.corrupted?.value === false || filters.corrupted?.exact) {
propSet(
query.filters,
@@ -346,13 +402,7 @@ export function createTradeRequest (
String(filters.corrupted.value)
)
}
if (filters.fractured?.value === false) {
propSet(
query.filters,
'misc_filters.filters.fractured_item.option',
String(false)
)
}
if (filters.mirrored) {
if (filters.mirrored.disabled) {
propSet(
@@ -373,121 +423,9 @@ export function createTradeRequest (
)
}
if (filters.gemLevel && !filters.gemLevel.disabled) {
propSet(
query.filters,
'misc_filters.filters.gem_level.min',
filters.gemLevel.value
)
}
// TRADE FILTERS
if (filters.quality && !filters.quality.disabled) {
propSet(
query.filters,
'misc_filters.filters.quality.min',
filters.quality.value
)
}
if (filters.itemLevel && !filters.itemLevel.disabled) {
propSet(
query.filters,
'misc_filters.filters.ilvl.min',
filters.itemLevel.value
)
if (filters.itemLevel.max) {
propSet(
query.filters,
'misc_filters.filters.ilvl.max',
filters.itemLevel.max
)
}
}
if (filters.stackSize && !filters.stackSize.disabled) {
propSet(
query.filters,
'misc_filters.filters.stack_size.min',
filters.stackSize.value
)
}
if (filters.linkedSockets && !filters.linkedSockets.disabled) {
propSet(
query.filters,
'socket_filters.filters.links.min',
filters.linkedSockets.value
)
}
if (filters.whiteSockets && !filters.whiteSockets.disabled) {
propSet(
query.filters,
'socket_filters.filters.sockets.w',
filters.whiteSockets.value
)
}
if (filters.mapTier && !filters.mapTier.disabled) {
propSet(
query.filters,
'map_filters.filters.map_tier.min',
filters.mapTier.value
)
propSet(
query.filters,
'map_filters.filters.map_tier.max',
filters.mapTier.value
)
}
if (filters.mapBlighted) {
if (filters.mapBlighted.value === 'Blighted') {
propSet(
query.filters,
'map_filters.filters.map_blighted.option',
String(true)
)
} else if (filters.mapBlighted.value === 'Blight-ravaged') {
propSet(
query.filters,
'map_filters.filters.map_uberblighted.option',
String(true)
)
}
}
if (filters.unidentified && !filters.unidentified.disabled) {
propSet(
query.filters,
'misc_filters.filters.identified.option',
String(false)
)
}
if (filters.areaLevel && !filters.areaLevel.disabled) {
propSet(
query.filters,
'map_filters.filters.area_level.min',
filters.areaLevel.value
)
}
if (filters.heistWingsRevealed && !filters.heistWingsRevealed.disabled) {
propSet(
query.filters,
'heist_filters.filters.heist_wings.min',
filters.heistWingsRevealed.value
)
}
if (filters.sentinelCharge && !filters.sentinelCharge.disabled) {
propSet(
query.filters,
'sentinel_filters.filters.sentinel_durability.min',
filters.sentinelCharge.value
)
}
// BREAK ==============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
for (const stat of stats) {
if (stat.tradeId[0] === 'item.has_empty_modifier') {
@@ -557,135 +495,135 @@ export function createTradeRequest (
const input = stat.roll!
switch (stat.tradeId[0] as InternalTradeId) {
case 'item.base_percentile':
propSet(
query.filters,
'armour_filters.filters.base_defence_percentile.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'armour_filters.filters.base_defence_percentile.max',
typeof input.max === 'number' ? input.max : undefined
)
break
// case 'item.base_percentile':
// propSet(
// query.filters,
// 'equipment_filters.filters.base_defence_percentile.min',
// typeof input.min === 'number' ? input.min : undefined
// )
// propSet(
// query.filters,
// 'equipment_filters.filters.base_defence_percentile.max',
// typeof input.max === 'number' ? input.max : undefined
// )
// break
case 'item.armour':
propSet(
query.filters,
'armour_filters.filters.ar.min',
'equipment_filters.filters.ar.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'armour_filters.filters.ar.max',
'equipment_filters.filters.ar.max',
typeof input.max === 'number' ? input.max : undefined
)
break
case 'item.evasion_rating':
propSet(
query.filters,
'armour_filters.filters.ev.min',
'equipment_filters.filters.ev.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'armour_filters.filters.ev.max',
'equipment_filters.filters.ev.max',
typeof input.max === 'number' ? input.max : undefined
)
break
case 'item.energy_shield':
propSet(
query.filters,
'armour_filters.filters.es.min',
'equipment_filters.filters.es.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'armour_filters.filters.es.max',
typeof input.max === 'number' ? input.max : undefined
)
break
case 'item.ward':
propSet(
query.filters,
'armour_filters.filters.ward.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'armour_filters.filters.ward.max',
'equipment_filters.filters.es.max',
typeof input.max === 'number' ? input.max : undefined
)
break
case 'item.block':
propSet(
query.filters,
'armour_filters.filters.block.min',
'equipment_filters.filters.block.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'armour_filters.filters.block.max',
'equipment_filters.filters.block.max',
typeof input.max === 'number' ? input.max : undefined
)
break
case 'item.total_dps':
propSet(
query.filters,
'weapon_filters.filters.dps.min',
'equipment_filters.filters.dps.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'weapon_filters.filters.dps.max',
'equipment_filters.filters.dps.max',
typeof input.max === 'number' ? input.max : undefined
)
break
case 'item.physical_dps':
propSet(
query.filters,
'weapon_filters.filters.pdps.min',
'equipment_filters.filters.pdps.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'weapon_filters.filters.pdps.max',
'equipment_filters.filters.pdps.max',
typeof input.max === 'number' ? input.max : undefined
)
break
case 'item.elemental_dps':
propSet(
query.filters,
'weapon_filters.filters.edps.min',
'equipment_filters.filters.edps.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'weapon_filters.filters.edps.max',
'equipment_filters.filters.edps.max',
typeof input.max === 'number' ? input.max : undefined
)
break
case 'item.crit':
propSet(
query.filters,
'weapon_filters.filters.crit.min',
'equipment_filters.filters.crit.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'weapon_filters.filters.crit.max',
'equipment_filters.filters.crit.max',
typeof input.max === 'number' ? input.max : undefined
)
break
case 'item.aps':
propSet(
query.filters,
'weapon_filters.filters.aps.min',
'equipment_filters.filters.aps.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'weapon_filters.filters.aps.max',
'equipment_filters.filters.aps.max',
typeof input.max === 'number' ? input.max : undefined
)
break
case 'item.spirit':
propSet(
query.filters,
'equipment_filters.filters.spirit.min',
typeof input.min === 'number' ? input.min : undefined
)
propSet(
query.filters,
'equipment_filters.filters.spirit.max',
typeof input.max === 'number' ? input.max : undefined
)
break
@@ -695,33 +633,33 @@ export function createTradeRequest (
stats = stats.filter(
(stat) => !INTERNAL_TRADE_IDS.includes(stat.tradeId[0] as any)
)
if (filters.veiled) {
for (const statRef of filters.veiled.statRefs) {
stats.push({
disabled: filters.veiled.disabled,
statRef: undefined!,
text: undefined!,
tag: undefined!,
sources: undefined!,
tradeId: STAT_BY_REF(statRef)!.trade.ids[ModifierType.Veiled]
})
}
}
// if (filters.veiled) {
// for (const statRef of filters.veiled.statRefs) {
// stats.push({
// disabled: filters.veiled.disabled,
// statRef: undefined!,
// text: undefined!,
// tag: undefined!,
// sources: undefined!,
// tradeId: STAT_BY_REF(statRef)!.trade.ids[ModifierType.Veiled]
// })
// }
// }
if (filters.influences) {
for (const influence of filters.influences) {
stats.push({
disabled: influence.disabled,
statRef: undefined!,
text: undefined!,
tag: undefined!,
sources: undefined!,
tradeId: STAT_BY_REF(INFLUENCE_PSEUDO_TEXT[influence.value])!.trade.ids[
ModifierType.Pseudo
]
})
}
}
// if (filters.influences) {
// for (const influence of filters.influences) {
// stats.push({
// disabled: influence.disabled,
// statRef: undefined!,
// text: undefined!,
// tag: undefined!,
// sources: undefined!,
// tradeId: STAT_BY_REF(INFLUENCE_PSEUDO_TEXT[influence.value])!.trade.ids[
// ModifierType.Pseudo
// ]
// })
// }
// }
const qAnd = query.stats[0]
for (const stat of stats) {

View File

@@ -10,7 +10,7 @@
<item-quick-price class="flex-1 text-base justify-center"
:price="trend.price"
:fraction="filters.stackSize != null"
:item-img="item.info.icon"
:item-img="item.info.icon === '%NOT_FOUND%' || item.info.icon === '' ? '/images/404.png' : item.info.icon"
:item-base="item.info"
>
<template #item v-if="isValuableBasetype">
@@ -53,7 +53,7 @@
<div v-else-if="!item.info.craftable" class="flex items-center pb-4" style="min-height: 3rem;">
<item-quick-price class="flex-1 text-base justify-center"
currency-text
:item-img="item.info.icon"
:item-img="item.info.icon === '%NOT_FOUND%' || item.info.icon === '' ? '/images/404.png' : item.info.icon"
:item-base="item.info" />
</div>
</template>

View File

@@ -6,7 +6,7 @@
<div class="grid grid-cols-2 gap-2 overflow-auto pb-4 px-4">
<div v-for="item in identifiedVariants" :key="item.name" class="flex">
<button @click="select(item)" class="bg-gray-700 rounded flex gap-x-3 items-center p-2 w-full">
<img :src="item.icon" class="w-12" />
<img :src="item.icon === '%NOT_FOUND%' || item.icon === '' ? '/images/404.png' : item.icon" class="w-12" />
<div class="leading-tight text-left">{{ item.name }}</div>
</button>
</div>