subscriptions/bot.py
2024-08-16 18:25:29 +03:00

538 lines
33 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
from datetime import datetime, timedelta
import datetime
from aiogram import types, F, Router
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from database_queries import (presence_user_bd, adding_user_db, update_user_db, user_search, getting_course,
installation_zero_question, installation_one_question, status_question,
write_hash_to_table, search_hash_in_table, number_of_streams_from_subscriptions,
number_of_threads_from_threads, get_user_data, subscription_entry,
subscription_end_record, check_expired_subscriptions)
from main import bot_chat
import qrcode
from utils import create_connection, get_contract_ret_tron, get_contract_ret_arbitrum, payment_order_yukassa, \
check_payment_status
from states import QuestionStates
from dotenv import load_dotenv
load_dotenv()
router = Router()
# Словарь для хранения состояния пользователя
user_states = {}
@router.message(Command("start"))
async def cmd_start(message: types.Message):
""" Основное меню """
photo = types.FSInputFile("1_IMAGE.png")
user_id = message.from_user.id
username = message.from_user.username or "No name"
conn = create_connection()
cursor = conn.cursor()
result = presence_user_bd(user_id)
if result is None:
adding_user_db(user_id, username)
keyboard = types.InlineKeyboardMarkup(
row_width=1,
inline_keyboard=[
[types.InlineKeyboardButton(text="Купить подписку", callback_data="buy_subscription")],
[types.InlineKeyboardButton(text="FAQ блок", callback_data="faq_block"),
types.InlineKeyboardButton(text="Моя подписка", callback_data="my_subscription")],
[types.InlineKeyboardButton(text="Задать вопрос", callback_data="ask_question")], ], )
# Отправляем меню пользователю
await message.reply_photo(photo=photo, reply_markup=keyboard)
@router.callback_query(F.data == "buy_subscription")
async def handle_buy_subscription(callback_query: types.CallbackQuery):
""" Выбор подписки или потоков """
await callback_query.message.delete()
keyboard = types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Купить подписку на 1 мес.", callback_data="buy_1_month")],
[types.InlineKeyboardButton(text="Купить подписку на 2 мес.", callback_data="buy_2_month")],
[types.InlineKeyboardButton(text="Купить подписку на 3 мес.", callback_data="buy_3_month")],
[types.InlineKeyboardButton(text="Увеличение потоков.", callback_data="increase_flow")],
[types.InlineKeyboardButton(text="Обратно в меню", callback_data="back_to_menu")],],)
# Отправляем подменю пользователю
await callback_query.message.answer("Выберите срок подписки:", reply_markup=keyboard)
@router.callback_query(F.data == "increase_flow")
async def handle_increase_flow(callback_query: types.CallbackQuery, state: FSMContext):
""" Получение от пользователя количество потоков """
await state.set_state(QuestionStates.count_flow)
user_id = callback_query.from_user.id
if user_id not in user_states: # Проверка на существование состояния пользователя
user_states[user_id] = {} # Инициализация состояния пользователя
await callback_query.message.delete()
msg_to_delete = await callback_query.message.answer("Введите количество потоков:",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Изменить",
callback_data="buy_subscription")]]))
await state.update_data(msg_to_delete=msg_to_delete)
@router.message(QuestionStates.count_flow)
async def handle_flow_count(message: types.Message, state: FSMContext):
""" Подтверждение покупки указанных потоков от пользователя """
await message.delete()
data = await state.get_data()
msg_to_delete = data.get('msg_to_delete')
if msg_to_delete:
try:
await msg_to_delete.delete()
except:
pass
user_id = message.from_user.id
user_states.setdefault(user_id, {}) # Инициализация состояния пользователя с помощью setdefault
if message.text.isdigit():
flow_count = int(message.text)
user_states[user_id] = flow_count # Сохранение количества потоков
total_price_usd = flow_count * 2
keyboard = types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Да", callback_data="yes_flow_count"),
types.InlineKeyboardButton(text="Изменить", callback_data="buy_subscription")],
[types.InlineKeyboardButton(text="Обратно в меню", callback_data="back_to_menu")]
])
await message.answer(f"Вы хотите купить {flow_count} поток(ов) за ${total_price_usd}?", reply_markup=keyboard)
else:
await message.answer("Пожалуйста, введите корректное число.")
@router.callback_query(F.data == "buy_1_month")
@router.callback_query(F.data == "buy_2_month")
@router.callback_query(F.data == "buy_3_month")
async def handle_buy_subscription_confirm(callback_query: types.CallbackQuery):
""" Получение подтверждения по покупке подписки и пользователя """
user_id = callback_query.from_user.id
user_states[user_id] = callback_query.data # Сохраняем текущее состояние
# Подтверждение перехода к оплате
keyboard = types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Да", callback_data="YES"),
types.InlineKeyboardButton(text="Изменить", callback_data="buy_subscription")],
[types.InlineKeyboardButton(text="Обратно в меню", callback_data="back_to_menu")],],)
months = {"buy_1_month": 1,
"buy_2_month": 2,
"buy_3_month": 3}
month_count = months.get(callback_query.data)
price = month_count * 1
# Отправляем запрос подтверждения
await callback_query.message.edit_text(
f"Вы хотите купить подписку сроком на {month_count} мес. за {price} $?", reply_markup=keyboard,)
@router.callback_query(F.data == "yes_flow_count")
async def handle_payment_method(callback_query: types.CallbackQuery):
""" Меню выбора способа оплаты потоков """
user_id = callback_query.from_user.id
flow_count = user_states[user_id] # Получаем состояние пользователя
total_price_usd = flow_count * 2
# Получаем курс USD/RUB из бд
conn = create_connection()
cursor = conn.cursor()
course_usd_rub = getting_course(cursor) # Функция для получения курса
price_rub = round(total_price_usd * course_usd_rub[1])
# Выбор способа оплаты
keyboard = types.InlineKeyboardMarkup(
row_width=1,
inline_keyboard=[
[types.InlineKeyboardButton(text=f"USDT TRC20 - {total_price_usd}$", callback_data="tron")],
[types.InlineKeyboardButton(text=f"Arbitrum - {total_price_usd}$", callback_data="Arbitrum")],
[types.InlineKeyboardButton(text=f"ЮКасса {price_rub} руб.", callback_data="Yukassa")],
[types.InlineKeyboardButton(text="Обратно в меню", callback_data="back_to_menu")],],)
# Отправляем запрос на выбор способа оплаты
await callback_query.message.edit_text(
f"Выберете способ оплаты товара за {total_price_usd} USDT или {price_rub} руб.",
reply_markup=keyboard,)
@router.callback_query(F.data == "YES")
async def handle_payment_method(callback_query: types.CallbackQuery):
""" Меню выбора способа оплаты подписки """
user_id = callback_query.from_user.id # Получаем состояние пользователя
subscription_type = user_states.get(user_id)
if subscription_type:
months = {"buy_1_month": 1,
"buy_2_month": 2,
"buy_3_month": 3}
month_count = months.get(subscription_type) # На входе мы получаем строку. далее переводим ее в int
price_usd = month_count * 1
# Получаем курс USD/RUB из бд
conn = create_connection()
cursor = conn.cursor()
course_usd_rub = getting_course(cursor)
price_rub = round(price_usd * course_usd_rub[1])
# Выбор способа оплаты
keyboard = types.InlineKeyboardMarkup(
row_width=1,
inline_keyboard=[
[types.InlineKeyboardButton(text=f"USDT TRC20 - {price_usd}$", callback_data="tron")],
[types.InlineKeyboardButton(text=f"Arbitrum - {price_usd}$", callback_data="Arbitrum")],
[types.InlineKeyboardButton(text=f"ЮКасса {price_rub} руб.", callback_data="Yukassa")],
[types.InlineKeyboardButton(text="Обратно в меню", callback_data="back_to_menu")],],)
# Отправляем запрос на выбор способа оплаты
await callback_query.message.edit_text(
f"Выберете способ оплаты товара на {month_count} мес. за {price_usd} USDT или {price_rub} руб.",
reply_markup=keyboard,)
@router.callback_query(F.data == "tron")
async def example(callback_query: types.CallbackQuery, state: FSMContext):
""" Платежный хэндлер трона на личный кошелек"""
await callback_query.message.delete()
await state.set_state(QuestionStates.waiting_for_hash) # ожидание хэша от пользователя
user_id = callback_query.from_user.id # Получение айди пользователя
flow_count = user_states[user_id] # Получение количесва потоков
subscription_type = user_states.get(user_id) # Получение строки по подписке
if isinstance(subscription_type, str): # проверка - идет покупка потоков или подписки
months = {"buy_1_month": 1,
"buy_2_month": 2,
"buy_3_month": 3}
month_count = months.get(subscription_type)
price_usd = month_count * 1
else:
price_usd = flow_count * 2
payment_url = os.getenv('TO_ADRESS') # Ссылка на кошелек заказчика
filename = "site.png"
# Генерация QR-кода
img = qrcode.make(payment_url)
img.save(filename)
photo = types.FSInputFile(filename)
message_to_delete = await callback_query.message.answer_photo(
photo=photo, caption=f"Для оплаты необходимо совершить пополнение в размере {price_usd}$"
f" на кошелек: {payment_url} После оплаты напишите хэш операции для проверки статуса",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Изменить", callback_data="buy_subscription")]]))
os.remove(filename)
await state.update_data(message_to_delete=message_to_delete)
@router.callback_query(F.data == "Arbitrum")
async def example(callback_query: types.CallbackQuery, state: FSMContext):
""" Платежный хэндлер арбитрума на личный кошелек"""
await callback_query.message.delete()
await state.set_state(QuestionStates.waiting_for_hash) # ожидание хэша от пользователя
user_id = callback_query.from_user.id # Получение айди пользователя
flow_count = user_states[user_id] # Получение количесва потоков
subscription_type = user_states.get(user_id) # Получение строки по подписке
if isinstance(subscription_type, str): # проверка - идет покупка потоков или подписки
months = {"buy_1_month": 1,
"buy_2_month": 2,
"buy_3_month": 3}
month_count = months.get(subscription_type)
price_usd = month_count * 1
else:
price_usd = flow_count * 2
payment_url = os.getenv('ARBITRUM_ADRESS') # Ссылка на кошелек заказчика
filename = "site.png"
# Генерация QR-кода
img = qrcode.make(payment_url)
img.save(filename)
photo = types.FSInputFile(filename)
message_to_delete = await callback_query.message.answer_photo(
photo=photo, caption=f"Для оплаты необходимо совершить пополнение в размере {price_usd}$"
f" на кошелек: {payment_url} После оплаты напишите хэш операции для проверки статуса",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Изменить", callback_data="buy_subscription")]]))
os.remove(filename)
await state.update_data(message_to_delete=message_to_delete)
@router.callback_query(F.data == "Yukassa")
async def example(callback_query: types.CallbackQuery, state: FSMContext):
""" Платежный хэндлер юкассы """
await callback_query.message.delete()
user_id = callback_query.from_user.id # Получение айди пользователя
flow_count = user_states[user_id] # Получение количесва потоков
subscription_type = user_states.get(user_id) # Получение строки по подписке
if isinstance(subscription_type, str): # проверка - идет покупка потоков или подписки
months = {"buy_1_month": 1,
"buy_2_month": 2,
"buy_3_month": 3}
month_count = months.get(subscription_type)
price_usd = month_count * 1
else:
price_usd = flow_count * 2
# Получаем курс USD/RUB
conn = create_connection()
cursor = conn.cursor()
course_usd_rub = getting_course(cursor)
price_rub = round(price_usd * course_usd_rub[1])
bot_me = await bot_chat.get_me() # эта и строчка ниже - получение имя бота
bot_username = bot_me.username
result = await payment_order_yukassa(price_rub, bot_username) # функция возвращает словарь платежного поручения
payment_url = result['confirmation']['confirmation_url'] # вытаскиваем ссылку на оплату из словаря
payment_id = result["id"] # вытаскиваем айди платежа
await state.update_data(payment_id=payment_id) # Сохраняем payment_id в состоянии. нужен для след хэндлера
filename = "site.png"
# Генерация QR-кода
img = qrcode.make(payment_url)
img.save(filename)
photo = types.FSInputFile(filename)
await callback_query.message.answer_photo(
photo=photo, caption=f"Необходимо совершить оплату в размере {price_rub}руб по ссылке: {payment_url}",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Изменить", callback_data="buy_subscription")],
[types.InlineKeyboardButton(text="Проверить платеж", callback_data=f"check {payment_id}")]]))
os.remove(filename)
@router.callback_query(F.data.startswith("check"))
async def check_payment(callback_query: types.CallbackQuery, state: FSMContext):
""" Проверка платежа юкассы по айди платежа """
await callback_query.message.delete()
await state.set_state(QuestionStates.payment_id) # Получаем состояние айди платежки из прошлого хэндлера
user_id = callback_query.from_user.id # Получаем айди пользователя
data = await state.get_data() # Получаем данные состояния
payment_id = data.get("payment_id") # Извлекаем payment_id
subscription_type = user_states.get(user_id) # Извлекаем состояние по подписки
flow_count = user_states[user_id] # Извлекаем состояние по потокам
if isinstance(subscription_type, str): # Проверяем, была ли это оплата потоков или подписки
months = {"buy_1_month": 1,
"buy_2_month": 2,
"buy_3_month": 3}
month_count = months.get(subscription_type)
price_usd = month_count * 1
else:
price_usd = flow_count * 1
conn = create_connection()
cursor = conn.cursor()
if search_hash_in_table(cursor, payment_id):
await callback_query.message.answer("Повторная проверка по хешу запрещена",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Обратно в меню", callback_data="back_to_menu")]]))
else:
if check_payment_status(payment_id) == "succeeded":
await callback_query.message.answer(
"Платеж успешно произведен", reply_markup=types.InlineKeyboardMarkup
(row_width=1, inline_keyboard=[[types.InlineKeyboardButton
(text="Обратно в меню", callback_data="back_to_menu")]]))
write_hash_to_table(cursor, payment_id, user_id)
conn.commit()
if isinstance(subscription_type, str):
# делаем запись в бд при покупки подписки. устанавливается "3" при условии отсутсвия активной подписки
number_of_streams_from_subscriptions(cursor, user_id) # Запись 3 единицы, если их не было
conn.commit()
subscription_entry(cursor, user_id, price_usd) # Запись подписки в столбец (1,2,3 мес)
conn.commit()
subscription_end_record(cursor, user_id) # Запись даты окончания подписки в столбцы
conn.commit()
else:
# добавляем в столбец количество потоков
number_of_threads_from_threads(cursor, user_id, price_usd)
conn.commit()
else:
await callback_query.message.answer(
"Ошибка, проверьте правильность написания хэша и повторите попытку проверки статуса платежа",
reply_markup=types.InlineKeyboardMarkup
(row_width=1, inline_keyboard=[[types.InlineKeyboardButton
(text="Обратно в меню", callback_data="back_to_menu")]]))
await callback_query.bot.unban_chat_member(-4226821992, user_id)
@router.message(QuestionStates.waiting_for_hash)
async def handle_hash(message: types.Message, state: FSMContext):
# хендлер по проверке по хешу статуса операции
data = await state.get_data()
message_to_delete = data.get('message_to_delete')
if message_to_delete:
try:
await message_to_delete.delete()
except:
pass
await message.delete()
await state.set_state(QuestionStates.waiting_for_hash)
user_id = message.from_user.id
flow_count = user_states[user_id]
subscription_type = user_states.get(user_id)
if isinstance(subscription_type, str):
months = {"buy_1_month": 1,
"buy_2_month": 2,
"buy_3_month": 3}
month_count = months.get(subscription_type)
price_usd = month_count * 1
else:
price_usd = flow_count * 1
user_id = message.from_user.id
conn = create_connection()
cursor = conn.cursor()
user_hash = message.text.strip() # Записываем хэш
# Проводим проверку на наличие хеша в таблице успешных операций. Если успешна - повторная проверка запрещена
if search_hash_in_table(cursor, user_hash):
await message.answer("Повторная проверка по хешу запрещена",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Обратно в меню", callback_data="back_to_menu")]]))
else:
result = get_contract_ret_tron(user_hash, price_usd)
result_2 = get_contract_ret_arbitrum(user_hash, price_usd) # вызов функции для проверки статуса платежа
# если успешный статус, выводим отбивку пользователю и записываем хеш в таблицу чтобы последующие
# проверки были невозможны
if result:
await message.answer(
"Платеж успешно произведен", reply_markup=types.InlineKeyboardMarkup
(row_width=1, inline_keyboard=[[types.InlineKeyboardButton
(text="Обратно в меню", callback_data="back_to_menu")]]))
write_hash_to_table(cursor, user_hash, user_id)
conn.commit()
if isinstance(subscription_type, str):
print(isinstance(subscription_type, str))
# делаем запись в бд при покупки подписки. устанавливается "3" при условии отсутсвия активной подписки
number_of_streams_from_subscriptions(cursor, user_id)
conn.commit()
subscription_entry(cursor, user_id, price_usd)
conn.commit()
subscription_end_record(cursor, user_id)
conn.commit()
else:
# добавляем в столбец количество потоков
number_of_threads_from_threads(cursor, user_id, price_usd)
conn.commit()
elif result_2:
await message.answer(
"Платеж успешно произведен", reply_markup=types.InlineKeyboardMarkup
(row_width=1, inline_keyboard=[[types.InlineKeyboardButton
(text="Обратно в меню", callback_data="back_to_menu")]]))
write_hash_to_table(cursor, user_hash, user_id)
conn.commit()
if isinstance(subscription_type, str):
# делаем запись в бд при покупки подписки. устанавливается "3" при условии отсутсвия активной подписки
number_of_streams_from_subscriptions(cursor, user_id)
conn.commit()
subscription_entry(cursor, user_id, price_usd)
conn.commit()
subscription_end_record(cursor, user_id)
conn.commit()
else:
# добавляем в столбец количество потоков
number_of_threads_from_threads(cursor, user_id, price_usd)
conn.commit()
else:
await message.answer(
"Ошибка, проверьте правильность написания хэша и повторите попытку проверки статуса платежа",
reply_markup=types.InlineKeyboardMarkup
(row_width=1, inline_keyboard=[[types.InlineKeyboardButton
(text="Обратно в меню", callback_data="back_to_menu")]]))
await message.bot.unban_chat_member(-4226821992, user_id)
@router.callback_query(F.data == "back_to_menu")
async def handle_back_to_menu(callback_query: types.CallbackQuery):
keyboard = types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Купить подписку", callback_data="buy_subscription")],
[types.InlineKeyboardButton(text="FAQ блок", callback_data="faq_block"),
types.InlineKeyboardButton(text="Моя подписка", callback_data="my_subscription")],
[types.InlineKeyboardButton(text="Задать вопрос", callback_data="ask_question")],],)
# Отправляем сообщение с инлайн-клавиатурой
await callback_query.message.edit_text("Добро пожаловать! Выберите действие:", reply_markup=keyboard)
@router.callback_query(F.data == "faq_block")
async def handle_faq_block(callback_query: types.CallbackQuery):
# сообщение с информацией о FAQ
await callback_query.message.delete()
await callback_query.message.answer("Тут будет FAQ блок",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Обратно в меню",
callback_data="back_to_menu")]],),)
@router.callback_query(F.data == "my_subscription")
async def handle_faq_block(callback_query: types.CallbackQuery):
await callback_query.message.delete()
user_id = callback_query.from_user.id # выковыриваем айди пользователя
conn = create_connection()
cursor = conn.cursor()
user_data = get_user_data(cursor, user_id) # Получение данных о пользователе из базы данных или API
chat_id = '-4226821992' # Замените на ваш chat_id
expire_date = datetime.datetime.now() + timedelta(hours=1)
expire_date_timestamp = int(expire_date.timestamp())
link = await bot_chat.create_chat_invite_link(chat_id=chat_id, name=None, expire_date=expire_date_timestamp,
member_limit=1)
print(link.invite_link)
# Формирование текста сообщения
message_text = f"Приветствуем, {user_data[2]}\n"
message_text += f"Ваш уникальный ID: {user_id}\n"
message_text += f"Ваш ZennolabID: {user_data[3]}\n"
message_text += f"Кол-во потоков Bcoin: {user_data[8]}\n"
if user_data[9] == '0':
message_text += f"Увас нет активных подписок\n"
else:
message_text += f"Ваши активные подписки:\n- Подписка на {user_data[9]} мес. до {user_data[10]}\n"
if user_data[4] is not None and user_data[4] != 0:
message_text += f"Переходите по ссылке в нашу группу: {link.invite_link}\n"
await callback_query.message.answer(message_text,
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Обратно в меню",
callback_data="back_to_menu")]],),)
@router.callback_query(F.data == "ask_question")
async def handle_ask_question(callback_query: types.CallbackQuery, state: FSMContext):
await callback_query.message.delete()
user_id = callback_query.from_user.id
conn = create_connection()
cursor = conn.cursor()
state_user = status_question(cursor, user_id)[0]
if state_user == 1:
await callback_query.answer("Отправка вопроса запрещена. Дождитесь ответа на прошлый вопрос",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Обратно в меню",
callback_data="back_to_menu")]]))
else:
# ожидание вопроса от пользователя
await state.set_state(QuestionStates.waiting_for_question)
await callback_query.message.answer(
"🙌 Задавайте вопрос, в ближайшее время Вам ответят.",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Обратно в меню", callback_data="back_to_menu")]],),)
@router.message(QuestionStates.waiting_for_question)
async def handle_question(message: types.Message, state: FSMContext):
# Записываем вопрос и отправляем в группу
question = message.text
user_id = message.from_user.id
username = message.from_user.username or "No name"
conn = create_connection()
cursor = conn.cursor()
# Проверяем, существует ли пользователь в таблице
result = presence_user_bd(user_id)
if not int(result[6]) == 0:
# Если пользователь существует, просто обновляем информацию о вопросе
await message.answer(
"Спасибо, Ваш вопрос принят в работу!",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Купить подписку", callback_data="buy_subscription")],
[types.InlineKeyboardButton(text="FAQ блок", callback_data="faq_block"),
types.InlineKeyboardButton(text="Моя подписка", callback_data="my_subscription")],
[types.InlineKeyboardButton(text="Задать вопрос", callback_data="ask_question")],],))
await bot_chat.send_message(chat_id=-1002195305182, text=question, message_thread_id=result[6])
else:
await message.answer("Спасибо, Ваш вопрос принят в работу!",
reply_markup=types.InlineKeyboardMarkup(row_width=1, inline_keyboard=[
[types.InlineKeyboardButton(text="Купить подписку", callback_data="buy_subscription")],
[types.InlineKeyboardButton(text="FAQ блок", callback_data="faq_block"),
types.InlineKeyboardButton(text="Моя подписка", callback_data="my_subscription")],
[types.InlineKeyboardButton(text="Задать вопрос", callback_data="ask_question")],],))
topic = await bot_chat.create_forum_topic(chat_id=-1002195305182, name=f"Вопрос от {username}")
update_user_db(cursor, topic.message_thread_id, user_id)
conn.commit() # Подтверждаем изменения
await bot_chat.send_message(chat_id=-1002195305182, text=question, message_thread_id=topic.message_thread_id,)
installation_one_question(cursor, user_id)
conn.commit()
await state.clear()
@router.message(F.chat.type == "supergroup", F.text)
async def handle_answer(message: types.Message):
conn = create_connection()
cursor = conn.cursor()
search_user = user_search(cursor, message.message_thread_id)
await bot_chat.send_message(chat_id=search_user[1], text=f"Ответ на Ваш вопрос: {message.text}")
installation_zero_question(cursor, search_user[1])
conn.commit()