def about_bio(bot: Bot, update: Update, args: List[str]): message = update.effective_message user_id = extract_user(message, args) if user_id: user = bot.get_chat(user_id) else: user = message.from_user info = sql.get_user_bio(user.id) if info: update.effective_message.reply_text( "*{}*:\n{}".format(user.first_name, escape_markdown(info)), parse_mode=ParseMode.MARKDOWN, ) elif message.reply_to_message: username = user.first_name update.effective_message.reply_text( f"{username} hasn't had a message set about themselves yet!" ) else: update.effective_message.reply_text( "You haven't had a bio set about yourself yet!" )
def approve(bot: Bot, update: Update, args: List[str]) -> str: message = update.effective_message chat_title = message.chat.title chat = update.effective_chat user_id = extract_user(message, args) if not user_id: message.reply_text( "I don't know who you're talking about, you're going to need to specify a user!" ) return "" member = chat.get_member(int(user_id)) if member.status == "administrator" or member.status == "creator": message.reply_text( f"User is already admin - locks, blocklists, and antiflood already don't apply to them." ) return if sql.is_approved(message.chat_id, user_id): message.reply_text( f"[{member.user['first_name']}](tg://user?id={member.user['id']}) is already approved in {chat_title}", parse_mode=ParseMode.MARKDOWN) return sql.approve(message.chat_id, user_id) message.reply_text( f"[{member.user['first_name']}](tg://user?id={member.user['id']}) has been approved in {chat_title}! They will now be ignored by automated admin actions like locks, blocklists, and antiflood.", parse_mode=ParseMode.MARKDOWN)
def warns(bot: Bot, update: Update, args: List[str]): message: Optional[Message] = update.effective_message chat: Optional[Chat] = update.effective_chat user_id = extract_user(message, args) or update.effective_user.id result = sql.get_warns(user_id, chat.id) if result and result[0] != 0: num_warns, reasons = result limit, soft_warn = sql.get_warn_setting(chat.id) if reasons: text = ( f"This user has {num_warns}/{limit} warns, for the following reasons:" ) for reason in reasons: text += f"\n - {reason}" msgs = split_message(text) for msg in msgs: update.effective_message.reply_text(msg) else: update.effective_message.reply_text( f"User has {num_warns}/{limit} warns, but no reasons for any of them." ) else: update.effective_message.reply_text("This user doesn't have any warns!")
def slap(bot: Bot, update: Update, args: List[str]): message = update.effective_message chat = update.effective_chat reply_text = ( message.reply_to_message.reply_text if message.reply_to_message else message.reply_text ) curr_user = html.escape(message.from_user.first_name) user_id = extract_user(message, args) if user_id == bot.id: temp = random.choice(fun_strings.SLAP_Jarvis_TEMPLATES) if isinstance(temp, list): if temp[2] == "tmute": if is_user_admin(chat, message.from_user.id): reply_text(temp[1]) return mutetime = int(time.time() + 60) bot.restrict_chat_member( chat.id, message.from_user.id, until_date=mutetime, can_send_messages=False, ) reply_text(temp[0]) else: reply_text(temp) return if user_id: slapped_user = bot.get_chat(user_id) user1 = curr_user user2 = html.escape(slapped_user.first_name) else: user1 = bot.first_name user2 = curr_user temp = random.choice(fun_strings.SLAP_TEMPLATES) item = random.choice(fun_strings.ITEMS) hit = random.choice(fun_strings.HIT) throw = random.choice(fun_strings.THROW) reply = temp.format(user1=user1, user2=user2, item=item, hits=hit, throws=throw) reply_text(reply, parse_mode=ParseMode.HTML)
def approval(bot: Bot, update: Update, args: List[str]) -> str: message = update.effective_message chat = update.effective_chat user_id = extract_user(message, args) member = chat.get_member(int(user_id)) if not user_id: message.reply_text( "I don't know who you're talking about, you're going to need to specify a user!" ) return "" if sql.is_approved(message.chat_id, user_id): message.reply_text( f"{member.user['first_name']} is an approved user. Locks, antiflood, and blocklists won't apply to them." ) else: message.reply_text( f"{member.user['first_name']} is not an approved user. They are affected by normal commands." )
def reset_warns(bot: Bot, update: Update, args: List[str]) -> str: message: Optional[Message] = update.effective_message chat: Optional[Chat] = update.effective_chat user: Optional[User] = update.effective_user user_id = extract_user(message, args) if user_id: sql.reset_warns(user_id, chat.id) message.reply_text("Warns have been reset!") warned = chat.get_member(user_id).user return ( f"<b>{html.escape(chat.title)}:</b>\n" f"#RESETWARNS\n" f"<b>Admin:</b> {mention_html(user.id, user.first_name)}\n" f"<b>User:</b> {mention_html(warned.id, warned.first_name)}" ) else: message.reply_text("No user has been designated!") return ""
def disapprove(bot: Bot, update: Update, args: List[str]) -> str: message = update.effective_message chat_title = message.chat.title chat = update.effective_chat user_id = extract_user(message, args) if not user_id: message.reply_text( "I don't know who you're talking about, you're going to need to specify a user!" ) return "" member = chat.get_member(int(user_id)) if member.status == "administrator" or member.status == "creator": message.reply_text("This user is an admin, they can't be unapproved.") return if not sql.is_approved(message.chat_id, user_id): message.reply_text(f"{member.user['first_name']} isn't approved yet!") return sql.disapprove(message.chat_id, user_id) message.reply_text( f"{member.user['first_name']} is no longer approved in {chat_title}.")
def get_id(bot: Bot, update: Update, args: List[str]): message = update.effective_message chat = update.effective_chat msg = update.effective_message user_id = extract_user(msg, args) if user_id: if msg.reply_to_message and msg.reply_to_message.forward_from: user1 = message.reply_to_message.from_user user2 = message.reply_to_message.forward_from msg.reply_text( f"The original sender, {html.escape(user2.first_name)}," f" has an ID of <code>{user2.id}</code>.\n" f"The forwarder, {html.escape(user1.first_name)}," f" has an ID of <code>{user1.id}</code>.", parse_mode=ParseMode.HTML, ) else: user = bot.get_chat(user_id) msg.reply_text( f"{html.escape(user.first_name)}'s id is <code>{user.id}</code>.", parse_mode=ParseMode.HTML, ) else: if chat.type == "private": msg.reply_text(f"Your id is <code>{chat.id}</code>.", parse_mode=ParseMode.HTML) else: msg.reply_text(f"This group's id is <code>{chat.id}</code>.", parse_mode=ParseMode.HTML)
def unbl_user(update: Update, context: CallbackContext) -> str: message = update.effective_message user = update.effective_user bot, args = context.bot, context.args user_id = extract_user(message, args) if not user_id: message.reply_text("I doubt that's a user.") return "" if user_id == bot.id: message.reply_text("I always notice myself.") return "" try: target_user = bot.get_chat(user_id) except BadRequest as excp: if excp.message == "User not found": message.reply_text("I can't seem to find this user.") return "" else: raise if sql.is_user_blacklisted(user_id): sql.unblacklist_user(user_id) message.reply_text("*notices user*") log_message = ( f"#UNBLACKLIST\n" f"<b>Admin:</b> {mention_html(user.id, html.escape(user.first_name))}\n" f"<b>User:</b> {mention_html(target_user.id, html.escape(target_user.first_name))}" ) return log_message else: message.reply_text("I am not ignoring them at all though!") return ""
def ungban(bot: Bot, update: Update, args: List[str]): message = update.effective_message user = update.effective_user chat = update.effective_chat log_message = "" user_id = extract_user(message, args) if not user_id: message.reply_text("You don't seem to be referring to a user.") return user_chat = bot.get_chat(user_id) if user_chat.type != "private": message.reply_text("That's not a user!") return if not sql.is_user_gbanned(user_id): message.reply_text("This user is not gbanned!") return message.reply_text( f"I'll give {user_chat.first_name} a second chance, globally.") start_time = time.time() datetime_fmt = "%H:%M - %d-%m-%Y" current_time = datetime.utcnow().strftime(datetime_fmt) if chat.type != "private": chat_origin = f"<b>{html.escape(chat.title)} ({chat.id})</b>\n" else: chat_origin = f"<b>{chat.id}</b>\n" log_message = ( f"#UNGBANNED\n" f"<b>Originated from:</b> {chat_origin}\n" f"<b>Admin:</b> {mention_html(user.id, user.first_name)}\n" f"<b>Unbanned User:</b> {mention_html(user_chat.id, user_chat.first_name)}\n" f"<b>Unbanned User ID:</b> {user_chat.id}\n" f"<b>Event Stamp:</b> {current_time}") if GBAN_LOGS: try: log = bot.send_message(GBAN_LOGS, log_message, parse_mode=ParseMode.HTML) except BadRequest as excp: log = bot.send_message( GBAN_LOGS, log_message + "\n\nFormatting has been disabled due to an unexpected error.", ) else: send_to_list(bot, SUDO_USERS + SUPPORT_USERS, log_message, html=True) chats = get_all_chats() ungbanned_chats = 0 for chat in chats: chat_id = chat.chat_id # Check if this group has disabled gbans if not sql.does_chat_gban(chat_id): continue try: member = bot.get_chat_member(chat_id, user_id) if member.status == "kicked": bot.unban_chat_member(chat_id, user_id) ungbanned_chats += 1 except BadRequest as excp: if excp.message in UNGBAN_ERRORS: pass else: message.reply_text(f"Could not un-gban due to: {excp.message}") if GBAN_LOGS: bot.send_message( GBAN_LOGS, f"Could not un-gban due to: {excp.message}", parse_mode=ParseMode.HTML, ) else: bot.send_message( OWNER_ID, f"Could not un-gban due to: {excp.message}") return except TelegramError: pass sql.ungban_user(user_id) if GBAN_LOGS: log.edit_text( log_message + f"\n<b>Chats affected:</b> {ungbanned_chats}", parse_mode=ParseMode.HTML, ) else: send_to_list(bot, SUDO_USERS + SUPPORT_USERS, "un-gban complete!") end_time = time.time() ungban_time = round((end_time - start_time), 2) if ungban_time > 60: ungban_time = round((ungban_time / 60), 2) message.reply_text( f"Person has been un-gbanned. Took {ungban_time} min") else: message.reply_text( f"Person has been un-gbanned. Took {ungban_time} sec")
def promote(update: Update, context: CallbackContext) -> str: bot = context.bot args = context.args message = update.effective_message chat = update.effective_chat user = update.effective_user promoter = chat.get_member(user.id) if not (promoter.can_promote_members or promoter.status == "creator") and not user.id in DRAGONS: message.reply_text("You don't have the necessary rights to do that!") return user_id = extract_user(message, args) if not user_id: message.reply_text( "You don't seem to be referring to a user or the ID specified is incorrect.." ) return try: user_member = chat.get_member(user_id) except: return if user_member.status == 'administrator' or user_member.status == 'creator': message.reply_text( "How am I meant to promote someone that's already an admin?") return if user_id == bot.id: message.reply_text( "I can't promote myself! Get an admin to do it for me.") return # set same perms as bot - bot can't assign higher perms than itself! bot_member = chat.get_member(bot.id) try: bot.promoteChatMember( chat.id, user_id, can_change_info=bot_member.can_change_info, can_post_messages=bot_member.can_post_messages, can_edit_messages=bot_member.can_edit_messages, can_delete_messages=bot_member.can_delete_messages, can_invite_users=bot_member.can_invite_users, # can_promote_members=bot_member.can_promote_members, can_restrict_members=bot_member.can_restrict_members, can_pin_messages=bot_member.can_pin_messages) except BadRequest as err: if err.message == "User_not_mutual_contact": message.reply_text( "I can't promote someone who isn't in the group.") else: message.reply_text("An error occured while promoting.") return bot.sendMessage( chat.id, f"Sucessfully promoted <b>{user_member.user.first_name or user_id}</b>!", parse_mode=ParseMode.HTML) log_message = ( f"<b>{html.escape(chat.title)}:</b>\n" f"#PROMOTED\n" f"<b>Admin:</b> {mention_html(user.id, user.first_name)}\n" f"<b>User:</b> {mention_html(user_member.user.id, user_member.user.first_name)}" ) return log_message
def demote(update: Update, context: CallbackContext) -> str: bot = context.bot args = context.args chat = update.effective_chat message = update.effective_message user = update.effective_user user_id = extract_user(message, args) if not user_id: message.reply_text( "You don't seem to be referring to a user or the ID specified is incorrect.." ) return try: user_member = chat.get_member(user_id) except: return if user_member.status == 'creator': message.reply_text( "This person CREATED the chat, how would I demote them?") return if not user_member.status == 'administrator': message.reply_text("Can't demote what wasn't promoted!") return if user_id == bot.id: message.reply_text( "I can't demote myself! Get an admin to do it for me.") return try: bot.promoteChatMember(chat.id, user_id, can_change_info=False, can_post_messages=False, can_edit_messages=False, can_delete_messages=False, can_invite_users=False, can_restrict_members=False, can_pin_messages=False, can_promote_members=False) bot.sendMessage( chat.id, f"Sucessfully demoted <b>{user_member.user.first_name or user_id}</b>!", parse_mode=ParseMode.HTML) log_message = ( f"<b>{html.escape(chat.title)}:</b>\n" f"#DEMOTED\n" f"<b>Admin:</b> {mention_html(user.id, user.first_name)}\n" f"<b>User:</b> {mention_html(user_member.user.id, user_member.user.first_name)}" ) return log_message except BadRequest: message.reply_text( "Could not demote. I might not be admin, or the admin status was appointed by another" " user, so I can't act upon them!") return
def info(bot: Bot, update: Update, args: List[str]): message = update.effective_message chat = update.effective_chat user_id = extract_user(update.effective_message, args) if user_id: user = bot.get_chat(user_id) elif not message.reply_to_message and not args: user = message.from_user elif not message.reply_to_message and ( not args or (len(args) >= 1 and not args[0].startswith("@") and not args[0].isdigit() and not message.parse_entities([MessageEntity.TEXT_MENTION]))): message.reply_text("I can't extract a user from this.") return else: return text = (f"<b>Characteristics:</b>\n" f"ID: <code>{user.id}</code>\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)}" text += f"\nPermanent user link: {mention_html(user.id, 'link')}" Nation_level_present = False num_chats = sql.get_user_num_chats(user.id) text += f"\nChat count: <code>{num_chats}</code>" 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"\nThis user holds the title <b>{custom_title}</b> here." except BadRequest: pass if user.id == OWNER_ID: text += f'\nThis person is my owner' Nation_level_present = True elif user.id in DEV_USERS: text += f'\nThis Person is a part of Jarvis Support' Nation_level_present = True elif user.id in SUDO_USERS: text += f'\nThe Nation level of this person is Royal' Nation_level_present = True elif user.id in SUPPORT_USERS: text += f'\nThe Nation level of this person is Sakura' Nation_level_present = True elif user.id in TECHY_USERS: text += f'\nThe Nation level of this person is Sardegna' Nation_level_present = True elif user.id in WHITELIST_USERS: text += f'\nThe Nation level of this person is Neptunia' Nation_level_present = True if Nation_level_present: text += ' [<a href="https://t.me/{}?start=nations">?</a>]'.format( bot.username) text += "\n" for mod in USER_INFO: if mod.__mod_name__ == "Users": continue try: mod_info = mod.__user_info__(user.id) except TypeError: mod_info = mod.__user_info__(user.id, chat.id) if mod_info: text += "\n" + mod_info if INFOPIC: try: profile = bot.get_user_profile_photos(user.id).photos[0][-1] _file = bot.get_file(profile["file_id"]) _file.download(f"{user.id}.png") message.reply_document(document=open(f"{user.id}.png", "rb"), caption=(text), parse_mode=ParseMode.HTML, disable_web_page_preview=True) os.remove(f"{user.id}.png") # Incase user don't have profile pic, send normal text except IndexError: message.reply_text(text, parse_mode=ParseMode.HTML, disable_web_page_preview=True) else: message.reply_text(text, parse_mode=ParseMode.HTML, disable_web_page_preview=True)
def promote(bot: Bot, update: Update, args: List[str]) -> str: message = update.effective_message chat = update.effective_chat user = update.effective_user log_message = "" user_id = extract_user(message, args) if not user_id: message.reply_text("You don't seem to be referring to a user.") return log_message try: user_member = chat.get_member(user_id) except: return log_message if user_member.status == "administrator" or user_member.status == "creator": message.reply_text( "How am I meant to promote someone that's already an admin?") return log_message if user_id == bot.id: message.reply_text( "I can't promote myself! Get an admin to do it for me.") return log_message # set same perms as bot - bot can't assign higher perms than itself! bot_member = chat.get_member(bot.id) try: bot.promoteChatMember( chat.id, user_id, can_change_info=bot_member.can_change_info, can_post_messages=bot_member.can_post_messages, can_edit_messages=bot_member.can_edit_messages, can_delete_messages=bot_member.can_delete_messages, can_invite_users=bot_member.can_invite_users, # can_promote_members=bot_member.can_promote_members, can_restrict_members=bot_member.can_restrict_members, can_pin_messages=bot_member.can_pin_messages, ) except BadRequest as err: if err.message == "User_not_mutual_contact": message.reply_text( "I can't promote someone who isn't in the group.") return log_message else: message.reply_text("An error occured while promoting.") return log_message bot.sendMessage( chat.id, f"Sucessfully promoted <b>{user_member.user.first_name or user_id}</b>!", parse_mode=ParseMode.HTML, ) log_message += ( f"<b>{html.escape(chat.title)}:</b>\n" "#PROMOTED\n" f"<b>Admin:</b> {mention_html(user.id, user.first_name)}\n" f"<b>User:</b> {mention_html(user_member.user.id, user_member.user.first_name)}" ) return log_message