def enforce_gban(bot: Bot, update: Update): # Not using @restrict handler to avoid spamming - just ignore if cant gban. try: if (sql.does_chat_gban(update.effective_chat.id) and update.effective_chat.get_member(bot.id).can_restrict_members): user = update.effective_user chat = update.effective_chat msg = update.effective_message if user and not is_user_admin(chat, user.id): check_and_ban(update, user.id) return if msg.new_chat_members: new_members = update.effective_message.new_chat_members for mem in new_members: check_and_ban(update, mem.id) return if msg.reply_to_message: user = msg.reply_to_message.from_user if user and not is_user_admin(chat, user.id): check_and_ban(update, user.id, should_message=False) return except Exception as f: print(f"Nut {f}")
def unlock(bot: Bot, update: Update, args: List[str]) -> str: chat = update.effective_chat user = update.effective_user message = update.effective_message if is_user_admin(chat, message.from_user.id): if len(args) >= 1: if args[0] in LOCK_TYPES: sql.update_lock(chat.id, args[0], locked=False) message.reply_text( tld(chat.id, "locks_unlock_success").format(args[0]), parse_mode=ParseMode.MARKDOWN, ) return ("<b>{}:</b>" "\n#UNLOCK" "\n<b>Admin:</b> {}" "\nUnlocked <code>{}</code>.".format( html.escape(chat.title), mention_html(user.id, user.first_name), args[0], )) elif args[0] in RESTRICTION_TYPES: sql.update_restriction(chat.id, args[0], locked=False) # members = users_sql.get_chat_members(chat.id) # if args[0] == "messages": # unrestr_members(bot, chat.id, members, media=False, other=False, previews=False) # elif args[0] == "media": # unrestr_members(bot, chat.id, members, other=False, previews=False) # elif args[0] == "other": # unrestr_members(bot, chat.id, members, previews=False) # elif args[0] == "previews": # unrestr_members(bot, chat.id, members) # elif args[0] == "all": # unrestr_members(bot, chat.id, members, True, True, True, True) message.reply_text( tld(chat.id, "locks_unlock_success").format(args[0]), parse_mode=ParseMode.MARKDOWN, ) return ("<b>{}:</b>" "\n#UNLOCK" "\n<b>Admin:</b> {}" "\nUnlocked <code>{}</code>.".format( html.escape(chat.title), mention_html(user.id, user.first_name), args[0], )) else: message.reply_text(tld(chat.id, "locks_type_invalid")) else: bot.sendMessage(chat.id, tld(chat.id, "locks_unlock_no_type")) return ""
def check_flood(bot: Bot, update: Update) -> str: user = update.effective_user chat = update.effective_chat msg = update.effective_message if not user: # ignore channels return "" # ignore admins if is_user_admin(chat, user.id): sql.update_flood(chat.id, None) return "" should_ban = sql.update_flood(chat.id, user.id) if not should_ban: return "" try: bot.restrict_chat_member(chat.id, user.id, can_send_messages=False) msg.reply_text(tld(chat.id, "flood_mute")) return tld(chat.id, "flood_logger_success").format( html.escape(chat.title), mention_html(user.id, user.first_name)) except BadRequest: msg.reply_text(tld(chat.id, "flood_err_no_perm")) sql.set_flood(chat.id, 0) return tld(chat.id, "flood_logger_fail").format(chat.title)
def rmwarn_handler(bot: Bot, update: Update) -> str: chat = update.effective_chat query = update.callback_query user = update.effective_user match = re.match(r"rm_warn\((.+?)\)", query.data) if match: user_id = match.group(1) if not is_user_admin(chat, int(user.id)): query.answer(text=tld(chat.id, "warns_remove_admin_only"), show_alert=True) return "" res = sql.remove_warn(user_id, chat.id) if res: update.effective_message.edit_text( tld(chat.id, "warns_remove_success").format( mention_html(user.id, user.first_name)), parse_mode=ParseMode.HTML, ) user_member = chat.get_member(user_id) return tld(chat.id, "warns_remove_log_channel").format( html.escape(chat.title), mention_html(user.id, user.first_name), mention_html(user_member.user.id, user_member.user.first_name), user_member.user.id, ) else: update.effective_message.edit_text( tld(chat.id, "warns_user_has_no_warns").format( mention_html(user.id, user.first_name)), parse_mode=ParseMode.HTML, ) return ""
def banme(bot: Bot, update: Update): user_id = update.effective_message.from_user.id chat = update.effective_chat if is_user_admin(update.effective_chat, user_id): update.effective_message.reply_text( tld(chat.id, "bans_err_usr_is_admin")) return res = update.effective_chat.kick_member(user_id) if res: update.effective_message.reply_text(tld(chat.id, "bans_kickme_success")) else: update.effective_message.reply_text(tld(chat.id, "bans_kickme_failed"))
def kickme(bot: Bot, update: Update): chat = update.effective_chat # type: Optional[Chat] user_id = update.effective_message.from_user.id if is_user_admin(update.effective_chat, user_id): update.effective_message.reply_text(tld(chat.id, "bans_kick_is_admin")) return res = update.effective_chat.unban_member( user_id) # unban on current user = kick if res: update.effective_message.reply_text(tld(chat.id, "bans_kickme_success")) else: update.effective_message.reply_text(tld(chat.id, "bans_kickme_failed"))
def check_update(self, update): chat = update.effective_chat user = update.effective_user if super().check_update(update): # Should be safe since check_update passed. command = update.effective_message.text_html.split( None, 1)[0][1:].split("@")[0] # disabled, admincmd, user admin if sql.is_command_disabled(chat.id, command): return command in ADMIN_CMDS and is_user_admin( chat, user.id) # not disabled else: return True return False
def muteme(bot: Bot, update: Update, args: List[str]) -> str: user_id = update.effective_message.from_user.id chat = update.effective_chat user = update.effective_user if is_user_admin(update.effective_chat, user_id): update.effective_message.reply_text(tld(chat.id, "mute_is_admin")) return res = bot.restrict_chat_member(chat.id, user_id, can_send_messages=False) if res: update.effective_message.reply_text(tld(chat.id, "muteme_muted")) log = ("<b>{}:</b>" "\n#MUTEME" "\n<b>User:</b> {}" "\n<b>ID:</b> <code>{}</code>".format( html.escape(chat.title), mention_html(user.id, user.first_name), user_id)) return log else: update.effective_message.reply_text(tld(chat.id, "mute_cant_mute"))
def check_update(self, update): return super().check_update(update) and not ( sql.is_restr_locked(update.effective_chat.id, "messages") and not is_user_admin(update.effective_chat, update.effective_user.id))
def warn(user: User, chat: Chat, reason: str, message: Message, warner: User = None) -> str: bot = dispatcher.bot if is_user_admin(chat, user.id): message.reply_text(tld(chat.id, "warns_warn_admin_no_warn")) return "" if warner: warner_tag = mention_html(warner.id, warner.first_name) else: warner_tag = tld(chat.id, "warns_warn_admin_autofilter") limit, soft_warn = sql.get_warn_setting(chat.id) num_warns, reasons = sql.warn_user(user.id, chat.id, reason) if num_warns >= limit: sql.reset_warns(user.id, chat.id) if soft_warn: # kick chat.unban_member(user.id) reply = tld(chat.id, "warns_max_warn_kick").format( limit, mention_html(user.id, user.first_name)) else: # ban chat.kick_member(user.id) reply = tld(chat.id, "warns_max_warn_ban").format( limit, mention_html(user.id, user.first_name)) for warn_reason in reasons: reply += "\n - {}".format(html.escape(warn_reason)) keyboard = [] log_reason = tld(chat.id, "warns_warn_ban_log_channel").format( html.escape(chat.title), warner_tag, mention_html(user.id, user.first_name), user.id, reason, num_warns, limit, ) else: keyboard = [[ InlineKeyboardButton( tld(chat.id, "warns_btn_remove_warn"), callback_data="rm_warn({})".format(user.id), ) ]] rules = rules_sql.get_rules(chat.id) if rules: keyboard[0].append( InlineKeyboardButton( tld(chat.id, "warns_btn_rules"), url="t.me/{}?start={}".format(bot.username, chat.id), )) reply = tld(chat.id, "warns_user_warned").format( mention_html(user.id, user.first_name), num_warns, limit) if reason: reply += tld(chat.id, "warns_latest_warn_reason").format( html.escape(reason)) log_reason = tld(chat.id, "warns_warn_log_channel").format( html.escape(chat.title), warner_tag, mention_html(user.id, user.first_name), user.id, reason, num_warns, limit, ) try: message.reply_text( reply, reply_markup=InlineKeyboardMarkup(keyboard), parse_mode=ParseMode.HTML, ) except BadRequest as excp: if excp.message == "Reply message not found": # Do not reply message.reply_text( reply, reply_markup=InlineKeyboardMarkup(keyboard), parse_mode=ParseMode.HTML, quote=False, ) else: raise return log_reason
def mute(bot: Bot, update: Update, args: List[str]) -> str: chat = update.effective_chat user = update.effective_user message = update.effective_message conn = connected(bot, update, chat, user.id) if conn: chatD = dispatcher.bot.getChat(conn) else: if chat.type == "private": return else: chatD = chat user_id = extract_user(message, args) if not user_id: message.reply_text(tld(chat.id, "mute_invalid")) return "" if user_id == bot.id: message.reply_text(tld(chat.id, "mute_not_myself")) return "" member = chatD.get_member(int(user_id)) if member: if user_id in SUDO_USERS: message.reply_text(tld(chat.id, "mute_not_sudo")) elif is_user_admin(chatD, user_id, member=member): message.reply_text(tld(chat.id, "mute_not_m_admin")) elif member.can_send_messages is None or member.can_send_messages: bot.restrict_chat_member(chatD.id, user_id, can_send_messages=False) keyboard = [] reply = tld(chat.id, "mute_success").format( mention_html(member.user.id, member.user.first_name), chatD.title) message.reply_text(reply, reply_markup=keyboard, parse_mode=ParseMode.HTML) return ("<b>{}:</b>" "\n#MUTE" "\n<b>Admin:</b> {}" "\n<b>User:</b> {}".format( html.escape(chatD.title), mention_html(user.id, user.first_name), mention_html(member.user.id, member.user.first_name), )) else: message.reply_text( tld(chat.id, "mute_already_mute").format(chatD.title)) else: message.reply_text( tld(chat.id, "mute_not_in_chat").format(chatD.title)) return ""
def temp_nomedia(bot: Bot, update: Update, args: List[str]) -> str: chat = update.effective_chat user = update.effective_user message = update.effective_message conn = connected(bot, update, chat, user.id) if conn: chatD = dispatcher.bot.getChat(conn) else: if chat.type == "private": return else: chatD = chat user_id, reason = extract_user_and_text(message, args) if not user_id: message.reply_text(tld(chat.id, "mute_not_refer")) return "" try: member = chat.get_member(user_id) except BadRequest as excp: if excp.message == "User not found": message.reply_text(tld(chat.id, "mute_not_existed")) return "" else: raise if is_user_admin(chat, user_id, member): message.reply_text(tld(chat.id, "restrict_is_admin")) return "" if user_id == bot.id: message.reply_text(tld(chat.id, "restrict_is_bot")) return "" if not reason: message.reply_text(tld(chat.id, "nomedia_need_time")) return "" split_reason = reason.split(None, 1) time_val = split_reason[0].lower() if len(split_reason) > 1: reason = split_reason[1] else: reason = "" mutetime = extract_time(message, time_val) if not mutetime: return "" log = ("<b>{}:</b>" "\n#TEMP RESTRICTED" "\n<b>• Admin:</b> {}" "\n<b>• User:</b> {}" "\n<b>• ID:</b> <code>{}</code>" "\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), user_id, time_val, )) if reason: log += tld(chat.id, "bans_logger_reason").format(reason) try: if member.can_send_messages is None or member.can_send_messages: bot.restrict_chat_member( chat.id, user_id, until_date=mutetime, can_send_messages=True, can_send_media_messages=False, can_send_other_messages=False, can_add_web_page_previews=False, ) message.reply_text( tld(chat.id, "nomedia_success").format(time_val, chatD.title)) return log else: message.reply_text( tld(chat.id, "restrict_already_restricted").format(chatD.title)) except BadRequest as excp: if excp.message == "Reply message not found": # Do not reply message.reply_text( tld(chat.id, "nomedia_success").format(time_val, chatD.title), quote=False, ) return log else: LOGGER.warning(update) LOGGER.exception( "ERROR muting user %s in chat %s (%s) due to %s", user_id, chat.title, chat.id, excp.message, ) message.reply_text(tld(chat.id, "restrict_cant_restricted")) return ""
def nomedia(bot: Bot, update: Update, args: List[str]) -> str: chat = update.effective_chat user = update.effective_user message = update.effective_message conn = connected(bot, update, chat, user.id) if conn: chatD = dispatcher.bot.getChat(conn) else: if chat.type == "private": return else: chatD = chat user_id = extract_user(message, args) if not user_id: message.reply_text(tld(chat.id, "restrict_invalid")) return "" if user_id == bot.id: message.reply_text(tld(chat.id, "restrict_is_bot")) return "" member = chatD.get_member(int(user_id)) if member: if is_user_admin(chatD, user_id, member=member): message.reply_text(tld(chat.id, "restrict_is_admin")) elif member.can_send_messages is None or member.can_send_messages: bot.restrict_chat_member( chatD.id, user_id, can_send_messages=True, can_send_media_messages=False, can_send_other_messages=False, can_add_web_page_previews=False, ) keyboard = [] reply = tld(chat.id, "restrict_success").format( mention_html(member.user.id, member.user.first_name), chatD.title) message.reply_text(reply, reply_markup=keyboard, parse_mode=ParseMode.HTML) return ("<b>{}:</b>" "\n#RESTRICTED" "\n<b>• Admin:</b> {}" "\n<b>• User:</b> {}" "\n<b>• ID:</b> <code>{}</code>".format( html.escape(chatD.title), mention_html(user.id, user.first_name), mention_html(member.user.id, member.user.first_name), user_id, )) else: message.reply_text(tld(chat.id, "restrict_already_restricted")) else: message.reply_text( tld(chat.id, "mute_not_in_chat").format(chatD.title)) return ""