1
0
Fork 0
forked from zovos/bot_tg

Compare commits

..

No commits in common. "3baf71ab98ccf95e72827c8e0fdeb263247374bd" and "6b6c1dd15d6120fa3c0efb5a42b4f24f1d7fd3b7" have entirely different histories.

5 changed files with 15 additions and 46 deletions

2
.env
View file

@ -1,3 +1,3 @@
BOT_TOKEN=8156642467:AAEalekr-33lFS3tTTkXIEiaawfDzR6lBJc BOT_TOKEN=8488665890:AAH7FY5I2xzHhfOdxlzb11ewl2I-MMTH2-o
TZ=Europe/Moscow TZ=Europe/Moscow
ODDS_API_KEY=c29bc26dee8aa9d95a5ce8d14ea63923 ODDS_API_KEY=c29bc26dee8aa9d95a5ce8d14ea63923

View file

@ -35,13 +35,9 @@ E621_API_KEY = os.getenv("E621_API_KEY", "")
ODDS_API_KEY = os.getenv("ODDS_API_KEY", "") ODDS_API_KEY = os.getenv("ODDS_API_KEY", "")
ODDS_API_BASE = "https://api.the-odds-api.com/v4" ODDS_API_BASE = "https://api.the-odds-api.com/v4"
ODDS_SPORTS = { ODDS_SPORTS = {
"epl": "soccer_epl", "cs": "esports_csgo",
"ucl": "soccer_uefa_champs_league", "dota": "esports_dota2",
"laliga": "soccer_spain_la_liga", "football": "soccer_epl",
"bundesliga": "soccer_germany_bundesliga",
"seriea": "soccer_italy_serie_a",
"ligue1": "soccer_france_ligue_one",
"europa": "soccer_uefa_europa_league",
} }
BET_MAX_AMOUNT = 3.0 BET_MAX_AMOUNT = 3.0
BET_DB_PATH = "/db/bets.sqlite3" BET_DB_PATH = "/db/bets.sqlite3"
@ -213,8 +209,8 @@ def get_hint_text(templates_str: str) -> str:
"• /talk [текст] — ИИ базарит на фене.\n" "• /talk [текст] — ИИ базарит на фене.\n"
"• /penis_casino [ставка] — казино на размер.\n" "• /penis_casino [ставка] — казино на размер.\n"
"• /gadanie [тема] — гадание на фене с мемом.\n" "• /gadanie [тема] — гадание на фене с мемом.\n"
"• /matches [epl|ucl|laliga|bundesliga|seriea|ligue1|europa] — матчи для ставок.\n" "• /matches [cs|dota|football] — матчи для ставок.\n"
"• /bet [лига] [номер] [исход] [ставка] — поставить см.\n" "• /bet [спорт] [номер] [исход] [ставка] — поставить см.\n"
"• /mybets — мои активные ставки.\n" "• /mybets — мои активные ставки.\n"
"• /bet_history — история ставок за месяц + статистика.\n" "• /bet_history — история ставок за месяц + статистика.\n"
"• /sports_debug — диагностика API матчей.\n" "• /sports_debug — диагностика API матчей.\n"

View file

@ -264,15 +264,7 @@ def format_matches(matches: list[dict], sport_alias: str, sport_label: str) -> s
def _get_sport_label(key: str) -> str: def _get_sport_label(key: str) -> str:
labels = { labels = {"cs": "🎮 CS2", "dota": "🎮 Dota 2", "football": "⚽ Футбол"}
"epl": "⚽ EPL",
"ucl": "⚽ Champions League",
"laliga": "⚽ La Liga",
"bundesliga": "⚽ Bundesliga",
"seriea": "⚽ Serie A",
"ligue1": "⚽ Ligue 1",
"europa": "⚽ Europa League",
}
return labels.get(key, key) return labels.get(key, key)
@ -444,17 +436,15 @@ def get_user_bet_history(user_id: int) -> str:
status = r["status"] status = r["status"]
amount = float(r["amount"]) amount = float(r["amount"])
odds_val = float(r["odds"]) odds_val = float(r["odds"])
payout_raw = float(r["payout"] or 0) payout = float(r["payout"] or 0)
total_bet += amount total_bet += amount
if status == "won": if status == "won":
wins += 1 wins += 1
# Для старых ставок payout может быть 0, пересчитываем total_won += payout
actual_payout = payout_raw if payout_raw > 0 else round(amount * odds_val, 1)
total_won += actual_payout
status_icon = "" status_icon = ""
result_text = f"+{actual_payout:.1f} см" result_text = f"+{payout:.1f} см"
elif status == "lost": elif status == "lost":
losses += 1 losses += 1
total_lost += amount total_lost += amount

View file

@ -2,15 +2,9 @@ import aiohttp
from aiogram import types from aiogram import types
import config import config
import logging import logging
import random
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
CAPTIONS = [
"Ня :3",
"uwu"
]
async def handle_uwu_cmd(message: types.Message): async def handle_uwu_cmd(message: types.Message):
args = message.text.split(maxsplit=1) args = message.text.split(maxsplit=1)
@ -22,12 +16,12 @@ async def handle_uwu_cmd(message: types.Message):
"• <b>score</b>: <code>score:>500</code> (искать популярные посты с рейтингом больше 500)\n" "• <b>score</b>: <code>score:>500</code> (искать популярные посты с рейтингом больше 500)\n"
"• Исключить тег: поставьте минус, например <code>-fox</code>\n\n" "• Исключить тег: поставьте минус, например <code>-fox</code>\n\n"
"<i>Пример:</i> <code>/uwu wolf -rating:explicit score:>100</code>\n" "<i>Пример:</i> <code>/uwu wolf -rating:explicit score:>100</code>\n"
"<i>По умолчанию:</i> <code>rating:safe score:>500 -animated</code>" "<i>По умолчанию:</i> <code>rating:safe score:>500</code>"
) )
await message.reply(help_msg, parse_mode="HTML") await message.reply(help_msg, parse_mode="HTML")
return return
tags = "rating:safe score:>500 -animated" tags = "rating:safe score:>500"
if len(args) > 1: if len(args) > 1:
tags = args[1].strip() tags = args[1].strip()
@ -63,21 +57,11 @@ async def handle_uwu_cmd(message: types.Message):
post = posts[0] post = posts[0]
file_url = post.get("file", {}).get("url") file_url = post.get("file", {}).get("url")
ext = post.get("file", {}).get("ext", "png")
if not file_url: if not file_url:
await message.reply("У найденного поста нет прямого URL изображения :(") await message.reply("У найденного поста нет прямого URL изображения :(")
return return
input_file = types.URLInputFile(file_url) await message.answer_photo(photo=types.URLInputFile(file_url), caption="Ня :3")
caption = random.choice(CAPTIONS)
if ext in ("png", "jpg", "jpeg", "webp"):
await message.answer_photo(photo=input_file, caption=caption)
elif ext == "gif":
await message.answer_animation(animation=input_file, caption=caption)
elif ext in ("webm", "mp4"):
await message.answer_video(video=input_file, caption=caption)
else:
await message.answer_document(document=input_file, caption=caption)
except Exception as e: except Exception as e:
logger.exception("Error in uwu command") logger.exception("Error in uwu command")

View file

@ -1237,8 +1237,7 @@ async def handle_matches_cmd(message: Message):
if sport_alias and sport_alias not in config.ODDS_SPORTS: if sport_alias and sport_alias not in config.ODDS_SPORTS:
if message.from_user: if message.from_user:
clear_user_sport_context(message.from_user.id) clear_user_sport_context(message.from_user.id)
available = " / ".join(config.ODDS_SPORTS.keys()) await message.reply("Неизвестный спорт. Доступно: cs / dota / football", parse_mode=None)
await message.reply(f"Неизвестная лига. Доступно: {available}", parse_mode=None)
return return
if message.from_user: if message.from_user:
if sport_alias and sport_alias in config.ODDS_SPORTS: if sport_alias and sport_alias in config.ODDS_SPORTS:
@ -1281,7 +1280,7 @@ async def handle_bet_cmd(message: Message):
sport_alias = get_user_sport_context(message.from_user.id) sport_alias = get_user_sport_context(message.from_user.id)
if not sport_alias: if not sport_alias:
await message.reply( await message.reply(
"Сначала открой /matches с нужной лигой (epl, ucl, laliga...).\n" "Сначала открой /matches cs, /matches dota или /matches football.\n"
"Либо пиши полный формат: /bet [спорт] [номер] [исход] [ставка]", "Либо пиши полный формат: /bet [спорт] [номер] [исход] [ставка]",
parse_mode=None, parse_mode=None,
) )