43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
import time
|
|
import logging
|
|
from django.core.management.base import BaseCommand
|
|
from django.utils import timezone
|
|
from datetime import timedelta
|
|
from backlogger.models import Item
|
|
from backlogger import hltb as hltb_api
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
INITIAL_DELAY_SECONDS = 20
|
|
BETWEEN_LOOKUPS_SECONDS = 5
|
|
IDLE_POLL_SECONDS = 10
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Background worker: fetches HLTB data for newly created game items.'
|
|
|
|
def handle(self, *args, **options):
|
|
self.stdout.write('HLTB worker started.')
|
|
while True:
|
|
cutoff = timezone.now() - timedelta(seconds=INITIAL_DELAY_SECONDS)
|
|
item = (
|
|
Item.objects
|
|
.filter(category=Item.GAMES, hltb_fetched=False, created_at__lte=cutoff)
|
|
.order_by('created_at')
|
|
.first()
|
|
)
|
|
if item is None:
|
|
time.sleep(IDLE_POLL_SECONDS)
|
|
continue
|
|
|
|
self.stdout.write(f'Fetching HLTB for: {item.name} (id={item.pk})')
|
|
try:
|
|
hltb_api.apply_to_item(item)
|
|
except Exception as e:
|
|
logger.exception('HLTB lookup failed for item %s', item.pk)
|
|
# Mark as fetched anyway to avoid retrying indefinitely
|
|
item.hltb_fetched = True
|
|
item.save(update_fields=['hltb_fetched'])
|
|
|
|
time.sleep(BETWEEN_LOOKUPS_SECONDS)
|