Implement handling for drops with more than one benefit

This commit is contained in:
DevilXD
2022-05-16 22:42:32 +02:00
parent 53d78f8a8d
commit 3c8274b166
2 changed files with 19 additions and 10 deletions

11
gui.py
View File

@@ -975,10 +975,13 @@ class InventoryOverview:
for i, drop in enumerate(campaign.drops):
drop_frame = ttk.Frame(drops_row, relief="ridge", borderwidth=1, padding=5)
drop_frame.grid(column=i, row=0, padx=4)
drop_image = await self._cache.get(drop.image_url, (80, 80))
ttk.Label(
drop_frame, text=drop.rewards_text(), image=drop_image, compound="bottom"
).grid(column=0, row=0)
benefits_frame = ttk.Frame(drop_frame)
benefits_frame.grid(column=0, row=0)
for i, benefit in enumerate(drop.benefits):
benefit_image = await self._cache.get(benefit.image_url, (80, 80))
ttk.Label(
benefits_frame, text=benefit.name, image=benefit_image, compound="bottom"
).grid(column=i, row=0, padx=5)
progress_text, progress_color = self.get_progress(drop)
self._drops[drop.id] = label = ttk.Label(
drop_frame, text=progress_text, foreground=progress_color

View File

@@ -24,6 +24,14 @@ def remove_dimensions(url: URLType) -> URLType:
return URLType(DIMS_PATTERN.sub('', url))
class Benefit:
def __init__(self, data: JsonType):
benefit_data: JsonType = data["benefit"]
self.id: str = benefit_data["id"]
self.name: str = benefit_data["name"]
self.image_url: URLType = benefit_data["imageAssetURL"]
class BaseDrop:
def __init__(
self, campaign: DropsCampaign, data: JsonType, claimed_benefits: dict[str, datetime]
@@ -32,9 +40,7 @@ class BaseDrop:
self.id: str = data["id"]
self.name: str = data["name"]
self.campaign: DropsCampaign = campaign
self.rewards: list[str] = [b["benefit"]["name"] for b in data["benefitEdges"]]
# we use the first benefit's image specifically here
self.image_url: URLType = data["benefitEdges"][0]["benefit"]["imageAssetURL"]
self.benefits: list[Benefit] = [Benefit(b) for b in data["benefitEdges"]]
self.starts_at: datetime = timestamp(data["startAt"])
self.ends_at: datetime = timestamp(data["endAt"])
self.claim_id: str | None = None
@@ -52,8 +58,8 @@ class BaseDrop:
(
dts := [
claimed_benefits[bid]
for b in data["benefitEdges"]
if (bid := b["benefit"]["id"]) in claimed_benefits
for benefit in self.benefits
if (bid := benefit.id) in claimed_benefits
]
)
and all(self.starts_at <= dt < self.ends_at for dt in dts)
@@ -97,7 +103,7 @@ class BaseDrop:
self.claim_id = claim_id
def rewards_text(self, delim: str = ", ") -> str:
return delim.join(self.rewards)
return delim.join(benefit.name for benefit in self.benefits)
async def claim(self) -> bool:
result = await self._claim()