diff --git a/AstrakoBot/modules/helper_funcs/extraction.py b/AstrakoBot/modules/helper_funcs/extraction.py index d8b63fc199..0640b5acdd 100644 --- a/AstrakoBot/modules/helper_funcs/extraction.py +++ b/AstrakoBot/modules/helper_funcs/extraction.py @@ -12,6 +12,8 @@ def id_from_reply(message): return None, None user_id = prev_message.from_user.id res = message.text.split(None, 1) + if prev_message.sender_chat: + user_id = prev_message.sender_chat.id if len(res) < 2: return user_id, "" return user_id, res[1] diff --git a/AstrakoBot/modules/userinfo.py b/AstrakoBot/modules/userinfo.py index 147009b44b..b3709f75cf 100644 --- a/AstrakoBot/modules/userinfo.py +++ b/AstrakoBot/modules/userinfo.py @@ -3,6 +3,7 @@ import os import requests +from telegram.user import User from telethon.tl.functions.channels import GetFullChannelRequest from telethon.tl.types import ChannelParticipantsAdmins from telethon import events @@ -35,7 +36,6 @@ from AstrakoBot.modules.helper_funcs.misc import delete from AstrakoBot import telethn as AstrakoBotTelethonClient, SUDO_USERS, SUPPORT_USERS - def get_id(update: Update, context: CallbackContext): bot, args = context.bot, context.args message = update.effective_message @@ -131,11 +131,20 @@ def info(update: Update, context: CallbackContext): chat = update.effective_chat user_id = extract_user(update.effective_message, args) - if user_id: + if user_id and int(user_id) != 777000 and int(user_id) != 1087968824: + user = bot.get_chat(user_id) + + elif user_id and int(user_id) == 777000: + msg.reply_text( + "This is Telegram. Unless you manually entered this reserved account's ID, it is likely a old broadcast from a linked channel." + ) + return + + elif user_id: user = bot.get_chat(user_id) elif not message.reply_to_message and not args: - user = message.from_user + user = message.sender_chat or message.from_user elif not message.reply_to_message and ( not args @@ -157,128 +166,161 @@ def info(update: Update, context: CallbackContext): else: return + + rep = message.reply_text("Appraising...", parse_mode=ParseMode.HTML) + + if isinstance(user, User): + text = ( + f"User info:\n" + f"ID: {user.id}\n" + f"First Name: {mention_html(user.id, user.first_name or 'None')}" + ) - rep = message.reply_text("Appraising...", parse_mode=ParseMode.HTML) - - text = ( - f"User info:\n" - f"ID: {user.id}\n" - f"First Name: {html.escape(user.first_name)}" - ) - - if user.last_name: - text += f"\nLast Name: {html.escape(user.last_name)}" - - if user.username: - text += f"\nUsername: @{html.escape(user.username)}" + if user.last_name: + text += f"\nLast Name: {html.escape(user.last_name)}" - text += f"\nPermalink: {mention_html(user.id, 'link')}" + if user.username: + text += f"\nUsername: @{html.escape(user.username)}" - if chat.type != "private" and user_id != bot.id: - _stext = "\nPresence: {}" + text += f"\nPermalink: {mention_html(user.id, 'link')}" - afk_st = is_afk(user.id) - if afk_st: - text += _stext.format("AFK") - else: - status = status = bot.get_chat_member(chat.id, user.id).status - if status: - if status == "left": - text += _stext.format("Not here") - if status == "kicked": - text += _stext.format("Banned") - elif status == "member": - text += _stext.format("Detected") - elif status in {"administrator", "creator"}: - text += _stext.format("Admin") + if chat.type != "private" and user_id != bot.id: + _stext = "\nPresence: {}" - try: - spamwtc = sw.get_ban(int(user.id)) - if spamwtc: - text += "\n\nThis person is Spamwatched!" - text += f"\nReason:
{spamwtc.reason}
" - text += "\nAppeal at @SpamWatchSupport" - else: - pass - except: - pass # don't crash if api is down somehow... - - disaster_level_present = False - - if user.id == OWNER_ID: - text += "\n\nUser level: god" - disaster_level_present = True - elif user.id in DEV_USERS: - text += "\n\nUser level: developer" - disaster_level_present = True - elif user.id in SUDO_USERS: - text += "\n\nUser level: sudo" - disaster_level_present = True - elif user.id in SUPPORT_USERS: - text += "\n\nUser level: support" - disaster_level_present = True - elif user.id in WHITELIST_USERS: - text += "\n\nUser level: whitelist" - disaster_level_present = True - - # if disaster_level_present: - # text += ' [?]'.format( - # bot.username) + afk_st = is_afk(user.id) + if afk_st: + text += _stext.format("AFK") + else: + status = bot.get_chat_member(chat.id, user.id).status + if status: + if status == "left": + text += _stext.format("Not here") + if status == "kicked": + text += _stext.format("Banned") + elif status == "member": + text += _stext.format("Detected") + elif status in {"administrator", "creator"}: + text += _stext.format("Admin") - try: - user_member = chat.get_member(user.id) - if user_member.status == "administrator": - result = requests.post( - f"https://api.telegram.org/bot{TOKEN}/getChatMember?chat_id={chat.id}&user_id={user.id}" - ) - result = result.json()["result"] - if "custom_title" in result.keys(): - custom_title = result["custom_title"] - text += f"\n\nTitle:\n{custom_title}" - except BadRequest: - pass - - for mod in USER_INFO: try: - mod_info = mod.__user_info__(user.id).strip() - except TypeError: - mod_info = mod.__user_info__(user.id, chat.id).strip() - if mod_info: - text += "\n\n" + mod_info + spamwtc = sw.get_ban(int(user.id)) + if spamwtc: + text += "\n\nThis person is Spamwatched!" + text += f"\nReason:
{spamwtc.reason}
" + text += "\nAppeal at @SpamWatchSupport" + else: + pass + except: + pass # don't crash if api is down somehow... + + disaster_level_present = False + + if user.id == OWNER_ID: + text += "\n\nUser level: god" + disaster_level_present = True + elif user.id in DEV_USERS: + text += "\n\nUser level: developer" + disaster_level_present = True + elif user.id in SUDO_USERS: + text += "\n\nUser level: sudo" + disaster_level_present = True + elif user.id in SUPPORT_USERS: + text += "\n\nUser level: support" + disaster_level_present = True + elif user.id in WHITELIST_USERS: + text += "\n\nUser level: whitelist" + disaster_level_present = True + + # if disaster_level_present: + # text += ' [?]'.format( + # bot.username) - if INFOPIC: try: - profile = context.bot.get_user_profile_photos(user.id).photos[0][-1] - _file = bot.get_file(profile["file_id"]) - _file.download(f"{user.id}.png") + user_member = chat.get_member(user.id) + if user_member.status == "administrator": + result = requests.post( + f"https://api.telegram.org/bot{TOKEN}/getChatMember?chat_id={chat.id}&user_id={user.id}" + ) + result = result.json()["result"] + if "custom_title" in result.keys(): + custom_title = result["custom_title"] + text += f"\n\nTitle:\n{custom_title}" + except BadRequest: + pass - delmsg = message.reply_document( - document=open(f"{user.id}.png", "rb"), - caption=(text), - parse_mode=ParseMode.HTML, - ) + for mod in USER_INFO: + try: + mod_info = mod.__user_info__(user.id).strip() + except TypeError: + mod_info = mod.__user_info__(user.id, chat.id).strip() + if mod_info: + text += "\n\n" + mod_info + + if INFOPIC: + try: + profile = context.bot.get_user_profile_photos(user.id).photos[0][-1] + _file = bot.get_file(profile["file_id"]) + _file.download(f"{user.id}.png") + + delmsg = message.reply_document( + document=open(f"{user.id}.png", "rb"), + caption=(text), + parse_mode=ParseMode.HTML, + ) - os.remove(f"{user.id}.png") - # Incase user don't have profile pic, send normal text - except IndexError: + os.remove(f"{user.id}.png") + # Incase user don't have profile pic, send normal text + except IndexError: + delmsg = message.reply_text( + text, parse_mode=ParseMode.HTML, disable_web_page_preview=True + ) + + else: delmsg = message.reply_text( text, parse_mode=ParseMode.HTML, disable_web_page_preview=True ) else: - delmsg = message.reply_text( - text, parse_mode=ParseMode.HTML, disable_web_page_preview=True + text = ( + f"Chat Info:" + f"\nID:{user.id}" + f"\nTitle: {user.title}" ) + if user.username: + text += f"\nUsername: @{html.escape(user.username)}" + text += f"\nChat Type: {user.type.capitalize()}" + + if INFOPIC: + try: + profile = bot.getChat(user.id).photo + _file = bot.get_file(profile["big_file_id"]) + _file.download(f"{user.id}.png") + + delmsg = message.reply_document( + document=open(f"{user.id}.png", "rb"), + caption=(text), + parse_mode=ParseMode.HTML, + ) - rep.delete() - + os.remove(f"{user.id}.png") + # Incase chat don't have profile pic, send normal text + except: + delmsg = message.reply_text( + text, parse_mode=ParseMode.HTML, disable_web_page_preview=True + ) + else: + delmsg = message.reply_text( + text, parse_mode=ParseMode.HTML, disable_web_page_preview=True + ) + + rep.delete() + cleartime = get_clearcmd(chat.id, "info") - + if cleartime: context.dispatcher.run_async(delete, delmsg, cleartime.time) - def about_me(update: Update, context: CallbackContext): bot, args = context.bot, context.args message = update.effective_message