Skip to content

Commit 57c3bbe

Browse files
committed
#824 Removed league .env backend and fixed different hours per league
1 parent d36e38d commit 57c3bbe

13 files changed

Lines changed: 116 additions & 140 deletions

File tree

src/.env

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ DOCKER_IMAGE_FRONTEND=pom_frontend
1818

1919
# Backend
2020
PRIVATIZE_API=
21-
TESTING=True
21+
TESTING=
2222
RATE_LIMIT=
2323
BACKEND_CORS_ORIGINS="http://localhost,http://localhost:5173,http://localhost:5174,https://localhost,https://localhost:5173,https://localhost:5174"
2424
PROJECT_NAME="pathofmodifiers"
@@ -35,20 +35,15 @@ SMTP_USER=noreply@pathofmodifiers.com
3535
SMTP_PASSWORD=changethis
3636
TURNSTILE_SECRET_KEY=1x0000000000000000000000000000000AA
3737

38-
# League
39-
CURRENT_SOFTCORE_LEAGUE="Mirage"
40-
ALL_SOFTCORE_LEAGUES="Mirage|Keepers|Mercenaries|Phrecia"
41-
42-
LEAGUE_LAUNCH_TIME=2026-03-06T19:00:00Z # ISO 8601 format. Round backwards to whole hour number
4338

4439
# Data retrieval
4540
MANUAL_NEXT_CHANGE_ID=True
46-
# Change ID Retrieved 02.09.2024:
47-
NEXT_CHANGE_ID=2621291179-2592930469-2516326916-2790039644-2710714910
41+
# Change ID Retrieved 28.06.2026:
42+
NEXT_CHANGE_ID=3176140940-3103957281-3029294684-3370770619-3261964453
4843
POE_PUBLIC_STASHES_AUTH_TOKEN=changethis
4944
# Enables the public stashes creation script in data_ret/app/tests/scripts.
5045
# Set value "True" to activate:
51-
DATA_RET_TEST_PUB_STASH_SIM_DATA_DEPOSIT_ENABLED=True
46+
DATA_RET_TEST_PUB_STASH_SIM_DATA_DEPOSIT_ENABLED=
5247

5348
# Postgres
5449
POSTGRES_PORT=5432

src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/config.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from datetime import datetime
2-
31
from pydantic import (
42
HttpUrl,
53
computed_field,
@@ -27,12 +25,6 @@ def BACKEND_BASE_URL(self) -> HttpUrl:
2725
OATH_ACC_TOKEN_CONTACT_EMAIL: str
2826
FIRST_SUPERUSER: str
2927
FIRST_SUPERUSER_PASSWORD: str
30-
CURRENT_SOFTCORE_LEAGUE: str
31-
32-
@computed_field # type: ignore[prop-decorator]
33-
@property
34-
def CURRENT_HARDCORE_LEAGUE(self) -> str:
35-
return f"Hardcore {self.CURRENT_SOFTCORE_LEAGUE}"
3628

3729
POE_PUBLIC_STASHES_AUTH_TOKEN: str
3830
OAUTH_CLIENT_ID: str
@@ -43,12 +35,5 @@ def CURRENT_HARDCORE_LEAGUE(self) -> str:
4335

4436
MAX_TIME_PER_MINI_BATCH: int = 3 * 60
4537

46-
LEAGUE_LAUNCH_TIME: str
47-
48-
@computed_field # type: ignore[prop-decorator]
49-
@property
50-
def LEAGUE_LAUNCH_DATETIME_OBJECT(self) -> datetime:
51-
return datetime.fromisoformat(self.LEAGUE_LAUNCH_TIME)
52-
5338

5439
settings = Settings() # type: ignore

src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/data_retrieval/poe_api_handler.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ def __init__(
3838
self,
3939
url: str,
4040
auth_token: str,
41-
leagues: list[dict[str, Any]],
4241
*,
42+
leagues: list[dict[str, Any]],
4343
n_wanted_items: int = 100,
4444
n_unique_wanted_items: int = 5,
4545
item_detectors: list[UniqueDetector] | None = None,

src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/detectors/base.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ def _general_filter(self, df: pd.DataFrame) -> pd.DataFrame:
6464
return pd.DataFrame(columns=df.columns)
6565

6666
df = df.loc[df["league"].isin(self.leagues)]
67-
df["leagueId"] = df["league"].map(self.league_to_id)
6867

6968
return df
7069

src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/main.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838

3939
class ContinuousDataRetrieval:
4040
auth_token = settings.POE_PUBLIC_STASHES_AUTH_TOKEN
41-
current_league = settings.CURRENT_SOFTCORE_LEAGUE
4241
stash_tab_url = "https://api.pathofexile.com/public-stash-tabs"
4342

4443
backend_base_url = settings.BACKEND_BASE_URL
@@ -53,13 +52,12 @@ def __init__(
5352
items_per_batch: int,
5453
data_transformers: dict[str, PoEAPIDataTransformerBase],
5554
):
55+
self.leagues = self._get_leagues()
5656
self.data_transformers: dict[str, PoEAPIDataTransformerBase] = {
57-
key: data_transformer()
57+
key: data_transformer(self.leagues)
5858
for key, data_transformer in data_transformers.items()
5959
}
6060

61-
self.leagues = self._get_leagues()
62-
6361
self.poe_api_handler = PoEAPIHandler(
6462
url=self.stash_tab_url,
6563
auth_token=self.auth_token,
@@ -188,7 +186,9 @@ def _initialize_data_stream_threads(
188186

189187
def _follow_data_dump_stream(self):
190188
try:
191-
current_hour = find_hours_since_launch()
189+
current_hours = find_hours_since_launch(self.leagues)
190+
# Only need to refer to one league to see when a new hour starts
191+
current_hour = current_hours[self.leagues[0]["leagueId"]]
192192
next_hour = current_hour + 1
193193
logger.info("Retrieving modifiers from db.")
194194
modifier_dfs = self._get_modifiers()
@@ -204,9 +204,10 @@ def _follow_data_dump_stream(self):
204204
modifier_df=modifier_dfs[data_transformer_type],
205205
currency_df=currency_df.copy(deep=True),
206206
item_base_types=item_base_types,
207-
current_hour=current_hour,
207+
current_hours=current_hours,
208208
)
209-
current_hour = find_hours_since_launch()
209+
current_hours = find_hours_since_launch(self.leagues)
210+
current_hour = current_hours[self.leagues[0]["leagueId"]]
210211
for data_transformer_type in self.data_transformers:
211212
self.data_transformers[data_transformer_type].end_of_hour_cleanup()
212213

src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/transforming_data/transform_currency_api_data.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,11 @@
11
import pandas as pd
22

33
from data_retrieval_app.external_data_retrieval.config import settings
4-
from data_retrieval_app.external_data_retrieval.data_retrieval.currency_api_handler import (
5-
CurrencyAPIHandler,
6-
)
74
from data_retrieval_app.logs.logger import transform_logger as logger
85
from data_retrieval_app.pom_api_authentication import get_superuser_token_headers
96
from data_retrieval_app.utils import get_data_safe, insert_data
107

118

12-
def load_currency_data():
13-
"""
14-
Loads data from the poe.ninja currency API.
15-
"""
16-
poe_ninja_currency_api_handler = CurrencyAPIHandler(
17-
url=f"https://poe.ninja/api/data/currencyoverview?league={settings.CURRENT_SOFTCORE_LEAGUE}&type=Currency"
18-
)
19-
20-
currencies_df = poe_ninja_currency_api_handler.make_request()
21-
22-
return currencies_df
23-
24-
259
class TransformCurrencyAPIData:
2610
def __init__(self) -> None:
2711
logger.debug("Initializing TransformCurrencyAPIData.")

src/backend_data_retrieval/data_retrieval_app/external_data_retrieval/transforming_data/transform_poe_api_data.py

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from typing import Any
2+
13
import pandas as pd
24
from requests.exceptions import HTTPError
35

@@ -14,24 +16,29 @@
1416

1517

1618
class PoEAPIDataTransformerBase:
17-
def __init__(self) -> None:
19+
def __init__(
20+
self,
21+
leagues: list[dict[str, Any]],
22+
) -> None:
1823
logger.debug("Initializing PoEAPIDataTransformer")
1924

2025
self.base_url = settings.BACKEND_BASE_URL
2126
self.pom_auth_headers = get_superuser_token_headers(self.base_url)
2227
self.roll_processor = RollProcessor()
2328

29+
self.league_to_id = {league["name"]: league["leagueId"] for league in leagues}
30+
2431
logger.debug("Initializing PoEAPIDataTransformer done.")
2532

26-
def _create_item_table(self, df: pd.DataFrame, current_hour: int) -> pd.DataFrame:
33+
def _create_item_table(self, df: pd.DataFrame) -> pd.DataFrame:
2734
"""
2835
Creates the basis of the `item` table.
2936
"""
3037
self.item_columns = [
3138
"itemId",
3239
"id",
3340
"name",
34-
"leagueId",
41+
"league",
3542
"baseType",
3643
"typeLine",
3744
"ilvl",
@@ -61,11 +68,12 @@ def _create_item_table(self, df: pd.DataFrame, current_hour: int) -> pd.DataFram
6168
:, [column for column in self.item_columns if column in df.columns]
6269
] # Can't guarantee all columns are present
6370

64-
item_df["createdHoursSinceLaunch"] = current_hour
6571
return item_df
6672

6773
def _find_not_too_highly_priced_item_mask(
68-
self, currency_df: pd.DataFrame, item_currency_merged_df: pd.DataFrame
74+
self,
75+
currency_df: pd.DataFrame,
76+
item_currency_merged_df: pd.DataFrame,
6977
) -> pd.Series:
7078
"""
7179
Some items are too highly priced to be legitimate. A boundary of the price equivelant to
@@ -91,6 +99,7 @@ def _transform_item_table(
9199
item_df: pd.DataFrame,
92100
currency_df: pd.DataFrame,
93101
item_base_types: dict[str, int],
102+
current_hours: dict[int, int],
94103
) -> pd.DataFrame:
95104
"""
96105
The `item` table requires a foreign key to the `currency` table.
@@ -126,6 +135,9 @@ def transform_influences(row: pd.DataFrame, influence_columns: list[str]):
126135
] = True
127136
return influence_dict
128137

138+
item_df["leagueId"] = item_df["league"].map(self.league_to_id)
139+
item_df["createdHoursSinceLaunch"] = item_df["leagueId"].map(current_hours)
140+
129141
base_type_series = item_df["baseType"]
130142
item_df["itemBaseTypeId"] = base_type_series.apply(transform_base_types)
131143

@@ -259,13 +271,15 @@ def _process_item_table(
259271
df: pd.DataFrame,
260272
currency_df: pd.DataFrame,
261273
item_base_types: dict[str, int],
262-
current_hour: int,
274+
current_hours: dict[int, int],
263275
) -> pd.Series:
264276
"""
265277
Needs to return item ids, as it is used to connect the item modifiers
266278
"""
267-
item_df = self._create_item_table(df, current_hour=current_hour)
268-
item_df = self._transform_item_table(item_df, currency_df, item_base_types)
279+
item_df = self._create_item_table(df)
280+
item_df = self._transform_item_table(
281+
item_df, currency_df, item_base_types, current_hours=current_hours
282+
)
269283
item_df = self._clean_item_table(item_df)
270284
insert_data(
271285
item_df,
@@ -284,11 +298,14 @@ def _transform_unidentified_item_table(
284298
item_df: pd.DataFrame,
285299
currency_df: pd.DataFrame,
286300
item_base_types: dict[str, int],
301+
current_hours: dict[int, int],
287302
) -> pd.DataFrame:
288303
"""
289304
For convenience, all unid items are stored in divine prices
290305
"""
291-
item_df = self._transform_item_table(item_df, currency_df, item_base_types)
306+
item_df = self._transform_item_table(
307+
item_df, currency_df, item_base_types, current_hours=current_hours
308+
)
292309

293310
item_df["chaos_value"] = (
294311
item_df["currencyAmount"].astype(float) * item_df["valueInChaos"]
@@ -401,11 +418,11 @@ def _process_unidentified_item_table(
401418
df: pd.DataFrame,
402419
currency_df: pd.DataFrame,
403420
item_base_types: dict[str, int],
404-
current_hour: int,
421+
current_hours: dict[int, int],
405422
) -> None:
406-
item_df = self._create_item_table(df, current_hour=current_hour)
423+
item_df = self._create_item_table(df)
407424
item_df = self._transform_unidentified_item_table(
408-
item_df, currency_df, item_base_types
425+
item_df, currency_df, item_base_types, current_hours=current_hours
409426
)
410427
item_df = self._clean_unidentified_item_table(item_df)
411428
insert_data(
@@ -417,7 +434,7 @@ def _process_unidentified_item_table(
417434
)
418435

419436
def _create_item_modifier_table(
420-
self, df: pd.DataFrame, *, item_id: pd.Series, current_hour: int
437+
self, df: pd.DataFrame, *, item_id: pd.Series
421438
) -> pd.DataFrame:
422439
"""
423440
The `item_modifier` table heavily relies on what type of item the modifiers
@@ -428,6 +445,7 @@ def _create_item_modifier_table(
428445
def _transform_item_modifier_table(
429446
self,
430447
item_modifier_df: pd.DataFrame,
448+
current_hours: dict[int, int],
431449
) -> pd.DataFrame:
432450
"""
433451
The `item_modifier` table heavily relies on what type of item the modifiers
@@ -450,14 +468,13 @@ def _process_item_modifier_table(
450468
self,
451469
df: pd.DataFrame,
452470
item_id: pd.Series,
453-
current_hour: int,
471+
current_hours: dict[int, int],
454472
) -> None:
455473
item_modifier_df = self._create_item_modifier_table(
456-
df, item_id=item_id, current_hour=current_hour
474+
df, item_id=item_id, current_hours=current_hours
457475
)
458476
item_modifier_df = self._transform_item_modifier_table(item_modifier_df)
459477
item_modifier_df = self._clean_item_modifier_table(item_modifier_df)
460-
461478
insert_data(
462479
item_modifier_df,
463480
url=self.base_url,
@@ -472,7 +489,7 @@ def transform_into_tables(
472489
modifier_df: pd.DataFrame,
473490
currency_df: pd.DataFrame,
474491
item_base_types: dict[str, int],
475-
current_hour: int,
492+
current_hours: dict[int, int],
476493
) -> None:
477494
self.roll_processor.add_modifier_df(modifier_df)
478495
try:
@@ -482,18 +499,18 @@ def transform_into_tables(
482499
df.copy(deep=True),
483500
currency_df=currency_df,
484501
item_base_types=item_base_types,
485-
current_hour=current_hour,
502+
current_hours=current_hours,
486503
)
487504
self._process_unidentified_item_table(
488505
df.copy(deep=True),
489506
currency_df=currency_df,
490507
item_base_types=item_base_types,
491-
current_hour=current_hour,
508+
current_hours=current_hours,
492509
)
493510
self._process_item_modifier_table(
494511
df.copy(deep=True),
495512
item_id=item_id,
496-
current_hour=current_hour,
513+
current_hours=current_hours,
497514
)
498515
logger.debug("Successfully transformed data into tables.")
499516

@@ -508,13 +525,17 @@ def end_of_hour_cleanup(self):
508525
class UniquePoEAPIDataTransformer(PoEAPIDataTransformerBase):
509526
@sync_timing_tracker
510527
def _create_item_modifier_table(
511-
self, df: pd.DataFrame, *, item_id: pd.Series, current_hour: int
528+
self,
529+
df: pd.DataFrame,
530+
*,
531+
item_id: pd.Series,
532+
current_hours: dict[int, int],
512533
) -> pd.DataFrame:
513534
"""
514535
A similiar process to creating the item table, only this time the
515536
relevant column contains a list and not a JSON-object
516537
"""
517-
item_modifier_columns = ["name", "explicitMods"]
538+
item_modifier_columns = ["name", "explicitMods", "league"]
518539
item_modifier_df = df.loc[
519540
self.price_found_mask,
520541
item_modifier_columns,
@@ -525,19 +546,23 @@ def _create_item_modifier_table(
525546
].reset_index()
526547

527548
item_modifier_df["itemId"] = item_id
549+
item_modifier_df["leagueId"] = item_modifier_df["league"].map(self.league_to_id)
550+
item_modifier_df["createdHoursSinceLaunch"] = item_modifier_df["leagueId"].map(
551+
current_hours
552+
)
528553
item_modifier_df = item_modifier_df.explode("explicitMods", ignore_index=True)
529554

530555
item_modifier_df.rename({"explicitMods": "modifier"}, axis=1, inplace=True)
531556

532-
item_modifier_df["createdHoursSinceLaunch"] = current_hour
533-
534557
return item_modifier_df
535558

536559
@sync_timing_tracker
537560
def _transform_item_modifier_table(
538-
self, item_modifier_df: pd.DataFrame
561+
self,
562+
item_modifier_df: pd.DataFrame,
539563
) -> pd.DataFrame:
540564
item_modifier_df = self.roll_processor.add_rolls(df=item_modifier_df)
565+
541566
return item_modifier_df
542567

543568
@property

0 commit comments

Comments
 (0)