Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Der-Henning
GitHub Repository: Der-Henning/tgtg
Path: blob/main/tgtg_scanner/models/reservations.py
725 views
1
import logging
2
from dataclasses import dataclass
3
from typing import Callable, Dict, List
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
self.reservation_query.append(Reservation(item_id, amount, display_name))
41
42
def make_orders(self, state: Dict[str, Item], callback: Callable[[Reservation], None]) -> None:
43
"""Create orders for reservations
44
45
Args:
46
state (Dict[str, Item]): Current item state
47
callback (Callable[[Reservation], None]): Callback for each order
48
"""
49
for reservation in self.reservation_query:
50
item = state.get(reservation.item_id)
51
if item and item.items_available > 0:
52
try:
53
self._create_order(reservation)
54
self.reservation_query.remove(reservation)
55
callback(reservation)
56
except Exception as exc:
57
log.warning("Order failed: %s", exc)
58
59
def update_active_orders(self) -> None:
60
"""Remove orders that are not active anymore"""
61
for order_id in list(self.active_orders):
62
res = self.client.get_order_status(order_id)
63
if res.get("state") != "RESERVED":
64
del self.active_orders[order_id]
65
66
def cancel_order(self, order_id: str) -> None:
67
"""Cancel an order"""
68
self.client.abort_order(order_id)
69
70
def cancel_all_orders(self) -> None:
71
"""Cancel all active orders"""
72
for order_id in list(self.active_orders):
73
self.cancel_order(order_id)
74
75
def _create_order(self, reservation: Reservation) -> None:
76
res = self.client.create_order(reservation.item_id, reservation.amount)
77
order_id = res.get("id")
78
if order_id:
79
order = Order(
80
order_id,
81
reservation.item_id,
82
reservation.amount,
83
reservation.display_name,
84
)
85
self.active_orders[order_id] = order
86
87