make prizebot work with new website

pull/484/head
Mike Lang 2 weeks ago
parent 3b1c837bfa
commit 968e6ec273

@ -1,23 +1,65 @@
from collections import namedtuple
import json import json
import time import time
import re
import argh import argh
import requests import requests
from bs4 import BeautifulSoup
from .config import get_config from .config import get_config
from .zulip import Client from .zulip import Client
Prize = namedtuple("Prize", ["id", "link", "type", "title", "state", "result"])
def get_prizes(type): def get_prizes(type):
resp = requests.get("https://desertbus.org/wapi/prizes/{}".format(type)) resp = requests.get(f"https://desertbus.org/2024/prizes/{type}", {"User-Agent": ""})
resp.raise_for_status() resp.raise_for_status()
return resp.json()['prizes'] html = BeautifulSoup(resp.content.decode(), "html.parser")
main = html.body.main
prizes = []
for a in main.find_all("a"):
# look for prize links
match = re.match("^/\d+/prize/([A-Z]+)$", a["href"])
if not match:
continue
# skip image links
if a.find("img") is not None:
continue
# skip "See More" link
if "See More >" in a.string:
continue
id = match.group(1)
title = a.string
div = a.parent.parent
current = div.find_all("div", recursive=False)[1].contents[0].strip()
result = None
if current.startswith("Starts"):
state = "pending"
elif current.startswith("High Bid"):
state = "active"
elif current.startswith("Entries open"):
state = "active"
elif current.startswith("Giveaway closed"):
state = "active"
elif current.startswith("Winner"):
state = "sold"
result = " - ".join([
"".join(d.strings).strip() for d in div.find_all("div", recursive=False)
if "text-brand-green" in d["class"]
])
else:
state = "unknown"
prizes.append(Prize(id, a["href"], type, title, state, result))
return prizes
def send_message(client, prize, test=False, giveaway=False): def send_message(client, prize, test=False):
message = "[{title}](https://desertbus.org/prize/{id}) won by {bidder} - raised ${bid:.2f}".format(**prize) message = f"[{prize.title}]({prize.link}) {prize.result}"
if giveaway: if prize.type == "giveaway":
message += "\n@*editors* Remember to go back and edit the giveaway video" message += "\n@*editors* Remember to go back and edit the giveaway video"
if test: if test:
print(message) print(message)
@ -38,13 +80,13 @@ def main(config_file, test=False, all=False, once=False, interval=60):
client = Client(config['url'], config['email'], config['api_key']) client = Client(config['url'], config['email'], config['api_key'])
while True: while True:
start = time.time() start = time.time()
for type in ('live_auction', 'silent_auction', 'giveaway'): for type in ('live', 'silent', 'giveaway'):
prizes = get_prizes(type) prizes = get_prizes(type)
for prize in prizes: for prize in prizes:
id = str(prize['id']) if prize.state == "sold" and (all or state.get(prize.id, "sold") != "sold"):
if prize['state'] == "sold" and (all or state.get(id, "sold") != "sold"): send_message(client, prize, test=test)
send_message(client, prize, test=test, giveaway=(type == "giveaway")) state[prize.id] = prize.state
state[id] = prize['state'] print(state)
if not test: if not test:
with open(config['state'], 'w') as f: with open(config['state'], 'w') as f:
f.write(json.dumps(state) + '\n') f.write(json.dumps(state) + '\n')

Loading…
Cancel
Save