/ PyCrypCli / PyCrypCli / commands / inventory.py
inventory.py
 1  from collections import Counter
 2  from typing import List, Dict, Any
 3  
 4  from .command import CommandError, command
 5  from .help import print_help
 6  from ..context import MainContext, DeviceContext
 7  from ..exceptions import CannotTradeWithYourselfError, UserUUIDDoesNotExistError
 8  from ..models import InventoryElement, ShopCategory
 9  from ..util import print_tree
10  
11  
12  @command("inventory", [MainContext, DeviceContext])
13  def handle_inventory(context: MainContext, args: List[str]) -> None:
14      """
15      Manage your inventory and trade with other players
16      """
17  
18      if args:
19          raise CommandError("Unknown subcommand.")
20      print_help(context, handle_inventory)
21  
22  
23  @handle_inventory.subcommand("list")
24  def handle_inventory_list(context: MainContext, _: Any) -> None:
25      """
26      List your inventory
27      """
28  
29      inventory: Dict[str, int] = Counter(element.name for element in InventoryElement.list_inventory(context.client))
30      if not inventory:
31          raise CommandError("Your inventory is empty.")
32  
33      categories: List[ShopCategory] = ShopCategory.shop_list(context.client)
34      tree = []
35      for category in categories:
36          category_tree = []
37          for subcategory in category.subcategories:
38              subcategory_tree: list[tuple[str, list[Any]]] = [
39                  (f"{inventory[item.name]}x {item.name}", []) for item in subcategory.items if inventory[item.name]
40              ]
41              if subcategory_tree:
42                  category_tree.append((subcategory.name, subcategory_tree))
43  
44          for item in category.items:
45              if inventory[item.name]:
46                  category_tree.append((f"{inventory[item.name]}x {item.name}", []))
47  
48          if category_tree:
49              tree.append((category.name, category_tree))
50  
51      print("Inventory")
52      print_tree(tree)
53  
54  
55  @handle_inventory.subcommand("trade")
56  def handle_inventory_trade(context: MainContext, args: List[str]) -> None:
57      """
58      Trade with other players
59      """
60  
61      if len(args) != 2:
62          raise CommandError("usage: inventory trade <item> <user>")
63  
64      item_name, target_user = args
65  
66      for item in InventoryElement.list_inventory(context.client):
67          if item.name.replace(" ", "") == item_name:
68              break
69      else:
70          raise CommandError("You do not own this item.")
71  
72      try:
73          item.trade(target_user)
74      except CannotTradeWithYourselfError:
75          raise CommandError("You cannot trade with yourself.")
76      except UserUUIDDoesNotExistError:
77          raise CommandError("This user does not exist.")
78  
79  
80  @handle_inventory_trade.completer()
81  def inventory_completer(context: MainContext, args: List[str]) -> List[str]:
82      if len(args) == 1:
83          return [element.name.replace(" ", "") for element in InventoryElement.list_inventory(context.client)]
84      return []