101 lines
3.6 KiB
Python
101 lines
3.6 KiB
Python
from aiogram import Router, F, Bot
|
|
from aiogram.filters import CommandStart
|
|
from aiogram.types import Message, BufferedInputFile
|
|
from aiogram.fsm.context import FSMContext
|
|
from aiogram.fsm.state import State, StatesGroup
|
|
|
|
from bot.config import settings
|
|
from bot.utils.captcha import generate_captcha
|
|
from bot.utils.db import db
|
|
from bot.utils.i18n import _
|
|
|
|
router = Router()
|
|
|
|
class CaptchaStates(StatesGroup):
|
|
waiting_for_captcha = State()
|
|
|
|
@router.message(CommandStart())
|
|
async def cmd_start(message: Message, locale: str):
|
|
db.log_user(message.from_user)
|
|
await message.answer(_("welcome", locale=locale))
|
|
|
|
@router.message(CaptchaStates.waiting_for_captcha)
|
|
async def process_captcha(message: Message, state: FSMContext, bot: Bot, locale: str):
|
|
data = await state.get_data()
|
|
correct_captcha = data.get("captcha_text")
|
|
original_msg_id = data.get("original_msg_id")
|
|
|
|
if message.text and message.text.upper() == correct_captcha:
|
|
await state.clear()
|
|
|
|
try:
|
|
db_msg_id = data.get("db_msg_id", "N/A")
|
|
prefix = f"Forwarding, ID [{db_msg_id}]:"
|
|
target_chat_id = settings.group_chat_id
|
|
|
|
if data.get('has_media'):
|
|
new_caption = prefix
|
|
if data.get('original_caption'):
|
|
new_caption += f"\n{data.get('original_caption')}"
|
|
|
|
await bot.copy_message(
|
|
chat_id=target_chat_id,
|
|
from_chat_id=message.chat.id,
|
|
message_id=original_msg_id,
|
|
caption=new_caption
|
|
)
|
|
elif data.get('is_text'):
|
|
await bot.send_message(
|
|
chat_id=target_chat_id,
|
|
text=f"{prefix}\n{data.get('original_text')}"
|
|
)
|
|
else:
|
|
# Other types (stickers, etc.)
|
|
await bot.copy_message(
|
|
chat_id=target_chat_id,
|
|
from_chat_id=message.chat.id,
|
|
message_id=original_msg_id
|
|
)
|
|
await bot.send_message(chat_id=target_chat_id, text=prefix)
|
|
|
|
await message.answer(_("captcha_solved", locale=locale))
|
|
|
|
except Exception as e:
|
|
await message.answer(_("captcha_error", locale=locale))
|
|
print(f"Error forwarding: {e}")
|
|
else:
|
|
# Generate new captcha
|
|
captcha_text, captcha_img = generate_captcha()
|
|
await state.update_data(captcha_text=captcha_text)
|
|
await message.answer_photo(
|
|
BufferedInputFile(captcha_img, filename="captcha.png"),
|
|
caption=_("incorrect_captcha", locale=locale)
|
|
)
|
|
|
|
@router.message(F.chat.type == "private")
|
|
async def handle_any_message(message: Message, state: FSMContext, locale: str):
|
|
# Log everything
|
|
db_msg_id = db.log_message(message)
|
|
|
|
# Generate captcha
|
|
captcha_text, captcha_img = generate_captcha()
|
|
|
|
has_media = bool(message.photo or message.video or message.document or message.audio or message.voice)
|
|
is_text = bool(message.text)
|
|
|
|
await state.set_state(CaptchaStates.waiting_for_captcha)
|
|
await state.update_data(
|
|
captcha_text=captcha_text,
|
|
db_msg_id=db_msg_id,
|
|
original_msg_id=message.message_id,
|
|
original_text=message.text,
|
|
original_caption=message.caption,
|
|
has_media=has_media,
|
|
is_text=is_text
|
|
)
|
|
|
|
await message.answer_photo(
|
|
BufferedInputFile(captcha_img, filename="captcha.png"),
|
|
caption=_("solve_captcha", locale=locale)
|
|
)
|