The great nerds work
discord botunknown
python
2 years ago
25 kB
5
Indexable
import discord
from discord.ext import commands
import json
import random
import asyncio
# Define intents
intents = discord.Intents.default()
intents.message_content = True
# Initialize the bot
bot = commands.Bot(command_prefix='!', intents=intents)
# Define the file path for user data
user_data_file = 'C:/Users/krs2l/Desktop/EconomyBotData.json'
# Load user data from the JSON file
def load_user_data():
try:
with open(user_data_file, 'r') as file:
data = json.load(file)
return data
except (FileNotFoundError, json.JSONDecodeError):
return {}
# Save user data to the JSON file
def save_user_data(data):
with open(user_data_file, 'w') as file:
json.dump(data, file, indent=4)
@bot.event
async def on_ready():
print(f'Logged in as {bot.user.name} ({bot.user.id})')
# Load user data when the bot starts
user_data = load_user_data()
# Define the cooldown duration in seconds (30 minutes)
WORK_COOLDOWN_SECONDS = 1800
TRANSACTION_COOLDOWN_SECONDS = 3 # Cooldown for transaction commands
# Define the house edge (1% less reward)
HOUSE_EDGE = 0.01
# Define a command to register a user
@bot.command(
name='register',
description='Register as a user to start using the bot.',
brief='Register as a user.'
)
async def register(ctx):
user_id = str(ctx.author.id)
if user_id not in user_data:
# Create a new user entry in the user_data dictionary
user_data[user_id] = {'purse': 0, 'bank': 500, 'items': []}
save_user_data(user_data)
await ctx.send("You have been registered as a user!")
else:
await ctx.send("You are already registered.")
# Define a command to allow users to work and earn money
@bot.command(
name='work',
description='Work to earn money (with a 30-minute cooldown).',
brief='Earn money.'
)
@commands.cooldown(1, WORK_COOLDOWN_SECONDS, commands.BucketType.user)
async def work(ctx):
user_id = str(ctx.author.id)
if user_id in user_data:
earnings = random.randint(100, 500)
user_data[user_id]['purse'] += earnings
save_user_data(user_data)
await ctx.send(f"You have worked hard and earned ${earnings}!")
else:
await ctx.send("You are not registered. Use !register to create your save data.")
# Handle the cooldown error
@work.error
async def work_error(ctx, error):
if isinstance(error, commands.CommandOnCooldown):
await ctx.send(f"This command is on cooldown. Please wait {error.retry_after:.2f} seconds.")
# Define a command to display the leaderboard with the total amount of money
@bot.command(
name='leaderboard',
aliases=['lb'],
description='Display the top 10 users with the highest total balance (purse + bank).',
brief='Show the top balances.'
)
async def leaderboard(ctx):
sorted_data = sorted(user_data.items(), key=lambda x: x[1]['purse'] + x[1]['bank'], reverse=True)
leaderboard_message = "Top 10 Balances (Purse + Bank):\n"
count = 0
for user_id, data in sorted_data:
user = await bot.fetch_user(int(user_id))
total_balance = data['purse'] + data['bank']
leaderboard_message += f"{user.display_name}: ${total_balance}\n"
count += 1
if count >= 10:
break
await ctx.send(f"```{leaderboard_message}```")
# Define a command to give a user 100 money
# Define a command to deposit money into the bank
@bot.command(
name='deposit',
aliases=['dep'],
description='Deposit money into your bank. You can use "all" or "half" as the amount.',
brief='Deposit money.'
)
async def deposit(ctx, amount: str):
user_id = str(ctx.author.id)
if user_id in user_data:
data = user_data[user_id]
purse_balance = data['purse']
if amount.lower() == 'all':
deposit_amount = purse_balance
elif amount.lower() == 'half':
deposit_amount = purse_balance // 2
else:
try:
deposit_amount = int(amount)
except ValueError:
await ctx.send("Invalid amount. Please specify a valid amount, 'all', or 'half'.")
return
if deposit_amount > 0 and purse_balance >= deposit_amount:
data['purse'] -= deposit_amount
data['bank'] += deposit_amount
save_user_data(user_data)
await ctx.send(f"You have deposited ${deposit_amount} into your bank.")
else:
await ctx.send("Invalid amount or insufficient funds.")
else:
await ctx.send("You are not registered. Use !register to create your save data.")
# Define a command to withdraw money from the bank
@bot.command(
name='withdraw',
aliases=['with'],
description='Withdraw money from your bank. You can use "all" or "half" as the amount.',
brief='Withdraw money.'
)
async def withdraw(ctx, amount: str):
user_id = str(ctx.author.id)
if user_id in user_data:
data = user_data[user_id]
bank_balance = data['bank']
if amount.lower() == 'all':
withdraw_amount = bank_balance
elif amount.lower() == 'half':
withdraw_amount = bank_balance // 2
else:
try:
withdraw_amount = int(amount)
except ValueError:
await ctx.send("Invalid amount. Please specify a valid amount, 'all', or 'half'.")
return
if withdraw_amount > 0 and bank_balance >= withdraw_amount:
data['purse'] += withdraw_amount
data['bank'] -= withdraw_amount
save_user_data(user_data)
await ctx.send(f"You have withdrawn ${withdraw_amount} from your bank.")
else:
await ctx.send("Invalid amount or insufficient funds.")
else:
await ctx.send("You are not registered. Use !register to create your save data.")
# Define a command to deposit all money into the bank
@bot.command(
name='depositall',
aliases=['depall'],
description='Deposit all your purse money into your bank.',
brief='Deposit all money.'
)
async def deposit_all(ctx):
user_id = str(ctx.author.id)
if user_id in user_data:
data = user_data[user_id]
purse_balance = data['purse']
if purse_balance > 0:
data['bank'] += purse_balance
data['purse'] = 0
save_user_data(user_data)
await ctx.send(f"You have deposited all your purse money into your bank.")
else:
await ctx.send("You don't have any money in your purse to deposit.")
else:
await ctx.send("You are not registered. Use !register to create your save data.")
# Define a command to withdraw all money from the bank
@bot.command(
name='withdrawall',
aliases=['withall'],
description='Withdraw all your bank money into your purse.',
brief='Withdraw all money.'
)
async def withdraw_all(ctx):
user_id = str(ctx.author.id)
if user_id in user_data:
data = user_data[user_id]
bank_balance = data['bank']
if bank_balance > 0:
data['purse'] += bank_balance
data['bank'] = 0
save_user_data(user_data)
await ctx.send(f"You have withdrawn all your bank money into your purse.")
else:
await ctx.send("You don't have any money in your bank to withdraw.")
else:
await ctx.send("You are not registered. Use !register to create your save data.")
# Rename the tipall command to rainall
@bot.command(
name='rainall',
description='Tip all users with a specified amount. You can use "all" or "half" as the amount.',
brief='Tip all users.'
)
async def rainall(ctx, amount: str):
user_id = str(ctx.author.id)
if user_id in user_data:
user_data_user = user_data[user_id]
purse_balance = user_data_user['purse']
if amount.lower() == 'all':
tip_amount = purse_balance
elif amount.lower() == 'half':
tip_amount = purse_balance // 2
else:
try:
tip_amount = int(amount)
except ValueError:
await ctx.send("Invalid amount. Please specify a valid amount, 'all', or 'half'.")
return
if tip_amount > 0 and purse_balance >= tip_amount:
for target_id, target_data in user_data.items():
if target_id != user_id: # Don't tip yourself
target_data['purse'] += tip_amount
user_data_user['purse'] -= (tip_amount * (len(user_data) - 1)) # Subtract the total tip amount from the tipper
save_user_data(user_data)
await ctx.send(f"```You tipped all users ${tip_amount} each!```")
else:
await ctx.send("```Invalid amount or insufficient funds in your purse.```")
else:
await ctx.send("```You are not registered. Use !register to create your save data.```")
# Modify the tip command to handle various scenarios and add a confirmation prompt
@bot.command(
name='tip',
description='Tip another user with a specified amount. You can use "all" or "half" as the amount.',
brief='Tip another user.'
)
async def tip(ctx, target_user: discord.User, amount: str):
user_id = str(ctx.author.id)
target_id = str(target_user.id)
if user_id in user_data and target_id in user_data:
user_data_user = user_data[user_id]
target_user_data = user_data[target_id]
purse_balance = user_data_user['purse']
if amount.lower() == 'all':
tip_amount = purse_balance
elif amount.lower() == 'half':
tip_amount = purse_balance // 2
else:
try:
tip_amount = int(amount)
except ValueError:
await ctx.send("Invalid amount. Please specify a valid amount, 'all', or 'half'.")
return
if tip_amount > 0 and purse_balance >= tip_amount:
# Calculate the percentage being tipped
percentage_tipped = (tip_amount / purse_balance) * 100
if percentage_tipped > 30:
# Prompt for confirmation
await ctx.send(f"You are about to tip {target_user.mention} {percentage_tipped:.2f}% of your balance. Are you sure? (Yes/No)")
def check(msg):
return msg.author == ctx.author and msg.channel == ctx.channel and msg.content.lower() in ['yes', 'no']
try:
response = await bot.wait_for('message', check=check, timeout=30)
except TimeoutError:
await ctx.send("You didn't respond within 30 seconds. Tip canceled.")
return
if response.content.lower() == 'yes':
user_data_user['purse'] -= tip_amount
target_user_data['purse'] += tip_amount
save_user_data(user_data)
await ctx.send(f"```You tipped {target_user.mention} ${tip_amount}!```")
else:
await ctx.send("Tip canceled.")
else:
user_data_user['purse'] -= tip_amount
target_user_data['purse'] += tip_amount
save_user_data(user_data)
await ctx.send(f"```You tipped {target_user.mention} ${tip_amount}!```")
else:
await ctx.send("```Invalid amount or insufficient funds in your purse.```")
else:
await ctx.send("```One of the users is not registered. Use !register to create their save data.```")
# Define the command to check a user's balance
@bot.command(
name='balance',
aliases=['bal'],
description='Check your current balance.',
brief='Check your balance.'
)
async def balance(ctx):
user_id = str(ctx.author.id)
if user_id in user_data:
purse_balance = user_data[user_id]['purse']
bank_balance = user_data[user_id]['bank']
total_balance = purse_balance + bank_balance
await ctx.send(f"@{ctx.author.name}'s current balance:\n"
f"Purse: ${purse_balance}\n"
f"Bank: ${bank_balance}\n"
f"Total: ${total_balance}")
else:
await ctx.send("You are not registered. Use !register to create your save data.")
# Define a command to roll a dice and potentially win or lose money (No house edge just luck)
@bot.command(
name='dice',
description='Roll a dice and potentially win or lose money based on a win chance and bet amount.',
brief='Roll a dice.'
)
async def dice(ctx, bet_amount: str, win_chance: int):
user_id = str(ctx.author.id)
if user_id in user_data:
data = user_data[user_id]
purse_balance = data['purse']
# Check if win chance is within valid limits
if win_chance < 1 or win_chance > 99:
await ctx.send("Invalid win chance.")
return
# Handle the 'half' case
if bet_amount.lower() == 'half':
bet_amount = purse_balance // 2
elif bet_amount.lower() == 'all':
bet_amount = purse_balance
else:
try:
bet_amount = int(bet_amount)
except ValueError:
await ctx.send("Invalid bet amount. Please specify a valid amount, 'half', or 'all'.")
return
# Check if the calculated bet amount is within valid limits
if bet_amount <= 0 or purse_balance < bet_amount:
await ctx.send("Invalid bet amount or insufficient funds.")
return
# Deduct the bet amount from the user's purse
data['purse'] -= bet_amount
save_user_data(user_data)
# Generate a random number between 1 and 100 to simulate the dice roll
roll = random.randint(1, 100)
if roll <= win_chance: # You win
multiplier = 100 / win_chance
winnings = int(bet_amount * multiplier)
data['purse'] += winnings # Award only the calculated winnings
save_user_data(user_data)
await ctx.send(f"You rolled a {roll} and won ${winnings}!")
else: # You lose
await ctx.send(f"You rolled a {roll} and lost ${bet_amount}. Better luck next time.")
else:
await ctx.send("You are not registered. Use !register to create your save data.")
# Define a command to send a message to the bot owner
@bot.command(
name='contact',
description='Send a message to the bot owner.',
brief='Contact the bot owner.'
)
async def contact_owner(ctx, *, message: str):
owner_id = '1137025087317491852' # Replace with the actual user ID of the bot owner
owner = await bot.fetch_user(owner_id)
await owner.send(f"Message from {ctx.author} (ID: {ctx.author.id}):\n{message}")
await ctx.send("Your message has been sent to the bot owner.")
# Define a dictionary to store Blackjack game states for users
blackjack_games = {}
@bot.command(
name='blackjack',
description='Play a game of Blackjack.',
brief='Play Blackjack.'
)
async def blackjack(ctx, bet_amount: str):
user_id = str(ctx.author.id)
if user_id in user_data:
user_data_user = user_data[user_id]
purse_balance = user_data_user['purse']
if bet_amount.lower() == 'all':
bet_amount = purse_balance
else:
try:
bet_amount = int(bet_amount)
except ValueError:
await ctx.send("Invalid bet amount. Please specify a valid amount or 'all'.")
return
if bet_amount <= 0 or bet_amount > purse_balance:
await ctx.send("Invalid bet amount or insufficient funds in your purse.")
return
# Check if a game is already in progress for this user
if user_id in blackjack_games:
await ctx.send("You already have a game in progress. Finish that game before starting a new one.")
return
# Initialize the deck of cards (simplified)
suits = ['Hearts', 'Diamonds', 'Clubs', 'Spades']
values = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
deck = [{'suit': suit, 'value': value} for suit in suits for value in values]
# Shuffle the deck
random.shuffle(deck)
# Deal two cards to the player and two cards to the dealer
player_hand = [deck.pop(), deck.pop()]
dealer_hand = [deck.pop(), deck.pop()]
# Implement game logic for Hit, Stand, Split, and Double Down (simplified)
def calculate_hand_value(hand):
# Calculate the value of a hand (simplified)
total_value = 0
num_aces = 0
for card in hand:
value = card['value']
if value.isnumeric():
total_value += int(value)
elif value in ['K', 'Q', 'J']:
total_value += 10
elif value == 'A':
total_value += 11
num_aces += 1
# Adjust for aces
while num_aces > 0 and total_value > 21:
total_value -= 10
num_aces -= 1
return total_value
def check_blackjack(hand):
return len(hand) == 2 and calculate_hand_value(hand) == 21
player_value = calculate_hand_value(player_hand)
dealer_value = calculate_hand_value(dealer_hand)
game_over = False
player_stand = False
can_split = len(player_hand) == 2 and player_hand[0]['value'] == player_hand[1]['value']
can_double_down = len(player_hand) == 2 and bet_amount * 2 <= purse_balance # Check if user can double down
# Store game state for this user
blackjack_games[user_id] = {
'user_data': user_data_user,
'bet_amount': bet_amount,
'deck': deck,
'player_hand': player_hand,
'dealer_hand': dealer_hand,
'player_value': player_value,
'dealer_value': dealer_value,
'game_over': game_over,
'player_stand': player_stand,
'can_split': can_split,
'can_double_down': can_double_down
}
while not game_over:
# Create a formatted message with game status
game_status = (
f"Your hand: {', '.join([card['value'] + ' of ' + card['suit'] for card in player_hand])} ({player_value})\n"
f"Dealer's hand: {dealer_hand[0]['value']} of {dealer_hand[0]['suit']}, ?"
)
if check_blackjack(player_hand):
game_status += "\nBlackjack! You win!"
user_data_user['purse'] += bet_amount
game_over = True
elif player_value > 21:
game_status += "\nBust! You lose!"
user_data_user['purse'] -= bet_amount
game_over = True
elif player_stand:
while dealer_value < 17:
dealer_hand.append(deck.pop())
dealer_value = calculate_hand_value(dealer_hand)
game_status += (
f"\nDealer's hand: {', '.join([card['value'] + ' of ' + card['suit'] for card in dealer_hand])} ({dealer_value})"
)
if dealer_value > 21:
game_status += "\nDealer busts! You win!"
user_data_user['purse'] += bet_amount
elif dealer_value > player_value:
game_status += "\nDealer wins!"
user_data_user['purse'] -= bet_amount
elif dealer_value < player_value:
game_status += "\nYou win!"
user_data_user['purse'] += bet_amount
else:
game_status += "\nIt's a push. You get your bet back."
game_over = True
else:
actions = ["hit", "stand"]
if can_split:
actions.append("split")
if can_double_down:
actions.append("double down")
game_status += f"\nChoose an action: `{', '.join(actions)}`."
await ctx.send(game_status)
try:
response = await bot.wait_for('message', timeout=60, check=lambda m: m.author == ctx.author and m.content.lower() in actions)
except asyncio.TimeoutError:
await ctx.send("You took too long to decide. Game over.")
game_over = True
else:
action = response.content.lower()
if action == 'hit':
new_card = deck.pop()
player_hand.append(new_card)
player_value = calculate_hand_value(player_hand)
elif action == 'stand':
player_stand = True
elif action == 'split' and can_split:
# Implement split logic here
pass
elif action == 'double down' and can_double_down:
# Double the bet amount and draw one card
bet_amount *= 2
new_card = deck.pop()
player_hand.append(new_card)
player_value = calculate_hand_value(player_hand)
player_stand = True # Automatically stand after doubling down
# Remove the game state for this user
del blackjack_games[user_id]
# Save user data
save_user_data(user_data)
# Send the final game status message
await ctx.send(game_status)
else:
await ctx.send("You are not registered. Use !register to create your save data.")
# Define the shop items and their prices
shop_items = {
'item1': 100,
'item2': 200,
'item3': 300,
# Add more items as needed
}
# Define a command to display the shop items
@bot.command(
name='shop',
description='View items available in the shop.',
brief='View shop items.'
)
async def shop(ctx, page: int = 1):
items_per_page = 5 # Number of items to display per page
start_index = (page - 1) * items_per_page
end_index = start_index + items_per_page
shop_items_list = list(shop_items.keys())[start_index:end_index]
if not shop_items_list:
await ctx.send("No items found on this page.")
return
shop_message = "Shop Items (Page {}):\n".format(page)
for item_name in shop_items_list:
item_price = shop_items[item_name]
shop_message += "{} - ${}\n".format(item_name, item_price)
await ctx.send("```{}```".format(shop_message))
# Define a command to allow users to buy items from the shop
@bot.command(
name='buy',
description='Buy an item from the shop.',
brief='Buy an item.'
)
async def buy(ctx, item_name: str):
user_id = str(ctx.author.id)
if user_id in user_data:
data = user_data[user_id]
purse_balance = data['purse']
if item_name in shop_items:
item_price = shop_items[item_name]
if purse_balance >= item_price:
data['purse'] -= item_price
data['items'].append(item_name)
save_user_data(user_data)
await ctx.send("You have successfully bought {} for ${}.".format(item_name, item_price))
else:
await ctx.send("You don't have enough money to buy this item.")
else:
await ctx.send("Item not found in the shop.")
else:
await ctx.send("You are not registered. Use !register to create your save data.")
# Define a command to view a user's items
@bot.command(
name='items',
description="View the items you've bought from the shop.",
brief='View your items.'
)
async def view_items(ctx):
user_id = str(ctx.author.id)
if user_id in user_data:
items = user_data[user_id]['items']
if items:
item_list = ", ".join(items)
await ctx.send("{}'s items: {}".format(ctx.author.display_name, item_list))
else:
await ctx.send("{} doesn't own any items.".format(ctx.author.display_name))
else:
await ctx.send("You are not registered. Use !register to create your save data.")
# Run the bot with your token
bot.run('you aint getting my bot token today man.')Editor is loading...