From 2e3bd9bd99b0eb1c13e3a0694cd647ff25c9be61 Mon Sep 17 00:00:00 2001 From: Danil Date: Tue, 19 May 2026 22:36:52 +0300 Subject: [PATCH] Restrict betting system to Dota 2 only --- config.py | 12 +++------ games/betting.py | 13 +++------ main.py | 57 +++++++++++---------------------------- webapp/api.py | 8 +----- webapp/frontend/js/app.js | 21 +++++++++++---- 5 files changed, 38 insertions(+), 73 deletions(-) diff --git a/config.py b/config.py index b0c2354..06840b9 100644 --- a/config.py +++ b/config.py @@ -35,13 +35,7 @@ ODDS_API_KEY = os.getenv("ODDS_API_KEY", "") ODDS_API_BASE = "https://api.the-odds-api.com/v4" BET_MAX_AMOUNT = 3.0 ODDS_SPORTS = { - "epl": "soccer_epl", - "ucl": "soccer_uefa_champs_league", - "laliga": "soccer_spain_la_liga", - "bundesliga": "soccer_germany_bundesliga", - "seriea": "soccer_italy_serie_a", - "ligue1": "soccer_france_ligue_one", - "europa": "soccer_uefa_europa_league", + "dota2": "esports_dota2", } ODDS_CACHE_TTL = 86400 # 24 часа — экономим запросы (500/мес бесплатно) @@ -219,8 +213,8 @@ def get_hint_text(templates_str: str) -> str: "• /talk [текст] — ИИ базарит на фене.\n" "• /penis_casino [ставка] — казино на размер.\n" "• /gadanie [тема] — гадание на фене с мемом.\n" - "• /matches [epl|ucl|laliga|bundesliga|seriea|ligue1|europa] — матчи для ставок.\n" - "• /bet [лига] [номер] [исход] [ставка] — поставить см.\n" + "• /matches — матчи для ставок.\n" + "• /bet [номер] [исход] [ставка] — поставить.\n" "• /mybets — мои активные ставки.\n" "• /bet_history — история ставок за месяц + статистика.\n" "• /sports_debug — диагностика API матчей.\n" diff --git a/games/betting.py b/games/betting.py index 89570d0..658060d 100644 --- a/games/betting.py +++ b/games/betting.py @@ -248,21 +248,14 @@ def format_matches(matches: list[dict], sport_alias: str, sport_label: str) -> s lines.append(f"{i}️⃣ {m['home']} vs {m['away']}{start_str}\n{odds_str}\n") - lines.append(f"Ставка: /bet {sport_alias} [номер] [исход] [ставка]") - lines.append(f"Коротко после /matches {sport_alias}: /bet [номер] [исход] [ставка]") - lines.append("Исход: 1/2, для ничьи X. Можно писать ещё название команды или коэффициент.") + lines.append("Ставка: /bet [номер] [исход] [ставка]") + lines.append("Исход: 1/2. Можно писать ещё название команды или коэффициент.") return "\n".join(lines) def _get_sport_label(key: str) -> str: labels = { - "epl": "⚽ EPL", - "ucl": "⚽ Champions League", - "laliga": "⚽ La Liga", - "bundesliga": "⚽ Bundesliga", - "seriea": "⚽ Serie A", - "ligue1": "⚽ Ligue 1", - "europa": "⚽ Europa League", + "dota2": "🎮 Dota 2", } return labels.get(key, key) diff --git a/main.py b/main.py index 7e20f49..9bf2f2b 100644 --- a/main.py +++ b/main.py @@ -1461,37 +1461,17 @@ async def handle_gadanie_cmd(message: Message): async def handle_matches_cmd(message: Message): raw_text = message.text or "" parts = raw_text.split(maxsplit=1) - sport_alias = parts[1].strip().lower() if len(parts) > 1 else None - - # Если лига не указана — показать список - if not sport_alias: - labels = { - "epl": "⚽ EPL (Англия)", - "ucl": "⚽ Champions League", - "laliga": "⚽ La Liga (Испания)", - "bundesliga": "⚽ Bundesliga (Германия)", - "seriea": "⚽ Serie A (Италия)", - "ligue1": "⚽ Ligue 1 (Франция)", - "europa": "⚽ Europa League", - } - lines = ["🏆 Доступные лиги для ставок:\n"] - for alias, name in labels.items(): - lines.append(f" {name} → /matches {alias}") - lines.append("\nПример: /matches epl") - await message.reply("\n".join(lines), parse_mode=None) - return + sport_alias = parts[1].strip().lower() if len(parts) > 1 else "dota2" if sport_alias not in config.ODDS_SPORTS: if message.from_user: clear_user_sport_context(message.from_user.id) - available = " / ".join(config.ODDS_SPORTS.keys()) - await message.reply(f"Неизвестная лига. Доступно: {available}", parse_mode=None) + await message.reply("Неизвестная лига. Доступно: dota2", parse_mode=None) return + if message.from_user: - if sport_alias in config.ODDS_SPORTS: - remember_user_sport_context(message.from_user.id, sport_alias) - else: - clear_user_sport_context(message.from_user.id) + remember_user_sport_context(message.from_user.id, sport_alias) + await message.bot.send_chat_action(chat_id=message.chat.id, action="typing") result = await get_formatted_matches(sport_alias) await message.reply(result, parse_mode=None) @@ -1504,41 +1484,34 @@ async def handle_bet_cmd(message: Message): parts = raw_text.split() if len(parts) < 4: await message.reply( - "Формат: /bet [спорт] [номер] [исход] [ставка]\n" - "Коротко после /matches cs|dota|football: /bet [номер] [исход] [ставка]\n" - "Исход: 1/2, для ничьи X, можно ещё название команды или коэффициент.\n" - "Пример: /bet cs 1 1 0.5", + "Формат: /bet [номер] [исход] [ставка]\n" + "Или: /bet dota2 [номер] [исход] [ставка]\n" + "Исход: 1/2. Можно писать ещё название команды или коэффициент.\n" + "Пример: /bet 1 1 0.5", parse_mode=None, ) return - sport_alias: str | None - if parts[1].lower() in config.ODDS_SPORTS: + sport_alias: str + if parts[1].lower() == "dota2": if len(parts) < 5: await message.reply( - "Формат: /bet [спорт] [номер] [исход] [ставка]\nПример: /bet cs 1 1 0.5", + "Формат: /bet dota2 [номер] [исход] [ставка]\nПример: /bet dota2 1 1 0.5", parse_mode=None, ) return - sport_alias = parts[1].lower() + sport_alias = "dota2" index_token = parts[2] selection = " ".join(parts[3:-1]).strip() amount_token = parts[-1] else: - sport_alias = get_user_sport_context(message.from_user.id) - if not sport_alias: - await message.reply( - "Сначала открой /matches с нужной лигой (epl, ucl, laliga...).\n" - "Либо пиши полный формат: /bet [спорт] [номер] [исход] [ставка]", - parse_mode=None, - ) - return + sport_alias = "dota2" index_token = parts[1] selection = " ".join(parts[2:-1]).strip() amount_token = parts[-1] if not selection: - await message.reply("Нужен исход: 1, 2, X, название команды или коэффициент.", parse_mode=None) + await message.reply("Нужен исход: 1, 2, название команды или коэффициент.", parse_mode=None) return try: diff --git a/webapp/api.py b/webapp/api.py index c85a18a..ccde165 100644 --- a/webapp/api.py +++ b/webapp/api.py @@ -174,13 +174,7 @@ async def get_profile(user: dict = Depends(get_current_user)) -> ProfileResponse async def get_leagues() -> list[LeagueInfo]: """Список доступных лиг для ставок.""" labels = { - "epl": "⚽ EPL (Англия)", - "ucl": "⚽ Champions League", - "laliga": "⚽ La Liga (Испания)", - "bundesliga": "⚽ Bundesliga (Германия)", - "seriea": "⚽ Serie A (Италия)", - "ligue1": "⚽ Ligue 1 (Франция)", - "europa": "⚽ Europa League", + "dota2": "🎮 Dota 2", } return [ LeagueInfo(alias=alias, name=labels.get(alias, alias), sport_key=key) diff --git a/webapp/frontend/js/app.js b/webapp/frontend/js/app.js index 3b7fd08..f3ee499 100644 --- a/webapp/frontend/js/app.js +++ b/webapp/frontend/js/app.js @@ -295,13 +295,17 @@ async function showBetHistory() { async function renderBetting(data) { if (data?.league) { - return renderMatches(data.league, data.leagueName); + return renderMatches(data.league, data.leagueName, data.isOnlyLeague); } container.innerHTML = `
⚽ Ставки на матчи
${skeleton(2)}`; try { const leagues = await API.getLeagues(); + if (leagues.length === 1) { + return renderMatches(leagues[0].alias, leagues[0].name, true); + } + container.innerHTML = `
⚽ Выбери лигу
@@ -317,7 +321,7 @@ async function renderBetting(data) { `); item.addEventListener('click', () => { haptic(); - navigate('betting', { league: l.alias, leagueName: l.name }); + navigate('betting', { league: l.alias, leagueName: l.name, isOnlyLeague: false }); }); list.appendChild(item); }); @@ -326,15 +330,22 @@ async function renderBetting(data) { } } -async function renderMatches(league, leagueName) { +async function renderMatches(league, leagueName, isOnlyLeague = false) { + const headerText = isOnlyLeague ? '🎮 Dota 2 Матчи' : leagueName; + const backTarget = isOnlyLeague ? 'home' : 'betting'; + const instructionsHtml = isOnlyLeague + ? `
Ставки на актуальные матчи Dota 2. Выберите исход и укажите сумму ставки в сантиметрах.
` + : ''; + container.innerHTML = `
-
${leagueName}
+
${headerText}
+ ${instructionsHtml} ${skeleton(3)} `; - document.getElementById('back-btn').onclick = () => navigate('betting'); + document.getElementById('back-btn').onclick = () => navigate(backTarget); try { const matches = await API.getMatches(league);