Spaces:
Building
Building
File size: 11,142 Bytes
aad95f7 7917f65 c9bee21 aad95f7 7917f65 0c072aa 7917f65 aad95f7 7917f65 0ea5e95 7917f65 650d132 7917f65 f379c17 7917f65 aad95f7 7917f65 d47a67f 7917f65 d47a67f 7917f65 d47a67f 7917f65 aad95f7 7917f65 aad95f7 7917f65 6af0395 7917f65 82c48f2 7917f65 6af0395 7917f65 6af0395 7917f65 6af0395 7917f65 6af0395 7917f65 6af0395 7917f65 f70fe1f 7917f65 b350ec8 7917f65 5187c78 7917f65 b350ec8 7917f65 c9bee21 7917f65 c9bee21 7917f65 c9bee21 7917f65 c9bee21 7917f65 c9bee21 f70fe1f 7917f65 0c072aa 7917f65 0c072aa f70fe1f 7917f65 d47a67f 7917f65 c9bee21 7917f65 c9bee21 7917f65 0c072aa 7917f65 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
import discord
from discord import app_commands
import aiohttp
import asyncio
from datetime import datetime, timezone
from cash import user_cash
user_bets = {}
async def fetch_nhl_scores():
async with aiohttp.ClientSession() as session:
async with session.get("https://nhl-score-api.herokuapp.com/api/scores/latest") as response:
return await response.json()
class GameSelect(discord.ui.Select):
def __init__(self, games):
options = [
discord.SelectOption(
label=f"{game['teams']['away']['teamName']} vs {game['teams']['home']['teamName']}",
value=f"{game['teams']['away']['abbreviation']}_{game['teams']['home']['abbreviation']}",
description=f"Start time: <t:{int(datetime.fromisoformat(game['startTime'].replace('Z', '+00:00')).timestamp())}:R>"
) for game in games
]
super().__init__(placeholder="Select a game", options=options)
class TeamSelect(discord.ui.Select):
def __init__(self, away_team, home_team):
options = [
discord.SelectOption(label=away_team['teamName'], value=away_team['abbreviation']),
discord.SelectOption(label=home_team['teamName'], value=home_team['abbreviation'])
]
super().__init__(placeholder="Select a team to bet on", options=options)
class BetModal(discord.ui.Modal, title="Place Your Bet"):
bet_amount = discord.ui.TextInput(label="Bet Amount", placeholder="Enter bet amount")
def __init__(self, team, user_id, game_data):
super().__init__()
self.team = team
self.user_id = user_id
self.game_data = game_data
async def on_submit(self, interaction: discord.Interaction):
try:
bet_amount = int(self.bet_amount.value)
if bet_amount <= 0:
raise ValueError("Bet more than 0 dollars")
if bet_amount > user_cash.get(self.user_id, 0):
raise ValueError("You are too poor. Check your balance and try again")
user_cash[self.user_id] -= bet_amount
await interaction.response.send_message(f"Bet placed on {self.team} for ${bet_amount}")
user = await interaction.client.fetch_user(self.user_id)
embed = discord.Embed(title="Bet Placed", color=0x787878)
embed.add_field(name="Team", value=self.team, inline=False)
embed.add_field(name="Amount", value=f"${bet_amount}", inline=False)
embed.add_field(name="Game", value=f"{self.game_data['teams']['away']['teamName']} vs {self.game_data['teams']['home']['teamName']}", inline=False)
embed.add_field(name="Start Time", value=f"<t:{int(datetime.fromisoformat(self.game_data['startTime'].replace('Z', '+00:00')).timestamp())}:F>", inline=False)
await user.send(embed=embed)
if self.user_id not in user_bets:
user_bets[self.user_id] = []
user_bets[self.user_id].append({
"team": self.team,
"amount": bet_amount,
"game_data": self.game_data
})
asyncio.create_task(self.monitor_game(interaction, bet_amount))
except ValueError as e:
await interaction.response.send_message(str(e), ephemeral=True)
async def monitor_game(self, interaction, bet_amount):
game_start = datetime.fromisoformat(self.game_data['startTime'].replace('Z', '+00:00'))
await asyncio.sleep((game_start - datetime.now(timezone.utc)).total_seconds())
user = await interaction.client.fetch_user(self.user_id)
await user.send(f"Your team {self.team} has started playing!")
previous_scores = {self.game_data['teams']['away']['abbreviation']: 0, self.game_data['teams']['home']['abbreviation']: 0}
while True:
scores = await fetch_nhl_scores()
game = next((g for g in scores['games'] if g['teams']['away']['abbreviation'] == self.game_data['teams']['away']['abbreviation'] and
g['teams']['home']['abbreviation'] == self.game_data['teams']['home']['abbreviation']), None)
if game is None or game['status']['state'] == 'PREVIEW':
await asyncio.sleep(60)
continue
current_scores = game['scores']
for team in [self.game_data['teams']['away']['abbreviation'], self.game_data['teams']['home']['abbreviation']]:
if current_scores[team] > previous_scores[team]:
team_name = game['teams']['away']['teamName'] if team == game['teams']['away']['abbreviation'] else game['teams']['home']['teamName']
await user.send(f"{team_name} SCORED! Current score: {current_scores[self.game_data['teams']['away']['abbreviation']]} - {current_scores[self.game_data['teams']['home']['abbreviation']]}")
previous_scores = current_scores.copy()
if game['status']['state'] == 'FINAL':
winner = self.game_data['teams']['away']['abbreviation'] if current_scores[self.game_data['teams']['away']['abbreviation']] > current_scores[self.game_data['teams']['home']['abbreviation']] else self.game_data['teams']['home']['abbreviation']
if winner == self.team:
winnings = bet_amount * 2
user_cash[self.user_id] += winnings
await user.send(f"Congratulations! Your team won. You won ${winnings}!")
else:
await user.send(f"Sorry, your team lost. Better luck next time!")
user_bets[self.user_id] = [bet for bet in user_bets[self.user_id] if bet['game_data'] != self.game_data]
break
await asyncio.sleep(60) # Check for updates every minute
class SportBetView(discord.ui.View):
def __init__(self):
super().__init__()
@discord.ui.button(label="Bet Again", style=discord.ButtonStyle.primary)
async def bet_again(self, interaction: discord.Interaction, button: discord.ui.Button):
await show_game_selection(interaction)
@discord.ui.button(label="View Bets", style=discord.ButtonStyle.secondary)
async def view_bets(self, interaction: discord.Interaction, button: discord.ui.Button):
await show_current_bets(interaction)
async def show_game_selection(interaction: discord.Interaction):
scores = await fetch_nhl_scores()
upcoming_games = [game for game in scores['games'] if game['status']['state'] == 'PREVIEW']
if not upcoming_games:
await interaction.response.send_message("No games available for betting.")
return
view = discord.ui.View()
game_select = GameSelect(upcoming_games)
view.add_item(game_select)
await interaction.response.send_message("Select a game to bet on:", view=view)
async def game_callback(interaction: discord.Interaction):
selected_game = next(game for game in upcoming_games if f"{game['teams']['away']['abbreviation']}_{game['teams']['home']['abbreviation']}" == game_select.values[0])
team_view = discord.ui.View()
team_select = TeamSelect(selected_game['teams']['away'], selected_game['teams']['home'])
team_view.add_item(team_select)
await interaction.response.edit_message(content="Select a team to bet on:", view=team_view)
async def team_callback(interaction: discord.Interaction):
selected_team = team_select.values[0]
await interaction.response.send_modal(BetModal(selected_team, interaction.user.id, selected_game))
team_select.callback = team_callback
game_select.callback = game_callback
async def show_current_bets(interaction: discord.Interaction):
user_id = interaction.user.id
if user_id not in user_bets or not user_bets[user_id]:
await interaction.response.send_message("You have no active bets.")
return
embed = discord.Embed(title="Your Current Bets", color=0x787878)
scores = await fetch_nhl_scores()
for i, bet in enumerate(user_bets[user_id]):
game = next((g for g in scores['games'] if g['teams']['away']['abbreviation'] == bet['game_data']['teams']['away']['abbreviation'] and
g['teams']['home']['abbreviation'] == bet['game_data']['teams']['home']['abbreviation']), None)
start_time = datetime.fromisoformat(bet['game_data']['startTime'].replace('Z', '+00:00'))
current_time = datetime.now(timezone.utc)
if current_time < start_time:
status = f"Starts <t:{int(start_time.timestamp())}:R>"
score = "N/A"
else:
status = game['status']['state'] if game else "Unknown"
score = f"{game['scores'][bet['game_data']['teams']['away']['abbreviation']]} - {game['scores'][bet['game_data']['teams']['home']['abbreviation']]}" if game and 'scores' in game else "Unknown"
embed.add_field(name=f"Bet {i+1}", value=(
f"Team: {bet['team']}\n"
f"Amount: ${bet['amount']}\n"
f"Game: {bet['game_data']['teams']['away']['teamName']} vs {bet['game_data']['teams']['home']['teamName']}\n"
f"Status: {status}\n"
f"Current Score: {score}\n"
f"Start Time: <t:{int(start_time.timestamp())}:F>"
), inline=False)
view = discord.ui.View()
cancel_select = discord.ui.Select(placeholder="Select a bet to cancel", options=[
discord.SelectOption(label=f"Bet {i+1}", value=str(i)) for i in range(len(user_bets[user_id]))
])
view.add_item(cancel_select)
async def cancel_callback(interaction: discord.Interaction):
if interaction.user.id != user_id:
await interaction.response.send_message("You cannot cancel other users' bets.", ephemeral=True)
return
bet_index = int(cancel_select.values[0])
cancelled_bet = user_bets[user_id][bet_index]
game = cancelled_bet['game_data']
current_time = datetime.now(timezone.utc)
game_start = datetime.fromisoformat(game['startTime'].replace('Z', '+00:00'))
if current_time >= game_start:
await interaction.response.send_message("You cannot cancel your bet as the game has already started.", ephemeral=True)
return
user_cash[user_id] += cancelled_bet['amount']
user_bets[user_id].pop(bet_index)
await interaction.response.send_message(f"Bet cancelled. ${cancelled_bet['amount']} has been refunded.")
cancel_select.callback = cancel_callback
await interaction.response.send_message(embed=embed, view=view)
@app_commands.command(name="sportbet", description="Bet on sports games")
async def sportbet(interaction: discord.Interaction):
user_id = interaction.user.id
if user_id in user_bets and user_bets[user_id]:
view = SportBetView()
await interaction.response.send_message("What would you like to do?", view=view)
else:
await show_game_selection(interaction) |