Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Der-Henning
GitHub Repository: Der-Henning/tgtg
Path: blob/main/tgtg_scanner/models/reservations.py
1218 views
1
import logging
2
from collections.abc import Callable
3
from dataclasses import dataclass
4
5
from tgtg_scanner.models.item import Item
6
from tgtg_scanner.tgtg import TgtgClient
7
8
log = logging.getLogger("tgtg")
9
10
11
@dataclass
12
class Order:
13
id: str
14
item_id: str
15
amount: int
16
display_name: str
17
18
19
@dataclass
20
class Reservation:
21
item_id: str
22
amount: int
23
display_name: str
24
25
26
class Reservations:
27
def __init__(self, client: TgtgClient) -> None:
28
self.client = client
29
self.reservation_query: list[Reservation] = []
30
self.active_orders: dict[str, Order] = {}
31
32
def reserve(self, item_id: str, display_name: str, amount: int = 1) -> None:
33
"""Create a new reservation.
34
35
Args:
36
item_id (str): Item ID
37
display_name (str): Item display name
38
amount (int, optional): Amount. Defaults to 1.
39
40
"""
41
self.reservation_query.append(Reservation(item_id, amount, display_name))
42
43
def make_orders(self, state: dict[str, Item], callback: Callable[[Reservation], None]) -> None:
44
"""Create orders for reservations.
45
46
Args:
47
state (Dict[str, Item]): Current item state
48
callback (Callable[[Reservation], None]): Callback for each order
49
50
"""
51
for reservation in self.reservation_query:
52
item = state.get(reservation.item_id)
53
if item and item.items_available > 0:
54
try:
55
self._create_order(reservation)
56
self.reservation_query.remove(reservation)
57
callback(reservation)
58
except Exception as exc:
59
log.warning("Order failed: %s", exc)
60
61
def update_active_orders(self) -> None:
62
"""Remove orders that are not active anymore."""
63
for order_id in list(self.active_orders):
64
res = self.client.get_order_status(order_id)
65
if res.get("state") != "RESERVED":
66
del self.active_orders[order_id]
67
68
def cancel_order(self, order_id: str) -> None:
69
"""Cancel an order."""
70
self.client.abort_order(order_id)
71
72
def cancel_all_orders(self) -> None:
73
"""Cancel all active orders."""
74
for order_id in list(self.active_orders):
75
self.cancel_order(order_id)
76
77
def _create_order(self, reservation: Reservation) -> None:
78
res = self.client.create_order(reservation.item_id, reservation.amount)
79
order_id = res.get("id")
80
if order_id:
81
order = Order(
82
order_id,
83
reservation.item_id,
84
reservation.amount,
85
reservation.display_name,
86
)
87
self.active_orders[order_id] = order
88
89