import discord from discord import app_commands from discord.ext import commands import random from typing import Optional # A sample shop inventory. The keys are item names (in lowercase) and the values are the cost. # When selling, we assume you get about half the price. SHOP_ITEMS = { "pen": 20, "notebook": 50, "backpack": 100, "headphones": 200, "Temu Iphone 69326": 75, "Temu Macbook water": 100, "phone": 150, "Dell Optiplex 3020 M": 200, "Asus Vivobook 14": 175, "Kasane Teto plushie": 50, "miku plushie": 50, "RARE Golden Teto Plusie": 20000, } # A simple in-memory economy store where each user starts with $100 and an empty inventory. economy = {} def get_account(user_id: int) -> dict: """Creates an account for the user if one does not exist and returns it.""" if user_id not in economy: economy[user_id] = {"balance": 100, "inventory": []} return economy[user_id] # ------------------- User Commands ------------------- @app_commands.command(name="work", description="Work a job and earn money!") async def work(interaction: discord.Interaction): account = get_account(interaction.user.id) earned = random.randint(50, 150) job = random.choice(["barista", "cashier", "developer", "bartender", "freelancer"]) account["balance"] += earned embed = discord.Embed( title="Work", description=f"You worked as a **{job}** and earned **${earned}**.\nYour new balance is **${account['balance']}**.", color=discord.Color.blue() ) await interaction.response.send_message(embed=embed) @app_commands.command(name="sell", description="Sell an item from your inventory.") @app_commands.describe(item="The item you wish to sell.") async def sell(interaction: discord.Interaction, item: str): account = get_account(interaction.user.id) # Find the item in your inventory (ignoring case) item_in_inventory = None for inv_item in account["inventory"]: if inv_item.lower() == item.lower(): item_in_inventory = inv_item break if not item_in_inventory: embed = discord.Embed( title="Sell", description="You don't have that item in your inventory!", color=discord.Color.red() ) await interaction.response.send_message(embed=embed) return account["inventory"].remove(item_in_inventory) # Use the shop price if known, otherwise default to $20; you get roughly half when selling. sold_price = SHOP_ITEMS.get(item_in_inventory.lower(), 20) // 2 account["balance"] += sold_price embed = discord.Embed( title="Sell", description=f"You sold your **{item_in_inventory}** for **${sold_price}**.\nYour new balance is **${account['balance']}**.", color=discord.Color.green() ) await interaction.response.send_message(embed=embed) @app_commands.command(name="steal", description="Attempt to steal money from another user!") @app_commands.describe(target="The member you want to steal from.") async def steal(interaction: discord.Interaction, target: discord.Member): account = get_account(interaction.user.id) thief = account victim = get_account(target.id) if target.id == interaction.user.id: embed = discord.Embed( title="Steal", description="You can't steal from yourself!", color=discord.Color.red() ) await interaction.response.send_message(embed=embed) return if victim["balance"] < 50: embed = discord.Embed( title="Steal", description=f"{target.display_name} doesn't have enough money to steal!", color=discord.Color.red() ) await interaction.response.send_message(embed=embed) return # Simulate theft with a 30% chance of success. if random.random() < 0.3: stolen = random.randint(10, min(100, victim["balance"] // 3)) victim["balance"] -= stolen thief["balance"] += stolen embed = discord.Embed( title="Steal", description=f"You successfully stole **${stolen}** from **{target.display_name}**!\nYour new balance is **${thief['balance']}**.", color=discord.Color.green() ) else: fine = random.randint(5, 20) thief["balance"] = max(0, thief["balance"] - fine) embed = discord.Embed( title="Steal", description=f"You got caught trying to steal from **{target.display_name}**!\nYou were fined **${fine}**.\nYour new balance is **${thief['balance']}**.", color=discord.Color.red() ) await interaction.response.send_message(embed=embed) @app_commands.command(name="shop", description="View shop items or buy an item.") @app_commands.describe(item="The item you wish to buy (optional). Leave empty to view available items.") async def shop(interaction: discord.Interaction, item: Optional[str] = None): account = get_account(interaction.user.id) if item is None: items_list = "\n".join([f"{name.title()} - ${price}" for name, price in SHOP_ITEMS.items()]) embed = discord.Embed( title="Shop - Available Items", description=items_list, color=discord.Color.blue() ) embed.set_footer(text="To buy an item, use /shop ") await interaction.response.send_message(embed=embed) else: item_key = item.lower() if item_key not in [key.lower() for key in SHOP_ITEMS]: embed = discord.Embed( title="Shop", description="That item is not available in the shop!", color=discord.Color.red() ) await interaction.response.send_message(embed=embed) return # Find the actual key (preserving case) from the shop items. for key in SHOP_ITEMS: if key.lower() == item_key: item_key = key break price = SHOP_ITEMS[item_key] if account["balance"] < price: embed = discord.Embed( title="Shop", description="You don't have enough money to buy that item!", color=discord.Color.red() ) await interaction.response.send_message(embed=embed) return account["balance"] -= price account["inventory"].append(item_key.lower()) embed = discord.Embed( title="Shop", description=f"You bought a **{item_key.title()}** for **${price}**.\nYour new balance is **${account['balance']}**.", color=discord.Color.green() ) await interaction.response.send_message(embed=embed) @app_commands.command(name="gamble", description="Gamble a certain amount of money in a coin flip!") @app_commands.describe(amount="The amount of money you want to gamble.") async def gamble(interaction: discord.Interaction, amount: int): account = get_account(interaction.user.id) if amount <= 0: embed = discord.Embed( title="Gamble", description="You must gamble a positive amount!", color=discord.Color.red() ) await interaction.response.send_message(embed=embed) return if account["balance"] < amount: embed = discord.Embed( title="Gamble", description="You don't have that much money!", color=discord.Color.red() ) await interaction.response.send_message(embed=embed) return if random.choice([True, False]): account["balance"] += amount embed = discord.Embed( title="Gamble", description=f"You won! You earned an extra **${amount}**.\nYour new balance is **${account['balance']}**.", color=discord.Color.green() ) else: account["balance"] -= amount embed = discord.Embed( title="Gamble", description=f"You lost the gamble and lost **${amount}**.\nYour new balance is **${account['balance']}**.", color=discord.Color.red() ) await interaction.response.send_message(embed=embed) # ------------------- Admin Commands ------------------- @app_commands.command(name="invedit", description="Admin: Add or remove a shop item from a user's inventory.") @app_commands.describe( user="The target user whose inventory you want to edit.", item="The shop item to add or remove.", action="Specify 'add' to add the item or 'take' to remove it." ) async def invedit(interaction: discord.Interaction, user: discord.Member, item: str, action: str): # Check if the command user has administrator permissions. if not interaction.user.guild_permissions.administrator: embed = discord.Embed( title="Invedit", description="You do not have permission to use this command.", color=discord.Color.red() ) await interaction.response.send_message(embed=embed, ephemeral=True) return # Perform a case-insensitive lookup in the shop items. shop_item_key = None for key in SHOP_ITEMS: if key.lower() == item.lower(): shop_item_key = key break if shop_item_key is None: embed = discord.Embed( title="Invedit", description="This item does not exist in the shop.", color=discord.Color.red() ) await interaction.response.send_message(embed=embed, ephemeral=True) return # Retrieve account for the target user. account = get_account(user.id) shop_item = shop_item_key.lower() # use consistent lowercase in the inventory if action.lower() == "add": account["inventory"].append(shop_item) embed = discord.Embed( title="Invedit", description=f"Added **{shop_item}** to **{user.display_name}**'s inventory.", color=discord.Color.green() ) await interaction.response.send_message(embed=embed) elif action.lower() == "take": if shop_item in account["inventory"]: account["inventory"].remove(shop_item) embed = discord.Embed( title="Invedit", description=f"Removed **{shop_item}** from **{user.display_name}**'s inventory.", color=discord.Color.green() ) await interaction.response.send_message(embed=embed) else: embed = discord.Embed( title="Invedit", description=f"**{user.display_name}** does not have **{shop_item}** in their inventory.", color=discord.Color.red() ) await interaction.response.send_message(embed=embed, ephemeral=True) else: embed = discord.Embed( title="Invedit", description="Invalid action. Use 'add' or 'take'.", color=discord.Color.red() ) await interaction.response.send_message(embed=embed, ephemeral=True) @app_commands.command(name="moneyedit", description="Admin: Edit a user's balance.") @app_commands.describe( user="The target user whose balance you want to modify.", amount="The amount to add (or subtract if negative)." ) async def moneyedit(interaction: discord.Interaction, user: discord.Member, amount: int): # Check if the command user has administrator permissions. if not interaction.user.guild_permissions.administrator: embed = discord.Embed( title="Moneyedit", description="You do not have permission to use this command.", color=discord.Color.red() ) await interaction.response.send_message(embed=embed, ephemeral=True) return account = get_account(user.id) account["balance"] += amount embed = discord.Embed( title="Moneyedit", description=f"**{user.display_name}**'s new balance is **${account['balance']}**.", color=discord.Color.green() ) await interaction.response.send_message(embed=embed) # ------------------- Setup Function ------------------- async def setup(bot: commands.Bot): # Register all commands to the bot's command tree. bot.tree.add_command(work) bot.tree.add_command(sell) bot.tree.add_command(steal) bot.tree.add_command(shop) bot.tree.add_command(gamble) bot.tree.add_command(invedit) bot.tree.add_command(moneyedit)