44 lines
1.4 KiB
Python
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
|