Всем привет. Проблема такая - кнопка "чат с менеджером" должна активировать режим общения пользователя с менеджером и показывать инлайн-кнопки, но этого не происходит и ошибок в консоли тоже не показывает.
Скорей всего ошибка глупейшая т.к. первый бот.
# Создаем роутер и диспетчер
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())