feat(auth): support interactive telegram in-chat login code submission

This commit is contained in:
mamad
2026-08-27 20:46:36 +03:30
parent 06e1d54f8f
commit 5819125010
3 changed files with 118 additions and 10 deletions
+55 -1
View File
@@ -33,10 +33,28 @@ class AdminBotService:
self.session_name = session_name or os.path.join(SESSION_DIR, "admin_bot.session")
os.makedirs(os.path.dirname(self.session_name), exist_ok=True)
self.client = TelegramClient(self.session_name, self.api_id, self.api_hash, proxy=get_telegram_proxy())
self.collector = None
def set_collector(self, collector):
self.collector = collector
def is_admin(self, user_id: int) -> bool:
return not self.admin_user_ids or user_id in self.admin_user_ids
async def notify_admins(self, text: str):
"""Broadcast message to review channel and all admin DMs."""
if self.review_channel_id:
try:
await self.client.send_message(self.review_channel_id, text, parse_mode="html")
except Exception as e:
logger.error(f"Failed to notify review channel: {e}")
for admin_id in self.admin_user_ids:
try:
await self.client.send_message(admin_id, text, parse_mode="html")
except Exception as e:
logger.debug(f"Could not send DM to admin {admin_id}: {e}")
async def start(self):
logger.info("Starting Admin Review Bot...")
await self.client.start(bot_token=self.bot_token)
@@ -44,6 +62,42 @@ class AdminBotService:
self._register_handlers()
def _register_handlers(self):
# --- Interactive Userbot Authentication Commands ---
@self.client.on(events.NewMessage(pattern=r"/code\s+(\S+)"))
async def cmd_code(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
if not self.collector:
await event.reply("Collector service not linked.")
return
code = event.pattern_match.group(1)
status_msg = await event.reply("⏳ Verifying code with Telegram...")
result = await self.collector.submit_code(code)
await status_msg.edit(result, parse_mode="html")
@self.client.on(events.NewMessage(pattern=r"/password\s+(.+)"))
async def cmd_password(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
if not self.collector:
await event.reply("Collector service not linked.")
return
pwd = event.pattern_match.group(1)
status_msg = await event.reply("⏳ Verifying 2FA password...")
result = await self.collector.submit_password(pwd)
await status_msg.edit(result, parse_mode="html")
@self.client.on(events.NewMessage(pattern="/request_code"))
async def cmd_request_code(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):
return
if not self.collector:
await event.reply("Collector service not linked.")
return
await event.reply("Requesting new login code...")
await self.collector.start(notify_fn=self.notify_admins)
# --- Review Keyboard Callbacks ---
@self.client.on(events.CallbackQuery)
async def on_callback(event: events.CallbackQuery.Event):
if not self.is_admin(event.sender_id):
@@ -83,7 +137,7 @@ class AdminBotService:
)
await event.answer("Post rejected.")
# --- Admin Commands ---
# --- Admin Configuration Commands ---
@self.client.on(events.NewMessage(pattern="/sources"))
async def cmd_sources(event: events.NewMessage.Event):
if not self.is_admin(event.sender_id):