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
This commit is contained in:
Kvan7
2024-12-13 00:07:53 -06:00
committed by GitHub
parent ab93c8b96a
commit ea50db827a
19 changed files with 7305 additions and 10489 deletions

View File

@@ -28,6 +28,15 @@
"editor.insertSpaces": true, "editor.insertSpaces": true,
"conventionalCommits.scopes": [ "conventionalCommits.scopes": [
"Update to 2" "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", "name": "exiled-exchange-2",
"version": "0.0.11", "version": "0.0.12",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "node build/script.mjs", "dev": "node build/script.mjs",
"build": "tsc --noEmit && node build/script.mjs --prod", "build": "tsc --noEmit && node build/script.mjs --prod",
"package": "electron-builder build", "package": "electron-builder build",
"lint": "eslint src", "lint": "eslint src",
"fix": "eslint src --fix" "fix": "eslint src --fix"
}, },
"author": { "author": {
"name": "Garrett Parker" "name": "Garrett Parker"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/Kvan7/exiled-exchange-2.git" "url": "https://github.com/Kvan7/exiled-exchange-2.git"
}, },
"main": "dist/main.js", "main": "dist/main.js",
"dependencies": { "dependencies": {
"electron-overlay-window": "3.3.0", "electron-overlay-window": "3.3.0",
"uiohook-napi": "1.5.x" "uiohook-napi": "1.5.x"
}, },
"devDependencies": { "devDependencies": {
"@types/ini": "^4.1.0", "@types/ini": "^4.1.0",
"@types/node": "20.x.x", "@types/node": "20.x.x",
"@types/ws": "^8.5.3", "@types/ws": "^8.5.3",
"@wokwi/bmp-ts": "^3.0.0", "@wokwi/bmp-ts": "^3.0.0",
"comlink": "^4.3.1", "comlink": "^4.3.1",
"electron": "33.2.1", "electron": "33.2.1",
"electron-builder": "25.1.8", "electron-builder": "25.1.8",
"electron-updater": "^6.3.0", "electron-updater": "^6.3.0",
"esbuild": "^0.24.0", "esbuild": "^0.24.0",
"ini": "^5.0.0", "ini": "^5.0.0",
"typescript": "5.6.x", "typescript": "5.6.x",
"ws": "^8.16.0" "ws": "^8.16.0"
} }
} }

View File

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

View File

@@ -50,6 +50,7 @@
"elemental_dps": "Elemental DPS: {0}", "elemental_dps": "Elemental DPS: {0}",
"crit": "Critical Strike Chance: {0}%", "crit": "Critical Strike Chance: {0}%",
"aps": "Attacks per Second: {0}", "aps": "Attacks per Second: {0}",
"spirit": "Spirit: {0}",
"has_empty_modifier": "1 Empty or Crafted Modifier", "has_empty_modifier": "1 Empty or Crafted Modifier",
"has_empty_affix": "Any", "has_empty_affix": "Any",
"has_empty_prefix": "Prefix", "has_empty_prefix": "Prefix",
@@ -63,6 +64,8 @@
"white_sockets": "White: {0}", "white_sockets": "White: {0}",
"quality": "Quality: {0}", "quality": "Quality: {0}",
"gem_level": "Level: {0}", "gem_level": "Level: {0}",
"gem_sockets": "Sockets: {0}",
"rune_sockets": "Sockets: {0}",
"sentinel_charge": "Charge: {0}", "sentinel_charge": "Charge: {0}",
"find_in_stash": "Find in Stash", "find_in_stash": "Find in Stash",
"parse_error": "An error occurred while parsing the item", "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', Tincture = 'Tincture',
Charm = 'Charm', Charm = 'Charm',
Crossbow = 'Crossbow', Crossbow = 'Crossbow',
SkillGem = 'Skill Gem',
SupportGem = 'Support Gem',
MetaGem = 'Meta Gem',
} }
export const WEAPON_ONE_HANDED_MELEE = new Set([ 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([ export const WEAPON = new Set([
ItemCategory.FishingRod, ItemCategory.FishingRod,
ItemCategory.Bow, ItemCategory.Bow,
ItemCategory.Crossbow,
...WEAPON_ONE_HANDED, ...WEAPON_ONE_HANDED,
...WEAPONE_TWO_HANDED_MELEE ...WEAPONE_TWO_HANDED_MELEE
]) ])

View File

@@ -8,7 +8,7 @@
:class="$style.starredItem" :class="$style.starredItem"
@click="starredItemClick($event, item)"> @click="starredItemClick($event, item)">
<ItemQuickPrice <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" :price="item.price"
currency-text currency-text
></ItemQuickPrice> ></ItemQuickPrice>

View File

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

View File

@@ -5,7 +5,7 @@
> >
<template #item> <template #item>
<div class="flex"> <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> </div>
</template> </template>
</item-quick-price> </item-quick-price>

View File

@@ -48,6 +48,19 @@
: t('filters.selected_none')" : t('filters.selected_none')"
/> />
</div> </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 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="flex" v-if="presets.length > 1">
<div class="w-5 border-b border-gray-700" /> <div class="w-5 border-b border-gray-700" />
@@ -134,6 +147,8 @@ export default defineComponent({
statsVisibility.disabled = false statsVisibility.disabled = false
}) })
console.log(props.item)
const showUnknownMods = computed(() => const showUnknownMods = computed(() =>
props.item.unknownModifiers.length && props.item.unknownModifiers.length &&
props.item.category !== ItemCategory.Sentinel && props.item.category !== ItemCategory.Sentinel &&

View File

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

View File

@@ -13,7 +13,7 @@
<div class="flex items-center pb-4"> <div class="flex items-center pb-4">
<item-quick-price class="flex-1 text-base justify-center" <item-quick-price class="flex-1 text-base justify-center"
:price="price" :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" :item-base="item.info"
approx approx
/> />

View File

@@ -8,7 +8,7 @@
:class="{ 'bg-gray-700': item.highlight }" class="rounded px-1"> :class="{ 'bg-gray-700': item.highlight }" class="rounded px-1">
<item-quick-price currency-text fraction class="text-base" <item-quick-price currency-text fraction class="text-base"
:price="item.price" :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 class="text-left text-gray-600 mb-1 whitespace-nowrap overflow-hidden">{{ item.name }}</div>
</div> </div>
</div> </div>
@@ -16,7 +16,7 @@
<div v-for="item in result.items" :key="item.name"> <div v-for="item in result.items" :key="item.name">
<item-quick-price currency-text fraction class="text-base" <item-quick-price currency-text fraction class="text-base"
:price="item.price" :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 class="text-left text-gray-600 mb-1 whitespace-nowrap overflow-hidden">{{ item.name }}</div>
</div> </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' { 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)) { if (stats.some(s => !s.disabled)) {
return 'trade' return 'trade'
} }

View File

@@ -1,4 +1,4 @@
import { ItemInfluence, ItemCategory, ParsedItem, ItemRarity } from '@/parser' import { ItemCategory, ParsedItem, ItemRarity } from '@/parser'
import { import {
ItemFilters, ItemFilters,
StatFilter, StatFilter,
@@ -60,7 +60,11 @@ export const CATEGORY_TO_TRADE_ID = new Map([
[ItemCategory.Trinket, 'accessory.trinket'], [ItemCategory.Trinket, 'accessory.trinket'],
[ItemCategory.SanctumRelic, 'sanctum.relic'], [ItemCategory.SanctumRelic, 'sanctum.relic'],
[ItemCategory.Tincture, 'tincture'], [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 = { const TOTAL_MODS_TEXT = {
@@ -77,14 +81,14 @@ const TOTAL_MODS_TEXT = {
TOTAL_MODIFIERS: ['# Modifiers', '# Prefix Modifiers', '# Suffix Modifiers'] TOTAL_MODIFIERS: ['# Modifiers', '# Prefix Modifiers', '# Suffix Modifiers']
} }
const INFLUENCE_PSEUDO_TEXT = { // const INFLUENCE_PSEUDO_TEXT = {
[ItemInfluence.Shaper]: 'Has Shaper Influence', // [ItemInfluence.Shaper]: 'Has Shaper Influence',
[ItemInfluence.Crusader]: 'Has Crusader Influence', // [ItemInfluence.Crusader]: 'Has Crusader Influence',
[ItemInfluence.Hunter]: 'Has Hunter Influence', // [ItemInfluence.Hunter]: 'Has Hunter Influence',
[ItemInfluence.Elder]: 'Has Elder Influence', // [ItemInfluence.Elder]: 'Has Elder Influence',
[ItemInfluence.Redeemer]: 'Has Redeemer Influence', // [ItemInfluence.Redeemer]: 'Has Redeemer Influence',
[ItemInfluence.Warlord]: 'Has Warlord Influence' // [ItemInfluence.Warlord]: 'Has Warlord Influence'
} // }
interface FilterBoolean { interface FilterBoolean {
option?: 'true' | 'false' option?: 'true' | 'false'
@@ -123,72 +127,64 @@ interface TradeRequest {
category?: { category?: {
option?: string option?: string
} }
ilvl?: FilterRange
quality?: FilterRange
} }
} }
socket_filters?: { equipment_filters?: {
filters: { filters: {
links?: FilterRange // Attacks per Second
sockets?: { aps?: FilterRange
w?: number // 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?: { misc_filters?: {
filters: { filters: {
ilvl?: FilterRange alternate_art?: FilterBoolean
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
area_level?: FilterRange area_level?: FilterRange
} corrupted?: FilterBoolean
} gem_level?: FilterRange
heist_filters?: { gem_sockets?: FilterRange
filters: { identified?: FilterBoolean
heist_wings?: FilterRange mirrored?: FilterBoolean
heist_agility?: FilterRange sanctum_gold?: FilterRange
heist_brute_force?: FilterRange unidentified_tier?: 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
} }
} }
trade_filters?: { trade_filters?: {
@@ -320,6 +316,16 @@ export function createTradeRequest (
query.type = nameToQuery(activeSearch.baseType, filters) 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) { if (filters.foil && !filters.foil.disabled) {
propSet(query.filters, 'type_filters.filters.rarity.option', 'uniquefoil') propSet(query.filters, 'type_filters.filters.rarity.option', 'uniquefoil')
} else if (filters.rarity) { } else if (filters.rarity) {
@@ -330,15 +336,65 @@ export function createTradeRequest (
) )
} }
if (activeSearch.category) { if (filters.itemLevel && !filters.itemLevel.disabled) {
const id = CATEGORY_TO_TRADE_ID.get(activeSearch.category) propSet(
if (id) { query.filters,
propSet(query.filters, 'type_filters.filters.category.option', id) 'type_filters.filters.ilvl.min',
} else { filters.itemLevel.value
throw new Error(`Invalid category: ${activeSearch.category}`) )
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) { if (filters.corrupted?.value === false || filters.corrupted?.exact) {
propSet( propSet(
query.filters, query.filters,
@@ -346,13 +402,7 @@ export function createTradeRequest (
String(filters.corrupted.value) 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) {
if (filters.mirrored.disabled) { if (filters.mirrored.disabled) {
propSet( propSet(
@@ -373,121 +423,9 @@ export function createTradeRequest (
) )
} }
if (filters.gemLevel && !filters.gemLevel.disabled) { // TRADE FILTERS
propSet(
query.filters,
'misc_filters.filters.gem_level.min',
filters.gemLevel.value
)
}
if (filters.quality && !filters.quality.disabled) { // BREAK ==============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
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
)
}
for (const stat of stats) { for (const stat of stats) {
if (stat.tradeId[0] === 'item.has_empty_modifier') { if (stat.tradeId[0] === 'item.has_empty_modifier') {
@@ -557,135 +495,135 @@ export function createTradeRequest (
const input = stat.roll! const input = stat.roll!
switch (stat.tradeId[0] as InternalTradeId) { switch (stat.tradeId[0] as InternalTradeId) {
case 'item.base_percentile': // case 'item.base_percentile':
propSet( // propSet(
query.filters, // query.filters,
'armour_filters.filters.base_defence_percentile.min', // 'equipment_filters.filters.base_defence_percentile.min',
typeof input.min === 'number' ? input.min : undefined // typeof input.min === 'number' ? input.min : undefined
) // )
propSet( // propSet(
query.filters, // query.filters,
'armour_filters.filters.base_defence_percentile.max', // 'equipment_filters.filters.base_defence_percentile.max',
typeof input.max === 'number' ? input.max : undefined // typeof input.max === 'number' ? input.max : undefined
) // )
break // break
case 'item.armour': case 'item.armour':
propSet( propSet(
query.filters, query.filters,
'armour_filters.filters.ar.min', 'equipment_filters.filters.ar.min',
typeof input.min === 'number' ? input.min : undefined typeof input.min === 'number' ? input.min : undefined
) )
propSet( propSet(
query.filters, query.filters,
'armour_filters.filters.ar.max', 'equipment_filters.filters.ar.max',
typeof input.max === 'number' ? input.max : undefined typeof input.max === 'number' ? input.max : undefined
) )
break break
case 'item.evasion_rating': case 'item.evasion_rating':
propSet( propSet(
query.filters, query.filters,
'armour_filters.filters.ev.min', 'equipment_filters.filters.ev.min',
typeof input.min === 'number' ? input.min : undefined typeof input.min === 'number' ? input.min : undefined
) )
propSet( propSet(
query.filters, query.filters,
'armour_filters.filters.ev.max', 'equipment_filters.filters.ev.max',
typeof input.max === 'number' ? input.max : undefined typeof input.max === 'number' ? input.max : undefined
) )
break break
case 'item.energy_shield': case 'item.energy_shield':
propSet( propSet(
query.filters, query.filters,
'armour_filters.filters.es.min', 'equipment_filters.filters.es.min',
typeof input.min === 'number' ? input.min : undefined typeof input.min === 'number' ? input.min : undefined
) )
propSet( propSet(
query.filters, query.filters,
'armour_filters.filters.es.max', 'equipment_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',
typeof input.max === 'number' ? input.max : undefined typeof input.max === 'number' ? input.max : undefined
) )
break break
case 'item.block': case 'item.block':
propSet( propSet(
query.filters, query.filters,
'armour_filters.filters.block.min', 'equipment_filters.filters.block.min',
typeof input.min === 'number' ? input.min : undefined typeof input.min === 'number' ? input.min : undefined
) )
propSet( propSet(
query.filters, query.filters,
'armour_filters.filters.block.max', 'equipment_filters.filters.block.max',
typeof input.max === 'number' ? input.max : undefined typeof input.max === 'number' ? input.max : undefined
) )
break break
case 'item.total_dps': case 'item.total_dps':
propSet( propSet(
query.filters, query.filters,
'weapon_filters.filters.dps.min', 'equipment_filters.filters.dps.min',
typeof input.min === 'number' ? input.min : undefined typeof input.min === 'number' ? input.min : undefined
) )
propSet( propSet(
query.filters, query.filters,
'weapon_filters.filters.dps.max', 'equipment_filters.filters.dps.max',
typeof input.max === 'number' ? input.max : undefined typeof input.max === 'number' ? input.max : undefined
) )
break break
case 'item.physical_dps': case 'item.physical_dps':
propSet( propSet(
query.filters, query.filters,
'weapon_filters.filters.pdps.min', 'equipment_filters.filters.pdps.min',
typeof input.min === 'number' ? input.min : undefined typeof input.min === 'number' ? input.min : undefined
) )
propSet( propSet(
query.filters, query.filters,
'weapon_filters.filters.pdps.max', 'equipment_filters.filters.pdps.max',
typeof input.max === 'number' ? input.max : undefined typeof input.max === 'number' ? input.max : undefined
) )
break break
case 'item.elemental_dps': case 'item.elemental_dps':
propSet( propSet(
query.filters, query.filters,
'weapon_filters.filters.edps.min', 'equipment_filters.filters.edps.min',
typeof input.min === 'number' ? input.min : undefined typeof input.min === 'number' ? input.min : undefined
) )
propSet( propSet(
query.filters, query.filters,
'weapon_filters.filters.edps.max', 'equipment_filters.filters.edps.max',
typeof input.max === 'number' ? input.max : undefined typeof input.max === 'number' ? input.max : undefined
) )
break break
case 'item.crit': case 'item.crit':
propSet( propSet(
query.filters, query.filters,
'weapon_filters.filters.crit.min', 'equipment_filters.filters.crit.min',
typeof input.min === 'number' ? input.min : undefined typeof input.min === 'number' ? input.min : undefined
) )
propSet( propSet(
query.filters, query.filters,
'weapon_filters.filters.crit.max', 'equipment_filters.filters.crit.max',
typeof input.max === 'number' ? input.max : undefined typeof input.max === 'number' ? input.max : undefined
) )
break break
case 'item.aps': case 'item.aps':
propSet( propSet(
query.filters, query.filters,
'weapon_filters.filters.aps.min', 'equipment_filters.filters.aps.min',
typeof input.min === 'number' ? input.min : undefined typeof input.min === 'number' ? input.min : undefined
) )
propSet( propSet(
query.filters, 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 typeof input.max === 'number' ? input.max : undefined
) )
break break
@@ -695,33 +633,33 @@ export function createTradeRequest (
stats = stats.filter( stats = stats.filter(
(stat) => !INTERNAL_TRADE_IDS.includes(stat.tradeId[0] as any) (stat) => !INTERNAL_TRADE_IDS.includes(stat.tradeId[0] as any)
) )
if (filters.veiled) { // if (filters.veiled) {
for (const statRef of filters.veiled.statRefs) { // for (const statRef of filters.veiled.statRefs) {
stats.push({ // stats.push({
disabled: filters.veiled.disabled, // disabled: filters.veiled.disabled,
statRef: undefined!, // statRef: undefined!,
text: undefined!, // text: undefined!,
tag: undefined!, // tag: undefined!,
sources: undefined!, // sources: undefined!,
tradeId: STAT_BY_REF(statRef)!.trade.ids[ModifierType.Veiled] // tradeId: STAT_BY_REF(statRef)!.trade.ids[ModifierType.Veiled]
}) // })
} // }
} // }
if (filters.influences) { // if (filters.influences) {
for (const influence of filters.influences) { // for (const influence of filters.influences) {
stats.push({ // stats.push({
disabled: influence.disabled, // disabled: influence.disabled,
statRef: undefined!, // statRef: undefined!,
text: undefined!, // text: undefined!,
tag: undefined!, // tag: undefined!,
sources: undefined!, // sources: undefined!,
tradeId: STAT_BY_REF(INFLUENCE_PSEUDO_TEXT[influence.value])!.trade.ids[ // tradeId: STAT_BY_REF(INFLUENCE_PSEUDO_TEXT[influence.value])!.trade.ids[
ModifierType.Pseudo // ModifierType.Pseudo
] // ]
}) // })
} // }
} // }
const qAnd = query.stats[0] const qAnd = query.stats[0]
for (const stat of stats) { for (const stat of stats) {

View File

@@ -10,7 +10,7 @@
<item-quick-price class="flex-1 text-base justify-center" <item-quick-price class="flex-1 text-base justify-center"
:price="trend.price" :price="trend.price"
:fraction="filters.stackSize != null" :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" :item-base="item.info"
> >
<template #item v-if="isValuableBasetype"> <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;"> <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" <item-quick-price class="flex-1 text-base justify-center"
currency-text 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" /> :item-base="item.info" />
</div> </div>
</template> </template>

View File

@@ -6,7 +6,7 @@
<div class="grid grid-cols-2 gap-2 overflow-auto pb-4 px-4"> <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"> <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"> <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> <div class="leading-tight text-left">{{ item.name }}</div>
</button> </button>
</div> </div>