#tooldev-general

1 messages Β· Page 6 of 1

civic crane
#

you need client_credentials grant because it's server-to-server api scope
read the docs!

worthy cape
#

btw, on Discord you can format code snippets by enclosing them in lines of three backticks:

hasty kayak
#

Oh thanks, I tried clicking the code one and it gave me single one and didn't work, will use that next time.
Yeah ok, client_credentials, already screwed there I see.. Starting from scratch, ty for all the help πŸ™‚

hasty kayak
#

I am now doing the refresh token grant method. I understand everything except the last part of POST to /oauth/token
Where do I get the refresh_token for the first time so I can get a new refresh token?

If I understand correctly I must first do authorization code grant, this is where people authorize my app on pathofexile website.
Then on callback URI, I get their access_token and refresh_token
That refresh token can be now be used with refresh token grant right?

To explain what I want to do is to have a search of public stashes, is this the correct way to do it?

worthy cape
#

You go through the authorization flow for either an Authorization Code Grant or Client Credentials Grant based on whether you wish to act on behalf of an individual user's account or access generic services unrelated to an account.

#

The Refresh Token Grant is to re-acquire an access token previously obtained without having to involve the user.

#

(In the examples on the docs page, an user access token lasts for 30 days according to the response and the refresh token for 90 days)

hasty kayak
#

Ok, thank you. Since I want service:psapi among other scopes, I need client credentials grant.
When user authenticates, I get access_token that doesn't expire. So now, I assume I need to save their access_token and use it when they do a query with their access_token
Since those tokens don't expire, I don't need to refresh their tokens right?
I somehow save the access_token and just use it in Authorization: Bearer access_token
I don't need to use refresh token and authorization code grants if I understand this correctly?

worthy cape
#

As I understand it, a CC grant is unrelated to any end user, it's your service authenticating itself (as the owner account of the application).

#

Those are indeed of unlimited duration.

hasty kayak
#

Oh, so I overcomplicated things that I want to do. I make a post request to /oauth/token with my application id and secret and get an access_token. That token I can generate once and use forever and just use Authorization: Bearer ${accessToken} in header?

worthy cape
#

Seems right.

hasty kayak
#

Thank you very much for your help! Really appreciate it.

hasty kayak
#

Now, I got my access token and everything works fine, but this code gives me and error when I try to fetch stashes. MYACCESSTOKEN is actually my access token that I got from client credentials grant post. Am I missing something in this request?

app.get('/stashes', async (req, res) => {
  const url = 'https://api.pathofexile.com/public-stash-tabs';
  const headers = {
    Authorization: 'Bearer MYACCESSTOKEN',
    'User-Agent': 'poeapp',
  };

  try {
    const response = await axios.get(url, { headers });
    res.send(response.data);
  } catch (error) {
    console.error(error);
    res.status(500).send('Error fetching stashes');
  }
});
worthy cape
#

Otherwise, not sure. What error code do you get?

hasty kayak
#

I changed my User-Agent now correctly to include my client_id, version and email
I get 500 Internal Server Error

#

Oh sorry, forgot to change MYACCESSTOKEN to my actual token, now with works with changed User-Agent. Thank you πŸ™‚

hasty kayak
#

A question about public stashes API
I now successfully get stashes via API, I get stashes and next_change_id
It says that it's a stream containing all public stashes in all leagues and roviding the next_change_id as the id query parameter serves as a way to paginate through current and newly listed stashes
How does this exactly work? I have problems understanding this. For example, if I check one of the stashes, public is false. Is this since the beginning of API and I have to loop through next_change_id as id in url parameter until the end to get to the current new stashes?

#

Or maybe better question regarding this, the first stash when I call public stash IP is what, from when? When the API started working?

worthy cape
#

Yeah, you iterate through the sequence of stash state chronologically by using the next ID.

#

You can obtain a current change ID from either poe.ninja or the official website.

#

The ID is essentially an incrementing serial for each of the game shards, starting from like 0-0-0-0-0, but you should treat it as an opaque ID.

#

I don't know off-hand what ID you get if you request without an ID, but it's at some point in time and you can use the next ID it supplies to step forward.

hasty kayak
#

So in theory if I want to get all public stashes, they best way would be to go from beginning and store/update database accordingly to the data I get from API.
Last change id only provides the things that change the last if I am correct and there is no way to get previous change ids only next ones if I'm correct.

worthy cape
#

Some people keep track of a change-ID just at the start of a league to be able to scan forward from that point.

#

Note that you're not going to get a complete history. Whenever the state for a particular stash tab is obsoleted by a newer change, the old change ID will omit that stash tab.
The further back you look in the river, the less information you're likely to encounter.

hasty kayak
#

So what would be the best way in your opinion to process this so I get all the current public stashes? In the long run, I assume the best way to be to go through it all once and for all and store it somewhere until current change id.
I am planning to have search for standard as well so there is no other way I believe?

worthy cape
#

It kind of depends on what your purpose is for consuming the river.
If you care about the contents of old Standard stashes that don't get updated you're going to have to stretch far into the past.
For league you only need to scan from the start of the league or accept some loss and start from around current.

#

You probably want to be smart about what you store as well as it can be quite a bit of data over time, stripping out some of the chaff like item descriptions and other redundant data is worth doing.

hasty kayak
#

Yes, I would refine it all, before I make it work I want to make it as optimized as possible, but yeah, since I want from standard as well with minimum losses, so I guess going from beginning is the way to go, wondering how long will this take :/
Also, does anyone know if there is a way to get first change id from current league and if not, does anyone have saved change id?

hasty kayak
#

And also website get listed x time ago. Is there a way to get that or do I have to store datetime manually if I have a database and calculate based on that. When I check response, I can't see anything about datetime

worthy cape
#

Seems likely.

subtle gust
#

fyi some ballpark numbers. I started calling the public stash api 5 days ago at 1 request/second and I'm all caught up now. I am storing everything as is for now and have about 400GB stored

worthy cape
#

Back when things were really clogged up I got around 5 MiB/s.

#

That's way too many leagues ago tho.

hasty kayak
#

damn 400GB. makes me wanna stop thinking about my project to make a search and make it go through the database

subtle gust
#

I am doing zero optimizations and just storing everything as is. I don't know how big it will be once I figure out a clear schema. Although that might be an issue if you don't have unlimited internet

hasty kayak
#

wondering how much would be the size after clearup and how much would server for database cost to handle all this and make it query fast

worthy cape
#

The payload is designed to be self-describing and as such is quite verbose.
Some fields you can just outright drop, while others you can deduplicate.

craggy beacon
#

Yeah a ton can be reduced

gilded tree
#

Maybe to give you some numbers, my indexer database needs around 16gb of combined indexes (some aren’t optimal but sadly needed for specific queries, that’s why the number could be smaller). Have around 5gb in cache and the indexer itself also needs some resources. So around 24-30gb of ram should be enough but can be optimised quite a bit. Think you can get quite far with 16 or even less. And you don’t even need indexes or a cache if it doesn’t have to be that fast.
It also includes history data and more things so it’s not a perfect example, so you can be fine with less.

worthy cape
#

If you're concerned about whether you may need to reprocess things you could spool out data as-is or lightly filtered in a compressed representation to disk.

#

Figuring out a good database format for this that survives league changes always feels like a challenge.

rapid pagoda
#

realistic solution: cook something up with protobuf
silly solution: .itemblob πŸ˜‰

craggy beacon
#

PoeStack currently holds 4.5GB of data from the public stash stream

hasty kayak
#

Wow, that is very little. What type of database do you use? Also are you saving everything from public stashes or skipping some things?

hasty kayak
#

As in some things, not variables in db/json, but items, but I looked at your website and I think you have stats for all except for like weapons/gear if it's not unique

hasty kayak
#

A question about stash id. Is this unique for each stash? So whenever I encounter the same one, it's the same stash and that stash will never have different stash id?

civic crane
#

yes, this how you are supposed to delist stashes when player make it private

rigid oxide
#

so how do you get the notification that a stash has been made private? do you get one with the same id but empty contents?

craggy beacon
civic crane
tender wagon
#

Hey guys, quick question. Could someone point me to some reading material on the character ladder API? Trying to figure out how to pull character data like Poe.ninja does for the builds section. Would like to set up some custom queries but can't find anything on how that data is served, only on the public stash.

cerulean flare
#

Hi, how can I get a list of someone's challenges when I have their account name as a string? I'm going to be looking only for public profiles, so I don't think I need OAuth.

In the API Reference I see that the Account structure has challenges object that would contain what I'm looking for, but I don't know how to retrieve the data for a specific account

Thanks

worthy cape
#

Everything official is behind OAuth these days and as with all the other per-account stuff you'd have the user authenticate to your service after which you get delegated credentials with which to access their account endpoints.

#

At least that's my understanding, haven't bothered setting the flow up myself as I don't have any apps to build πŸ˜„

cerulean flare
#

But with OAuth I would be able to retrieve only the logged in user's challenges? I would prefer to get anyone's challenges (if their profile is public)

worthy cape
#

With the proper API I believe that's all you have, as all the account endpoints are for the credentials you bear when requesting it.

#

Any other solutions would violate ToS.

#

The structure of the API is that you either act on behalf of an user for the account:* scopes or act as your service itself for the service:* scopes.

clever thistle
#

@cerulean flare are you confusing USER OAuth with APP OAuth?

cerulean flare
#

I believe I am @clever thistle. I thought OAuth is the "log in with poe account" where the user needs to verify giving access to the tool

rigid oxide
# cerulean flare But with OAuth I would be able to retrieve only the logged in user's challenges?...

the idea is, as i understand it, to favor hypothetical user unwillingness to give just anyone access to their data over tool developer interest.
the inconsistency between manual/private api access and public api access (user already has the ability to toggle on/off public access to their profile on private site api, but not on the oauth endpoints where it's disabled by default without the ability to override) is probably just an inconsistency that may or may not be fixed eventually πŸ™‚

worthy cape
#

I consider it two different kinds of intent.
Public profiles are for human interaction on a one-by-one basis, you get to look at some specific individual's profile and see what they want to show you, a human.
API and script access that do things in bulk are different kinds of consumers. The human may not like automation and aggregation to look at their stuff in the same way.

#

Noting that interacting with the website through any API that happens to power it or some sort of screen scraping is not compliant with the ToS.

cerulean flare
#

okay, thanks guys

formal kraken
#

Does anyone know why I can't find Seething Fury in Words.dat64 and therefor also not in UniqueStashLayout?

civic crane
formal kraken
#

oh I just found that too

formal kraken
velvet fog
#

WordslistId = 6

civic crane
#

first one is id-like, idk why we didn't rename it yet)

formal kraken
formal kraken
velvet fog
#

always use Text2

civic crane
#

always use second, it's the only one that localized

formal kraken
#

thanks!

#

nice, finally fixed - was annoying me for a while now

└─ % find ./ -iname "*seethi*"
./Seething Fury.webp
scenic crypt
#

Is there any way to get the actual explicit mods of an item via the account stash api? It seems like it only returns summed-up values which is not very useful if I want to know things like whether an item has open prefixes. Is that really all that is available?

civic crane
worthy cape
#

Judging by the API reference, everything is cooked and only the psapi has the extended section.

#

(with the counts)

scenic crypt
daring moss
#

Has anyone used the public OAuth client thing before? Any idea what this actually means?

Have shared rate-limits between all other public clients.

Do all applications sharerate-limits? Is the rate-limit per application but then every client for that application shares rate-limits? Or are the rate-limits per-account?

compact isle
#

per account

daring moss
#

Ah, okay, that clears up a lot for me. I was wondering how e.g. something like exilence would even function if it were to use public clients if it was shared between all instances of the application

compact isle
#

it's kind of implied since public clients can only interact in an account context. We should clarify it anyway

daring moss
#

Oh also, is account:league_accounts actually "for viewing the account's allocated atlas passives"?

#

Thanks for the clarification anyway!

compact isle
#

yeah it doesn't have anything else IIRC

daring moss
#

πŸ‘

patent notch
#

@compact isle sometimes on trade website "Resource not found. Offer no longer available pops up" even when item is available for sale. I have had this multiple times today but it was hard to capture it live to report it to you https://www.pathofexile.com/trade/exchange/Crucible/4rJ2VRgS9

The link above shows first few trades as "Resource not found" error but when i copied the msg and msged the person using that text, it was available. The same thing happens with first 3 results in that link, which may help you find the cause I hope.

I think this bug caused the player named "CrucSRSPoison" to sell his invitation for far less than its usual price because no one could msg him directly assuming the item is sold due to the error pop up. I am attaching few pics to show that trade was done afterwards at listed price and item was still up.

This happened with few items today, not all, In bulk item exchange.

#

Tried to clear cache etc as well but still happens.

#

Earlier today while I was trying to buy shaper maps, it was happening for few listings and not for the other, in the same link.

#

I have a video of this interaction as well if you think that will help in any ways.

frank drift
#

could be as simple as the person moving it in their stash, or putting it in their inventory and then back in the stash

patent notch
#

I have video of happening it with all the item in that link, so i doubt it, in 2nd link it happened with top listing and worked fine for others.

compact isle
#

there were some problems happening which have now been fixed

#

it'll be catching back up to date now

patent notch
#

Thanks!

daring moss
#

For public clients, does GGG permit redirect URIs to custom protocols, e.g. myapp://auth which are then caught by my desktop client? I've recently been working with both the EVE Online API and PoE's confidential client model and I am not sure which one required the usage of https for all redirects anymore

formal kraken
daring moss
#

what about regular http and localhost? Does it have to be https and/or a remote host that does the final auth?

#

because how else would I handle auth for a public client?

formal kraken
daring moss
#

Okay, but no custom protocols? So I just have to try and pick a port at random and hope no other app will choose it for anything else?

worthy cape
#

The only way I could imagine it working for "binding with port 0" would be if you provide a localhost URI and they're cool with any port being glued on. If that's not the case, then yeah, you'll have to fix your port.

formal kraken
bright ridge
#

(Reposting from TFT Dev Chat) Does anyone have any resources or example code that uses the authentication scheme for "Public Clients" (e.g. desktop client)? Massive bonus points if there are any C#/.NET examples. https://www.pathofexile.com/developer/docs/authorization#clients

The Chaos Recipe Enhancer has been needing to get OAuth integration for the longest time and I finally have some time to work on it.

frank drift
bright ridge
frank drift
#

ah the backend is

oak estuary
#

Yeah they have a server as a go-between afaik

daring moss
#

Yup, Exilence Next does not use public clients yet

#

They've only been introduced this league

worthy cape
#

Considering that Exilence is shutting down, probably never.

velvet fog
hazy fog
#

that was super interesting

craggy beacon
hazy fog
#

I am offended noone has given you tooldev

#

server fell apart without me

craggy beacon
#

LOLW I'm not sure who gives out those roles, maybe someday I'll make it

worthy cape
#

I forget who to boop <_<

patent notch
#

Don't know if the screen recording was necessary or not, but I assumed they have to check somehow that I am the same guy so I did it anyway. πŸ˜„

#
  • reddit post, github page link etc was also given
oak estuary
#

I didn't even ask and I got it 🀭

pulsar moat
round hazel
#

Anyone can tell me mod sell price value is stored to where in the dat file?

Got a list of mods (or item such as Kingmaker do have a sell price override) that have sell price in ModSellPriceTypes.dat64 only

hidden forge
#

Is there a way to export the 3d character model somehow?

worthy cape
#

I've got to make coffee for this πŸ˜„

hidden forge
#

im all ears

#

Please explain (whenever you have time)

formal kraken
#

/me googles how to unsee an image

worthy cape
#

It's "yes" in that the file formats for static meshes, animated meshes, terrain and animation are mostly figured out, we understand most of the core data.
While you can get at the raw model geometry fairly easily, it's not immediately useful as everything that is drawn by the game goes through the renderer's material system.

#

Materials don't just tune parameters for how the surface is shaded but instead generates complete vertex and pixel shaders for rendering the object.
The vertex shader takes the raw geometry, modifying any aspect of it like the texture coordinates procedurally based on any input data they have available, and also perform skinning and other transforms.
The pixel shader implements the whole object material, lighting and shading pipeline in parts. These include modifying material parameters arbitrarily per-pixel, eventually applying GI, shadows, direct point lights; the whole shebang.

#

While there's some similarities to the kind of blueprints and materials you may have in a modern engine like Unreal, Unity or Blender, it's also fairly different in some key aspects.
The material system is also rather poorly understood, I think I'm the only one in the community that have attempted a material compiler and actually rendered with it.

#

Without the material system you have very little indication of what texture goes where and what modifications are made to it when rendering the model.

#

A great example there is Jun's character model which has two textures per image file and the material samples from the left or right side depending on what data it needs. If you naively apply it as albedo and gloss it will be completely wrong.

#

There's not much in the way of tools written around this as the problem is much harder than the usual ones that game data exporters run into and the file formats evolve throughout the leagues, we're at like version 15 of animated models now I think.

#

But yeah, to answer the original question - you can kind of export geometry but depending on your intended use case it may be extremely unfit for purpose.

#

All my effort around this has apart from some in-house exporters for 3D printing experiments, it's all running inside my own custom renderer intended for my tool projects - reinterpreting it for some other environment is a huge effort which several people have tried; including Chuan's defunct model viewers for poedb and poeloremaster's viewer.

worthy cape
#

I'm personally not super keen on making and providing tools around this as it more often than not is going to be used for asset flips or other sketchy or unsavory content with no interest in preserving the artist intent.

hidden forge
#

just thought it would be cool to have my character in one of my videos

#

but sounds like too much work

#

thank you for explaining

worthy cape
#

I had some plans in the past to make a nice little asset viewer which content creators could use to render high-quality video snippets of characters and objects to include in their videos, but the technical problems are still too steep to do that well.

#

Equipment is fairly straightforward, hide the shapes of the model that equipment replaces and also render the equipment pieces attached to joints.
All the VFX I haven't even dared touch yet, it's a completely unknown system to me.

#

Also had some ideas about a dress-up tool where you could try out different MTX and armour pieces, but again same kind of technical barriers.

smoky temple
#

Does anyone here know if there is something similar to the skillTree.json for all the items in poe. Would need data of all uniques, div cards, currency, .. in form of json files if possible, didnt find anything yet, the only thing that came to mind was writting a crawler that reads through the data present in the wiki.

formal kraken
#

Most of the data you're looking for should be in data/BasteItemTypes.dat64 and UniqueStashLayout.dat64

smoky temple
#

@formal kraken Aight thanks a lot, gonna check out the .dat64 files using the viewer, and figure out how to compile the data

lunar crypt
#

hi @civic crane im trying to export the data using pathofexile-dat and im wondering if there is a built in way to dump an entire table or all the data without adding every table and column to the config?

civic crane
#

no

lunar crypt
#

also any way to dump the unknown columns?

civic crane
#

yes in web ui

lunar crypt
#

ah ok, was hoping i can dump themp from the cli

#

im trying a proof of concept new workflow for the wiki

lunar crypt
#

i assume the column names need to match whats in the actual data, since it wont accept anything else

civic crane
#

yep, don't want the data to become corrupted because someone renmaed column in schema πŸ˜„

lunar crypt
#

Ah so it needs to match the schema, not the values in the game files?

#

Anyhow I wrote a parser to create the config from the exported data from dat viewer minus the unknowns and was able to get all the known data

tender radish
#

What are current limits for api requests through oauth?

I'd like to use private stash tabs scope, and would like to know what I would be working with. Thanks in advance

outer jay
#

There's no fixed limits only dynamic ones

#

So it depends on load

lunar crypt
#

hey @civic crane i have another question, i see the latest json schema has some tables that are not in the game data like ShrineBuffs

civic crane
#

doesn't hurt anyone to keep it there

lunar crypt
#

is there a way i can get a similar json with the core data?

#

without me interacting with the gql

civic crane
#

no

lunar crypt
civic crane
#

my exporter is oriented for granular export, as fast as JS possibly allows it, therefore I don't care what in schema doesn't exist anymore πŸ˜„
for exporting everything based on schema and to use in wiki sql joins better to look at #680796887259021342 message

lunar crypt
#

for context what im trying to do is to generate the config.json for the pathofexile-dat export

#

and i want pretty much all the known data

#

i guess ultimately i can throw gql on top of my db and call it a day

#

but id rather not do that

lunar crypt
#

I guess graphql it is

#

Just makes it easier for me

fading bone
#

@compact isle The certf for web.poecdn.com seems to have expired, figured I'd give you a ping but I'm sure you're already on it.

lofty berry
hazy wigeon
#

A very big and exciting evening for me, finally released a big batch of fancy features for PoeFilterX!

https://pathofexile-discuss.com/post/119

This is a pretty huge one for me folks, after a few months of work I finally
managed to get PoeFilterX to the point of where I wanted it, enabling the
absolute most critical of features I have been hoping to get working since I
first started this project. # I am pleased to announce the release of V3.19 of
PoeFilterX! (Technically its 3.19.3, bec...

daring moss
#

Hiya, was wondering if anyone else here has been using public clients. Specifically, is anyone else also not getting a refresh token during their auth flow? According to the docs we should be receiving one usable for 7 days

#

but in the end this is what I get (not json but the debug formatting from rust)

StandardTokenResponse { access_token: AccessToken([redacted]), token_type: Bearer, expires_in: Some(36000), refresh_token: None, scopes: Some([Scope("account:characters"), Scope("account:stashes"), Scope("account:league_accounts")]), extra_fields: EmptyExtraTokenFields }
daring moss
#

Is this intended behaviour or am I doing something wrong?

hazy wigeon
daring moss
#

Yeah, this is what I get back after a user auth's and I trade in the code for a token

#

going by GGG's docs it should also just include a refresh token in that response and I don't think it would be a problem with the oauth2 lib I am using

#

given its usage I'd think more people would have noticed this if it was a problem with the crate

hazy wigeon
#

hmmm the library perhaps could be the issue but, IIRC GGG adhered to the standard for OAuth v2

#

do you have a way to inspect the "raw" response you got back with all the headers and whatnot, rather than the coerced type response that has been deserialized?

#

btw, if its handy for you, awhile back I started development on a basic Path of Exile API Emulator, for local development testing without needing to get rate limited by GGG's servers, it might be useful for you. It doesnt have all the API endpoints emulated unfortunately, eventually Id like to get stash tab stuff emulated and working, but it does have login and profile stuff working IIRC:

https://github.com/SteffenBlake/PathOfEmulator

daring moss
#

give me a moment, looks like I will have to supply the lib with a custom http client to intercept raw traffic

daring moss
#

Alright, I did get the raw response body, and it is in fact missing a refresh token

#
{"access_token":"redacted","expires_in":36000,"token_type":"bearer","scope":"account:characters account:stashes account:league_accounts","sub":"not sure if I should redact this?","username":"MagnificentPako"}
#

is what I got

daring moss
#

kinda unfortunate

#

because tokens which only last 10 hours at a time are a bit... unwieldy for an application, or rather the user?

#

hm

#

the docs explicitly give an example with one included for the PKCE code grant

hazy wigeon
#

no thats definitely something wrong happening

compact isle
#

it won't return one if you can't use it

daring moss
#

ohh, I see

#

okay, would I be able to ask for it to be added or is this intentional?

compact isle
#

flick an email to oauth@

daring moss
#

will do Prayge

daring moss
#

Aight, if this happens to anyone else, it was a problem with the grant missing and an email saw the required grant added within a few days

#

not sure if I didn't have the grant because I didn't explicitly mention it initially or it was removed when I asked for an existing application to be transitioned into a public client. either way, sending them a mail is all y'all need

round hazel
#

another silly question again. Where the monster mod text stored (the text that under the nameplate). I want to figure out the new "Hasted" mod 's actual affix name and id

velvet fog
#

ArchnemesisMods.dat64

round hazel
#

then it does not make sense. "MonsterModSpeedAura" is displayed as "haste aura" but not found in bufftemplate .dat (so that does it really grant haste aura? edit: tested it does grant the aura), while the current of hasted (MonsterModAttackCastMovementSpeed) seems the same mod

or does the game code the aura in new way?

honest hollow
#

hey

#

how can i download awakened trade api for win10

silent tree
civic crane
#

win11 is win vista reskin* everything will work on your ten πŸ˜„

daring moss
#

does the lifetime of a refresh token change when you refresh an auth token?

#

public clients get 10h on the auth token and 7 days on the refresh token. If I refresh a token a day after the user logged in, do I get a new refresh token back that is valid for another 7 days (so I can indefinitely refresh tokens as long as the user keeps using my app), or do I get the old refresh token back/a new one with a 6d lifetime so that I am forced to fully re-auth the user once a week?

fleet grove
#

You make a new one

coral terrace
#

How do you get a refresh token

silent tree
#

do the pkce setup then get a code from /oauth/authorize, then post the code to /oauth/token

#

should be some detailed setup steps somewhere in the poe oauth docs

unreal raft
compact isle
#

unique per stash, yes

#

though some actions can lead to stashes being recreated (map / unique stash subtabs / remove-only tab shenanigans)

unreal raft
compact isle
#

correct

unreal raft
inner sundial
#

hey mates do u know is there an api with reset ladder / seasons ?

worthy cape
#

There is an endpoint for leagues but the end date on it is seldom accurate and only really updated as it's nearing the end, if ever.

inner sundial
#

thats ok I just want the start

#

meeeh but the api should be updated with the next one just before it comes

#

right ?

worthy cape
#

Two-year league, woo!

#

I've got no idea about the timeline for how it's updated. Also not sure if it has private leagues if authed.

inner sundial
#

u can plan nothing with that 😦

worthy cape
#

In practice, the only actionable information you have is the human-readable that come out during the hype cycle.

#

For 3.22 in particular, they've given a timeline which I can't remember at the moment but something like "two weeks after Exilecon" as travel advice.

inner sundial
#

ty

worthy cape
#

@inner sundial https://www.pathofexile.com/forum/view-thread/3351803

Path of Exile's 3.22 Expansion
If you're coming to ExileCon and wanting to do some travel within New Zealand around that time, we are generally recommending that people travel before the convention rather than afterwards. The reason for this is that we are currently planning to reveal our 3.22 expansion at ExileCon and its launch will take place soon after, likely around two weeks afterwards.

frank drift
#

China "rumors" put it at 3 weeks after, but GGG already denied much of those rumors, so no reason to think it's accurate

silent tree
#

unless some major infrastructure changes are announced soon the specific release date shouldn't make a difference

#

generally u should be able to have ur tools consuming the api switch to the new league when it becomes the current one

formal kraken
silent tree
#

crucible queue was pretty close to that

#

(17:30 utc would've been 18:30 uk i believe)

past merlin
#

Does anyone know if the public stash API endpoint (GET /public-stash-tabs[/<realm>]) can accept filter parameters other than pagination? Specifically I'm interested in filtering on:

  • specific league within a realm
  • stash type (for example, just unique collection tabs)
worthy cape
#

The river/psapi? Nah, it's very plain.

past merlin
#

So the only way to catch up with the current state of a given league is to process all historical data available through the psapi?

past merlin
#

Thanks to both of you πŸ™‚ @worthy cape @velvet fog

velvet fog
worthy cape
#

If you only care about things happening since the start of the current temporary league, you can begin from a known ID near the league start rather than the beginning of time, but that's about it.

#

(1845206211-1842338811-1783252826-1974951538-1918151925)

past merlin
#

Both helpful approaches, thanks! The application in question is a ladder for tracking the unique collection tabs of people in SSF leagues, which I'm not sure the trade API still works with (on the trade website you aren't able to select SSF leagues to search your tabs, though I haven't tried it in postman yet). So going through all the trade league data is really overkill for that kind of project. I'll look into whether the query API can still work with SSF leagues (I'm not the author of that website, btw - just asking here on their behalf)

e: As far as I can tell the query-based search is disabled for SSF leagues and results in 400 with {"error":{"code":2,"message":"Invalid query"}}

turbid cosmos
#

Can I use a "client_credentials" grant in tandem with the "account:stashes" scope to view users' account stashes other than my own? I want to avoid using the river/psapi if I can

#

The error messages suggests that I might be able to if I get the additional scopes for my app: 403{"error":"insufficient_scope","error_description":"The request requires higher privileges than provided"}

exotic egret
#

Can I use a "client_credentials" grant in tandem with the "account:stashes" scope to view users' account stashes other than my own?
No. The scope is for all stashes for an account. Accounts need to give your app permission for their stashes, so you'll need the authorization_code grant implemented, and the account to grant you the permission for that explicitly.

velvet fog
#

Patch 3.22 placeholder: August 19th (NZT)
source: https://api.pathofexile.com/leagues/Crucible

{
  "id": "Crucible",
  "realm": "pc",
  "url": "https://www.pathofexile.com/ladders/league/Crucible",
  "startAt": "2023-04-07T20:00:00Z",
  "endAt": "2023-08-15T22:00:00Z",
  "description": "Harness the power of the Crucible to forge weapons of great power.\n\nThis is the default Path of Exile league.",
  "registerAt": "2023-04-07T17:30:00Z",
  "delveEvent": true,
  "rules": []
}
worthy cape
#

Could be placeholdery still.

silent tree
#

well that's better than the 2 years it said previously

velvet fog
#

ya, another placeholder

turbid cosmos
hard jungle
#

Hello, new to the world of swe dev. Was wondering if anyone can direct me towards how sites like vhpg or poedb obtain their gem weighting data. can't find anything related to it on RePoE and PyPoE. Thanks in advance

lunar crypt
#

You can use this to have a look around the files for more convenience

lean phoenix
#

I cant set Item Filter Validation to false/disable. Set to true/enable works, but disable not . The way is set url with ?validate=true during API request, but with false not works. Omitting not works, adding as JSON request body parameters not works.
My site https://php10.5v.pl/simplefilter/

golden knot
#

Wouldn't you just omit that parameter completely in order to not validate the filter?

lean phoenix
#

omitting not reverts validated filter...

worthy cape
#

@rancid atlas I see you forked SimpleGraphic a few days ago. I should tell you that we have extensive work done on a portable version of it in development for a good while now built around GLFW3/ANGLE and recent 64-bit LuaJIT that builds on all three OSes.
I'm currently revamping the font rendering and investigating scalable UI, as well as fixing the layer violations in drawing.
I'd love to hear what your plans are here and what work you're doing, as SG is a huge project to take on and we've already done a lot of the heavy lifting.

#

I'm on vacation for another week or two but figured I'd reach out before you spend too much time diverging already.

#

A lot of the cross platform stuff works as PoC but kind of needs a champion and enough support crew too motivate packaging it up and shipping it, whether it's outsourcing it to packagers like the AUR peeps or doing a standalone deployment or recipes for particular distros.

#

If you're curious you could reach out to me or the other PoB people or the Discord to chat about it.

rancid atlas
#

Hey @worthy cape , thanks for reaching out, that's very kind of you. πŸ™‚ To be honest I've seen the merge request for angle/glfw, but I thought it was abandoned (probably because of github labeling the commits as "2 years ago", despite there being some recent commits too). I wanted to add much of the same (glfw in particular for Linux/Mac), but without touching any of the Windows stuff to avoid regressions for heavy users and to keep the changes as simple as possible. Knowing now that work is still being done on that branch, I'm happy to contribute there instead if we discuss how I can help. I'm also happy to package stuff for AUR, maybe even brew or an ubuntu PPA in the future.

worthy cape
#

The short story is that the branch started out as a revamp of context creation and windowing to get around the driver crashes that people had with the OpenGL stack.
GLFW's combined video/context/everything kind of cut straight across the previous separation of the runtime so rather than adding a separate one I broke the established interface and replaced and reorganized the "win" part, which ended up portable after seeing if I could.
The idea now is to try to bring it into a state where we can ship it as the beta channel to get it working for end users, but the polish needed is a lot thanks to the inherent complexity of the Lua side and I've been quite bogged down with life stuff.
Much like you, we aimed to do the renovations inside the actual codebase rather than adopt a remake like pobfrontend or something novel.

#

There's instructions on getting in touch in the CONTRIBUTING.md document in the repo, I believe.

lean phoenix
#

I cant set Item Filter Validation to false/disable. Set to true/enable works, but disable not . The way is set url with ?validate=true during API request, but with false not works. Omitting not works, adding as JSON request body parameters not works.
My site https://php10.5v.pl/simplefilter/

silent tree
#

what exactly are u trying to do

#

if u dont want to validate the filter just dont set the validate filter param

lean phoenix
#

πŸ™‚ hehe but if I want invalidate, then what I should to do ? I want to do exactly what is written, set invalidate.

worthy cape
#

It feels like you might be searching for a functionality that isn't there, or might be misunderstanding the purpose or misinterpreting the behaviour you see.
As I see it, item filters are by default as-is, and the optional query parameter indicates if you wish for the endpoint to perform live validation.
It's not a boolean choice of true/false, it's either present (doing the validation when posting) or absent (which assumedly doesn't).

#

Could you elaborate on what it is you're trying to do here, what you expect it to do and what instead happens?

#

If the endpoint rejects your create/update requests, it may be a sign of some other misuse like some invalid argument or malformed payload.

#

I would expect that ?validate=true performs a similar check like the game client does when you load a filter and it warns about things like item types that don't exist, etc.

silent tree
#

validate isnt a property of the filter it's just an instruction for the server to validate it

#

u cant revoke validation as any filter that hasnt been manually validated is by definition not validated

lean phoenix
#

Filters on www site in filter section have validation option to enable or disable. It works. In documentation states what You wrote it is for enable - https://www.pathofexile.com/developer/docs/reference#itemfilters, but not states that it works in one way, direction and can't be disabled. My site edits filters and should be option to revert/enable back validation. But as mentioned in documentation there is no information that through API it works only in one direction. Query have no alert and no rejections it returns 200. I noticed no error.

worthy cape
#

That's a better description, thanks.

silent tree
#

what do u mean by "revert validation"

worthy cape
#

This is the checkbox I assume they refer to, in your set of item filters on the main website.

lean phoenix
#

Yes this is and through API disabling not works......

#

You can check on my site, enabling works perfect diabling not

#

In documantaion there is no information this is in one direction....

silent tree
#

i took the docs to mean it will validate the post once rather than setting that flag permanently, does it instead set that checkbox?

lean phoenix
#

Sorry I don't know what You mean (english not fluent)

#

In site works in API not, only permament check this checkbox. By API could not be disabled but by www site it could be disabled with easy....

silent tree
#

does the api request with validate=true also update that checkbox when u look at the filter in the site

#

when i read the docs it sounded like it would validate the filter once only

lean phoenix
#

And there is no information that in API it works only for enable. Filter could be disabled only by site....

#

hymmm then in docs states it works only for validate , only ??

#

Then this is intended ?

worthy cape
#

Only the relevant people at GGG can answer it properly, but the text strongly suggests something by saying that the only legal value is true.
Now if that is because of some bug they had to work around or some design choice, we don't know.

lean phoenix
#

I post Them email yesterday in this case.....

lean phoenix
green geyser
#

hey guys, i got a quick question about the public-stash API: currently I'm consuming 1 next-id once ever 1.8 seconds on average, assuming I start at the current next-id, will I be able to keep up with changes or am I kicking water up hill?

worthy cape
#

The impression I get is that you'll be running approximately as fast as the rate limit and keep up most of the time.
There's the old trick of grabbing the next ID early from the first bunch of bytes before you fetch and process the rest of the payload, so you can pipeline a wee bit.

green geyser
#

too bad there's no HEAD option available, i'd just be able to grab the next-id in advance and just put them in a blocking queue somewhere

worthy cape
#

Ooh, they put it in a header these days? That's neat.

lean phoenix
# worthy cape Ooh, they put it in a header these days? That's neat.

I noticed You have tried login via my site about 14.00 +1UTC, I have your session in base, but is something strange. I have Your login and session named as athorization. During authorization login should not be present. Login should be provided after full pass of Authorization. Did You receive some error or something strange ??

worthy cape
#

@lean phoenix yep, both as I first loaded the site as the last line of the interface and then also a plain page with just an error as the login flow tool me back to your site from the GGG Auth page.

lean phoenix
#

502 bad gateway ?

worthy cape
#

Not at any computer now so can't get you better info.

#

Nah, more verbose than that.

lean phoenix
#

Site is finished and implemented full OAuth like no other with session manager, refresh token options like auto refresh of acces token, refresh by hand access token etc, all is finished many time agoo and You had error ?? siet....
it's a pity that you didn't take a screenshot, maybe it's from the server side, because for now it's running on a free server, but it still surprises me because I shouldn't get a login. Generally, the GGG servers responses tragically slow, I even put a measurement time and it's always about 2000ms, which is 2 sec ! My scripts quering to databse etc have 1ms......

worthy cape
#

I assumed it was work in progress as already the very first page I visited had inline error text.

worthy cape
#

That's what I got when returning from the auth flow, it was still in my tab close undo history.

#

(or possibly from a fresh request, not sure if it reloads the page or not when reopening it)

lean phoenix
#

oooo Ok I know what it is . It is part when session gets name ok THX going to check ! πŸ˜‰

worthy cape
#

That is, from a page with URI like: https://php10.5v.pl/simplefilter/?code=NNN&state=NNN

lean phoenix
#

Fixed !

worthy cape
#

Main page btw:

#

(haven't tried re-logging in yet)

lean phoenix
#

Siet a fuc... eaven I had bug. It was for session name for separate sessions in the same machines πŸ™‚ ..........all is good now !

#

This site is good at the bottom are addition information etc it is good 200 is code response means OK etc

worthy cape
#

Yeah, I just assume it's not intended if what's essentially a raw request logged to the page πŸ™‚

#

In any way, the login process seems to work now, showing session info in that table cell now instead.

lean phoenix
#

This was a bug during read what browser you use. From $_SERVER['HTTP_SEC_CH_UA'] or $_SERVER['HTTP_USER_AGENT'] and first was $_SERVER['HTTP_SEC_CH_UA'] and should be :
if(isset($_SERVER['HTTP_SEC_CH_UA'] ) ){ πŸ™‚

#

Yeah You have Firefox-N0Dh. How it is look ?? If You have no item filters created then You will have only session info not a item filter....

worthy cape
#

I've got one filter from the dark ages.

#

Can't really dig much into the site or test around, only pulled out the laptop to get you the proper error message.

lean phoenix
#

All is encrypted in database with your key . From database no one could read your tokens etc . Key is transferd during cookie read etc, this is not SID. Administrators cant read encrypted data....

#

Ok

inland wedge
#

hello

#

can anyone help me?

inland wedge
#

Where can I register an client?

formal kraken
#

read the link

#

but you'd have to send an email to ggg

#

but you should really read through the docs before sending the email

inland wedge
#

Thank u

formal kraken
#

Unfortunately just trying stuff with the API has become a pretty long task, but the oauth stuff also has its upsides

lucid grotto
#

Heya, just one quick question:
I got fed up with the terrible Map stash filtering ingame, so I decided to write a little tool to properly filter through a map stash.
The Problem is now the rate limit. As far as I can see, you need to create an API call for every single map type.. and you can only call the stash API 30 times in 5 minutes. So it takes like 20 minutes to pull an entire map stash, which is a bit absurd.

Has anyone a solution for that? Something I am missing? Or is it really intended that it takes 20 mins?

frank drift
#

that's the reality of it unfortunately

#

I think Zach of poestack had some ideas for it but not sure what they are

light tide
#

Good morning (at least in Europe^^), I would like to access the sound effect files in PoE for some modding experimentations. How can I do that?

worthy cape
#

Modifying the game files is against ToS, won't help you with anything around that.

#

Nothing off the shelf will work, there's quite a bit of legwork needed to even read them.

light tide
#

I understand, thanks @worthy cape

frank drift
#

why does the GGG Tracker bot keep posting random ads? twitter change something with ads and the bot can't parse it properly?

silent tree
#

pretty sure nothing changed with the bot, multi reckons it's twitter api issues

#

which given the slow carcrash that is twitter in recent months surprises probably nobody

frank drift
#

for sure

#

hopefully GGG will abandon twitter soon enough

silent tree
#

probably depends how good threads is for commercial use

long sky
#

Time to go back to rss

gilded tree
lucid grotto
neat sable
#

Hi!, So, I am learning how to code in Python and SQL(Haven't Started SQL Yet, but hope to soon) and, I am trying to figure out a way to start practicing the little code I know so far, and since I love PoE, since starting the game back in 2017, I want to try to make something, even if it's simple. Are there any reccomended places I can look, for inspiration or, maybe even looking for someone to help start developing code?

frank drift
worthy cape
#

There's a bit less available to play with out of the box these days when much of the API is behind OAuth but if you've got an idea for a service there, one can always apply for an app.

#

On the side of data access and playing with that, I'm not sure how well the PyPoE/RePoE forks have fared since I last looked.

lean phoenix
#

In the case of coode validation. I got the answer that this is intentional and indicates the server should validate the provided code in the request before saving. However it is litle nonsense. First of all, behavior differ from this on www site in filter section, where you can uncheck validation, but here you can't. We always receive from the server that the filter is checked, even though it is not, it cannot be changed. For me this is strange and should not be differ in behavior from site, second, if resource should be checked on demand then why the status of validation as checked is received by OAuth request ??

silent tree
#

when u say "receive from the server that the filter is checked" do u mean the response includes a field that states it's been validated? iirc the only acknowledgement in docs for validation is, if u do a POST to update an existing filter and set the validation flag, then the response will include the validation errors

#

i think as long as u pass a valid request (regardless of filter validity) as a POST to a new filter u always get the same response

#

as a side note it feels like the call to update a filter should probably be a PUT but i guess it might just be overwriting the existing record completely behind the scenes?

#

nvm im dumb there's a valid field on the filter object that my eyes just slid right over

#

ah it's always true if a validation is returned

lean phoenix
#

I don't know if We understand clearly. For me it is simple. www site differ from API. On site You can check and uncheck simple. In API after check i.e. by PHP function and POST etc, You can't uncheck this. If You request for Item Filter data with API You always received it is check. You can't unchceck this with API in any way.....

silent tree
#

does sending a request with validate=true check the box on the website?

civic crane
#

ok, someone fked unicode, and they are yet to recover russian translation riffLul

lean phoenix
#

On the poe website it's different. Why I don't care, but the validate field is called should_validate and not valid (different names when received fileds from serwer: you get valid, you set validated )as it is in the API. In the API documentation, to enable validation, it can only be done with an additional variable in the GET ?validated=true field and not in the JSON section. All is described in API documentation:
https://www.pathofexile.com/developer/docs/reference#itemfilters
After that, I tested many other options, because maybe GGG got lost somewhere and somewhere you can, but you can't.

#

JSON received after call:

{
"filter": {
"id": "....",
"filter_name": "SimpleFilter",
"realm": "pc",
"description": "...",
"version": "Crucible",
"type": "Normal",
"public": true,
"filter": "code of filter.....",
"validation": {
"valid": true,
"version": "3.21.1",
"validated": "2023-05-31T15:07:39Z"
},
}
}

#

HTML Code on poe site:
<input type="checkbox" name="should_validate" id="should_validate" class="should-validate" value="1" checked=""> but this no matter, They could process differently on the site then in the API...

silent tree
lean phoenix
#

yes:

"validation": {
"valid": true,
"version": "3.21.1",
"validated": "2023-05-31T15:07:39Z"
},

#

And there is no way to invalidate this by API. You can only uncheck by WWW site.....

formal kraken
#

Have you tested if this actually has an effect or if this is purely informational?

#

They may still send validation information but still allow invalid filters

silent tree
#

the validation date on that is the same as the one in the previous response

#

so it's not validating it again

#

per docs valid is always true regardless of whether validation=true is sent as part of the request - the informative fields are the other two in the object

lean phoenix
formal kraken
#

so it does reject invalid filters if validation is not enabled?

lean phoenix
#

No there is no error, simple after validated - invalidated filter It is always validated and there is no way to invalidate it....

worthy cape
#

Sounds like a fun discrepancy, but I'd chalk it up to the site being somewhat differently-abled and richer, either by design or by omission on one or the other facet.

#

You might get an explanation or an intent on where it's going, or you might not get anything and have to deal with this reality.

silent tree
#

that field is always true, it doesnt have any bearing on the outcome - if u have ever validated a filter u will get a validation object in ur response

worthy cape
#

Better plan for the latter regardless.

#

Sometimes things don't work out for you.

silent tree
#

the relevant parts of the response are the version and validated fields

formal kraken
#

I dont understand where the problem is, but sounds like at this point all you can do is open a bug report

silent tree
#

in the second snippet u posted, the validated value is set to the same as in the previous response

#

which indicates that it has NOT been validated in a second request

lean phoenix
#

in query for given filter, you always get that it is validated - stupid.... πŸ˜›

silent tree
#

and instead has returned the last time it was validated

lean phoenix
#

But why by API can be invalidated , for what ??

silent tree
#

i'm confused what u want to do

#

u want to get an existing filter, that has been validated, and invalidate it with no changes?

#

that doesnt make sense - once it has been validated, it will always be valid until changes are made to the filter code

lean phoenix
#

ehhh I made changes and cant invlidate , simple on the www site you can invalidate by API You can't , what is strange in my question ?? πŸ™‚

silent tree
#

the filter has not been revalidated unless ur request url includes validate=true

lean phoenix
#

eeeeeeh it NOT contain THIS I tested in many way , how I can describe it easer ?? πŸ™‚

silent tree
#

check the time in the validation object man, its the same as before - no validation has taken place after the second request when u didnt set validate in the url

#

that sounds to me like its exactly what u want to be able to do - to post changes without having them validated

worthy cape
#

It makes sense that you're not able to destroy that piece of information, as it's a record of something that has happened in the past and nothing you do onward can change it, except performing a new validation later on?

silent tree
#

i'm having to make some assumptions based off the docs and koszmarnica's info since i'm still waiting for my sandbox site to finish being set up to do my oauth request but yes it looks like that's exactly it

#

i think the confusion here is stemming from how the official site has users update their filters - the checkbox to validate the filter looks like it's preserving whatever setting the user last chose

#

in api terms that just means it defaults to appending validate=true to the url if the user chose to validate the filter last time

#

i'm prepared to be wrong on that since i can't test it myself yet but going on how ggg also apparently confirmed this is all intentional...

worthy cape
#

I've been thinking about requesting a test app with all the bells and whistles to test things out, but it's better for my time to not have that ability πŸ˜„

lean phoenix
#

I have checked again . Change name of filter(for some changings) and send validated=true (again because filter was validated) and the date was not changed Last updated: 31 May 2023 15:03:10 PM

silent tree
worthy cape
#

Did you also alter the filter text? Otherwise it might be caching outcomes?

silent tree
lean phoenix
lean phoenix
# silent tree the url field is ``validate`` not ``validated``

all is ok, just check:

public static function update_filter(string $ACCESS_TOKEN, string $ID_FILTER, array $CONTENT ){
$query_url = 'https://api.pathofexile.com/item-filter/'.$ID_FILTER;
if(isset($CONTENT['valid' ] ) ){
$query_url .= $CONTENT['valid' ]?'?validate='.$CONTENT['valid' ]:'';
unset($CONTENT['valid' ] );
}
if(isset($CONTENT['public' ] ) && !$CONTENT['public' ] ){
unset($CONTENT['public' ] );
}
return $CONTENT?file_get_contents($query_url, false,
stream_context_create(
array(
'http' => array(
'method' => 'POST',
'header' => array(
'User-Agent: OAuth SimpleFilter/1 (contact: darek334@gazeta.pl) StrictMode', 'Content-Type: application/json', 'Authorization: Bearer '.$ACCESS_TOKEN
),
'content' => json_encode($CONTENT )
)
)
)
):false;
}

#

and the $CONTENT['valid' ] is boolean not string if someone could ask....

#

If You have some filter creted then all works perfect. You can check , dates etc, function is as on above..........

silent tree
#

site doesnt seem to be working at all atm - trying to save changes returns a 512

#

[{"Count":1,"Type":"WARNING","Code":512,"Text":"Niepowodzenie aktualizacji filtra 8MpRjLuE","File":"\/home\/darek334\/public_html\/php10\/simplefilter\/index.php","Line":179}]

#

also it seems the site cant parse my filters from this league at all

lean phoenix
silent tree
#

it also looks like this is being sent by ur site as true regardless of setting

lean phoenix
#

Moment...

#

OK all is good I will explain this:

#

hidden is always send (for check if changing of some field occurs like description etc for saving resources. hidden is compared with input, on POE site is the same technique etc), input checkbox if is not checked is not send in form: Not send == false with hidden == no change. Selecting input send true: hidden input has false != true: changing was happen and through API is set as ?validate=true.
After that if has been checked now, hidden becomes also true. If You uncheck input box : input is not send by form:
no input == false, hidden = true: input != hidden : there is change and reaction is done, to not set validate etc, flow is good I checked this many times....

silent tree
#

does the same thing happen if u do the api request manually via a tool like postman, rather than through ur own code?

lean phoenix
#

No I don't check in that way,,,, ok I have things to do to next time, thx for participating in this problem I'm very appreciate for all ! I think GGG team should close to this even though it is intentional = valid bool always true.....

lean phoenix
noble ocean
worthy cape
# noble ocean Hey guys I have something not to do with an API πŸ˜„ I've written a tool intended ...

It definitely touches 7i by virtue of inspecting how the client functions albeit at a surface level, maybe 7e as it's actively producing traffic, maybe 7b if you squint at it.
From an outside perspective, of the tools that people think up it's one of the least naughty ones I've seen.
From a risk standpoint, you always risk your account and the account of others if you interact in unusual ways with game-adjacent things on your machine or produce suspicious traffic patterns.

#

If you want a certain answer (which probably is "no, don't do this"), you can email support@ to ask.

frank drift
#

emailing support is almost always a waste of time yeah

noble ocean
#

Yeah I already emailed support and they dont comemnt on that

#

But yea it is touching those points I agree but the logout macro itself is also doing that imo, as its using cports to close the socket iirc. But that can be quite a technical hair splitting which is why im not sure. I just hope that GGG gives out warnings before enforcing in that manner

#

It is in itself a net positive for the HC community so at least for the discussion this can be something GGG can also integrate in their PoE client.

worthy cape
#

I'm sure that PoE2 will fix all the fundamental problems with game pacing and the need for logout macros πŸ˜‰

lean phoenix
#

Hc is Hc and in my opinion unofficial logouts and desyncs the server is not acceptable. Instead of this macros there could be dedicated button to cut off. But there are portals through You can escape, and therefore ggg will do not changing that. Question:
if you be the owner of such a game, want users to disconnect in this way by macros ? logouts etc ?

#

In World Of Tanks if You logout and after some period login Your tank is destroyed, and there is no questions.....

frank drift
#

that opinion has nothing to do with tooldev

worthy cape
#

OP explicitly and kindly asked in the linked thread to keep the philosophy and fairness of HC out of the discussion, focusing on the legal aspects of the tool.

paper zephyr
#

Anyone here know why poe.ninja latest snapshot stopped including sort by/display delve depth? Still works for the time machine snapshots, but not latest.

fickle yew
paper zephyr
#

The depth sorting is very useful to get ideas for delve builds

fickle yew
#

Anyone going to Exilecon btw? Would be cool to meet some tooldev people.

oak estuary
#

I'll be there!

fickle yew
oak estuary
#

Definitely, I think @carmine merlin is going to be there too.

carmine merlin
#

Yep, will be there too templarthumbsup . Arriving Friday (28th) afternoon

fickle yew
#

Great. I'll arrive Thursday and be at the dinner Friday.

fickle yew
formal kraken
#

Exilecon Europe, when?

worthy cape
#

At least they're gonna show PoE2 off at Gamescom, but that requires going to Germany and being around people.

hazy fiber
velvet fog
#

tencent have exilecon at the same time in china

grave wren
#

How does that work, does GGG send Devs there or is it without GGG staff?

hazy fiber
#

probs whatever tencent staff works on the china version, as I assume if its at the same time all the NZ staff will stay in NZ

formal kraken
#

China would be easier to get to than nz...

grave wren
#

Yup. Nothing could get me into an airplane for 30+h

hazy fiber
grave wren
#

Meh sounds like torture still and a lot of money but yeah sounds a bit better

jovial fractal
#

Is there a way to get always-up-to-date item data?

#

Maybe poedb can be queried?

hazy fiber
#

I dont think your supposed to query that though, my advice would be to use the ggpk and extract it yourself

#

if you want unique mods, then querying trade site might be your best bet though

silent tree
#

depends what u want it for i suppose

#

could mean base stat data or stuff from the psapi

lunar crypt
#

You can get base stats from the wiki api

hazy fog
junior peak
hazy fiber
#

seems fine, colours probs needs work

oak estuary
#

Yeah, the other implementation I saw in a PR ended up being pretty complicated: https://github.com/PathOfBuildingCommunity/PathOfBuilding/pull/3546 If yours can simply extend the way creators already do their leveling trees I'd be more open to that. Generally PoB steers toward endgame optimization though, and will err on rejecting leveling features simply due to maintainability concerns.

velvet fog
#

_.index.bin filename checksum algorithm changed

civic crane
#

Yep, ggg lowercased folder names

civic crane
#

My only guess they hit collision, so seed it now

worthy cape
#

Oh heck. This probably broke Inya good.

worthy cape
#

I wonder if there's some far-reaching implications here, like the new particle system from PoE2 moving from string paths to path hashes and they had to krangle the bundles to match?

#

I'm on a sidetrack to a sidetrack atm, Bun won't resolve any file info hashes with the current seed.

worthy cape
#

If anyone's digging, the format of .index.dbg seems to be:

uint32 version;
uint32 count;
typedef struct {
    byte unk0[24];
    uint32 uval24;
} Elem;
Elem elems[count];

There's as many entries as file info chunks in _.index.bin, so probably something derived from each of them. I can't count, 813878 in this file, 813444 in the index.
The 24 bytes don't have any structure to them but the following uint32 is small values.

#

Could of course just be some WIP debug data that accidentally got published, much like the old _.index.txt in pre-Heist.

worthy cape
#

Enumerated all four-byte suffixes on a given file and its lowecase form, didn't match any of the file info entries, but not sure if that file still exists.

#

Not sure where to go from here, I could match compressed file slices to existing files to tell their old filenames and the correspondence to new hashes - but that on its own isn't any help.

thick hawk
#

Can't figure out new index hash algorithm 😦
I assumed the salt added to file names ("++") has been changed so I tried to bruteforce it as suffix & prefix, up to 4 characters (255255255*255 combinations per each try).
Tried to change encoding (ASCII -> Unicode) for file names.
Tried to change letter case.
Tried to use file orders as hash function parameters, both DEC, hex and HEX formats.
Tried some other well-known 64bit hash algorithms (not all of them tho).
Still no luck.

worthy cape
#

Doing some cross-referencing with the previous release I've mapped out the .dbg file slightly more, the first field of the entries is the new hash as it occurs in the file entry list in the bundle:

{
  uint64 new_hash;
  uint64 val8[2];
  uint32 file_size;
}
#

It seems like val8[0] and val8[1] are often identical, but not always.

worthy cape
#

Not related to newness either:
16379945813437288577 is a new file in 3.21.2
9363473673332662835 existed before and has different values.
13928490628064583859 existed before and has identical values.

worthy cape
#

I have an idea... new angle of attack.

velvet fog
#

I can't find .index.dbg in my ggpk file

worthy cape
#

I'm working off Steam, might only be there.

velvet fog
#

could you upload a copy

worthy cape
#

Was wondering why the file didn't show up in the directory listing... it starts with a period πŸ˜„

worthy cape
#

Way past bed time, but it's smelling of that the algorithm has changed rather than the disambiguating suffix. I see a significant reduction in occurrences of the FNV constants once all the false positives are out of the way.
bedge

worthy cape
#

I may have it.

carmine merlin
worthy cape
worthy cape
carmine merlin
worthy cape
#
Index bundle decompressed, 22260264 bytes
Bundle count in index binary: 34138
File count in index binary: 813444
Decompressed inner size: 17339183
Done, 813444/813444 extracted, 0 missed.
#

Need to conjure up some auto-detection logic for Bun to look at the root pathrep's hash to determine which algorithm/seed to use.

worthy cape
#

@velvet fog @thick hawk @civic crane @carmine merlin @formal kraken - for you and other people playing at home:
The hash algorithm is MurmurHash64A with a seed of 0x1337b33f. The old ++ suffix is gone, both file and directory paths are now lowercase with forward slashes, no trailing slashes.
You can use the hash of the root directory entry as a sentry to tell whether you're using the old hash or the new hash with the specific seed.
The old root is 0x07e47507b4a92e53, new is 0xf42a94e69cff42fe.

#

I'll be shipping an update for Bun (bun_extract_file) once I run through one last set of extraction tests.

swift beacon
#

lol @ 0x1337b33f

#

Finally I have an excuse to wear this shirt

velvet fog
#

finding php MurmurHash64A support..

worthy cape
robust merlin
#

Oh gratz!
Meanwhile my PC keep comparing files by content and already detected 264081 new file name in 3240 bundles... I'm so glad I can stop the process lol.

civic crane
#

Ok lowercase filenames are quite painful to work with

#

Also, I don't know since when, but Art directory is no longer special "glued" into root...
And cachedshaders dir too

swift beacon
#

Not sure if this is a recent change, but it looks like the format of the .dds.header files has changed.

worthy cape
#

The version number has indeed changed from 1 to 3 for this file I'm looking at.

worthy cape
#

(revised, had mixed up proxy and full sizes)

#

unk4 seems to commonly be 0xD5, 0xCD and 0x15, could be something derived from pixel formats maybe?

#

Feels like it should be some information about the full image that is needed ahead of time for the pipeline.

#

Files with 0xCD seem to be BC1, files with 0x15 seem to be R8G8B8A8, 0xD5 seems to be BC7.

rapid pagoda
#

wonder if it's an oodle texture thing

worthy cape
#

If my tools weren't horribly broken it'd be fun to run some sweeps across the data and see what maps to what, but that's not happening.

#

Also still working off that lack of sleep, so bedge seems alluring.

worthy cape
#

Made Bun slightly more future-proof in case the seed changes some day.

worthy cape
#

Ooh, new dat64 in 3.21.2b - tieredmicrotransactionsvisuals.dat64. I guess something might've been split out or the next league ones are fancier somehow.

carmine merlin
#

Might be to fix this Tiered microtransactions applied to Mannequin Decorations can now only be set up to the maximum tier you have unlocked.

worthy cape
#

Ah, I think it's to support a specific (new?) MTX that may have a different UI appearance per tier.
Not gonna spoil more about it ^_^

velvet fog
frank drift
#

mirror charges

velvet fog
#

finally finished most of the file export before exilecon

worthy cape
# frank drift mirror charges

At that investment tier it has an unprecedented effect of making all items drop only in a mirrored form with an applause sound effect and a message telling you that you have spent enough to win the game.
We call this phenomenon "pay-to-win".

daring moss
#

Is my understanding of this correct in that with this rate limit policy I can at most send 30 requests every 5 minutes or else I get timed out for 5 minutes? (also no more than 15 within 10 seconds)

civic crane
#

@daring moss yes, but don't forget to add extra 1-2s to them to account for latency

daring moss
#

yeah, fair

#

I was mostly wondering about the 30 tabs per 5 minutes limit, which sounds a bit harsh

#

but I get that it is so strict for a public client

velvet fog
#

announcement page don't use PoE/Item/DeferredItemRenderer anymore, can't parse item data anymore

shadow haven
#

There is no press kit this time around?

oak estuary
#

@carmine merlin @fickle yew want to meet up after the q&a? @compact isle would love to meet you too at some point

carmine merlin
oak estuary
#

Same

carmine merlin
#

@oak estuary where to meet?

fickle yew
carmine merlin
#

Is that top floor?

compact isle
#

I can be at the mappy device

carmine merlin
#

I'm next to it. Tall guy with red hair

compact isle
#

Be there soon gotta fight off people with cards

lean phoenix
#

Ok I reported this as Bug finally, The Validation case by API, because the date is not changed. Soon next step in my site the personalization of Currency section in https://php10.5v.pl/simplefilter/ I'm excited ;)...

hot karma
#

hi, my pob became super laggy and stuttery for no apparent reason, it worked just fine previous years lol, I tried doing fresh reinstall but it didnt help. Any clue why ?

#

I use the latest version of pob community edition

grave wren
#

Try the standalone version maybe that helps

hot karma
#

kinda odd how u got "tooldev" role without knowing that

grave wren
#

kinda odd yes

#

download portable, try that

hot karma
#

okay lemme try that

#

yeah, it doesnt stutter anymore, Thanks a lot! @grave wren

daring moss
#

I don't get what Faust's role has anything to do with their knowledge about PoB. We're not a PoB support channel

#

for all you know they might be the person keeping poe.ninja together

worthy cape
#

@hot karma There's been some people reporting similar problems lately. It'd be interesting to see if there's anything especially weird about your existing configuration (settings.xml + builds) vs. what you have in the portable installation.

hot karma
#

ill gladly help, give me a minute

worthy cape
#

I'm kind of busy tonight, but it'd be interesting to know if you've got something abnormal, like way too many shared items (a typical settings.xml is like two kilobytes), or something else that's off.

rapid pagoda
compact isle
#

Hm proper link is without the www but that is still v weird

rapid pagoda
compact isle
#

Fixed πŸ‘Œ ty

quick gorge
#

Is there a api to get images from the cdn? currently i'm developing a browser tool in angular (mainly to learn angular :D) and i can extract the list of available maps from https://www.pathofexile.com/api/trade/data/static.

but there are no image-links in that json :/

civic crane
velvet fog
waxen musk
#

Uh am I going crazy or VisualGGPK2 no longer supports steam?

#

steam_mode.bat is not there and if i add -steam option directly its missing oodle dll

worthy cape
#

Sounds like fun. @vestal pond - that's your project right?

vestal pond
waxen musk
#

its not in the releases no. i copied it from an old folder and it works now

#

oo2core_9_win64.dll specifically

lean phoenix
#

OAuth etc, create item filter. Is the filter parameter of json body required ?

silent tree
#

docs say yes

#

in what scenario would u want to create a filter without a filter

lean phoenix
silent tree
grave wren
#

Any Param without a question mark in front is required

lean phoenix
#

OK.

lean phoenix
#

siet nothing works, I don;t know what it is I receive list of filters except new filter data. It should work the function is similar to update almost the same except id in link:
https://api.pathofexile.com/item-filter/

/**/
public static function create_filter(string $ACCESS_TOKEN, array $CONTENT ){

        $query_url = '';
        
        if($CONTENT && isset($CONTENT['filter_name' ] ) && $CONTENT['filter_name' ] ){
            $query_url = 'https://api.pathofexile.com/item-filter/';
            
            if(isset($CONTENT['valid' ] ) && $CONTENT['valid' ] ){
            $query_url .= '?validate=true';
            unset($CONTENT['valid' ] );
            }
            if(isset($CONTENT['public' ] ) && !$CONTENT['public' ] ){
                unset($CONTENT['public' ] );
            }
        }
        echo json_encode($CONTENT );
        return $query_url?file_get_contents($query_url, false,
            stream_context_create(
                array(
                    'http' => array(
                        'method' => 'POST',
                        'header' => array(
                            'User-Agent: OAuth SimpleFilter/1 (contact: darek334@gazeta.pl) StrictMode', 'Content-Type: application/json', 'Authorization: Bearer '.$ACCESS_TOKEN
                        ),
                        'content' => json_encode($CONTENT )
                    )
                )
            )
        ):false;
        return false;
    }
#

I think problem is with code in filter parameter....

#

but I set only Show - one word and not works too.....

#

OK targeted ! The problem is with / at the end of URL !!!!

silent tree
#

the trailing slash makes it a different url

worthy cape
#

Great fun when you're dealing with user agents or users that don't discern for sure.

silent tree
#

in general routing would expect each slash to mean something should come after it

#

a rare few restful apis don't distinguish between trailing slash and no trailing slash but i think it's pretty standard to not want one

worthy cape
#

Fond memories from making and interfacing with WebDAV - great fun when clients go into a redirect loop from non-slash to slash, or keep insisting on the incorrect slashless syntax.

#

WebDAV is nicely strict on this, which works poorly out in reality where people don't discern πŸ˜„

#

There IIRC a slash means it's a directory/collection, while no slash means it's a file.

#

In short - use the form you have documented in the API - subtle differences matter.

lean phoenix
#

πŸ˜‰

silent tree
#

but then again rfcs are made to be broken right Pepga

mild bronze
#

hi. apologies if this has been asked before but I couldn't find another example. I'm trying to implement OAuth "Public Client" and the authorization request to https://www.pathofexile.com/oauth/authorize is failing with

  "error": "invalid_client",
  "error_description": "No client id supplied"
}```
but I am supplying a `client_id` request parameter. does anyone know if the client_id has to be registered with GGG to be used?
worthy cape
mild bronze
#

does the local redirect URI port have to be static then? my code currently gets a random open port

worthy cape
#

No custom protocols either.

worthy cape
mild bronze
#

sounds like Public Clients also share rate limits across all clients using that client_id. am I reading that right?

daring moss
#

Yes, has to be a static port

#

am not novynn but someone using a public client currently

compact isle
#

I think we can do randomised but not 100%

compact isle
mild bronze
#

thanks for answering. I just have one other question to maybe help clarify. I'm not sure I understand the rate-limit. is it per client_id or per client install? e.g. two different users on different computers are using Public Client OAuth with the same app. does each instance of the app have its own rate limit associated with the authorization or is it shared across all instances of the client?

#

let me know if I'm not being clear in my example.

compact isle
#

it's per account

#

essentially public clients can't be trusted so everything is based on the account using it

mild bronze
#

thanks. I understand now.

primal schooner
#

is there any open source code i can look at that would provide the building blocks for targeting individual account stash tabs, akin to chaos recipe or exilence ?

earnest dune
#

There is an add on called chaos recipe enhancer

#

@primal schooner

primal schooner
#

thnx

lean phoenix
#

Is somewhere JSON resource of filter syntax of conditions like SetBackgroundColor and possible values, etc ?

hexed mesa
lean phoenix
#

But I know yhis site and want this in JSON form πŸ˜‰

hazy fiber
#

you will probs have to make it yourself then

whole ruin
#

Is there a zip or similar of web assets we can use similar to the ones used on pathofexile.com ?

formal kraken
#

I also have a dump for all assets I need for pobbin

formal kraken
whole ruin
#

i didnt even consider that the logo, frame borders etc from the website are also probably in the game πŸ˜„

daring moss
#

what are you trying to use them for?

#

if its anything public you might very likely run into licensing/copyright problems

whole ruin
#

thats why i asked if they had made it available. Games often make graphics available for use on fansites

frank drift
whole cloud
#

Anyone got a link to the tool that was just posted on the subreddit a day or two ago that has a ton of different functionality, but one example is that it lets you clone certain UI elements in the game and move them to anywhere you want on the screen to make them more central / etc?

civic crane
#

So many features but I don't want to steal even a single one. Looks fancy, with wow effect, but useless on practice .. for me at least

whole ruin
#

im really tempted to use it just for cooldown timers/pulse

#

that is one thing i wish POE added as a native feature

primal schooner
#

how do you use the API to dynamically get the current league name ?

compact isle
#

there is no real "current" league so you can't really

primal schooner
#

yeah, i'm trying to determine a way of filtering it

#

but there like.. isnt

compact isle
#

the common way is to grab the first one from the leagues list and check it isn't standard

primal schooner
#

well there's at aleast start date

#

but that only narrows it to all the leageut types

compact isle
#

but outside of marketing / patches leagues are just things... it's hard on us too πŸ˜…

primal schooner
#

I gues i'll have to do multiple filters and truncate the results

#

How much I gotta slide ya to add another column into that table isCurrentLeague πŸ˜‰

compact isle
#

the thing is that that just doesn't exist

#

though maybe there is some sneak we can do hmmm

primal schooner
#

there's no db table with the leagues info in it?

#

how is the API servicing that endpoint?

#

is the Rules field adaptable?

#

oh, will the description field always contain the sentence This is the default Path of Exile league.

#

I guess I can use that

compact isle
#

leagues are dynamic and dictated by the backend. They don't come from the data files

primal schooner
#

if it always has that sentence in the description

#

I think I can use that

primal schooner
#

what are the chances of changing the description of Ruthless <league> slightly ?

#

just so it has one word in it that just the League desc doesn't (or vice versa)

hazy fiber
#

the issue with alot of this setup is private leagues

#

if you are logged in a private league is treated the same as other leagues, shows up on tradesite etc

primal schooner
#

or like making the base league desc say: This is the base default Path of Exile league.

#

because base would be unique among al league types

hazy fiber
#

cant you just filter out ssf/hc/ruthless for your usecase?

primal schooner
#

unless that start using that description other places

#

i guess i can cross that road when it comes to it

#

yeah i only get 2 results using that line from the desc

#

guess I can live w/ that. πŸ™‚

#

does file_get_contents() not work w/ the POE API ?

worthy cape
#

Don't forget to set user agents and stuff.

cobalt urchin
#

Hello guys, I'm looking to develop A google spreadsheet based on Js. This spreasheet would use PoE ninja to auto update prices. My main goal is to make a community tool for people to use much likely something simmilar to the Casual Exile document from Path of math, but for comparing flipping stuff more easily so the game is more affordable to people that can't make that much of currency in the league start. The goal is to make people use this document at first when they can't afford doing higher end stuff and make them transition from flipping to playing more quickly.

The project is using very basic Js as I'm not even close to being a developer myself.

I'm looking for some help doing the project with things like array manipulation and optimization. Nothing that would get much of a headache, but as I said earlier I'm not that much experienced with Js.

Here is what I'm looking to do with this spreadsheet:

  • Input lifeforce prices
  • Input oils , fragments, delirium orbs, etc. All that can be flipped using lifeforce (Js) - then compare the flipping value and aprox profit
  • Input known valuable unique items that can flipped (compare the cost for flipping into them)
  • input known valuable craftable items (+2 all skills, phys%+phys flat), output aprox profit
  • input card flipping (same as others)
  • input alternate quality flipping and corrupt gems flipping
  • compare all methods profit range

In the end, my goal is to make a document that let's any player make a lot of currency without the need for flipping for hours or even days. I'm looking for making them do the maximum amount of profit in the least amount of time so they can play the game and enjoy themselves more.

If you're interested in helping me out, i would appreciate that and thanks everybody that read this until the end. Thanks for your time reading it.

Pm me in case πŸ™‚

daring moss
#

Why would any of this require javascript

misty imp
#

@daring moss its just at hand in Google Sheets and lets you do things in an more idiomatic programming way, if you're already a developer

daring moss
#

I'm aware that JS is what Google offers to add more elaborate scripting to sheets, but none of what they described seems to require more than regular formulas

#

It's a very weird niche where if you had more development experience, why not just use a proper database too

misty imp
#

fetching from APIs for example is far easier with access to JSON as a first class citizen

#

the Excel way is basically pull the full collection of objects into a sheet, then basically use its existing indices etc. In JS you do the request, map the fields you care about and lay them out in the indicies that make the most sense to you. Not saying you cant do either in either language, just saying one will look normal and programmy, and the other will look like an onion of function compisition.

#

Also, if the OP has any ambition at development, last SO survey clocked 65% of developers using JavaScript, its the language that runs the internet, so a great place to have some experience even if its just means making sick spreadsheets at work that are easier to maintain.

"2022 marks JavaScript’s tenth year in a row as the most commonly used programming language."

daring moss
#

or is there no difference between a 2-mod rare and a 2-mod magic item?

silent tree
#

is it one of the items in the properties array?

daring moss
#

doesn't seem like it; here's a spine bow for reference

{
  "verified": false,
  "w": 2,
  "h": 4,
  "icon": "...",
  "support": null,
  "stackSize": null,
  "maxStackSize": null,
  "stackSizeText": null,
  "league": "Crucible",
  "id": "...",
  "fractured": null,
  "synthesized": null,
  "name": "",
  "typeLine": "Serrated Spine Bow",
  "baseType": "Spine Bow",
  "identified": true,
  "itemLevel": null
}
#

shortened icon and id so it isn't as wide

#

actually I am surprised how little there is to this item

#

hm, maybe I'm messing this up somewhere myself

#

okay, properties is not it:

{
  "verified": false,
  "w": 2,
  "h": 4,
  "icon": "...",
  "league": "Crucible",
  "id": "...",
  "sockets": [
    {
      "group": 0,
      "attr": "D",
      "sColour": "G"
    },
    {
      "group": 0,
      "attr": "D",
      "sColour": "G"
    }
  ],
  "name": "",
  "typeLine": "Serrated Spine Bow",
  "baseType": "Spine Bow",
  "identified": true,
  "ilvl": 86,
  "properties": [
    {
      "name": "Bow",
      "values": [],
      "displayMode": 0
    },
    {
      "name": "Physical Damage",
      "values": [
        [
          "64-195",
          1
        ]
      ],
      "displayMode": 0,
      "type": 9
    },
    {
      "name": "Critical Strike Chance",
      "values": [
        [
          "6.50%",
          0
        ]
      ],
      "displayMode": 0,
      "type": 12
    },
    {
      "name": "Attacks per Second",
      "values": [
        [
          "1.40",
          0
        ]
      ],
      "displayMode": 0,
      "type": 13
    }
  ],
  "requirements": [
    {
      "name": "Level",
      "values": [
        [
          "64",
          0
        ]
      ],
      "displayMode": 0,
      "type": 62
    },
    {
      "name": "Dex",
      "values": [
        [
          "212",
          0
        ]
      ],
      "displayMode": 1,
      "type": 64
    }
  ],
  "explicitMods": [
    "61% increased Physical Damage"
  ],
  "crucibleMods": [
    "Adds 2 to 6 Physical Damage",
    "15% chance to cause Bleeding on Hit"
  ],
  "frameType": 1,
  "x": 10,
  "y": 8,
  "inventoryId": "Stash1",
  "socketedItems": [],
  "crucible": {
    ...
  }
}
#

there just doesn't seem to be any way of figuring out the rarity, hrm

silent tree
#

oh properties is just how it stores mods, thought i saw that as another array somewhere

#

if there's genuinely nothing in the object that specifically indicates rarity then for anything with <3 mods u could check whether the name follows the format {a} {b} {baseType}

worthy cape
#

Vaal Pyramid Map πŸ˜‰

silent tree
#

is the basetype for those not "vaal pyramid map"

worthy cape
#

Probably - I'm just scarred from parsing guild stash audit logs.

silent tree
#

actually that wouldn't even work for unidentified items

#

but stuff like eg. chaos recipe enhancer can sort unided rares from other items so it must have a property somewhere

daring moss
#

good call ,let me check their code

#

oh neptune

#

who decided that ChaosRecipeEnhancer should be written like a mid-2000s Java enterprise app

silent tree
daring moss
#

interesting

#

looks like they don't filter for rarity

#

at least not in their companion app

#

that's done in the item filter entirely

formal kraken
#

@daring moss old code of mine uses type for rarity

silent tree
#

huh i guess they put the onus on the user to use the right tab and assume any item in it is eligible for chaos recipe?

daring moss
#

you tend to only pick up stuff your item filter marks as chaos recipe-able I guess

frank drift
#

I use CRE, it knows what's rare and what's not IME

#

@bright ridge is the maintainer

formal kraken
#

So the type has special meaning and also indicates rarity

daring moss
#

unless I linked a different app

formal kraken
#

But this is from a character query

daring moss
#

type as in typeLine?

silent tree
#

typeline is the item name in the response u got above

daring moss
#

yeah

formal kraken
#

Sorry for the screenshot, I'm on a ferry templarLul

silent tree
#

"typeLine": "Serrated Spine Bow",

daring moss
#

I'm just unsure what other type david might be talking about

formal kraken
#

My code just says .type, but maybe because it's referencing an item that's socketed into the trew

silent tree
#

yea that doesnt seem to be right for stash items

#

i should probably grab the source myself to poke at it actually, 2s

bright ridge
silent tree
#

i think the question atm is how the api returns item rarity

daring moss
#

it isn't specifically a question about CRE but rather someone brought CRE up as an example for a functionality I was wondering about

bright ridge
#

Actively working on v2 btw on a separate branch, beta release to be pushed out before league launch

silent tree
#

and cre came up as an example of an app that uses rarity to function

daring moss
#

but my assumption after looking at CRE is that it doesn't care about rarity, only the item filter does

bright ridge
#

Our implementation is a hacky work around, as we do not have OAuth set up to access the β€œreal” dev APIs

daring moss
#

I maybe vaguely remember some GGG dev mention something about rarity along the lines of it being hacky in general, but I might be wrong on that

bright ridge
#

The official APIs will give you much better item metadata including item class and rarity

daring moss
#

I mean, the data I fetched is from the official API

#

and it didn't come with rarity sadCat

worthy cape
#

Note that there may be differences between the river (psapi) and account stashes.

daring moss
#

at least according to the docs they should both handle in Item objects

silent tree
#

what was in icon?

#

i'm assuming just a ref that would point to its inventory icon

daring moss
#

idk if icon contains any app-specific data but it is just a URL to GGG's CDN which seems to contain some encoded data

bright ridge
#

Damn bro u right

silent tree
#

ah right it's only a string, for a min i thought that u omitted it because it was some giant object

bright ridge
#

0 results found for rarity wtf hah

silent tree
#

i refuse to believe it's not returned at all KEKW

bright ridge
#

Yeah so for CRE someone said it we just have it in the filter

#

I can’t believe it’s not in the actual API lmao there’s no shot

silent tree
#

but unless i'm misinterpreting what one of the properties like w or h are and they're not width and height it's just not in there

bright ridge
#

It has to be there

daring moss
#

w and h iirc are about the item's position in the stash

silent tree
#

nah theres an x and y for that

bright ridge
#

I cant look at the code rn but I’ll post here once I can see what the name of the property is

frank drift
#

weird, CRE for me will always perfectly pick out rares in a tab of mixed rarities

daring moss
#

ohh

silent tree
#

iirc w and h are item dimensions since u can also add those properties to item filters

bright ridge
#

Yeah I know we have to have the property there but idk what the name is

daring moss
#

w/h are how many stash slots it takes up then, yeah

silent tree
#

i do it to remove any onehand weapons that aren't 1x3

daring moss
silent tree
#

any chance u can do a get for an unidentified magic and rare item so we can compare each?

frank drift
silent tree
#

although if meatbox says theyre doing a hacky way that avoids the actual api then it probably isn't going to help with working out where it is in the api response

daring moss
#

I assume it just isn't included then

#

oh neptune

#

2017 coming in clutch

bright ridge
#

https://sandbox.chaos-recipe.com/

#

woops

silent tree
#

oh ok well that is NOT what i expected KEKW

bright ridge
#

item.frameType != 2

#

yeah so we have that so that's rarity

#

for some reason wtf is frametype

worthy cape
bright ridge
#

(we have a !=2 so it skips any item that isn't rare in a loop in our code)

silent tree
#

alright there it is

bright ridge
#

nice find man that's wild

worthy cape
#

Items have different frames in-game, thus frame type πŸ˜‰

frank drift
#

I knew it

daring moss
#

the yellow-goldish thing being the frame here

silent tree
#

ah yea it's right there in the response for that spinebow too "frameType": 1,

daring moss
#

yeah

bright ridge
#

nice

daring moss
#

I'm a bit surprised it isn't made more obvious

#

but also "its right there"

silent tree
#

i just completely missed that property when i was scanning through what came back from ur request before KEKW

worthy cape
#

(itemframetype.dat64 also has a reference to rarity.dat64)

daring moss
#

to be fair it was a bulky request

silent tree
#

compared to the bullshit we're throwing around at work it's pretty lightweight

daring moss
#

haha

silent tree
#

it took 4 people but we finally figured out where it was KEKW

#

if anyone from ggg's webdev is reading this maybe it's worth including this in docs

bright ridge
#

yeah fields are scuffed af sometimes.

if anyone wants their brain to break here's how we get an item base type (e.g. glove, helmet, boot) deriving from the item image KEKW

public void GetItemClass()
    {
        //https://web.poecdn.com/gen/image/WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9IZWxtZXRzL0hlbG1ldFN0ckRleDciLCJ3IjoyLCJoIjoyLCJzY2FsZSI6MX1d/0884b27765/HelmetStrDex7.png
        var urlParts = icon.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
        string encodedPart = urlParts[4];
        while (encodedPart.Length % 4 != 0)
        {
            encodedPart += "=";
        }
        string decodedItemData = Encoding.UTF8.GetString(Convert.FromBase64String(encodedPart));
        var iconParts = decodedItemData.Split('/');
        string itemClass = iconParts[1];
        switch (itemClass)
        {
            case "Armours" when iconParts[2] == "Shields":
                itemClass = "OneHandWeapons";
                break;
            case "Weapons":
            case "Armours":
                itemClass = iconParts[2];
                break;
        }
        ItemType = itemClass;
    }
daring moss
#

oh neptune

silent tree
daring moss
#

you don't get the basetype as is?

silent tree
#

cre isn't using sapi so i guess they have to work off the image

#

wait so is that human readable when converted to utf8?

#

that's pretty amusing

worthy cape
#

In the new-style CDN URLs, the first part is an base64-encoded JSON dict and the second part is an opaque key that you're not supposed to know how to make.

daring moss
#

I wonder what the json dict means

worthy cape
#

The dict contains instructions to the web server on how to generate the image for different item types like maps and flasks.

#

It has different contents for different item types.

daring moss
#

oho, interesting

bright ridge
#

just like { field1: "some value" }

#

contains a whole json object in the url basically

worthy cape
#

Many items are composed out of several images, like maps have the base plate and the glyph as separate assets, composed with some recolouring as it generates.
Flasks have like four layers including the liquid.

#

The CDN is friendly enough to serve precomposed images, given proper URLs.

bright ridge
#

WzI1LDE0LHsiZiI6IjJESXRlbXMvQXJtb3Vycy9IZWxtZXRzL0hlbG1ldFN0ckRleDciLCJ3IjoyLCJoIjoyLCJzY2FsZSI6MX1d

(with padding) decodes to:

[
    25,
    14,
    {
        "f": "2DItems/Armours/Helmets/HelmetStrDex7",
        "w": 2,
        "h": 2,
        "scale": 1
    }
]
#

so we, in that code i shared, decode it, and extract the asset path (folder) name for a given item class

#

from the field named "f"

worthy cape
silent tree
#

very neat workaround

bright ridge
#

and you probably ask why don't u just pull from the nice human readable text in the URL example i posted with the code

#

it's because not all items are nicely named "HelmetStrDex" etc. some things like rings or amulets might not explicitly contain the item class in teh asset name

#

once we get the full access to the dev api via oauth i can retire the beautiful code hto

silent tree
#

archive it for posterity Baseg

formal kraken
#

@bright ridge what tool is this for?

frank drift
formal kraken
#

Tyty

daring moss
#

couldn't you make use of the new public client auth flow?

bright ridge
#

I could but I want to be able to access current and potentially new scopes added that are I currently only available with a private client

#

I was able to use Exilences implementation of OAuth and have an API deployed

#

Just got busy at work so never got the client credentials from GGG and hooked my API up to the desktop app

#

As for rewriting our api logic it needed a good cleaning anyways

After that it’s just a matter of good programing patterns to make the swap to different APIs seamless

hazy fiber
#

new tree data when?

compact isle
#

small delay on passive tree

hazy fog
#

is Emmitt the only atlas planner thinkPeepo

carmine merlin
#

I think there were some other smaller ones, but Emmitt's was the best one

compact isle
#

poeplanner guy has one

lean phoenix
#

I need Currency list to my site, any idea what and where use ?

velvet fog
compact isle
#

passive tree up (sans tattoo stuff)

#

working on ruthless passive tree now (which is just ascendancy changes afaik)

lean phoenix
lean phoenix
#

hymn I saw that and I thought is any other source...

velvet fog
#

there should be no source other than poe.ninja

worthy cape
fading bone
#

Will there be a preload/torrent for Content.ggpk? (There's some things I'd like to parse before league start, if possible)

velvet fog
#

torrent doesn't contain any required .dat files

fading bone
#

Oh it's not .dat I'm interested in, it's the art for the new uniques

velvet fog
#

torrent file is usually available 16-24 hours before the server up

fading bone
#

I'll leave the .dat parsing to you (just noticed the poedb tag) :p.

Gotcha, should be fine then. It's for a personal unique collection project

worthy cape
#

Some other types of (often small) files can be missing from the torrent due to scrubbing of whole bundles to remove the DATs.

fading bone
#

Ah, guess I'll cross my fingers then. Worst case I'll grab em after launch, not like I'm gonna end up finding all the new uniques first day anyhow

rapid pivot
#

is it a known bug ? i cant patch my PoB : 39/39 files and it fails

#

39/39 then this

carmine merlin
#

I thought I pushed an update to the beta branch a month ago but forgot to include the update manifest with it so it'll never finish the update completely

rapid pivot
#

if its known its ok, ty xD

wise forge
#

Yo, what is the best build planner on OS X currently? I've tried PoB in Wine, but it didn't run quite as well as I'd hoped. Are any online build planners up to the task these days?

grave wren
#

none as exhaustive

wise forge
#

not yet; will give it a shot. thanks!

#

This is working perfectly, thanks again! My CPU usage isn't pegged at 100% when I have the tree open BlobbleWobbler

grave wren
#

nice, didnt work on my old macbook as its ui scaling was too harsh but glad to hear it works nicely πŸ˜„

past merlin
low hollow
#

hey i just started to work with some poe-go and i'm not sure how does change_id works and the link to poe.ninja that was supposed to Get the data seems not to be working ("http://api.poe.ninja/api/Data/GetStats") and I wonder how can i get item list from the trade, it does not need to be refreshed every changeId

lean phoenix
#

I think I will use this resource and poe ninja together...

velvet fog
daring moss
waxen musk
#

hey is there a dat reader for JS?

#

or how difficult would it be to make one (for steam version)?

daring moss
#

what is GGG's stance on embedding their (league) promotional art/videos in an app? e.g. to "theme" it for the current league. Is that generally a no?

lean phoenix
daring moss
#

because it isn't supposed to be documented

#

Why doesn't everyone know where the employee entrance for a McDonald's is?

lean phoenix
#

Because emplye should know, simple and all developers should for that is API, then for what is API then ?

grave wren
#

for internal use?

daring moss
#

an API isn't always meant to be consumed by external developers

#

This endpoint is clearly made to fit the trade site

lean phoenix
#

I'm internal registerd developer if I'm using OAuth or not ?

daring moss
#

No

silent tree
#

do you work for ggg

lean phoenix
#

No but I have registered app

silent tree
#

then you're not an internal developer

lean phoenix
#

Then if all uses link not described URL in API is illegal ?? πŸ™‚

daring moss
#

not necessarily

#

but you also shouldn't expect GGG to document it for you

grave wren
#

you also shouldnt expect it to behave forever as it does

worthy cape
#

If you're expecting exhaustive curated data for every aspect of the game, you're probably doing community tools for the wrong game.
The vibrant tools community has grown much thanks to self-sourcing everything needed in a hands-off approach. Providing the level of things that you believe there should be would come at a significant engineering costs and I'd like to then ask which parts of the game they should focus less on developing.

#

Not to mention, part of the charm of the game is the lack of immediately available information, even if data mining sites have skewed the balance in a way that definitely was not originally intended.

#

People have gotten around with responsible use of undocumented API endpoints for near a decade, the formally documented endpoints and oauth are quite new initiatives to provide a bit more legality and guarantees about services.

#

And yes, you have opinions about how particular endpoints work. That doesn't matter.

daring moss
#

I believe it is also about protecting the user?

worthy cape
#

You're like a year too late to enjoy the fruits of community efforts like RePoE that provided easy access to curated information.

daring moss
#

because expecting them to pass around their session ID was "fine" while there was like... one tool around that was more of a toy than anything

worthy cape
lean phoenix
daring moss
#

what do you mean, illegal?

silent tree
daring moss
#

nobody talked about legality anywhere

worthy cape
#

The ToU forbids a lot of things.

daring moss
#

fair

#

but depending on where you live you have to expressly agree to terms of use

worthy cape
lean phoenix
daring moss
#

and "by using this site you agree to the ToS" usually isn't binding

daring moss
silent tree
#

by all means send ggg an email to ask for express permission

worthy cape
#

I should frame my rejection emails.

silent tree
#

although u may also force a more official response to everyone using those resources

daring moss
#

to be fair, it probably also just is extremely hard to tell "illegitimate" use of those endpoints from legitimate ones

#

if there's an argument about this I could much rather see it crippling the trade site itself

waxen musk
#

ah ye i see ooz-wasm

quick stratus
#

Has anyone successfully used pako (https://www.npmjs.com/package/pako) to decode/inflate POB's build code format?
I've tried a bunch of things:

  • replacing _ and - with / and +
  • atob() that
  • pako.inflate() that
    But to no avail, none of these turned out to be something pako could inflate.
    cc @carmine merlin maybe
worthy cape
#

Note that atob gets you something text:y, maybe investigate if the library does some sort of text-based transcoding before it tries to inflate.

quick stratus
#

Hm that's a good point, looks like atob works with asci and not utf8

worthy cape
#

If you want a command line you can grab intermediary results from:
echo -n 'buildcode' | tr _- /+ | base64 -d | openssl zlib -d

#

Like pulling out the data after the base64 -d step into a file and compare it to what you've got from your logic.

quick stratus
#

alright, figured it out. Here's the solution in case anyone else ever needs it:

function pobBase64ToXml(base64: string) {
  const raw = base64.replaceAll("_", "/").replaceAll("-", "+");
  const text = atob(raw);
  const length = text.length;
  const bytes = new Uint8Array(length);
  for (let i = 0; i < length; i++) {
    bytes[i] = text.charCodeAt(i);
  }
  return pako.inflate(bytes, { to: "string" });
}

This decodes a base64 POB code back into its original XML.
The trick was that the output of atob() needed one extra step to get back proper utf8 chars.

#

@worthy cape thanks for the pointers

worthy cape
#

I actually fell into a similar trap when trying to implement it in Node just now, not really knowing the language.
I used TextEncoder which encoded the codepoints of the string from atob as UTF-8 code units, rather than the codepoint value directly interpreted as a byte.

quick stratus
#

yeah I was trying the same thing for a while

whole ruin
#

Ye i remember struggling with the same shit

quick stratus
#

Does POB support pob: url protocol for full build codes? or just shortened urls (pobbin, pastebin, poeninja)? Looking at PobLink it only shows code for url shorteners (likely due to the fact that it works on link in browser)

oak estuary
#

Full build codes are too long for URLs, so there are just several sites that have hardcoded support

civic crane
waxen musk
#

like if i import these, i get ERR_PACKAGE_PATH_NOT_EXPORTED

import {
  FileLoader,
  SteamBundleLoader
} from 'pathofexile-dat/dist/cli/bundle-loaders.js'
#

and if i import this, i get "cannot find corresponding type declarations"
import * as POE from 'pathofexile-dat/bundles.js'

#

specifically, package.json is missing types field, and some modules like the actual bundle loader are hidden in CLI folder which is not exported at all

clever fog
#

is it intentional that we can't filter poe.ninja by support gems linked to main skill any more?

winter jewel
compact isle
#

looks like LiveSplit

frank drift
winter jewel
#

ty will try it πŸ™‚

#

@frank drift This is pretty cool, ty so much!

compact isle
daring moss
#

Novynn, I've been using a public oauth client for a bit now and was wondering, what would happen if someone took my app's client ID to auth for something that isn't the intended use case? e.g. could someone go out of their way to get my app flagged for hitting rate limits too often even when I do everything in my power to adhere to the ratelimits set by your API?

compact isle
#

yes, that's the consequence of public clients

#

though since it's understood that that could happen the rate-limits are per-account rather than per-client

daring moss
#

Okay yeah, that does make sense

#

thanks for clarifying

magic field
#

What's a good trading tool? I use an older defunct POE Trades Companion. It still works but I'm curious what else is out there

velvet fog
magic field
#

Oh yea, love that for price checking and have donated! Any suggestions for incoming trades and management?

daring moss
#

Is anyone here interfacing with the HTTP API via Rust? if so, how are you managing the ratelimits?

#

I've been looking around different crates and couldn't find anything that'd properly accomodate the requirements set by GGG and I'm a bit scared of implementing it myself as I don't enough about tread-safety to make this work without introducing problems

formal kraken
#

I think there is a client out there that implemented it πŸ€”

daring moss
#

and it hasn't been updates for 5 years (also doesn't implement ratelimits as far as I can see)

formal kraken
#

Mh no can't find it, I started one once but that thing isnt fully implemented and might actually be broken

daring moss
formal kraken
daring moss
#

interesting, you implemented the rate limiting yourself then, i see

#

and you used a semaphore to count?

formal kraken
#

Yeah that's pretty old code and I wouldn't do it like that again

daring moss
#

the semaphore is definitely an interesting choice

formal kraken
#

But I dropped the project which needed it so I never finished it

daring moss
#

I've only ever encountered them as a way to do ref counting iirc

#

I see