Sending Documents with Aiogram
Sending Documents with Aiogram
import sqlite3
import random
from datetime import datetime
from aiogram import Bot, Dispatcher, F, Router, types
from [Link] import Message, ReplyKeyboardMarkup, KeyboardButton,
InlineKeyboardMarkup, InlineKeyboardButton
from [Link] import Command
from [Link] import FSMContext
from [Link] import State, StatesGroup
from [Link] import MemoryStorage
def get_user(user_id):
conn = [Link]('[Link]')
c = [Link]()
[Link]("SELECT * FROM users WHERE user_id = ?", (user_id,))
user = [Link]()
[Link]()
return user
def mark_freebet_used(user_id):
conn = [Link]('[Link]')
c = [Link]()
[Link]("UPDATE users SET freebet_used = 1 WHERE user_id = ?", (user_id,))
[Link]()
[Link]()
def get_random_freebet():
return [Link](FREE_BET_MIN, FREE_BET_MAX)
if 'is_active' in columns:
[Link]("SELECT id, team1, team2 FROM matches WHERE is_active = 1")
else:
# Fallback to status-based if column doesn't exist
[Link]("SELECT id, team1, team2 FROM matches WHERE status != 'ended'")
matches = [Link]()
[Link]()
return matches
def get_user_balance(user_id):
"""Get current user balance (fixed version)"""
conn = [Link]('[Link]')
c = [Link]()
[Link]("SELECT balance FROM users WHERE user_id = ?", (user_id,))
result = [Link]()
[Link]()
return result[0] if result else 0
def create_match(game_type, team1, team2, win1_odds, draw_odds, win2_odds,
total_goals, over_odds, under_odds, both_yes_odds, both_no_odds,
start_time):
conn = [Link]('[Link]')
c = [Link]()
[Link]('''INSERT INTO matches (
game_type, team1, team2, win1_odds, draw_odds, win2_odds,
total_goals, over_odds, under_odds, both_teams_yes_odds,
both_teams_no_odds, start_time)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''',
(game_type, team1, team2, win1_odds, draw_odds, win2_odds,
total_goals, over_odds, under_odds, both_yes_odds, both_no_odds,
start_time))
match_id = [Link]
[Link]()
[Link]()
return match_id
def publish_match(match_id):
conn = [Link]('[Link]')
c = [Link]()
[Link]("UPDATE matches SET published = 1 WHERE id = ?", (match_id,))
[Link]()
[Link]()
def get_match(match_id):
conn = [Link]('[Link]')
c = [Link]()
[Link]("SELECT * FROM matches WHERE id = ?", (match_id,))
match = [Link]()
[Link]()
return match
def get_all_matches():
conn = [Link]('[Link]')
c = [Link]()
[Link]("SELECT * FROM matches")
matches = [Link]()
[Link]()
return matches
def start_match(match_id):
conn = [Link]('[Link]')
c = [Link]()
# Get current status first
[Link]("SELECT status FROM matches WHERE id = ?", (match_id,))
current_status = [Link]()[0] if [Link]() else None
def end_match(match_id):
conn = [Link]('[Link]')
c = [Link]()
# Get current status first
[Link]("SELECT status FROM matches WHERE id = ?", (match_id,))
current_status = [Link]()[0] if [Link]() else None
# Record event
event_time = [Link]().strftime("%H:%M")
[Link]("INSERT INTO match_events (match_id, event_type, event_time) VALUES
(?, ?, ?)",
(match_id, f"Гол команды {team}", event_time))
[Link]()
[Link]()
def complete_match(match_id):
conn = [Link]('[Link]')
c = [Link]()
[Link]("UPDATE matches SET completed = 1 WHERE id = ?", (match_id,))
[Link]()
[Link]()
def get_match_bets(match_id):
conn = [Link]('[Link]')
c = [Link]()
[Link]("SELECT * FROM bets WHERE match_id = ?", (match_id,))
bets = [Link]()
[Link]()
return bets
def get_user_bets(user_id):
conn = [Link]('[Link]')
c = [Link]()
[Link]("SELECT * FROM bets WHERE user_id = ?", (user_id,))
bets = [Link]()
[Link]()
return bets
def create_match_stats(match_id):
conn = [Link]('[Link]')
c = [Link]()
[Link]("INSERT INTO match_stats (match_id) VALUES (?)", (match_id,))
[Link]()
[Link]()
def get_match_stats(match_id):
conn = [Link]('[Link]')
c = [Link]()
[Link]("SELECT * FROM match_stats WHERE match_id = ?", (match_id,))
stats = [Link]()
[Link]()
return stats
match = get_match(match_id)
if not match:
return
message = (
"🎉 Новый матч доступен для ставок!\n\n"
f" {match[2]} vs {match[3]}\n"
f"⏰ Начало: {match[25]}\n"
"➡️ Используйте команду /matches для просмотра"
)
buttons = []
if status == 'scheduled':
[Link](InlineKeyboardButton(
text="▶️ Начать матч",
callback_data=f"start_match_{match_id}"
))
elif status == 'in_progress':
[Link](InlineKeyboardButton(
text=" Завершить матч",
callback_data=f"end_match_{match_id}"
))
else:
[Link](InlineKeyboardButton(
text="✅ Матч завершен",
callback_data="no_action"
))
return InlineKeyboardMarkup(inline_keyboard=[buttons])
def game_selection_keyboard():
return ReplyKeyboardMarkup(
keyboard=[
[KeyboardButton(text="FC25")],
[KeyboardButton(text="CS2")],
[KeyboardButton(text="Другое")]
],
resize_keyboard=True,
one_time_keyboard=True
)
def match_action_keyboard():
return ReplyKeyboardMarkup(
keyboard=[
[KeyboardButton(text="Создать новый матч")],
[KeyboardButton(text="История матчей")]
],
resize_keyboard=True,
one_time_keyboard=True
)
def confirmation_keyboard():
return ReplyKeyboardMarkup(
keyboard=[
[KeyboardButton(text="Да, опубликовать")],
[KeyboardButton(text="Нет, изменить")]
],
resize_keyboard=True,
one_time_keyboard=True
)
def match_control_keyboard(match_id):
return InlineKeyboardMarkup(
inline_keyboard=[
[InlineKeyboardButton(text="Матч Стартовал!",
callback_data=f"start_{match_id}")],
[InlineKeyboardButton(text="Гол 1 команды",
callback_data=f"goal1_{match_id}"),
InlineKeyboardButton(text="Гол 2 команды",
callback_data=f"goal2_{match_id}")],
[InlineKeyboardButton(text="Матч Закончился!",
callback_data=f"end_{match_id}")]
]
)
def bet_options_keyboard(match_id):
return InlineKeyboardMarkup(inline_keyboard=[
[
InlineKeyboardButton(text="П1", callback_data=f"bet_win1_{match_id}"),
InlineKeyboardButton(text="X", callback_data=f"bet_draw_{match_id}"),
InlineKeyboardButton(text="П2", callback_data=f"bet_win2_{match_id}"),
],
[
InlineKeyboardButton(text="Тотал голов",
callback_data=f"bet_total_{match_id}"),
InlineKeyboardButton(text="Обе забьют",
callback_data=f"bet_both_{match_id}"),
],
[
InlineKeyboardButton(text="Фолы",
callback_data=f"bet_fouls_{match_id}"),
InlineKeyboardButton(text="Угловые",
callback_data=f"bet_corners_{match_id}"),
],
[
InlineKeyboardButton(text="Желтые карточки",
callback_data=f"bet_yellows_{match_id}"),
InlineKeyboardButton(text="Красные карточки",
callback_data=f"bet_reds_{match_id}"),
]
])
def advanced_match_control_keyboard(match_id):
return InlineKeyboardMarkup(
inline_keyboard=[
[InlineKeyboardButton(text="Фол команды 1",
callback_data=f"foul1_{match_id}"),
InlineKeyboardButton(text="Фол команды 2",
callback_data=f"foul2_{match_id}")],
[InlineKeyboardButton(text="Аут команды 1",
callback_data=f"out1_{match_id}"),
InlineKeyboardButton(text="Аут команды 2",
callback_data=f"out2_{match_id}")],
[InlineKeyboardButton(text="Удар от ворот 1",
callback_data=f"goalkick1_{match_id}"),
InlineKeyboardButton(text="Удар от ворот 2",
callback_data=f"goalkick2_{match_id}")],
[InlineKeyboardButton(text="Угловой команды 1",
callback_data=f"corner1_{match_id}"),
InlineKeyboardButton(text="Угловой команды 2",
callback_data=f"corner2_{match_id}")],
[InlineKeyboardButton(text="Пенальти команды 1",
callback_data=f"penalty1_{match_id}"),
InlineKeyboardButton(text="Пенальти команды 2",
callback_data=f"penalty2_{match_id}")],
[InlineKeyboardButton(text="Опасная атака 1",
callback_data=f"danger1_{match_id}"),
InlineKeyboardButton(text="Опасная атака 2",
callback_data=f"danger2_{match_id}")],
[InlineKeyboardButton(text="Желтая карточка 1",
callback_data=f"yellow1_{match_id}"),
InlineKeyboardButton(text="Желтая карточка 2",
callback_data=f"yellow2_{match_id}")],
[InlineKeyboardButton(text="Красная карточка 1",
callback_data=f"red1_{match_id}"),
InlineKeyboardButton(text="Красная карточка 2",
callback_data=f"red2_{match_id}")],
[InlineKeyboardButton(text="Назад", callback_data=f"back_{match_id}")]
]
)
def extended_bet_options_keyboard(match_id):
return InlineKeyboardMarkup(
inline_keyboard=[
[InlineKeyboardButton(text="Победа команды 1",
callback_data=f"bet_win1_{match_id}"),
InlineKeyboardButton(text="Ничья",
callback_data=f"bet_draw_{match_id}"),
InlineKeyboardButton(text="Победа команды 2",
callback_data=f"bet_win2_{match_id}")],
[InlineKeyboardButton(text="Тотал больше",
callback_data=f"bet_over_{match_id}"),
InlineKeyboardButton(text="Тотал меньше",
callback_data=f"bet_under_{match_id}")],
[InlineKeyboardButton(text="Обе забьют: Да",
callback_data=f"bet_both_yes_{match_id}"),
InlineKeyboardButton(text="Обе забьют: Нет",
callback_data=f"bet_both_no_{match_id}")],
[InlineKeyboardButton(text="Дополнительные ставки",
callback_data=f"bet_extended_{match_id}")]
]
)
def extended_stats_bet_keyboard(match_id):
return InlineKeyboardMarkup(
inline_keyboard=[
[InlineKeyboardButton(text="Общее кол-во фолов",
callback_data=f"bet_total_fouls_{match_id}"),
InlineKeyboardButton(text="Общее кол-во угловых",
callback_data=f"bet_total_corners_{match_id}")],
[InlineKeyboardButton(text="Общее кол-во жёлтых карточек",
callback_data=f"bet_total_yellows_{match_id}"),
InlineKeyboardButton(text="Общее кол-во красных карточек",
callback_data=f"bet_total_reds_{match_id}")],
[InlineKeyboardButton(text="Назад",
callback_data=f"bet_back_{match_id}")]
]
)
class UserBetStates(StatesGroup):
SELECT_BET_TYPE = State()
ENTER_AMOUNT = State()
EXTENDED_BET = State()
await [Link](
f"🎉 Привет, {username}! Добро пожаловать в BetBot! 🎉\n"
f"Ваш баланс: {balance} BC\n"
"Получите фрибет в разделе 'Баланс'",
reply_markup=main_keyboard()
)
@[Link](Command("matches"))
async def matches_command_handler(message: Message):
await active_matches_handler(message)
try:
# Use the new status-based system directly
[Link]("SELECT id, team1, team2 FROM matches WHERE status IN
('scheduled', 'in_progress')")
matches = [Link]()
if not matches:
await [Link]("ℹ️ Сейчас нет активных матчей для ставок.")
return
keyboard = InlineKeyboardMarkup(inline_keyboard=[])
for match in matches:
match_id = match[0]
team1 = match[1]
team2 = match[2]
if str(message.from_user.id) == ADMIN_CHAT_ID:
button = InlineKeyboardButton(
text=f"{team1} vs {team2} (ID: {match_id})",
callback_data=f"admin_panel_{match_id}"
)
else:
button = InlineKeyboardButton(
text=f"{team1} vs {team2}",
callback_data=f"match_detail_{match_id}"
)
keyboard.inline_keyboard.append([button])
await [Link]("⚽ Активные матчи:", reply_markup=keyboard)
except [Link] as e:
# Handle potential schema issues gracefully
await [Link]("⚠️ Временная проблема с отображением матчей.
Пожалуйста, попробуйте позже.")
print(f"Database error: {str(e)}")
finally:
[Link]()
@[Link]([Link] == "Баланс")
async def balance_handler(message: Message):
user_id = message.from_user.id
user = get_user(user_id)
if not user:
await [Link]("❌ Пользователь не найден")
return
response = (
f"💰 Ваш баланс: {user[3]} BC\n"
f"💳 Минимальная ставка: {MIN_BET} BC\n"
f"💵 Максимальная ставка: {MAX_BET} BC"
)
@router.callback_query([Link] == "claim_freebet")
async def claim_freebet_handler(callback: [Link]):
user_id = callback.from_user.id
if not get_user(user_id):
await [Link]("❌ Пользователь не найден")
return
if not matches:
await [Link]("ℹ️ Сейчас нет активных матчей для ставок.")
return
keyboard = InlineKeyboardMarkup(inline_keyboard=[])
for match in matches:
match_id = match[0] # First column is ID
team1 = match[1] # Second column is team1
team2 = match[2] # Third column is team2
if str(message.from_user.id) == ADMIN_CHAT_ID:
button = InlineKeyboardButton(
text=f"{team1} vs {team2} (ID: {match_id})",
callback_data=f"admin_panel_{match_id}"
)
else:
button = InlineKeyboardButton(
text=f"{team1} vs {team2}",
callback_data=f"match_detail_{match_id}"
)
keyboard.inline_keyboard.append([button])
@router.callback_query([Link]("match_detail_"))
async def match_detail_handler(callback: [Link]):
match_id = int([Link]("_")[2])
match = get_match(match_id)
if not match:
await [Link]("❌ Матч не найден!")
return [Link]()
details = (
f" Матч: {match[2]} vs {match[3]}\n"
f"🎮 Игра: {match[1]}\n"
f"⏰ Начало: {match[12]}\n"
f"{status}\n"
f"{score}\n"
f"📊 Коэффициенты:\n"
f" Победа {match[2]}: {match[4]}\n"
f" Ничья: {match[5]}\n"
f" Победа {match[3]}: {match[6]}\n"
f" Тотал больше {match[7]}: {match[8]}\n"
f" Тотал меньше {match[7]}: {match[9]}\n"
f" Обе забьют: Да - {match[10]}, Нет - {match[11]}"
)
await [Link]()
@router.callback_query([Link]("bet_"))
async def bet_selection_handler(callback: [Link], state: FSMContext):
data = [Link]("_")
bet_type = data[1]
match_id = int(data[2])
odds = {
"win1": match[4],
"draw": match[5],
"win2": match[6],
"over": match[8],
"under": match[9],
"both_yes": match[10],
"both_no": match[11]
}[bet_type]
await [Link](
f"➡️ Вы выбрали: {bet_type_names[bet_type]}\n"
f"📈 Коэффициент: {odds}\n"
f"💳 Введите сумму ставки (от {MIN_BET} до {MAX_BET} BC):"
)
await [Link]()
@[Link](UserBetStates.ENTER_AMOUNT)
async def process_bet_amount(message: Message, state: FSMContext):
try:
amount = int([Link])
if amount < MIN_BET or amount > MAX_BET:
await [Link](f"❌ Сумма должна быть от {MIN_BET} до {MAX_BET}
BC!")
return
# Place bet
place_bet(
user_id=message.from_user.id,
match_id=data['match_id'],
bet_type=data['bet_type'],
amount=amount,
odds=data['odds']
)
await [Link](
f"✅ Ставка принята!\n"
f"⚽ Матч: {get_match(data['match_id'])[2]} vs
{get_match(data['match_id'])[3]}\n"
f"📊 Ваша ставка: {data['bet_name']}\n"
f"💰 Сумма: {amount} BC\n"
f"📈 Коэффициент: {data['odds']}\n\n"
f"💵 Ваш новый баланс: {user[3] - amount} BC",
reply_markup=main_keyboard()
)
await [Link]()
except ValueError:
await [Link]("❌ Пожалуйста, введите число!")
@[Link]([Link])
async def authenticate(message: Message, state: FSMContext):
if [Link] == ADMIN_PASSWORD:
await state.set_state(AdminStates.GAME_SELECTION)
await [Link](
"🎮 Выберите игру:",
reply_markup=game_selection_keyboard()
)
else:
await [Link]("❌ Неверный пароль. Попробуйте снова.")
@[Link](AdminStates.GAME_SELECTION)
async def game_selected(message: Message, state: FSMContext):
if [Link] in ["FC25", "CS2", "Другое"]:
await state.update_data(game_type=[Link])
await state.set_state(AdminStates.MATCH_ACTION)
await [Link](
"⚽ Что вы хотите сделать?",
reply_markup=match_action_keyboard()
)
else:
await [Link]("❌ Пожалуйста, выберите игру из списка")
@[Link]([Link])
async def process_teams(message: Message, state: FSMContext):
teams = [Link](',')
if len(teams) != 2:
await [Link]("❌ Неверный формат. Введите две команды через
запятую.")
return
team1 = teams[0].strip()
team2 = teams[1].strip()
await state.update_data(team1=team1, team2=team2)
await state.set_state(AdminStates.WIN_ODDS)
await [Link](
f"📊 Введите коэффициенты на победу (формат: Победа {team1}, Ничья, Победа
{team2}):"
)
@[Link](AdminStates.WIN_ODDS)
async def process_win_odds(message: Message, state: FSMContext):
odds = [Link](',')
if len(odds) != 3:
await [Link]("❌ Неверный формат. Введите три коэффициента через
запятую.")
return
try:
win1_odds = float(odds[0].strip())
draw_odds = float(odds[1].strip())
win2_odds = float(odds[2].strip())
except ValueError:
await [Link]("❌ Неверный формат коэффициентов. Используйте числа.")
return
@[Link](AdminStates.TOTAL_GOALS)
async def process_total_goals(message: Message, state: FSMContext):
try:
total_goals = float([Link])
except ValueError:
await [Link]("❌ Неверный формат. Введите число (например: 2.5).")
return
await state.update_data(total_goals=total_goals)
await state.set_state(AdminStates.TOTAL_ODDS)
await [Link]("📊 Введите коэффициенты на тотал (формат: Тотал больше,
Тотал меньше):")
@[Link](AdminStates.TOTAL_ODDS)
async def process_total_odds(message: Message, state: FSMContext):
odds = [Link](',')
if len(odds) != 2:
await [Link]("❌ Неверный формат. Введите два коэффициента через
запятую.")
return
try:
over_odds = float(odds[0].strip())
under_odds = float(odds[1].strip())
except ValueError:
await [Link]("❌ Неверный формат коэффициентов. Используйте числа.")
return
try:
both_yes_odds = float(odds[0].strip())
both_no_odds = float(odds[1].strip())
except ValueError:
await [Link]("❌ Неверный формат коэффициентов. Используйте числа.")
return
@[Link](AdminStates.FOULS_TOTAL)
async def process_fouls_total(message: Message, state: FSMContext):
try:
fouls_total = float([Link])
except ValueError:
await [Link]("❌ Неверный формат. Введите число (например: 25.5).")
return
await state.update_data(fouls_total=fouls_total)
await state.set_state(AdminStates.FOULS_ODDS)
await [Link]("📊 Введите коэффициенты на тотал фолов (формат: Тотал
больше, Тотал меньше):")
@[Link](AdminStates.FOULS_ODDS)
async def process_fouls_odds(message: Message, state: FSMContext):
odds = [Link](',')
if len(odds) != 2:
await [Link]("❌ Неверный формат. Введите два коэффициента через
запятую.")
return
try:
fouls_over_odds = float(odds[0].strip())
fouls_under_odds = float(odds[1].strip())
except ValueError:
await [Link]("❌ Неверный формат коэффициентов. Используйте числа.")
return
await state.update_data(fouls_over_odds=fouls_over_odds,
fouls_under_odds=fouls_under_odds)
await state.set_state(AdminStates.CORNERS_TOTAL)
await [Link]("↗️ Введите тотал угловых (например: 10.5):")
@[Link](AdminStates.CORNERS_TOTAL)
async def process_corners_total(message: Message, state: FSMContext):
try:
corners_total = float([Link])
except ValueError:
await [Link]("❌ Неверный формат. Введите число (например: 10.5).")
return
await state.update_data(corners_total=corners_total)
await state.set_state(AdminStates.CORNERS_ODDS)
await [Link]("📊 Введите коэффициенты на тотал угловых (формат: Тотал
больше, Тотал меньше):")
@[Link](AdminStates.CORNERS_ODDS)
async def process_corners_odds(message: Message, state: FSMContext):
odds = [Link](',')
if len(odds) != 2:
await [Link]("❌ Неверный формат. Введите два коэффициента через
запятую.")
return
try:
corners_over_odds = float(odds[0].strip())
corners_under_odds = float(odds[1].strip())
except ValueError:
await [Link]("❌ Неверный формат коэффициентов. Используйте числа.")
return
await state.update_data(corners_over_odds=corners_over_odds,
corners_under_odds=corners_under_odds)
await state.set_state(AdminStates.YELLOW_CARDS_TOTAL)
await [Link]("🟨 Введите тотал желтых карточек (например: 4.5):")
@[Link](AdminStates.YELLOW_CARDS_TOTAL)
async def process_yellow_cards_total(message: Message, state: FSMContext):
try:
yellow_cards_total = float([Link])
except ValueError:
await [Link]("❌ Неверный формат. Введите число (например: 4.5).")
return
await state.update_data(yellow_cards_total=yellow_cards_total)
await state.set_state(AdminStates.YELLOW_CARDS_ODDS)
await [Link]("📊 Введите коэффициенты на тотал желтых карточек (формат:
Тотал больше, Тотал меньше):")
@[Link](AdminStates.YELLOW_CARDS_ODDS)
async def process_yellow_cards_odds(message: Message, state: FSMContext):
odds = [Link](',')
if len(odds) != 2:
await [Link]("❌ Неверный формат. Введите два коэффициента через
запятую.")
return
try:
yellow_cards_over_odds = float(odds[0].strip())
yellow_cards_under_odds = float(odds[1].strip())
except ValueError:
await [Link]("❌ Неверный формат коэффициентов. Используйте числа.")
return
await state.update_data(yellow_cards_over_odds=yellow_cards_over_odds,
yellow_cards_under_odds=yellow_cards_under_odds)
await state.set_state(AdminStates.RED_CARDS_TOTAL)
await [Link]("🟥 Введите тотал красных карточек (например: 0.5):")
@[Link](AdminStates.RED_CARDS_TOTAL)
async def process_red_cards_total(message: Message, state: FSMContext):
try:
red_cards_total = float([Link])
except ValueError:
await [Link]("❌ Неверный формат. Введите число (например: 0.5).")
return
await state.update_data(red_cards_total=red_cards_total)
await state.set_state(AdminStates.RED_CARDS_ODDS)
await [Link]("📊 Введите коэффициенты на тотал красных карточек (формат:
Тотал больше, Тотал меньше):")
@[Link](AdminStates.RED_CARDS_ODDS)
async def process_red_cards_odds(message: Message, state: FSMContext):
odds = [Link](',')
if len(odds) != 2:
await [Link]("❌ Неверный формат. Введите два коэффициента через
запятую.")
return
try:
red_cards_over_odds = float(odds[0].strip())
red_cards_under_odds = float(odds[1].strip())
except ValueError:
await [Link]("❌ Неверный формат коэффициентов. Используйте числа.")
return
await state.update_data(red_cards_over_odds=red_cards_over_odds,
red_cards_under_odds=red_cards_under_odds)
await state.set_state(AdminStates.START_TIME)
await [Link]("⏰ Введите время начала матча (формат: ЧЧ:ММ):")
@[Link](AdminStates.START_TIME)
async def process_start_time(message: Message, state: FSMContext):
try:
# Validate time format
[Link]([Link], "%H:%M")
except ValueError:
await [Link]("❌ Неверный формат времени. Используйте ЧЧ:ММ
(например: 20:30).")
return
await state.set_state([Link])
await [Link](summary, reply_markup=confirmation_keyboard())
try:
data = await state.get_data()
# Create match with status 'scheduled' by default
match_id = create_match(
data['game_type'],
data['team1'],
data['team2'],
data['win1_odds'],
data['draw_odds'],
data['win2_odds'],
data['total_goals'],
data['over_odds'],
data['under_odds'],
data['both_yes_odds'],
data['both_no_odds'],
data['total_fouls'],
data['over_fouls_odds'],
data['under_fouls_odds'],
data['total_corners'],
data['over_corners_odds'],
data['under_corners_odds'],
data['total_yellows'],
data['over_yellows_odds'],
data['under_yellows_odds'],
data['total_reds'],
data['over_reds_odds'],
data['under_reds_odds'],
data['start_time']
)
await [Link]()
await [Link]("✅ Матч успешно создан и опубликован!",
reply_markup=main_keyboard())
except Exception as e:
await [Link](f"❌ Ошибка при создании матча: {str(e)}")
print(f"Match creation error: {str(e)}")
if not matches:
await [Link]("ℹ️ Нет доступных матчей.")
return
@[Link](Command("control"))
async def control_handler(message: Message):
try:
match_id = int([Link]()[1])
match = get_match(match_id)
if not match:
await [Link]("❌ Матч с таким ID не найден.")
return
await [Link](
f"⚽ Управление матчем ID: {match_id}\n"
f"{match[2]} vs {match[3]}",
reply_markup=match_control_keyboard(match_id)
)
except (IndexError, ValueError):
await [Link]("❌ Неверный формат. Используйте: /control [ID матча]")
@router.callback_query([Link]("start_"))
async def start_match_callback(callback: [Link]):
match_id = int([Link]("_")[-1])
start_match(match_id)
match = get_match(match_id)
# Check current match status
conn = [Link]('[Link]')
c = [Link]()
[Link]("SELECT status FROM matches WHERE id = ?", (match_id,))
status = [Link]()
if not status:
await [Link]("Матч не найден")
return
if status[0] != 'scheduled':
await [Link]("⚠️ Матч уже начат или завершен!")
return
@router.callback_query([Link]("goal_1_"))
async def goal1_callback(callback: [Link]):
match_id = int([Link]("_")[-1])
record_goal(match_id, 1)
match = get_match(match_id)
@router.callback_query([Link]("goal_2_"))
async def goal2_callback(callback: [Link]):
match_id = int([Link]("_")[-1])
record_goal(match_id, 2)
match = get_match(match_id)
if not status:
await [Link]("Матч не найден")
return
if status[0] != 'in_progress':
await [Link]("⚠️ Матч не начат или уже завершен!")
return
await [Link]()
@router.callback_query([Link]("control_"))
async def control_handler(callback: [Link]):
match_id = int([Link]("_")[1])
match = get_match(match_id)
if not match:
await [Link]("❌ Матч с таким ID не найден.")
return await [Link]()
await [Link]()
@router.callback_query([Link]("out"))
async def out_handler(callback: [Link]):
data = [Link]("_")
team = int(data[0][-1]) # out1 or out2
match_id = int(data[1])
@router.callback_query([Link]("goalkick"))
async def goal_kick_handler(callback: [Link]):
data = [Link]("_")
team = int(data[0][-1]) # goalkick1 or goalkick2
match_id = int(data[1])
@router.callback_query([Link]("corner"))
async def corner_handler(callback: [Link]):
data = [Link]("_")
team = int(data[0][-1]) # corner1 or corner2
match_id = int(data[1])
@router.callback_query([Link]("penalty"))
async def penalty_handler(callback: [Link]):
data = [Link]("_")
team = int(data[0][-1]) # penalty1 or penalty2
match_id = int(data[1])
match = get_match(match_id)
team_name = match[2] if team == 1 else match[3]
await [Link](
f"‼️Пенальти! Команде {team_name} назначен 11-метровый удар",
reply_markup=penalty_outcome_keyboard(match_id, team)
)
await [Link]()
@router.callback_query([Link]("penalty_goal_"))
async def penalty_goal_handler(callback: [Link]):
data = [Link]("_")
match_id = int(data[3])
team = int(data[4])
record_goal(match_id, team, penalty=True)
match = get_match(match_id)
team_name = match[2] if team == 1 else match[3]
@router.callback_query([Link]("penalty_miss_"))
async def penalty_miss_handler(callback: [Link]):
data = [Link]("_")
match_id = int(data[3])
team = int(data[4])
match = get_match(match_id)
team_name = match[2] if team == 1 else match[3]
await [Link](f"😱 {team_name} не реализует пенальти! Эх, а
такая возможность была!")
await [Link]()
@router.callback_query([Link]("danger"))
async def dangerous_attack_handler(callback: [Link]):
data = [Link]("_")
team = int(data[0][-1]) # danger1 or danger2
match_id = int(data[1])
update_match_stats(match_id, "dangerous_attacks", team)
match = get_match(match_id)
team_name = match[2] if team == 1 else match[3]
@router.callback_query([Link]("yellow"))
async def yellow_card_handler(callback: [Link]):
data = [Link]("_")
team = int(data[0][-1]) # yellow1 or yellow2
match_id = int(data[1])
update_match_stats(match_id, "yellow_cards", team)
match = get_match(match_id)
team_name = match[2] if team == 1 else match[3]
@router.callback_query([Link]("red"))
async def red_card_handler(callback: [Link]):
data = [Link]("_")
team = int(data[0][-1]) # red1 or red2
match_id = int(data[1])
update_match_stats(match_id, "red_cards", team)
match = get_match(match_id)
team_name = match[2] if team == 1 else match[3]
@router.callback_query([Link]("back_"))
async def back_handler(callback: [Link]):
match_id = int([Link]("_")[1])
match = get_match(match_id)
await [Link](
f"⚽ Управление матчем ID: {match_id}\n"
f"{match[2]} vs {match[3]}",
reply_markup=match_control_keyboard(match_id)
)
await [Link]()
# Extended bet handlers
@router.callback_query([Link]("bet_extended_"))
async def extended_bet_handler(callback: [Link]):
match_id = int([Link]("_")[2])
await [Link](
"📊 Выберите тип дополнительной ставки:",
reply_markup=extended_stats_bet_keyboard(match_id)
)
await [Link]()
@router.callback_query([Link]("bet_total_"))
async def total_stat_bet_handler(callback: [Link], state: FSMContext):
data = [Link]("_")
stat_type = data[2] # fouls, corners, yellows, reds
match_id = int(data[3])
stat_names = {
"fouls": "общее количество фолов",
"corners": "общее количество угловых",
"yellows": "общее количество желтых карточек",
"reds": "общее количество красных карточек"
}
await state.update_data(
match_id=match_id,
bet_type=f"total_{stat_type}",
bet_name=f"Общее кол-во {stat_names[stat_type]}"
)
await state.set_state(UserBetStates.EXTENDED_BET)
await [Link](
f"➡️ Вы выбрали: Общее кол-во {stat_names[stat_type]}\n"
f"📊 Введите тотал (например: 10.5):"
)
await [Link]()
@[Link](UserBetStates.EXTENDED_BET)
async def process_extended_bet(message: Message, state: FSMContext):
try:
total_line = float([Link])
data = await state.get_data()
await state.update_data(total_line=total_line)
await [Link](
f"📊 Введите коэффициент для тотала {total_line}:"
)
await state.set_state(UserBetStates.ENTER_AMOUNT)
except ValueError:
await [Link]("❌ Пожалуйста, введите число!")
if not match:
await [Link]("Матч не найден")
return
await [Link](details,
reply_markup=bet_options_keyboard(match_id))
# Initialize bot
bot = Bot(token=BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(storage=storage)
dp.include_router(router)
# Start polling
await dp.start_polling(bot)
if __name__ == "__main__":
[Link](main())