Skip to content

Commit 4d6061c

Browse files
authored
Merge pull request #814 from Path-of-Modifiers/813-fix-poe-ninja-api-endpoint-change
#813 Switched from poe ninja to poe watch
2 parents abd58b2 + 4861c5c commit 4d6061c

5 files changed

Lines changed: 73 additions & 60 deletions

File tree

src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/data_retrieval/poe_ninja_currency_api_handler.py renamed to src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/data_retrieval/currency_api_handler.py

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,10 @@
44
from data_retrieval_app.logs.logger import external_data_retrieval_logger as logger
55

66

7-
class PoENinjaCurrencyAPIHandler:
7+
class CurrencyAPIHandler:
88
def __init__(self, url: str) -> None:
99
self.url = url
1010

11-
def _combine_currency_data(self, currencies: list, currency_details: list) -> list:
12-
"""
13-
Combines the currency data.
14-
"""
15-
currencies_df = self._json_to_df(currencies)
16-
currency_details_df = self._json_to_df(currency_details)
17-
18-
combined_currency_data_df = currencies_df.merge(
19-
currency_details_df,
20-
how="left",
21-
# left_on="pay.pay_currency_id",
22-
# right_on="id",
23-
left_on="currencyTypeName",
24-
right_on="name",
25-
)
26-
return combined_currency_data_df
27-
2811
def _json_to_df(self, currencies: list) -> pd.DataFrame:
2912
df = pd.json_normalize(currencies)
3013

@@ -44,19 +27,16 @@ def make_request(self) -> pd.DataFrame:
4427
raise e
4528
response_json = response.json()
4629

47-
currencies = response_json["lines"]
48-
currency_details = response_json["currencyDetails"]
49-
50-
combined_currency_data_df = self._combine_currency_data(
51-
currencies, currency_details
52-
)
30+
# items_df = pd.DataFrame(response_json["items"])
31+
items_df = pd.json_normalize(response_json["items"])
32+
currency_df = items_df[items_df["category"] == "currency"]
5333

54-
return combined_currency_data_df
34+
return currency_df
5535

5636
def store_data_to_csv(self, path: str) -> None:
5737
"""
5838
Stores the data in a CSV. Only to be used for testing purposes.
5939
"""
6040
currencies_df = self.make_request()
6141

62-
currencies_df.to_csv(path + "/poe_ninja_currencies.csv", index=False)
42+
currencies_df.to_csv(path + "/currencies.csv", index=False)

src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/main.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@
1111
import requests
1212

1313
from data_retrieval_app.external_data_retrieval.config import settings
14+
from data_retrieval_app.external_data_retrieval.data_retrieval.currency_api_handler import (
15+
CurrencyAPIHandler,
16+
)
1417
from data_retrieval_app.external_data_retrieval.data_retrieval.poe_api_handler import (
1518
PoEAPIHandler,
1619
)
17-
from data_retrieval_app.external_data_retrieval.data_retrieval.poe_ninja_currency_api_handler import (
18-
PoENinjaCurrencyAPIHandler,
20+
from data_retrieval_app.external_data_retrieval.transforming_data.transform_currency_api_data import (
21+
TransformCurrencyAPIData,
1922
)
2023
from data_retrieval_app.external_data_retrieval.transforming_data.transform_poe_api_data import (
2124
PoEAPIDataTransformerBase,
2225
UniquePoEAPIDataTransformer,
2326
)
24-
from data_retrieval_app.external_data_retrieval.transforming_data.transform_poe_ninja_currency_api_data import (
25-
TransformPoENinjaCurrencyAPIData,
26-
)
2727
from data_retrieval_app.external_data_retrieval.utils import (
2828
ProgramRunTooLongException,
2929
ProgramTooSlowException,
@@ -62,10 +62,10 @@ def __init__(
6262
n_unique_wanted_items=10,
6363
)
6464

65-
self.poe_ninja_currency_api_handler = PoENinjaCurrencyAPIHandler(
66-
url=f"https://poe.ninja/api/data/currencyoverview?league={self.current_league}&type=Currency"
65+
self.currency_api_handler = CurrencyAPIHandler(
66+
url=f"https://api.poe.watch/exchange/ratios?league={self.current_league}&game=poe1"
6767
)
68-
self.poe_ninja_transformer = TransformPoENinjaCurrencyAPIData()
68+
self.currency_transformer = TransformCurrencyAPIData()
6969

7070
def _get_modifiers(self) -> dict[str, pd.DataFrame]:
7171
response = requests.get(self.modifier_url, headers=self.pom_auth_headers)
@@ -147,8 +147,8 @@ def _categorize_new_items(self, df: pd.DataFrame) -> dict[str, pd.DataFrame]:
147147
return split_dfs
148148

149149
def _get_new_currency_data(self) -> pd.DataFrame:
150-
currency_df = self.poe_ninja_currency_api_handler.make_request()
151-
currency_df = self.poe_ninja_transformer.transform_into_tables(currency_df)
150+
currency_df = self.currency_api_handler.make_request()
151+
currency_df = self.currency_transformer.transform_into_tables(currency_df)
152152
return currency_df
153153

154154
def _initialize_data_stream_threads(
@@ -233,6 +233,8 @@ def retrieve_data(self):
233233
)
234234
futures[follow_future] = "data_processing"
235235
elif future_job == "listener":
236+
logger.exception(crashed_future.exception().with_traceback())
237+
raise crashed_future.exception()
236238
new_future = self._initialize_data_stream_threads(
237239
executor,
238240
listeners=1,

src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/transforming_data/transform_poe_ninja_currency_api_data.py renamed to src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/transforming_data/transform_currency_api_data.py

Lines changed: 53 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
import requests
33

44
from data_retrieval_app.external_data_retrieval.config import settings
5-
from data_retrieval_app.external_data_retrieval.data_retrieval.poe_ninja_currency_api_handler import (
6-
PoENinjaCurrencyAPIHandler,
5+
from data_retrieval_app.external_data_retrieval.data_retrieval.currency_api_handler import (
6+
CurrencyAPIHandler,
77
)
88
from data_retrieval_app.logs.logger import transform_logger as logger
99
from data_retrieval_app.pom_api_authentication import get_superuser_token_headers
@@ -14,7 +14,7 @@ def load_currency_data():
1414
"""
1515
Loads data from the poe.ninja currency API.
1616
"""
17-
poe_ninja_currency_api_handler = PoENinjaCurrencyAPIHandler(
17+
poe_ninja_currency_api_handler = CurrencyAPIHandler(
1818
url=f"https://poe.ninja/api/data/currencyoverview?league={settings.CURRENT_SOFTCORE_LEAGUE}&type=Currency"
1919
)
2020

@@ -23,57 +23,89 @@ def load_currency_data():
2323
return currencies_df
2424

2525

26-
class TransformPoENinjaCurrencyAPIData:
26+
class TransformCurrencyAPIData:
2727
def __init__(self) -> None:
28-
logger.debug("Initializing TransformPoENinjaCurrencyAPIData.")
28+
logger.debug("Initializing TransformCurrencyAPIData.")
2929
self.base_url = settings.BACKEND_BASE_URL
3030
logger.debug(f"Url set to: {self.base_url}")
3131
self.pom_api_headers = get_superuser_token_headers(self.base_url)
3232
logger.debug("Headers set to: " + str(self.pom_api_headers))
33-
logger.debug("Initializing TransformPoENinjaCurrencyAPIData done.")
33+
logger.debug("Initializing TransformCurrencyAPIData done.")
3434

35-
def _create_currency_table(self, currency_df: pd.DataFrame) -> pd.DataFrame:
35+
self.name_to_trade_name = self._get_name_to_trade_name_dict()
36+
37+
def _get_name_to_trade_name_dict(self) -> dict:
3638
"""
37-
Creates the currency table.
39+
Retrieves a map for "fancy" currency names, as used in the API, to their trade names, which we need.
3840
"""
39-
currency_df.rename(
40-
columns={
41-
"tradeId": "tradeName",
42-
"chaosEquivalent": "valueInChaos",
43-
},
44-
inplace=True,
45-
)
46-
return currency_df
41+
headers = {
42+
"User-Agent": f"OAuth pathofmodifiers/0.1.0 (contact: {settings.OATH_ACC_TOKEN_CONTACT_EMAIL}) StrictMode"
43+
}
44+
try:
45+
response = requests.get(
46+
"https://www.pathofexile.com/api/trade/data/static", headers=headers
47+
)
48+
response.raise_for_status()
49+
except Exception as e:
50+
logger.error(
51+
f"The following error occurred while making request _get_latest_change_id: {e}"
52+
)
53+
raise e
54+
55+
response_json = response.json()
56+
result = response_json["result"]
57+
currencies = {}
58+
for category in result:
59+
if category["id"] == "Currency":
60+
for entry in category["entries"]:
61+
name = entry["text"]
62+
trade_name = entry["id"]
63+
currencies[name] = trade_name
64+
65+
return currencies
4766

4867
def _transform_currency_table(
4968
self, currency_df: pd.DataFrame, hours_since_launch: int
5069
) -> pd.DataFrame:
5170
"""
5271
Since a chaos orb is always worth one chaos orb, ninja does not include it in its price api.
5372
"""
73+
74+
currency_df["chaos.chaosValue"] = currency_df["chaos.chaosValue"].where(
75+
(currency_df["chaos.chaosValue"] == 0)
76+
| (currency_df["chaos.chaosValue"].isna()),
77+
currency_df["divine.chaosValue"],
78+
)
79+
5480
chaos_dict = {
55-
"tradeName": ["chaos"],
56-
"valueInChaos": [1],
81+
"name": ["Chaos Orb"],
82+
"chaos.chaosValue": [1],
5783
}
5884
chaos_df = pd.DataFrame.from_dict(chaos_dict)
5985
currency_df = pd.concat((currency_df, chaos_df), ignore_index=True)
6086

87+
currency_df["tradeName"] = currency_df["name"].map(
88+
lambda name: self.name_to_trade_name.get(name, pd.NA)
89+
)
90+
6191
currency_df["createdHoursSinceLaunch"] = hours_since_launch
6292
return currency_df
6393

6494
def _clean_currency_table(self, currency_df: pd.DataFrame) -> pd.DataFrame:
6595
"""
6696
Cleans the currency table of unnecessary columns.
6797
"""
98+
currency_df = currency_df.rename(columns={"chaos.chaosValue": "valueInChaos"})
6899

69-
currency_df.drop(
100+
currency_df = currency_df.drop(
70101
currency_df.columns.difference(
71102
["tradeName", "valueInChaos", "createdHoursSinceLaunch"]
72103
),
73104
axis=1,
74-
inplace=True,
75105
)
76-
currency_df = currency_df.loc[~currency_df["tradeName"].isna()].reset_index()
106+
currency_df = currency_df.loc[~currency_df["tradeName"].isna()].reset_index(
107+
drop=True
108+
)
77109
return currency_df
78110

79111
def _get_latest_currency_id_series(self, currency_df: pd.DataFrame) -> pd.Series:
@@ -102,7 +134,6 @@ def transform_into_tables(self, currency_df: pd.DataFrame) -> pd.DataFrame:
102134
"""
103135
hours_since_launch = find_hours_since_launch()
104136
logger.debug("Transforming data into tables.")
105-
currency_df = self._create_currency_table(currency_df)
106137
currency_df = self._transform_currency_table(currency_df, hours_since_launch)
107138
logger.debug("Successfully transformed data into tables.")
108139

src/backend_data_retrieval/data_retrieval_app/tests/external_data_retrieval/data_retrieval/test_poe_ninja_currency_api_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
class TestPoENinjaCurrencyAPIHandler:
1+
class TestCurrencyAPIHandler:
22
"""
33
settings.POE_PUBLIC_STASHES_AUTH_TOKEN and settings.OATH_ACC_TOKEN_CONTACT_EMAIL
44
needs to be set to for this test to work
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
class TestTransformPoeNinjaCurrencyAPIData:
1+
class TestTransformCurrencyAPIData:
22
# TODO: Add tests if needed
33
pass

0 commit comments

Comments
 (0)