1+ from .inventory import get_inventory_stock
12from .database import Database
23from .options import Options
3- from .offer import valuate
4+ from .offer import valuate , OfferData
45
6+ from dataclasses import asdict
57from json import dumps
68import logging
79import time
810
911from steampy .exceptions import InvalidCredentials
1012from steampy .client import SteamClient
11- from tf2_utils import Offer , to_refined , refinedify , PricesTF
13+ from tf2_utils import (
14+ Offer ,
15+ Inventory ,
16+ PricesTF ,
17+ to_refined ,
18+ refinedify ,
19+ account_id_to_steam_id ,
20+ )
1221
1322
1423class Express :
@@ -21,15 +30,17 @@ def __init__(self, bot: dict, options: Options) -> None:
2130 self .client = SteamClient (bot ["api_key" ])
2231 self .db = Database (options .database )
2332 self .pricer = PricesTF ()
33+ self .inventory = Inventory ("steamcommunity" ) # use apikey?
2434
25- # TODO: make processed and values into offers list[Offer]
26- self .values = {}
27- self .processed = []
35+ self .stock = {}
36+ self .processed : list [OfferData ] = []
2837 self .last_offer_fetch = 0
2938 self .options = options
3039
3140 self .is_enabled = True
32- # TODO: add processed_offers, accepted_offers, active_offers for status
41+ self .active_offers = 0
42+ self .processed_offers = 0
43+ self .accepted_offers = 0
3344
3445 self .prices_to_check = []
3546
@@ -90,7 +101,7 @@ def __get_offers(self) -> list[dict]:
90101 "trade_offers_received"
91102 ]
92103 except Exception as e :
93- logging .error (f"Did not get wanted response when getting offers: { e } " )
104+ logging .error (f"{ e } " )
94105 return [{}]
95106
96107 def __get_offer (self , offer_id : str ) -> dict :
@@ -126,17 +137,24 @@ def __process_offer(self, offer: dict) -> None:
126137 if not offer_id :
127138 return
128139
129- if offer_id in self .processed :
140+ for offer_data in self .processed :
141+ if offer_id != offer_data .offer_id :
142+ continue
143+
130144 logging .debug (f"({ offer_id } ) has already been processed" )
131145 return
132146
133147 self .__log_trade ("Processing offer" , offer_id )
134148
135149 # we assume we wont crash, add to processed now
136150 # so if we return early, we wont process again
137- self .processed .append (offer_id )
151+ offer_data = OfferData (offer_id )
152+ self .processed .append (offer_data )
138153 logging .debug (f"Added offer { offer_id } to processed list" )
139154
155+ self .active_offers += 1
156+ self .processed_offers += 1
157+
140158 trade = Offer (offer )
141159
142160 if not trade .is_active ():
@@ -153,10 +171,13 @@ def __process_offer(self, offer: dict) -> None:
153171 their_items = offer ["items_to_receive" ]
154172 our_items = offer ["items_to_give" ]
155173
156- self .values [offer_id ] = {
157- "their_items" : their_items ,
158- "our_items" : our_items ,
159- }
174+ # add offer data
175+ offer_data .message = offer ["message" ]
176+ offer_data .steam_id_other = account_id_to_steam_id (offer ["accountid_other" ])
177+ offer_data .time_created = offer ["time_created" ]
178+ offer_data .time_updated = offer ["time_updated" ]
179+ offer_data .their_items = their_items
180+ offer_data .our_items = our_items
160181
161182 # is owner
162183 if partner_steam_id in self .options .owners :
@@ -188,6 +209,10 @@ def __process_offer(self, offer: dict) -> None:
188209 # get mann co key buy and sell price
189210 key_prices = self .db .get_item ("5021;6" )
190211
212+ # TODO: handle if in_stock + new items would
213+ # surpass max_stock. -100;6 is edge case
214+ # max_stock = -1 is unlimited
215+
191216 # we dont care about unpriced items on their side
192217 their_value , _ = valuate (
193218 self .db , their_items , "buy" , all_skus , key_prices , self .options
@@ -213,8 +238,9 @@ def __process_offer(self, offer: dict) -> None:
213238 )
214239 )
215240
216- self .values [offer_id ]["our_value" ] = our_value
217- self .values [offer_id ]["their_value" ] = their_value
241+ offer_data .their_value = their_value
242+ offer_data .our_value = our_value
243+ offer_data .has_unpriced = has_unpriced
218244
219245 self .__log_trade (summary )
220246
@@ -244,52 +270,45 @@ def __process_offers(self) -> None:
244270 logging .info ("No new offers available" )
245271 return
246272
247- logging .info (f"Processing { amount } offers" )
273+ # logging.info(f"Processing {amount} offers")
248274
249275 for offer in offers :
250276 self .__process_offer (offer )
251277
252278 def __update_offer_states (self ) -> None :
253- active_offers = 0
279+ if self .active_offers :
280+ logging .info (f"{ self .active_offers } offer(s) are still active" )
254281
255- for offer_id in self .processed :
256- offer = self .__get_offer (offer_id )
282+ for offer_data in self .processed . copy () :
283+ offer = self .__get_offer (offer_data . offer_id )
257284 trade = Offer (offer )
258285
286+ offer_data .state = trade .get_state ()
287+
259288 if trade .is_active ():
260- active_offers += 1
261289 continue
262290
263- if not trade .is_active ():
264- self .__log_trade (
265- f"Offer state changed to { trade .get_state ()} " , offer_id
266- )
267- # we have processed the offer if its not active anymore
268- self .processed .remove (offer_id )
291+ self .active_offers -= 1
292+
293+ self .__log_trade (
294+ f"Offer state changed to { trade .get_state ()} " , offer_data .offer_id
295+ )
269296
270297 if trade .is_accepted ():
298+ self .accepted_offers += 1
299+
300+ # TODO: increment in_stock, -100;6 edge case
301+
271302 if self .options .save_trades :
272303 logging .info ("Saving offer data..." )
273304
274- if offer_id in self .values :
275- offer ["their_items" ] = self .values [offer_id ]["their_items" ]
276- offer ["our_items" ] = self .values [offer_id ]["our_items" ]
277- offer ["our_value" ] = self .values [offer_id ].get ("our_value" , 0.0 )
278- offer ["their_value" ] = self .values [offer_id ].get (
279- "their_value" , 0.0
280- )
281-
282305 if offer .get ("tradeid" ) and self .options .save_receipt :
283- offer [ " receipt" ] = self .__get_receipt (offer ["tradeid" ])
306+ offer_data . receipt = self .__get_receipt (offer ["tradeid" ])
284307
285- self .db .insert_trade (offer )
308+ self .db .insert_trade (asdict ( offer_data ) )
286309 logging .info ("Offer was added to the database" )
287310
288- if offer_id in self .values :
289- self .values .pop (offer_id )
290-
291- if active_offers :
292- logging .info (f"{ active_offers } offer(s) are still active" )
311+ self .processed .remove (offer_data )
293312
294313 def __append_autopriced_items (self ) -> None :
295314 autopriced_items = self .db .get_autopriced ()
@@ -308,6 +327,13 @@ def run(self) -> None:
308327 self .__append_autopriced_items ()
309328 self .__update_prices ()
310329
330+ inventory = self .inventory .fetch (self .steam_id )
331+ self .stock = get_inventory_stock (inventory )
332+
333+ self .db .update_stocks (self .stock )
334+
335+ del inventory
336+
311337 while True :
312338 # bot is disabled
313339 if not self .is_enabled :
0 commit comments