diff --git a/src/bot.py b/src/bot.py index 27fdd93..c3099a3 100644 --- a/src/bot.py +++ b/src/bot.py @@ -4,7 +4,7 @@ from . import db intents = discord.Intents.default() intents.message_content = True -intents.members = True # better name resolution +intents.members = True BOT_PREFIX = os.getenv("BOT_PREFIX", "!") TOKEN = os.getenv("DISCORD_TOKEN") diff --git a/src/cogs/baccarat.py b/src/cogs/baccarat.py index cf97713..843e69c 100644 --- a/src/cogs/baccarat.py +++ b/src/cogs/baccarat.py @@ -5,7 +5,6 @@ from typing import Optional, List, Tuple, Dict from .. import db -# ====== Config (inline so you don't have to touch constants.py) ====== BAC_MIN_BET = 10 BAC_MAX_BET = 100_000 TIE_PAYS = 8 # 8:1 (plus stake => ×9 return) @@ -309,7 +308,6 @@ class Baccarat(commands.Cog): async def baccarat(self, ctx: commands.Context): uid = ctx.author.id if uid in _active_bac: - # Replace their old panel if it's still around try: old = _active_bac[uid] if old.message: await old.message.delete() diff --git a/src/cogs/blackjack.py b/src/cogs/blackjack.py index ae925f6..080797b 100644 --- a/src/cogs/blackjack.py +++ b/src/cogs/blackjack.py @@ -96,7 +96,6 @@ class BlackjackGame: self.game_over = True def create_embed(game: BlackjackGame, reveal: bool = False) -> discord.Embed: - # (unchanged renderer from your file) dv = game.dealer_hand.get_value() if game.game_over: if game.is_split_game: @@ -164,7 +163,6 @@ def create_embed(game: BlackjackGame, reveal: bool = False) -> discord.Embed: embed.add_field(name="📊 Result", value=txt, inline=False) return embed -# ====== New UI layer (Set Bet / ×2 / ½ / Deal + in-game buttons) ====== MIN_BJ_BET = 10 # simple minimum @@ -227,7 +225,6 @@ class BlackjackPanel(discord.ui.View): b = self._btn(lbl) if b: b.disabled = not hand_active - # More granular in-hand state if hand_active: h = self.game.get_current_hand() b_hit = self._btn("Hit") @@ -313,7 +310,6 @@ class BlackjackPanel(discord.ui.View): if self.user_id in active_games: return await itx.response.send_message("You already have an active blackjack hand.", ephemeral=True) - # validate funds similar to old command cash,_ = db.get_wallet(self.user_id) if self.bet < MIN_BJ_BET: return await itx.response.send_message(f"Minimum bet is ${MIN_BJ_BET}.", ephemeral=True) diff --git a/src/cogs/coinflip.py b/src/cogs/coinflip.py index 03f1916..18c3034 100644 --- a/src/cogs/coinflip.py +++ b/src/cogs/coinflip.py @@ -1,10 +1,4 @@ # src/cogs/coinflip.py -# Coin Flip with Towers-style "Set Bet" modal and a minimal 2-row UI. -# Buttons: [Set Bet, ×2, ½] and [Heads, Tails] -# -# Commands: -# !coin (aliases: !coinflip, !cf, !flip) -# !rules_coin (optional) import random import discord @@ -128,7 +122,6 @@ class CoinFlipView(discord.ui.View): if return_amount: db.add_cash(self.user_id, return_amount) - # record stats (kept even if not shown on balance) try: db.record_coinflip(self.user_id, bet=self.chip, return_amount=return_amount, won=won) except Exception: diff --git a/src/cogs/economy.py b/src/cogs/economy.py index f83c8d7..57b3b87 100644 --- a/src/cogs/economy.py +++ b/src/cogs/economy.py @@ -2,7 +2,6 @@ import discord from discord.ext import commands from .. import db -# Try to import constants; provide safe defaults if missing. try: from ..utils.constants import ( DAILY_CASH, DAILY_FREE_SPINS, @@ -57,6 +56,8 @@ class RulesSelect(discord.ui.Select): embed = rules_blackjack_embed() elif choice == "Slots": embed = rules_slots_embed() + elif choice == "Coin Flip": + embed = rules_coinflip_embed() elif choice == "Roulette (Mini)": embed = rules_roulette_mini_embed() elif choice == "Towers": @@ -67,7 +68,7 @@ class RulesSelect(discord.ui.Select): embed = rules_hilo_embed() elif choice == "Mines": embed = rules_mines_embed() - else: # Packs or fallback + else: embed = rules_packs_embed() await interaction.response.edit_message(embed=embed, view=self.view) @@ -138,7 +139,6 @@ def rules_blackjack_embed(): return e def rules_slots_embed(): - # Payout table (if provided) to pretty-print if PAYOUTS: pairs = sorted(PAYOUTS.items(), key=lambda kv: kv[1], reverse=True) lines = [f"{sym} x{mult}" for sym, mult in pairs] @@ -197,13 +197,11 @@ class CasinoView(discord.ui.View): return True async def _launch(self, interaction: discord.Interaction, command_name: str): - # Acknowledge fast try: await interaction.response.defer(thinking=False) except Exception: pass - # Delete the menu to reduce clutter try: await interaction.message.delete() except Exception: @@ -214,7 +212,6 @@ class CasinoView(discord.ui.View): except Exception: pass - # Invoke command cmd = self.cog.bot.get_command(command_name) if cmd is None: return await self.ctx.send(f"⚠️ Command `{command_name}` not found.") diff --git a/src/cogs/hilo.py b/src/cogs/hilo.py index 5585b4a..c8e36ea 100644 --- a/src/cogs/hilo.py +++ b/src/cogs/hilo.py @@ -6,7 +6,6 @@ from typing import Optional from .. import db -# ---- Config (safe fallbacks; override in constants.py if you like) ---- try: from ..utils.constants import HILO_EDGE_PER_STEP, HILO_MAX_MULT, HILO_MIN_BET except Exception: @@ -89,8 +88,6 @@ class HiloView(discord.ui.View): self.last_note: Optional[str] = None self.message: Optional[discord.Message] = None - # NEW: summary of the last finished round (loss or cashout) - # keys: 'from','to','guess','net','returned','steps','mult' self.last_summary: Optional[dict] = None self._busy = False @@ -184,7 +181,6 @@ class HiloView(discord.ui.View): b = self._btn(lbl) if b: b.disabled = not hand_active - # Edge cases: disable impossible guesses if hand_active and self.current_card: cur = RANK_TO_VAL[self.current_card[0]] if self._btn("LOWER"): @@ -233,11 +229,10 @@ class HiloView(discord.ui.View): nrank, nsuit = draw_card() if nrank != from_rank: break - # gentle note, no state change self.last_note = "Tie (same rank) — try again." await itx.response.edit_message(embed=self.render(), view=self) self._busy = False - return # require another click to proceed + return win = (RANK_TO_VAL[nrank] > cur_val) if direction == "up" else (RANK_TO_VAL[nrank] < cur_val) @@ -258,7 +253,6 @@ class HiloView(discord.ui.View): # lose round: no return, bet already debited returned = 0 db.record_hilo(self.user_id, bet=self.bet, return_amount=returned, won=False) - # Save a visible summary BEFORE resetting state self.last_summary = { "from": (from_rank, from_suit), "to": (nrank, nsuit), diff --git a/src/cogs/mines.py b/src/cogs/mines.py index 5cbabb7..fc8a4bd 100644 --- a/src/cogs/mines.py +++ b/src/cogs/mines.py @@ -6,7 +6,6 @@ from typing import Optional, Set, Tuple from .. import db -# --- Config (override via constants.py if present) --- try: from ..utils.constants import ( MINES_MIN_BET, MINES_EDGE_PER_STEP, MINES_MAX_MULT, MINES_CHOICES @@ -170,7 +169,6 @@ class MinesView(discord.ui.View): for c in range(GRID_N): idx = coord_to_idx((r, c)) if idx in revealed: - # if we want the clicked bomb to show as 💥 even if counted as revealed, prefer 💥 if show_mines and hit_idx is not None and idx == hit_idx: row_emojis.append(EMO_HIT) else: @@ -229,7 +227,6 @@ class MinesView(discord.ui.View): ] e.description = "\n".join(desc) - # NEW: show snapshot board if present if self.last_summary is not None and self.last_summary.get("board"): e.add_field(name="Board", value=self.last_summary["board"], inline=False) @@ -306,13 +303,11 @@ class MinesView(discord.ui.View): self._busy = True idx = coord_to_idx(rc) - # already revealed? if idx in self.revealed: self._busy = False return if idx in self.mines: - # build snapshot BEFORE resetting: show all mines and mark the hit snapshot_board = self._grid_text( show_mines=True, with_labels=True, mines=set(self.mines), revealed=set(self.revealed), hit_idx=idx @@ -335,7 +330,6 @@ class MinesView(discord.ui.View): self._busy = False return - # success — update multiplier and state step_mult = step_multiplier(self.total_rem, self.safe_rem) self.mult = min(self.mult * step_mult, MINES_MAX_MULT) self.revealed.add(idx) diff --git a/src/cogs/packs.py b/src/cogs/packs.py index f5724e5..460c052 100644 --- a/src/cogs/packs.py +++ b/src/cogs/packs.py @@ -6,13 +6,11 @@ from typing import Optional, Dict, List, Tuple from .. import db -# ---- Tunables (override via constants.py if you want) ---- try: from ..utils.constants import PACK_MIN_BET, PACK_SIZE, PACK_RARITY_WEIGHTS except Exception: PACK_MIN_BET = 50 PACK_SIZE = 5 - # weights per rarity (sum doesn't need to be 1; we normalize) PACK_RARITY_WEIGHTS = { "Common": 600, "Uncommon": 250, @@ -22,10 +20,6 @@ except Exception: "Mythic": 1, } -# ----------------------------------------------------------------------------- -# Catalog: id, emoji, display name, rarity, multiplier (× bet) -# Kept your original 25 items & IDs; expanded to 100 total. -# ----------------------------------------------------------------------------- CATALOG: List[Dict] = [ # ---------------------- Common (40) ---------------------- {"id":"cherry","emoji":"🍒","name":"Cherries","rarity":"Common","mult":0.10}, @@ -277,7 +271,6 @@ class PacksCollectionView(discord.ui.View): return True def _sync(self): - # enable/disable nav buttons based on current page for c in self.children: if isinstance(c, discord.ui.Button): if c.custom_id == "first": c.disabled = (self.page <= 0) diff --git a/src/cogs/roulette.py b/src/cogs/roulette.py index ec25c0f..149438e 100644 --- a/src/cogs/roulette.py +++ b/src/cogs/roulette.py @@ -1,12 +1,4 @@ # src/cogs/roulette.py -# Mini Roulette (0–18) with a single ephemeral "Bet Builder" panel. -# - Outside/Inside flows live in ONE popup; each step edits the same ephemeral message. -# - Back / Close buttons on every picker. -# - Clear Slip also resets chip to $0. -# - Requires: -# from ..utils.constants import (ROULETTE_NUMBERS, ROULETTE_RED, ROULETTE_BLACK, -# ROULETTE_MIN_CHIP, ROULETTE_MIN_BET, ROULETTE_MAX_BET) -# from .. import db import random, discord from typing import List, Tuple, Dict, Any, Optional diff --git a/src/cogs/slots.py b/src/cogs/slots.py index 7c0e835..fb5d47f 100644 --- a/src/cogs/slots.py +++ b/src/cogs/slots.py @@ -67,7 +67,7 @@ def evaluate(board, active_indices: List[int]): if len(non_stars) == 2 and non_stars[0] == non_stars[1]: fruit = non_stars[0] base = PAYOUTS.get(fruit, 0) - mult = max(1, int(base * WILDCARD_FACTOR)) # reduced payout for wild wins + mult = max(1, int(base * WILDCARD_FACTOR)) total_mult += mult winning_lines.append((idx, fruit, mult)) continue diff --git a/src/utils/constants.py b/src/utils/constants.py index e599ab1..cda4784 100644 --- a/src/utils/constants.py +++ b/src/utils/constants.py @@ -5,7 +5,7 @@ DAILY_CASH = int(os.getenv("DAILY_BONUS", "10000")) DAILY_COOLDOWN_HOURS = int(os.getenv("DAILY_COOLDOWN_HOURS", "24")) DAILY_FREE_SPINS = int(os.getenv("DAILY_FREE_SPINS", "10")) -# Slots base (now we support variable bets; this acts as default if user omits) +# Slots base SLOTS_DEFAULT_BET = int(os.getenv("SLOTS_DEFAULT_BET", "8")) SLOTS_MIN_BET = int(os.getenv("SLOTS_MIN_BET", "8")) SLOTS_MAX_BET = int(os.getenv("SLOTS_MAX_BET", "5000"))