import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.orm import declarative_base, sessionmaker
from datetime import datetime
BOT_TOKEN = 'token'
MODERATOR_ID = id
bot = Bot(token=BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(storage=storage)
engine = create_engine('sqlite:///test.db')
Base = declarative_base()
Session = sessionmaker(bind=engine)
class ReleaseRegistration(Base):
__tablename__ = 'releases'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, nullable=False)
full_name = Column(String, nullable=False)
contact = Column(String, nullable=False)
status = Column(String, default='pending')
rejection_reason = Column(String)
created_at = Column(DateTime, default=datetime.utcnow)
Base.metadata.create_all(engine)
class Form(StatesGroup):
full_name = State()
contact = State()
waiting_for_rejection_reason = State()
@dp.message(Command("start"))
async def cmd_start(message: types.Message, state: FSMContext):
await message.answer("Здравствуйте! Давайте зарегистрируем вас. Введите своё ФИО:")
await state.set_state(Form.full_name)
@dp.message(Form.full_name)
async def process_full_name(message: types.Message, state: FSMContext):
await state.update_data(full_name=message.text)
await message.answer("Введи контакт (телефон или email):")
await state.set_state(Form.contact)
@dp.message(Form.contact)
async def process_contact(message: types.Message, state: FSMContext):
user_data = await state.get_data()
user_id = message.from_user.id
session = Session()
registration = ReleaseRegistration(
user_id=user_id,
full_name=user_data['full_name'],
contact=message.text
)
session.add(registration)
session.commit()
# Отправка анкеты модератору с кнопками
registration_text = (
f"Заявка на регистрацию:\n"
f"ФИО: {user_data['full_name']}\n"
f"Контакт: {message.text}"
)
keyboard = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text="Одобрить", callback_data=f"approve_{registration.id}")],
[InlineKeyboardButton(text="Отклонить", callback_data=f"reject_{registration.id}")]
])
await bot.send_message(MODERATOR_ID, registration_text, reply_markup=keyboard)
await message.answer("Заявка отправлена на модерацию!")
await state.clear()
session.close()
@dp.callback_query(lambda c: c.data.startswith("approve_"))
async def process_approve(callback: types.CallbackQuery):
registration_id = int(callback.data.split("_")[1])
session = Session()
registration = session.query(ReleaseRegistration).filter_by(id=registration_id).first()
if registration and registration.status == 'pending':
registration.status = 'approved'
session.commit()
# Уведомление пользователю об одобрении
await bot.send_message(
registration.user_id,
f"Ваша заявка на регистрацию одобрена! Скоро свяжемся с вами через {registration.contact}"
)
await callback.message.edit_text(f"{callback.message.text}\n\nСтатус: Одобрено", reply_markup=None)
session.close()
await callback.answer()
@dp.callback_query(lambda c: c.data.startswith("reject_"))
async def process_reject(callback: types.CallbackQuery, state: FSMContext):
registration_id = int(callback.data.split("_")[1])
session = Session()
registration = session.query(ReleaseRegistration).filter_by(id=registration_id).first()
if registration and registration.status == 'pending':
await state.update_data(registration_id=registration_id)
await state.set_state(Form.waiting_for_rejection_reason)
await callback.message.edit_text(f"{callback.message.text}\n\nВведи причину отклонения:")
session.close()
await callback.answer()
@dp.message(Form.waiting_for_rejection_reason)
async def process_rejection_reason(message: types.Message, state: FSMContext):
data = await state.get_data()
registration_id = data.get("registration_id")
reason = message.text
session = Session()
registration = session.query(ReleaseRegistration).filter_by(id=registration_id).first()
if registration and registration.status == 'pending':
registration.status = 'rejected'
registration.rejection_reason = reason
session.commit()
# Уведомление пользователю об отклонении
await bot.send_message(
registration.user_id,
f"Твой релиз отклонён.\nПричина: {reason}"
)
await message.answer(
f"Заявка:\nФИО: {registration.full_name}\nКонтакт: {registration.contact}\n\nСтатус: Отклонено\nПричина: {reason}"
)
session.close()
await state.clear()
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())