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 []