Compare commits

..

2 Commits

Author SHA1 Message Date
2e92164bbf fix: исправлен синтаксис YAML в Drone CI
Some checks reported errors
continuous-integration/drone/push Build encountered an error
- Заменён headers.Content-Type на content_type в webhook настройках
- Исправлена ошибка 'cannot unmarshal !!map into string' на строке 126
- Применено для всех webhook уведомлений (success, failure, deploy)
2025-11-22 19:01:35 +09:00
69985f6afb fix: улучшена обработка создания розыгрыша
- Добавлено подробное логирование callback admin_create_lottery
- Добавлен немедленный ответ на callback для предотвращения таймаута
- Добавлена обработка ошибок с логированием
- Исправлена логика проверки прав админа
2025-11-22 18:59:34 +09:00
3 changed files with 35 additions and 26 deletions

View File

@@ -137,8 +137,7 @@ steps:
settings: settings:
urls: urls:
- https://discord.com/api/webhooks/YOUR_WEBHOOK_URL # Замените на ваш webhook - https://discord.com/api/webhooks/YOUR_WEBHOOK_URL # Замените на ваш webhook
headers: content_type: application/json
Content-Type: application/json
template: | template: |
{ {
"content": "✅ **Build Success** - Lottery Bot\n**Branch:** {{build.branch}}\n**Commit:** {{build.commit}}\n**Build:** #{{build.number}}\n**Author:** {{build.author}}" "content": "✅ **Build Success** - Lottery Bot\n**Branch:** {{build.branch}}\n**Commit:** {{build.commit}}\n**Build:** #{{build.number}}\n**Author:** {{build.author}}"
@@ -156,8 +155,7 @@ steps:
settings: settings:
urls: urls:
- https://discord.com/api/webhooks/YOUR_WEBHOOK_URL # Замените на ваш webhook - https://discord.com/api/webhooks/YOUR_WEBHOOK_URL # Замените на ваш webhook
headers: content_type: application/json
Content-Type: application/json
template: | template: |
{ {
"content": "❌ **Build Failed** - Lottery Bot\n**Branch:** {{build.branch}}\n**Commit:** {{build.commit}}\n**Build:** #{{build.number}}\n**Author:** {{build.author}}\n**Logs:** {{build.link}}" "content": "❌ **Build Failed** - Lottery Bot\n**Branch:** {{build.branch}}\n**Commit:** {{build.commit}}\n**Build:** #{{build.number}}\n**Author:** {{build.author}}\n**Logs:** {{build.link}}"
@@ -237,8 +235,7 @@ steps:
settings: settings:
urls: urls:
- https://discord.com/api/webhooks/YOUR_WEBHOOK_URL # Замените на ваш webhook - https://discord.com/api/webhooks/YOUR_WEBHOOK_URL # Замените на ваш webhook
headers: content_type: application/json
Content-Type: application/json
template: | template: |
{ {
"content": "🚀 **Deployment Complete** - Lottery Bot\n**Environment:** Staging\n**Build:** #{{build.number}}\n**Commit:** {{build.commit}}" "content": "🚀 **Deployment Complete** - Lottery Bot\n**Environment:** Staging\n**Build:** #{{build.number}}\n**Commit:** {{build.commit}}"

View File

@@ -204,21 +204,34 @@ async def show_lottery_management(callback: CallbackQuery):
@admin_router.callback_query(F.data == "admin_create_lottery") @admin_router.callback_query(F.data == "admin_create_lottery")
async def start_create_lottery(callback: CallbackQuery, state: FSMContext): async def start_create_lottery(callback: CallbackQuery, state: FSMContext):
"""Начать создание розыгрыша""" """Начать создание розыгрыша"""
logging.info(f"🎯 Callback admin_create_lottery получен от пользователя {callback.from_user.id}")
# Сразу отвечаем на callback
await callback.answer()
if not is_admin(callback.from_user.id): if not is_admin(callback.from_user.id):
await callback.answer("❌ Недостаточно прав", show_alert=True) logging.warning(f"⚠️ Пользователь {callback.from_user.id} не является админом")
await callback.message.answer("❌ Недостаточно прав")
return return
logging.info(f"✅ Админ {callback.from_user.id} начинает создание розыгрыша")
text = "📝 Создание нового розыгрыша\n\n" text = "📝 Создание нового розыгрыша\n\n"
text += "Шаг 1 из 4\n\n" text += "Шаг 1 из 4\n\n"
text += "Введите название розыгрыша:" text += "Введите название розыгрыша:"
await callback.message.edit_text( try:
text, await callback.message.edit_text(
reply_markup=InlineKeyboardMarkup(inline_keyboard=[ text,
[InlineKeyboardButton(text="❌ Отмена", callback_data="admin_lotteries")] reply_markup=InlineKeyboardMarkup(inline_keyboard=[
]) [InlineKeyboardButton(text="❌ Отмена", callback_data="admin_lotteries")]
) ])
await state.set_state(AdminStates.lottery_title) )
await state.set_state(AdminStates.lottery_title)
logging.info(f"✅ Состояние установлено: AdminStates.lottery_title")
except Exception as e:
logging.error(f"❌ Ошибка при создании розыгрыша: {e}")
await callback.message.answer(f"❌ Ошибка: {str(e)}")
@admin_router.message(StateFilter(AdminStates.lottery_title)) @admin_router.message(StateFilter(AdminStates.lottery_title))

View File

@@ -123,21 +123,20 @@ async def handle_text_message(message: Message):
# Извлекаем команду (первое слово) # Извлекаем команду (первое слово)
command = message.text.split()[0] if message.text else '' command = message.text.split()[0] if message.text else ''
# Если это пользовательская команда - пропускаем, она будет обработана другими обработчиками # ИЗМЕНЕНИЕ: Если это команда от АДМИНА - не пересылаем (админ сам её видит)
if command in user_commands: if is_admin(message.from_user.id):
return # Если это админская команда - пропускаем, она будет обработана другими обработчиками
if command in admin_commands:
# Если это админская команда
if command in admin_commands:
# Проверяем права админа
if not is_admin(message.from_user.id):
await message.answer("У вас нет прав для выполнения этой команды")
return return
# Если админ - команда будет обработана другими обработчиками, пропускаем пересылку # Если это пользовательская команда от админа - тоже пропускаем
if command in user_commands:
return
# Любая другая команда от админа - тоже не пересылаем
return return
# Если неизвестная команда - тоже не пересылаем # ИЗМЕНЕНИЕ: Если команда от обычного пользователя - ПЕРЕСЫЛАЕМ админу
return # Чтобы админ видел, что пользователь отправил /start или другую команду
# НЕ делаем return, продолжаем выполнение для пересылки
async with async_session_maker() as session: async with async_session_maker() as session:
# Проверяем права на отправку # Проверяем права на отправку