Files
tg_post_min/app/bot/handlers/utils.py
2025-08-20 21:10:31 +09:00

44 lines
1.4 KiB
Python

import re
from typing import Tuple, Optional, Any
from telegram.constants import ChatType
from telegram.error import Forbidden, BadRequest
async def verify_and_fetch_chat(ctx, raw: str | int):
"""Return (chat, member, can_post) for the bot in that chat."""
bot = ctx.bot
# Normalize t.me links to @username
if isinstance(raw, str) and "t.me/" in raw:
raw = raw.strip().split("t.me/")[-1]
raw = raw.strip().lstrip("/")
if raw and not raw.startswith("@"):
raw = "@" + raw
chat = await bot.get_chat(raw)
try:
member = await bot.get_chat_member(chat.id, bot.id)
except Forbidden:
return chat, None, False
except BadRequest as e:
raise e
can_post = False
if chat.type == ChatType.CHANNEL:
status = getattr(member, "status", "")
if status in ("administrator", "creator"):
flag = getattr(member, "can_post_messages", None)
can_post = True if (flag is None or flag is True) else False
elif chat.type in (ChatType.SUPERGROUP, ChatType.GROUP):
status = getattr(member, "status", "")
can_post = status in ("member", "administrator", "creator")
return chat, member, can_post
def parse_chat_id(text: str) -> int | None:
m = re.search(r'(-?\d{5,})', text or "")
if m:
try:
return int(m.group(1))
except ValueError:
return None
return None