Модерация релизов в телеграмм

ninxja_xr

Новичок
Автор темы
8
1
Приветствую смотрящих. В общем, у меня есть бот в телеграмм, в котором обычный пользователь заполняет анкету на выход своего релиза, после чего эта анкета отправляется на модерацию. Вместе с анкетой пользователя, к сообщению с анкетой прикрепляются кнопки "Одобрить" и "Отклонить" для модератора. Как мне сделать так, чтобы эти кнопки работали по принципу: Модератор нажимает на кнопку "Одобрить" и обычному пользователю отправляется сообщение о том, что его релиз был одобрен. Нажав кнопку "Отклонить", модератор должен будет указать причину, с которой он отклонил релиз пользователя, и после чего, бот отправил бы сообщение обычному пользователю, что его релиз был отклонён и прикреплял бы причину, которую ввёл модератор. Кто сможет помочь? Весь код готов буду прикрепить, если это необходимо
 

Dickson

Активный
211
59
оно?
1742518593206.png
1742518607369.png

код снизу

python:
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())