def ban(bot: Bot, update: Update, args: List[str]) -> str: chat = update.effective_chat # type: Optional[Chat] user = update.effective_user # type: Optional[User] message = update.effective_message # type: Optional[Message] user_id, reason = extract_user_and_text(message, args) if not user_id: message.reply_text( tld(chat.id, "You don't seem to be referring to a user.")) return "" try: member = chat.get_member(user_id) except BadRequest as excp: if excp.message == "User not found": message.reply_text(tld(chat.id, "I can't seem to find this user")) return "" else: raise if is_user_ban_protected(chat, user_id, member): message.reply_text(tld(chat.id, "I really wish I could ban admins...")) return "" if user_id == bot.id: update.effective_message.reply_text( tld(chat.id, "I'm not gonna BAN myself, are you crazy?")) return "" log = "<b>{}:</b>" \ "\n#BANNED" \ "\n<b>Admin:</b> {}" \ "\n<b>User:</b> {}".format(html.escape(chat.title), mention_html(user.id, user.first_name), mention_html(member.user.id, member.user.first_name)) if reason: log += "\n<b>Reason:</b> {}".format(reason) try: update.effective_chat.kick_member(user_id) bot.send_sticker(update.effective_chat.id, BAN_STICKER) # banhammer marie sticker message.reply_text(tld(chat.id, "Banned!")) return log except BadRequest as excp: if excp.message == "Reply message not found": # Do not reply message.reply_text('Banned!', quote=False) return log else: LOGGER.warning(update) LOGGER.exception("ERROR banning user %s in chat %s (%s) due to %s", user_id, chat.title, chat.id, excp.message) message.reply_text( tld(chat.id, "Well damn, I can't ban that user.")) return ""
def kick(bot: Bot, update: Update, args: List[str]) -> str: chat = update.effective_chat # type: Optional[Chat] user = update.effective_user # type: Optional[User] message = update.effective_message # type: Optional[Message] user_id, reason = extract_user_and_text(message, args) if not user_id: return "" try: member = chat.get_member(user_id) except BadRequest as excp: if excp.message == "User not found": message.reply_text(tld(chat.id, "I can't seem to find this user")) return "" else: raise if is_user_ban_protected(chat, user_id): message.reply_text(tld(chat.id, "I really wish I could kick admins...")) return "" if user_id == bot.id: update.effective_message.reply_text( tld(chat.id, "Yeahhh I'm not gonna do that")) return "" res = update.effective_chat.unban_member( user_id) # unban on current user = kick if res: bot.send_sticker(update.effective_chat.id, BAN_STICKER) # banhammer marie sticker message.reply_text(tld(chat.id, "Kicked!")) log = "<b>{}:</b>" \ "\n#KICKED" \ "\n<b>Admin:</b> {}" \ "\n<b>User:</b> {}".format(html.escape(chat.title), mention_html(user.id, user.first_name), mention_html(member.user.id, member.user.first_name)) if reason: log += "\n<b>Reason:</b> {}".format(reason) return log else: message.reply_text(tld(chat.id, "Well damn, I can't kick that user.")) return ""
def warn_user(bot: Bot, update: Update, args: List[str]) -> str: message = update.effective_message # type: Optional[Message] chat = update.effective_chat # type: Optional[Chat] warner = update.effective_user # type: Optional[User] user_id, reason = extract_user_and_text(message, args) if user_id: if message.reply_to_message and message.reply_to_message.from_user.id == user_id: return warn(message.reply_to_message.from_user, chat, reason, message.reply_to_message, warner) else: return warn(chat.get_member(user_id).user, chat, reason, message, warner) else: message.reply_text(tld(chat.id, "No user was designated!")) return ""
def unban(bot: Bot, update: Update, args: List[str]) -> str: message = update.effective_message # type: Optional[Message] user = update.effective_user # type: Optional[User] chat = update.effective_chat # type: Optional[Chat] user_id, reason = extract_user_and_text(message, args) if not user_id: return "" try: member = chat.get_member(user_id) except BadRequest as excp: if excp.message == "User not found": message.reply_text(tld(chat.id, "I can't seem to find this user")) return "" else: raise if user_id == bot.id: update.effective_message.reply_text( tld(chat.id, "How would I unban myself if I wasn't here...?")) return "" if is_user_in_chat(chat, user_id): update.effective_message.reply_text( tld( chat.id, "Why are you trying to unban someone that's already in the chat?" )) return "" update.effective_chat.unban_member(user_id) message.reply_text(tld(chat.id, "Yep, this user can join!")) log = "<b>{}:</b>" \ "\n#UNBANNED" \ "\n<b>Admin:</b> {}" \ "\n<b>User:</b> {}".format(html.escape(chat.title), mention_html(user.id, user.first_name), mention_html(member.user.id, member.user.first_name)) if reason: log += "\n<b>Reason:</b> {}".format(reason) return log
def temp_ban(bot: Bot, update: Update, args: List[str]) -> str: chat = update.effective_chat # type: Optional[Chat] user = update.effective_user # type: Optional[User] message = update.effective_message # type: Optional[Message] user_id, reason = extract_user_and_text(message, args) if not user_id: message.reply_text( tld(chat.id, "You don't seem to be referring to a user.")) return "" try: member = chat.get_member(user_id) except BadRequest as excp: if excp.message == "User not found": message.reply_text(tld(chat.id, "I can't seem to find this user")) return "" else: raise if is_user_ban_protected(chat, user_id, member): message.reply_text(tld(chat.id, "I really wish I could ban admins...")) return "" if user_id == bot.id: update.effective_message.reply_text( tld(chat.id, "I'm not gonna BAN myself, are you crazy?")) return "" split_reason = reason.split(None, 1) if not reason: message.reply_text( tld(chat.id, "You haven't specified a time to ban this user for!")) return "" else: time_val = split_reason[0].lower() if len(split_reason) > 1: reason = split_reason[1] else: reason = "" if any(time_val.endswith(unit) for unit in ('m', 'h', 'd')): unit = time_val[-1] time_num = time_val[:-1] # type: str if not time_num.isdigit(): message.reply_text(tld(chat.id, "Invalid time amount specified.")) return "" if unit == 'm': bantime = int(time.time() + int(time_num) * 60) elif unit == 'h': bantime = int(time.time() + int(time_num) * 60 * 60) elif unit == 'd': bantime = int(time.time() + int(time_num) * 24 * 60 * 60) else: # how even...? return "" else: message.reply_text( tld(chat.id, "Invalid time type specified. Expected m,h, or d, got: {}"). format(time_val[-1])) return "" log = "<b>{}:</b>" \ "\n#TEMP BANNED" \ "\n<b>Admin:</b> {}" \ "\n<b>User:</b> {}" \ "\n<b>Time:</b> {}".format(html.escape(chat.title), mention_html(user.id, user.first_name), mention_html(member.user.id, member.user.first_name), time_val) if reason: log += "\n<b>Reason:</b> {}".format(reason) try: update.effective_chat.kick_member(user_id, until_date=bantime) bot.send_sticker(update.effective_chat.id, BAN_STICKER) # banhammer marie sticker message.reply_text( tld(chat.id, "Banned! User will be banned for {}.").format(time_val)) return log except BadRequest as excp: if excp.message == "Reply message not found": # Do not reply message.reply_text( tld(chat.id, "Banned!User will be banned for {}.").format(time_val), quote=False) return log else: LOGGER.warning(update) LOGGER.exception("ERROR banning user %s in chat %s (%s) due to %s", user_id, chat.title, chat.id, excp.message) message.reply_text( tld(chat.id, "Well damn, I can't ban that user.")) return ""
def rban(bot: Bot, update: Update, args: List[str]): message = update.effective_message if not args: message.reply_text( tld(chat.id, "You don't seem to be referring to a chat/user.")) return user_id, chat_id = extract_user_and_text(message, args) if not user_id: message.reply_text( tld(chat.id, "You don't seem to be referring to a user.")) return elif not chat_id: message.reply_text( tld(chat.id, "You don't seem to be referring to a chat.")) return try: chat = bot.get_chat(chat_id) except BadRequest as excp: if excp.message == "Chat not found": message.reply_text( tld( chat.id, "Chat not found! Make sure you entered a valid chat ID and I'm part of that chat." )) return else: raise if chat.type == 'private': message.reply_text( tld(chat.id, "I'm sorry, but that's a private chat!")) return if not is_bot_admin(chat, bot.id) and not chat.get_member( bot.id).can_restrict_members: message.reply_text( tld( chat.id, "I can't restrict people there! Make sure I'm admin and can ban users." )) return try: member = chat.get_member(user_id) except BadRequest as excp: if excp.message == "User not found": message.reply_text(tld(chat.id, "I can't seem to find this user")) return else: raise if is_user_ban_protected(chat, user_id, member): message.reply_text(tld(chat.id, "I really wish I could ban admins...")) return if user_id == bot.id: message.reply_text( tld(chat.id, "I'm not gonna BAN myself, are you crazy?")) return try: chat.kick_member(user_id) message.reply_text(tld(chat.id, "Banned!")) except BadRequest as excp: if excp.message == "Reply message not found": # Do not reply message.reply_text('Banned!', quote=False) elif excp.message == "User_not_participant": message.reply_text("This user is not a participant of the chat!") elif excp.message == "Group chat was deactivated": message.reply_text("This group chat was deactivated!") elif excp.message == "Need to be inviter of a user to kick it from a basic group": message.reply_text(excp.message) elif excp.message == "Only the creator of a basic group can kick group administrators": message.reply_text(excp.message) elif excp.message == "Peer_id_invalid": message.reply_text( "Could not ban user. Perhaps the group has been suspended by Telegram." ) else: LOGGER.warning(update) LOGGER.exception("ERROR banning user %s in chat %s (%s) due to %s", user_id, chat.title, chat.id, excp.message) message.reply_text("Well damn, I can't ban that user.")
def gban(bot: Bot, update: Update, args: List[str]): message = update.effective_message # type: Optional[Message] user_id, reason = extract_user_and_text(message, args) if not user_id: message.reply_text("You don't seem to be referring to a user.") return if int(user_id) in SUDO_USERS: message.reply_text( "I spy, with my little eye... a sudo user war! Why are you guys turning on each other?" ) return if int(user_id) in SUPPORT_USERS: message.reply_text( "OOOH someone's trying to gban a support user! *grabs popcorn*") return if user_id == bot.id: message.reply_text( "-_- So funny, lets gban myself why don't I? Nice try.") return try: user_chat = bot.get_chat(user_id) except BadRequest as excp: message.reply_text(excp.message) return if user_chat.type != 'private': message.reply_text("That's not a user!") return if sql.is_user_gbanned(user_id): if not reason: message.reply_text( "This user is already gbanned; I'd change the reason, but you haven't given me one..." ) return success = sql.update_gban_reason( user_id, user_chat.username or user_chat.first_name, reason) if success: message.reply_text( "This user is already gbanned; I've gone and updated the gban reason though!" ) else: message.reply_text( "Do you mind trying again? I thought this person was gbanned, but then they weren't? " "Am very confused") return message.reply_text("*Blows dust off of banhammer* 😉") banner = update.effective_user # type: Optional[User] send_to_list(bot, SUDO_USERS + SUPPORT_USERS, "{} is gbanning user {} " "because:\n{}".format( mention_html(banner.id, banner.first_name), mention_html(user_chat.id, user_chat.first_name), reason or "No reason given"), html=True) sql.gban_user(user_id, user_chat.username or user_chat.first_name, reason) chats = get_all_chats() 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: bot.kick_chat_member(chat_id, user_id) except BadRequest as excp: if excp.message == "User is an administrator of the chat": pass elif excp.message == "Chat not found": pass elif excp.message == "Not enough rights to restrict/unrestrict chat member": pass elif excp.message == "User_not_participant": pass elif excp.message == "Peer_id_invalid": # Suspect this happens when a group is suspended by telegram. pass elif excp.message == "Group chat was deactivated": pass elif excp.message == "Need to be inviter of a user to kick it from a basic group": pass elif excp.message == "Chat_admin_required": pass elif excp.message == "Only the creator of a basic group can kick group administrators": pass else: message.reply_text("Could not gban due to: {}".format( excp.message)) send_to_list(bot, SUDO_USERS + SUPPORT_USERS, "Could not gban due to: {}".format(excp.message)) sql.ungban_user(user_id) return except TelegramError: pass send_to_list(bot, SUDO_USERS + SUPPORT_USERS, "gban complete!") message.reply_text("Person has been gbanned.")