diff --git a/Dockerfile b/Dockerfile index e2bdb04..630757b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,6 +40,7 @@ COPY web/ ./web/ # Create data directory for persistent storage RUN mkdir -p /app/data && chmod 777 /app/data +RUN mkdir -p /app/logs && chmod 777 /app/logs # Expose web port EXPOSE 8080 diff --git a/src/__main__.py b/src/__main__.py index e040005..fbc9bf4 100644 --- a/src/__main__.py +++ b/src/__main__.py @@ -1,4 +1,5 @@ from __future__ import annotations + import argparse import asyncio import logging diff --git a/src/config/constants.py b/src/config/constants.py index 2bfa09c..b54d761 100644 --- a/src/config/constants.py +++ b/src/config/constants.py @@ -9,6 +9,7 @@ from datetime import timedelta from enum import Enum, auto from typing import TYPE_CHECKING, Any, Literal, NewType + if TYPE_CHECKING: from collections import abc # noqa from typing import TypeAlias @@ -57,7 +58,6 @@ ONLINE_DELAY = timedelta(seconds=120) WATCH_INTERVAL = timedelta(seconds=59) - class State(Enum): """Application state machine states.""" diff --git a/src/web/managers/inventory.py b/src/web/managers/inventory.py index c736bef..6856942 100644 --- a/src/web/managers/inventory.py +++ b/src/web/managers/inventory.py @@ -3,6 +3,7 @@ from __future__ import annotations import asyncio +import logging from typing import TYPE_CHECKING, Any @@ -12,6 +13,9 @@ if TYPE_CHECKING: from src.web.managers.cache import ImageCache +logger = logging.getLogger("TwitchDrops") + + class InventoryManager: """Manages drop campaign inventory display in the web interface. @@ -41,6 +45,16 @@ class InventoryManager: drops_data = [] for drop in campaign.drops: + # Collect full benefit data (filter out benefits without images) + benefits_data = [ + { + "name": benefit.name, + "type": benefit.type.name, + "image_url": str(benefit.image_url), + } + for benefit in drop.benefits + if benefit.image_url + ] drops_data.append( { "id": drop.id, @@ -50,7 +64,7 @@ class InventoryManager: "progress": drop.progress, "is_claimed": drop.is_claimed, "can_claim": drop.can_claim, - "rewards": drop.rewards_text(), + "benefits": benefits_data, "starts_at": drop.starts_at.isoformat(), "ends_at": drop.ends_at.isoformat(), } diff --git a/web/static/app.js b/web/static/app.js index 19eef05..fd7f0ba 100644 --- a/web/static/app.js +++ b/web/static/app.js @@ -494,14 +494,36 @@ function renderInventory() { } const claimedText = t.gui?.inventory?.status?.claimed || 'Claimed'; - const dropsHtml = campaign.drops.map(drop => ` -