150600
This commit is contained in:
197
main.py
197
main.py
@@ -1,188 +1,31 @@
|
||||
import logging
|
||||
import sqlite3
|
||||
import asyncio
|
||||
from aiogram import Bot, Dispatcher, types
|
||||
from aiogram.contrib.middlewares.logging import LoggingMiddleware
|
||||
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton
|
||||
from aiogram.utils import executor
|
||||
from aiogram.dispatcher import FSMContext
|
||||
from aiogram.dispatcher.filters.state import State, StatesGroup
|
||||
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
|
||||
from dotenv import load_dotenv
|
||||
import os
|
||||
|
||||
from handlers import register_handlers
|
||||
from database import create_tables
|
||||
|
||||
# Загрузка переменных окружения из .env файла
|
||||
load_dotenv()
|
||||
|
||||
API_TOKEN = os.getenv('BOT_API_TOKEN')
|
||||
OPERATORS_GROUP_ID = int(os.getenv('OPERATORS_GROUP_ID'))
|
||||
ADMIN_GROUP_ID = int(os.getenv('ADMIN_GROUP_ID'))
|
||||
|
||||
# Устанавливаем уровень логов
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
# Подключаемся к базе данных SQLite
|
||||
conn = sqlite3.connect("answers.db")
|
||||
cursor = conn.cursor()
|
||||
|
||||
# Создание таблицы для хранения ответов
|
||||
cursor.execute("""
|
||||
CREATE TABLE IF NOT EXISTS answers (
|
||||
user_id INTEGER,
|
||||
question_id INTEGER,
|
||||
answer TEXT
|
||||
)
|
||||
""")
|
||||
conn.commit()
|
||||
|
||||
# Заменить на свой токен
|
||||
API_TOKEN = '7472030348:AAGI53nX-ON-WBmEhd_qBC6EnZsHOqp_2kE'
|
||||
GROUP_ID = '-1001961537659'
|
||||
|
||||
# Инициализация бота и диспетчера
|
||||
bot = Bot(token=API_TOKEN)
|
||||
dp = Dispatcher(bot)
|
||||
dp.middleware.setup(LoggingMiddleware())
|
||||
|
||||
# Клавиатура для подтверждения ответов
|
||||
confirm_keyboard = ReplyKeyboardMarkup(resize_keyboard=True).add(KeyboardButton('Подтвердить'))
|
||||
|
||||
# Словарь для хранения вопросов и ответов
|
||||
questions = {
|
||||
1: "Как вас зовут?",
|
||||
2: "Укажите номер телефона дл связи",
|
||||
3: "Укажите район, улицу дом",
|
||||
4: "Какая уборка нужна, влажная ли сухая?",
|
||||
5: "На какое время?",
|
||||
6: "Оплата наличными или картой?"
|
||||
}
|
||||
|
||||
# Обработчик команды /start
|
||||
@dp.message_handler(commands=['start'])
|
||||
async def start(message: types.Message):
|
||||
await message.answer("Привет! Я задам тебе 6 вопросов. Давай начнем.")
|
||||
await ask_question(message.chat.id, 1)
|
||||
|
||||
|
||||
# Функция для задания вопроса
|
||||
async def ask_question(user_id, question_id):
|
||||
#question_text = questions[question_id]
|
||||
#await bot.send_message(user_id, text=question_text, reply_markup=confirm_keyboard)
|
||||
if question_id == 4:
|
||||
keyboard = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[
|
||||
InlineKeyboardButton(text="Влажная", callback_data="wet_cleaning"),
|
||||
InlineKeyboardButton(text="Сухая", callback_data="dry_cleaning")
|
||||
]
|
||||
])
|
||||
question_text = questions[question_id]
|
||||
await bot.send_message(user_id, text=question_text, reply_markup=keyboard)
|
||||
elif question_id == 5:
|
||||
keyboard = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[
|
||||
InlineKeyboardButton(text="Утро", callback_data="morning_time"),
|
||||
InlineKeyboardButton(text="День", callback_data="day_time"),
|
||||
InlineKeyboardButton(text="Вечер", callback_data="evening_time")
|
||||
]
|
||||
])
|
||||
question_text = questions[question_id]
|
||||
await bot.send_message(user_id, text=question_text, reply_markup=keyboard)
|
||||
elif question_id == 6:
|
||||
keyboard = InlineKeyboardMarkup(inline_keyboard=[
|
||||
[
|
||||
InlineKeyboardButton(text="Наличные", callback_data="cash_payment"),
|
||||
InlineKeyboardButton(text="Карта", callback_data="card_payment")
|
||||
]
|
||||
])
|
||||
question_text = questions[question_id]
|
||||
await bot.send_message(user_id, text=question_text, reply_markup=keyboard)
|
||||
else:
|
||||
question_text = questions[question_id]
|
||||
await bot.send_message(user_id, text=question_text, reply_markup=confirm_keyboard)
|
||||
|
||||
|
||||
# Обработчик callback-кнопок
|
||||
@dp.callback_query_handler(lambda query: query.data in ['wet_cleaning', 'dry_cleaning', 'morning_time', 'day_time', 'evening_time', 'cash_payment', 'card_payment'])
|
||||
async def handle_callback_answer(query: types.CallbackQuery):
|
||||
answer = {
|
||||
'wet_cleaning': 'Влажная уборка',
|
||||
'dry_cleaning': 'Сухая уборка',
|
||||
'morning_time': 'Утро',
|
||||
'day_time': 'День',
|
||||
'evening_time': 'Вечер',
|
||||
'cash_payment': 'Наличные',
|
||||
'card_payment': 'Карта'
|
||||
}
|
||||
await save_answer(query.from_user.id, answer[query.data])
|
||||
await ask_question(query.from_user.id, query.message.message_id + 1)
|
||||
|
||||
# Функция для сохранения ответа в базе данных
|
||||
async def save_answer(user_id, answer):
|
||||
cursor.execute("INSERT INTO answers (user_id, question_id, answer) VALUES (?, ?, ?)", (user_id, cursor.rowcount + 1, answer))
|
||||
conn.commit()
|
||||
|
||||
# Обработчик ответов с текстовым полем
|
||||
@dp.message_handler(lambda message: message.text != 'Подтвердить')
|
||||
async def handle_text_answer(message: types.Message):
|
||||
user_id = message.chat.id
|
||||
cursor.execute("SELECT MAX(question_id) FROM answers WHERE user_id=?", (user_id,))
|
||||
prev_question_id = cursor.fetchone()[0]
|
||||
|
||||
if prev_question_id is None:
|
||||
question_id = 1
|
||||
else:
|
||||
question_id = prev_question_id + 1
|
||||
answer = message.text
|
||||
|
||||
cursor.execute("INSERT INTO answers (user_id, question_id, answer) VALUES (?, ?, ?)",
|
||||
(user_id, question_id, answer))
|
||||
conn.commit()
|
||||
|
||||
if question_id < 6:
|
||||
await ask_question(user_id, question_id + 1)
|
||||
else:
|
||||
await bot.send_message(user_id, "Ответы записаны. Подтверди перед отправкой.", reply_markup=confirm_keyboard)
|
||||
|
||||
|
||||
# Обработчик ответов с inline кнопкой
|
||||
@dp.callback_query_handler()
|
||||
async def handle_callback_answer(query: types.CallbackQuery):
|
||||
user_id = query.from_user.id
|
||||
answer = query.data
|
||||
|
||||
cursor.execute("SELECT MAX(question_id) FROM answers WHERE user_id=?", (user_id,))
|
||||
prev_question_id = cursor.fetchone()[0]
|
||||
|
||||
if prev_question_id is None:
|
||||
question_id = 1
|
||||
else:
|
||||
question_id = prev_question_id + 1
|
||||
|
||||
cursor.execute("INSERT INTO answers (user_id, question_id, answer) VALUES (?, ?, ?)",
|
||||
(user_id, question_id, answer))
|
||||
conn.commit()
|
||||
|
||||
if question_id < 6:
|
||||
await ask_question(user_id, question_id + 1)
|
||||
else:
|
||||
await bot.send_message(user_id, "Ответы записаны. Подтверди перед отправкой.", reply_markup=confirm_keyboard)
|
||||
# Функция для подтверждения ответов и отправки в группу
|
||||
@dp.message_handler(lambda message: message.text == 'Подтвердить')
|
||||
async def confirm_answers(message: types.Message):
|
||||
user_id = message.chat.id
|
||||
cursor.execute("SELECT * FROM answers WHERE user_id=?", (user_id,))
|
||||
answers = cursor.fetchall()
|
||||
|
||||
if answers:
|
||||
group_id = GROUP_ID # Заменить на ID вашей группы
|
||||
answer_text = '\n'.join([f"{questions[ans[1]]}: {ans[2]}" for ans in answers])
|
||||
|
||||
# Очищаем таблицу с ответами
|
||||
cursor.execute("DELETE FROM answers WHERE user_id=?", (user_id,))
|
||||
conn.commit()
|
||||
|
||||
# Отправляем ответы в группу с помощью реплая
|
||||
sent_message = await bot.send_message(group_id, answer_text)
|
||||
await bot.send_message(user_id,
|
||||
f"Ответы отправлены в группу. Можете посмотреть их [здесь](https://t.me/{sent_message.chat.username}/{sent_message.message_id})",
|
||||
parse_mode='Markdown')
|
||||
else:
|
||||
await bot.send_message(user_id, "Ответов нет")
|
||||
|
||||
|
||||
# Основное приложение
|
||||
if __name__ == '__main__':
|
||||
loop = asyncio.get_event_loop()
|
||||
try:
|
||||
loop.create_task(dp.start_polling())
|
||||
loop.run_forever()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
finally:
|
||||
conn.close()
|
||||
create_tables()
|
||||
register_handlers(dp, OPERATORS_GROUP_ID)
|
||||
executor.start_polling(dp, skip_updates=True)
|
||||
|
||||
Reference in New Issue
Block a user