semenovstyle
@semenovstyle

Не активируется инлайн кнопки и режим чата, где ошибка?

Всем привет. Проблема такая - кнопка "чат с менеджером" должна активировать режим общения пользователя с менеджером и показывать инлайн-кнопки, но этого не происходит и ошибок в консоли тоже не показывает.
Скорей всего ошибка глупейшая т.к. первый бот.
# Создаем роутер и диспетчер
router = Router()
dp = Dispatcher()

# Основные кнопки
main_menu_buttons = [
    [KeyboardButton(text='Чат с менеджером')],
    [KeyboardButton(text='Услуги')],
    [KeyboardButton(text='Отправить запрос')],
    [KeyboardButton(text='О нас')],
    [KeyboardButton(text='Посетить наш сайт')],
    [KeyboardButton(text='Наши контакты')]
]

main_menu = ReplyKeyboardMarkup(
    keyboard=main_menu_buttons,
    resize_keyboard=True,
    #input_field_placeholder="Воспользуйтесь меню:"
)

# Кнопка "Вернуться в главное меню"
back_button = KeyboardButton(text="Вернуться в главное меню")
back_menu = ReplyKeyboardMarkup(
    keyboard=[[back_button]],
    resize_keyboard=True
)

# Инлайн-кнопка для начала чата с администратором
chat_button = InlineKeyboardButton(text="Чат с менеджером", callback_data="start_chat")
inline_chat_keyboard = InlineKeyboardMarkup(
    inline_keyboard=[
        [chat_button]
    ]
)

# Инлайн-кнопка для возврата в главное меню
return_button = InlineKeyboardButton(text="Вернуться в главное меню", callback_data="return_to_menu")
inline_return_keyboard = InlineKeyboardMarkup(
    inline_keyboard=[
        [return_button]
    ]
)
# Кнопка для прикрепления контакта
contact_button = KeyboardButton(text='Прикрепить мой контакт', request_contact=True)
contact_keyboard = ReplyKeyboardMarkup(
    keyboard=[[contact_button]],
    resize_keyboard=True
)

# Кнопка-ссылка на сайт
inline_button = InlineKeyboardButton(text="prizma59.ru", url="https://prizma59.ru")
inline_keyboard_1 = InlineKeyboardMarkup(
   inline_keyboard=[[inline_button]]
)

button_1 = InlineKeyboardButton(text="Изготовление вывесок", url="https://prizma59.ru/vyveski.shtml")
button_2 = InlineKeyboardButton(text="Печать пленка/баннер", url="https://prizma59.ru/printing.shtml")
button_2_2 = InlineKeyboardButton(text="Печать УФ", url="https://prizma59.ru/uvprint.shtml")
button_3 = InlineKeyboardButton(text="Холодный неон", url="https://prizma59.ru/neonsign.shtml")
button_4 = InlineKeyboardButton(text="Брендирование транспорта", url="https://prizma59.ru/transport.shtml")
button_5 = InlineKeyboardButton(text="Изделия из оргстекла", url="https://prizma59.ru/pos.shtml")
button_6 = InlineKeyboardButton(text="Новогодняя подсветка", url="https://prizma59.ru/newyear.shtml")
button_7 = InlineKeyboardButton(text="Дизайн", url="https://prizma59.ru/razrabotka_dizaina.shtml")

# Создаем клавиатуру с несколькими инлайн-кнопками
inline_button = InlineKeyboardButton(text="Наши основные услуги")
inline_keyboard_2 = InlineKeyboardMarkup(
    inline_keyboard=[
        [button_1],  # Первая строка с одной кнопкой
        [button_2, button_2_2],  # Вторая строка с двумя кнопками
        [button_3, button_4],
        [button_6],
        [button_5, button_7]
    ]
)

#------------
# Определяем состояния для чата
class ChatStates(StatesGroup):
    waiting_for_message = State()  # Пользователь ожидает отправки сообщения
    chatting_with_admin = State()  # Пользователь в процессе общения с администратором

# Отслеживание активных чатов для пересылки сообщений
active_chats = {}

# Обработчик команды /start
@router.message(Command("start"))
async def cmd_start(message: Message):
    await message.answer("Привет!", reply_markup=main_menu)

# Обработчик кнопки "Чат с поддержкой"
@router.callback_query(F.data == "start_chat")
async def start_chat(callback_query: types.CallbackQuery, state: FSMContext):
    user_id = callback_query.from_user.id
    
    # Уведомляем администратора о начале чата
    await bot.send_message(CHAT_USER_ID, f"Пользователь @{callback_query.from_user.username} начал чат с поддержкой.")
    
    # Устанавливаем состояние ожидания сообщения от пользователя
    await state.set_state(ChatStates.waiting_for_message)
    
    # Сообщаем пользователю, что можно отправить сообщение
    await callback_query.message.answer("Чат с поддержкой начат. Отправьте ваше сообщение.", reply_markup=inline_return_keyboard)
    
    # Добавляем пользователя в активные чаты
    active_chats[user_id] = CHAT_USER_ID

# Обработчик сообщения от пользователя в процессе чата
@router.message(ChatStates.waiting_for_message)
async def handle_chat_message(message: Message, state: FSMContext):
    # Пересылаем сообщение администратору
    admin_message = f"Сообщение от @{message.from_user.username}: {message.text}"
    await bot.send_message(CHAT_USER_ID, admin_message)
    
    # Сообщаем пользователю, что сообщение отправлено
    await message.answer("Ваше сообщение отправлено в поддержку.", reply_markup=inline_return_keyboard)
    
    # Переводим пользователя в состояние активного чата
    await state.set_state(ChatStates.chatting_with_admin)

# Обработчик сообщений от администратора
@router.message(F.chat.id == int(CHAT_USER_ID))  # Проверка, что сообщение приходит от администратора
async def handle_admin_message(message: Message):
    # Получаем ID пользователя, с которым общается администратор
    user_id = active_chats.get(CHAT_USER_ID)
    
    if user_id:
        # Пересылаем сообщение пользователю
        await bot.send_message(user_id, f"Ответ от поддержки: {message.text}")
    else:
        await message.answer("Нет активного чата с пользователем.")

# Обработчик завершения чата
@router.message(F.text == "Завершить чат")
async def finish_chat(message: Message, state: FSMContext):
    user_id = message.from_user.id

    # Оповещаем администратора о завершении чата
    await bot.send_message(CHAT_USER_ID, f"Пользователь @{message.from_user.username} завершил чат.")
    
    # Убираем пользователя из активных чатов
    if CHAT_USER_ID in active_chats:
        del active_chats[CHAT_USER_ID]
    
    # Очищаем состояние
    await state.clear()
    
    # Возвращаем пользователя в главное меню
    await message.answer("Чат завершён. Вы вернулись в главное меню.", reply_markup=main_menu)

# Обработчик возврата в главное меню
@router.callback_query(F.data == "return_to_menu")
async def return_to_menu(callback_query, state: FSMContext):
    # Завершаем текущее состояние
    await state.clear()

    await callback_query.message.answer("Вы вернулись в главное меню.", reply_markup=main_menu)

@router.message(F.text == "Услуги")
async def visit_website(message: Message):
    await message.answer("Наши услуги  ", reply_markup=inline_keyboard_2)

# Обработчик кнопки "О нас"
@router.message(F.text == "О нас")
async def about_us(message: Message):
    about_text = "<b>Добро пожаловать в РА Призма!</b> "
    await message.answer(about_text)

# Инлайн кнопки
@router.message(F.text == "Посетить наш сайт")
async def visit_website(message: Message):
    await message.answer("Посетить наш сайт  ", reply_markup=inline_keyboard_1)


# Обработчик кнопки "Наши контакты"
@router.message(F.text == "Наши контакты")
async def our_contacts(message: Message):
    contacts_text = "<b>Наши контакты:</b> \nТелефон: +7(342)2179040 \nВремя работы: Пн-Пт с 9:00 до 18:00 \nг. Пермь ул. Ижевская, 27 к2."
    await message.answer(contacts_text)

# Флаг для отслеживания запроса
waiting_for_request = {}

# Обработчик кнопки "Отправить запрос"
@router.message(F.text == "Отправить запрос")
async def send_request(message: Message):
    user_id = message.from_user.id
    waiting_for_request[user_id] = True  # Помечаем, что ожидаем сообщение от пользователя
    await message.answer("Прикрепите Ваш контакт и напишите сообщение", reply_markup=contact_keyboard)

# Обработчик получения контакта
@router.message(F.contact)
async def handle_contact(message: Message):
    user_id = message.from_user.id
    contact = message.contact.phone_number
    waiting_for_request[user_id] = {"contact": contact}  # Сохраняем контакт
    await message.answer("Контакт получен  Напишите ваше сообщение ⏬ ")

# Обработчик получения сообщения пользователя после нажатия на "Отправить запрос"
@router.message(F.text)
async def handle_user_message(message: Message):
    user_id = message.from_user.id
    
    # Проверяем, ждем ли мы сообщение от пользователя
    if waiting_for_request.get(user_id):
        contact_info = waiting_for_request[user_id].get("contact", "Контакт не предоставлен")
        user_message = message.text
        
        # Отправка администратору
        admin_message = f"Запрос от {message.from_user.full_name} (@{message.from_user.username}):\nКонтакт: {contact_info}\nСообщение: {user_message}"
        await bot.send_message(ADMIN_ID, admin_message)
        
        # Сохраняем запрос в базу данных
        await save_request(message.from_user.id, message.from_user.full_name, contact_info, user_message)
        
        # Отправляем подтверждение пользователю
        await message.answer("Спасибо за ваш запрос! Мы свяжемся с вами в ближайшее время.", reply_markup=main_menu)
        
        # Убираем пользователя из режима ожидания
        waiting_for_request.pop(user_id, None)

# Запуск бота
async def main():
    await init_db()  # Инициализация базы данных
    
    # Регистрируем роутер в диспетчере
    dp.include_router(router)
    
    #await bot.delete_my_commands(scope=types.BotCommandScopeAllPrivateChats())

    # Запускаем поллинг
    await dp.start_polling(bot)

if __name__ == "__main__":
    import asyncio
    asyncio.run(main())
  • Вопрос задан
  • 29 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы