import os
from asyncio import sleep
from datetime import datetime
from traceback import format_exc
from pyrogram import enums
from pyrogram.errors import EntityBoundsInvalid, MediaCaptionTooLong, RPCError
from pyrogram.raw.functions.channels import GetFullChannel
from pyrogram.raw.functions.users import GetFullUser
from pyrogram.raw.types import Channel, UserFull, users
from pyrogram.types import Message
from Powers import BDB_URI, LOGGER, OWNER_ID
from Powers.bot_class import Gojo
from Powers.database.antispam_db import GBan
from Powers.database.approve_db import Approve
from Powers.supports import get_support_staff
from Powers.utils.custom_filters import command
from Powers.utils.extract_user import extract_user
gban_db = GBan()
if BDB_URI:
from Powers.plugins import bday_info
async def count(c: Gojo, chat):
try:
administrator = []
async for admin in c.get_chat_members(
chat_id=chat, filter=enums.ChatMembersFilter.ADMINISTRATORS
):
administrator.append(admin)
total_admin = administrator
bot = []
async for tbot in c.get_chat_members(
chat_id=chat, filter=enums.ChatMembersFilter.BOTS
):
bot.append(tbot)
total_bot = bot
bot_admin = 0
ban = []
async for banned in c.get_chat_members(
chat, filter=enums.ChatMembersFilter.BANNED
):
ban.append(banned)
total_banned = ban
for x in total_admin:
for y in total_bot:
if x == y:
bot_admin += 1
total_admin = len(total_admin)
total_bot = len(total_bot)
total_banned = len(total_banned)
return total_bot, total_admin, bot_admin, total_banned
except Exception as e:
total_bot = total_admin = bot_admin = total_banned = "`Can't fetch because I am not part of the chat.`"
return total_bot, total_admin, bot_admin, total_banned
async def user_info(c: Gojo, user, already=False):
user_all: users.UserFull = await c.invoke(
GetFullUser(
id=await c.resolve_peer(user)
)
)
user = await c.get_users(user)
full_user: UserFull = user_all.full_user
channel: Channel = user_all.chats
if user.is_deleted:
return "Deleted account", None
gbanned, reason_gban = gban_db.get_gban(user.id)
if gbanned:
gban = True
reason = reason_gban
else:
gban = False
reason = "User is not gbanned"
user_id = user.id
about = full_user.about
SUPPORT_STAFF = get_support_staff()
username = user.username
full_name = user.full_name
dc_id = user.dc_id
is_verified = user.is_verified
mention = user.mention
dob = False
if dob := full_user.birthday:
dob = datetime(int(dob.year), int(dob.month), int(dob.day)).strftime("%d %B %Y")
else:
if BDB_URI:
try:
if result := bday_info.find_one({"user_id": user}):
u_dob = datetime.strptime(result["dob"], "%d/%m/%Y")
day = u_dob.day
formatted = u_dob.strftime("%B %Y")
suffix = {1: 'st', 2: 'nd', 3: 'rd'}.get(day % 10, 'th')
dob = f"{day}{suffix} {formatted}"
except:
pass
is_restricted = user.is_restricted
photo_id = user.photo.big_file_id if user.photo else None
is_support = user_id in SUPPORT_STAFF
if user_id == c.me.id:
is_support = "A person is a great support to himself"
omp = "Hmmm.......Who is that again?"
if is_support or c.me.id:
if user_id in get_support_staff("dev"):
omp = "Dev"
elif user_id in get_support_staff("sudo"):
omp = "Sudoer"
elif user_id in get_support_staff("whitelist"):
omp = "Whitelist"
elif user_id == c.me.id:
omp = "I am the targeted user"
elif user_id == OWNER_ID:
omp = "Owner of the bot"
if user_id in get_support_staff("dev") and user_id == OWNER_ID:
omp = "Dev and Owner"
is_scam = user.is_scam
is_bot = user.is_bot
is_fake = user.is_fake
status = user.status
last_date = "Unable to fetch"
if is_bot is True:
last_date = "Targeted user is a bot"
if status == enums.UserStatus.RECENTLY:
last_date = "User was seen recently"
if status == enums.UserStatus.LAST_WEEK:
last_date = "User was seen last week"
if status == enums.UserStatus.LAST_MONTH:
last_date = "User was seen last month"
if status == enums.UserStatus.LONG_AGO:
last_date = "User was seen long ago or may be I am blocked by the user :("
if status == enums.UserStatus.ONLINE:
last_date = "User is online"
if status == enums.UserStatus.OFFLINE:
try:
last_date = datetime.fromtimestamp(user.status.date).strftime("%Y-%m-%d %H:%M:%S")
except Exception:
last_date = "User is offline"
caption = f"""
⚡️ Extracted User info From Telegram ⚡️
🆔 User ID: {user_id}
🫵 Mention: {mention}
🗣 Full Name: {full_name}
🔍 Username: {("@" + username) if username else "NA"}
✍️ Bio: `{about}`\n"""
if dob:
caption += f"🎂 Birthday: {dob}\n🧑💻 Support: {is_support}\n"
else:
caption += f"🧑💻 Support: {is_support}\n"
if is_support:
caption += f"🥷 Support user type: {omp}
\n💣 Gbanned: {gban}\n"
else:
caption += f"💣 Gbanned: {gban}\n"
if gban:
caption += f"☠️ Gban reason: {reason}
"
caption += f"""🌐 DC ID: {dc_id}
✋ RESTRICTED: {is_restricted}
✅ VERIFIED: {is_verified}
❌ FAKE : {is_fake}
⚠️ SCAM : {is_scam}
🤖 BOT: {is_bot}
👀 Last seen: {last_date}
"""
return caption, photo_id
async def chat_info(c: Gojo, chat, already=False):
u_name = False
if not already:
try:
chat = await c.get_chat(chat)
try:
chat_r = (await c.resolve_peer(chat.id))
ll = await c.invoke(
GetFullChannel(
channel=chat_r
)
)
u_name = ll.chats[0].usernames
except Exception:
pass
except Exception:
try:
chat_r = await c.resolve_peer(chat)
chat = await c.get_chat(chat_r.channel_id)
try:
ll = await c.invoke(
GetFullChannel(
channel=chat_r
)
)
u_name = ll.chats[0].usernames
except Exception:
pass
except KeyError as e:
caption = f"Failed to find the chat due to\n{e}"
return caption, None
chat_id = chat.id
username = " ".join([f"@{i}" for i in u_name]) if u_name else chat.username
total_bot, total_admin, total_bot_admin, total_banned = await count(c, chat.id)
title = chat.title
type_ = str(chat.type).split(".")[1]
is_scam = chat.is_scam
is_fake = chat.is_fake
description = chat.description
members = chat.members_count
is_restricted = chat.is_restricted
dc_id = chat.dc_id
photo_id = chat.photo.big_file_id if chat.photo else None
can_save = chat.has_protected_content
linked_chat = chat.linked_chat
caption = f"""
🔰 CHAT INFO 🔰
🆔 ID: {chat_id}
🚀 Chat Title: {title}
✨ Chat Type: {type_}
🌐 DataCentre ID: {dc_id}
🔍 Username: {f"@{username}" if username else "NA"}
⚜️ Administrators: {total_admin}
🤖 Bots: {total_bot}
🚫 Banned: {total_banned}
⚜️ Admin 🤖 Bots: {total_bot_admin}
⁉️ Scam: {is_scam}
❌ Fake: {is_fake}
✋ Restricted: {is_restricted}
👨🏿💻 Description: {description}
👪 Total members: {members}
🚫 Has Protected Content: {can_save}
🔗 Linked Chat: {linked_chat.id if linked_chat else "Not Linked"}
"""
return caption, photo_id
@Gojo.on_message(command(["info", "whois"]))
async def info_func(c: Gojo, message: Message):
if message.reply_to_message and message.reply_to_message.sender_chat:
await message.reply_text("This is not a user, but rather a channel. Use `/chinfo` to fetch its information.")
return
try:
user, _, user_name = await extract_user(c, message)
except Exception as e:
await message.reply_text(f"Got Some errors failed to fetch user info\n{e}")
LOGGER.error(e)
LOGGER.error(format_exc())
return
m = await message.reply_text(
f"Fetching {f'@{user_name}' if user_name else 'user'} info from telegram's database..."
)
try:
info_caption, photo_id = await user_info(c, user)
except Exception as e:
LOGGER.error(e)
LOGGER.error(format_exc())
return await m.edit(str(e))
status = False
if m.from_user and (m.chat.id != m.from_user.id):
try:
if status:= await m.chat.get_member(user):
status = str(status.status.value).capitalize()
except:
pass
if not status or status == "Member":
approved_users = Approve(m.chat.id).check_approve(user)
if Approve(m.chat.id).check_approve(user):
status = "Member, Approved"
if status:
info_caption += f"👥 Status : {status}"
if not photo_id:
await m.delete()
await sleep(2)
return await message.reply_text(info_caption, disable_web_page_preview=True)
photo = await c.download_media(photo_id)
await m.delete()
await sleep(2)
try:
await message.reply_photo(photo, caption=info_caption, quote=False)
except MediaCaptionTooLong:
x = await message.reply_photo(photo)
try:
await x.reply_text(info_caption)
except EntityBoundsInvalid:
await x.delete()
await message.reply_text(info_caption)
except RPCError as rpc:
await message.reply_text(rpc)
LOGGER.error(rpc)
LOGGER.error(format_exc())
except Exception as e:
if e == "User not found ! Error: 'InputPeerChannel' object has no attribute 'user_id'":
await m.reply_text(
"Looks like you are trying to fetch info of a chat not an user. In that case please use /chinfo")
return
await message.reply_text(text=e)
LOGGER.error(e)
LOGGER.error(format_exc())
os.remove(photo)
return
@Gojo.on_message(command(["chinfo", "chatinfo", "chat_info"]))
async def chat_info_func(c: Gojo, message: Message):
splited = message.text.split()
if len(splited) == 1:
if message.reply_to_message and message.reply_to_message.sender_chat:
chat = message.reply_to_message.sender_chat.id
else:
chat = message.chat.id
else:
chat = splited[1]
try:
chat = int(chat)
except Exception as ef:
if "invalid literal for int() with base 10:" not in str(ef):
return await message.reply_text(
f"Got and exception {ef}\n**Usage:**/chinfo [USERNAME|ID]"
)
chat = str(chat)
if chat.startswith("https://"):
chat = '@' + chat.split("/")[-1]
m = await message.reply_text(
"Fetching chat info of chat from telegram's database....."
)
try:
info_caption, photo_id = await chat_info(c, chat=chat)
if info_caption.startswith("Failed to find the chat due"):
await message.reply_text(info_caption)
return
except Exception as e:
await m.delete()
await sleep(0.5)
return await message.reply_text(f"**GOT AN ERROR:**\n {e}")
if not photo_id:
await m.delete()
await sleep(2)
return await message.reply_text(info_caption, disable_web_page_preview=True)
photo = await c.download_media(photo_id)
await m.delete()
await sleep(2)
try:
await message.reply_photo(photo, caption=info_caption, quote=False)
except MediaCaptionTooLong:
x = await message.reply_photo(photo)
try:
await x.reply_text(info_caption)
except EntityBoundsInvalid:
await x.delete()
await message.reply_text(info_caption)
except RPCError as rpc:
await message.reply_text(rpc)
LOGGER.error(rpc)
LOGGER.error(format_exc())
except Exception as e:
await message.reply_text(text=e)
LOGGER.error(e)
LOGGER.error(format_exc())
os.remove(photo)
return
__PLUGIN__ = "info"
__alt_name__ = [
"info",
"chinfo",
]
__HELP__ = """
**Information**
• /info - To get info about the user
• /chinfo - To get info about the chat
"""