Skip to content

Commit 26f109a

Browse files
authored
1.5.1 (#218)
* adding wow token price menu * set wow token in mega data setup * wip on token prices * fix token price retrieval * bump version * minor fixes
1 parent d2fadda commit 26f109a

File tree

4 files changed

+91
-2
lines changed

4 files changed

+91
-2
lines changed

.github/workflows/windows-exe-build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: Build Windows Executable
22

33
env:
4-
AAA_VERSION: "1.5"
4+
AAA_VERSION: "1.5.1"
55

66
on:
77
workflow_dispatch:

AzerothAuctionAssassin.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import sys
66
from datetime import datetime
77

8-
AAA_VERSION = "1.5"
8+
AAA_VERSION = "1.5.1"
99

1010
windowsApp_Path = None
1111
try:
@@ -612,6 +612,15 @@ def make_settings_page(self, settings_page):
612612
self.settings_page_layout.addWidget(self.discount_percent_label, 14, 1, 1, 1)
613613
self.settings_page_layout.addWidget(self.discount_percent, 15, 1, 1, 1)
614614

615+
self.token_price = QLineEdit(settings_page)
616+
self.token_price.setText("1")
617+
self.token_price_label = QLabel("Token Price", settings_page)
618+
self.token_price_label.setToolTip(
619+
"Set a minimum price to alert on wow token prices"
620+
)
621+
self.settings_page_layout.addWidget(self.token_price_label, 16, 1, 1, 1)
622+
self.settings_page_layout.addWidget(self.token_price, 17, 1, 1, 1)
623+
615624
self.show_bid_prices = QCheckBox("Show Bid Prices", settings_page)
616625
self.show_bid_prices.setToolTip(
617626
"Show items with Bid prices below your price limit on Desired Items"
@@ -1387,6 +1396,9 @@ def check_config_file(self, path_to_config):
13871396
if "DISCOUNT_PERCENT" in raw_mega_data:
13881397
self.discount_percent.setText(str(raw_mega_data["DISCOUNT_PERCENT"]))
13891398

1399+
if "TOKEN_PRICE" in raw_mega_data:
1400+
self.token_price.setText(str(raw_mega_data["TOKEN_PRICE"]))
1401+
13901402
if "NO_RUSSIAN_REALMS" in raw_mega_data:
13911403
self.russian_realms.setChecked(raw_mega_data["NO_RUSSIAN_REALMS"])
13921404

@@ -2560,6 +2572,7 @@ def reset_app_data(self):
25602572
self.wow_head_link.setChecked(False),
25612573
self.no_links.setChecked(False),
25622574
self.discount_percent.setText("10"),
2575+
self.token_price.setText("1"),
25632576
self.russian_realms.setChecked(True),
25642577
self.refresh_alerts.setChecked(True),
25652578
self.scan_time_min.setText("1"),
@@ -2578,6 +2591,7 @@ def validate_application_settings(self, reset=False):
25782591
scan_time_max = self.scan_time_max.text()
25792592
scan_time_min = self.scan_time_min.text()
25802593
discount_percent = self.discount_percent.text()
2594+
token_price = self.token_price.text()
25812595
faction = self.faction.currentText()
25822596
show_bids = self.show_bid_prices.isChecked()
25832597
wowhead = self.wow_head_link.isChecked()
@@ -2640,6 +2654,7 @@ def validate_application_settings(self, reset=False):
26402654
"SCAN_TIME_MAX": scan_time_max,
26412655
"SCAN_TIME_MIN": scan_time_min,
26422656
"DISCOUNT_PERCENT": discount_percent,
2657+
"TOKEN_PRICE": token_price,
26432658
}
26442659

26452660
for field, value in integer_fields.items():
@@ -2680,6 +2695,7 @@ def validate_application_settings(self, reset=False):
26802695
"WOWHEAD_LINK": wowhead,
26812696
"NO_LINKS": no_links,
26822697
"DISCOUNT_PERCENT": int(discount_percent),
2698+
"TOKEN_PRICE": int(token_price),
26832699
"NO_RUSSIAN_REALMS": no_russians,
26842700
"REFRESH_ALERTS": refresh_alerts,
26852701
"SCAN_TIME_MAX": int(scan_time_max),

mega_alerts.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ def run(self):
7777
def pull_single_realm_data(connected_id):
7878
auctions = mega_data.get_listings_single(connected_id)
7979
clean_auctions = clean_listing_data(auctions, connected_id)
80+
if connected_id in [-1, -2]:
81+
check_token_price()
8082
if not clean_auctions or len(clean_auctions) == 0:
8183
return
8284

@@ -202,6 +204,21 @@ def pull_single_realm_data(connected_id):
202204
)
203205
mega_data.send_discord_embed(item_embed)
204206

207+
def check_token_price():
208+
try:
209+
# check if token price is below threshold durring commodity run
210+
if mega_data.TOKEN_PRICE:
211+
token_price = mega_data.get_wow_token_price()
212+
if mega_data.TOKEN_PRICE is not None and mega_data.TOKEN_PRICE > 0:
213+
token_embed = create_embed(
214+
f"WoW Token Alert - {mega_data.REGION}",
215+
f"**Token Price:** {token_price:,} gold\n**Threshold:** {mega_data.TOKEN_PRICE:,} gold\n**Region:** {mega_data.REGION}",
216+
[],
217+
)
218+
mega_data.send_discord_embed(token_embed)
219+
except Exception as e:
220+
print(f"Error checking token price: {e}")
221+
205222
def clean_listing_data(auctions, connected_id):
206223
all_ah_buyouts = {}
207224
all_ah_bids = {}

utils/mega_data_setup.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def __init__(
4545
)
4646
self.DEBUG = self.__set_mega_vars("DEBUG", raw_mega_data)
4747
self.NO_LINKS = self.__set_mega_vars("NO_LINKS", raw_mega_data)
48+
self.TOKEN_PRICE = self.__set_mega_vars("TOKEN_PRICE", raw_mega_data)
4849

4950
# set required env vars
5051
self.WOW_CLIENT_ID = self.__set_mega_vars("WOW_CLIENT_ID", raw_mega_data, True)
@@ -194,6 +195,15 @@ def __set_mega_vars(var_name, raw_mega_data, required=False):
194195
else:
195196
var_value = 1
196197

198+
if var_name == "TOKEN_PRICE":
199+
if str(var_value).isnumeric() or isinstance(var_value, int):
200+
if 1 <= int(var_value) <= 10000000:
201+
var_value = int(var_value)
202+
else:
203+
var_value = 1
204+
else:
205+
var_value = 1
206+
197207
# handle cases where we need a default value to be true or false
198208
def process_var(var_value, default_behaviour):
199209
if (
@@ -748,6 +758,52 @@ def make_commodity_ah_api_request(self):
748758
auction_info = req.json()
749759
return auction_info
750760

761+
@retry(
762+
stop=stop_after_attempt(10),
763+
retry=retry_if_exception_type(requests.RequestException),
764+
retry_error_callback=lambda retry_state: None,
765+
)
766+
def get_wow_token_price(self):
767+
"""
768+
Get the current WoW token price from the Blizzard API.
769+
770+
Returns:
771+
float: Token price in gold, or None if the request fails
772+
"""
773+
if self.REGION == "NA":
774+
url = "https://us.api.blizzard.com/data/wow/token/index?namespace=dynamic-us&locale=en_US"
775+
elif self.REGION == "EU":
776+
url = "https://eu.api.blizzard.com/data/wow/token/index?namespace=dynamic-eu&locale=en_EU"
777+
else:
778+
print(f"WoW tokens not available for region {self.REGION}")
779+
return None
780+
781+
headers = {"Authorization": f"Bearer {self.check_access_token()}"}
782+
req = requests.get(url, headers=headers, timeout=20)
783+
784+
# check for api errors
785+
if req.status_code == 429:
786+
error_message = f"{req} BLIZZARD too many requests error getting WoW token price for {self.REGION}"
787+
print(error_message)
788+
time.sleep(3)
789+
raise Exception(error_message)
790+
elif req.status_code != 200:
791+
error_message = (
792+
f"{req} BLIZZARD error getting WoW token price for {self.REGION}"
793+
)
794+
print(error_message)
795+
time.sleep(1)
796+
raise Exception(error_message)
797+
798+
token_data = req.json()
799+
800+
# Validate the response structure
801+
if "price" not in token_data or "last_updated_timestamp" not in token_data:
802+
print(f"Invalid token data structure: {token_data}")
803+
return None
804+
805+
return token_data["price"] / 10000
806+
751807
#### GENERAL USE FUNCTIONS ####
752808
def send_discord_message(self, message):
753809
send_discord_message(message, self.WEBHOOK_URL)

0 commit comments

Comments
 (0)