def check_flood(bot: Bot, update: Update) -> str: user = update.effective_user # type: Optional[User] chat = update.effective_chat # type: Optional[Chat] msg = update.effective_message # type: Optional[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: chat.kick_member(user.id) msg.reply_text(tld(chat.id, "I like to leave the flooding to natural disasters. But you, you were just a disappointment. Get out.")) return "<b>{}:</b>" \ "\n#BANNED" \ "\n<b>User:</b> {}" \ "\nFlooded the group.".format(html.escape(chat.title), mention_html(user.id, user.first_name)) except BadRequest: msg.reply_text(tld(chat.id, "I can't kick people here, give me permissions first! Until then, I'll disable antiflood.")) sql.set_flood(chat.id, 0) return "<b>{}:</b>" \ "\n#INFO" \ "\nDon't have kick permissions, so automatically disabled antiflood.".format(chat.title)
def button(bot: Bot, update: Update) -> str: query = update.callback_query # type: Optional[CallbackQuery] user = update.effective_user # type: Optional[User] match = re.match(r"rm_warn\((.+?)\)", query.data) if match: user_id = match.group(1) chat = update.effective_chat # type: Optional[Chat] if not is_user_admin(chat, int(user.id)): query.answer(text="You are not authorized to remove this warn!", show_alert=True) return "" res = sql.remove_warn(user_id, chat.id) if res: update.effective_message.edit_text(tld( chat.id, "Warn removed by {}.").format( mention_html(user.id, user.first_name)), parse_mode=ParseMode.HTML) user_member = chat.get_member(user_id) return "<b>{}:</b>" \ "\n#UNWARN" \ "\n<b>Admin:</b> {}" \ "\n<b>User:</b> {}".format(html.escape(chat.title), mention_html(user.id, user.first_name), mention_html(user_member.user.id, user_member.user.first_name)) else: update.effective_message.edit_text(tld( chat.id, "User has already has no warns.").format( mention_html(user.id, user.first_name)), parse_mode=ParseMode.HTML) return ""
def start(bot: Bot, update: Update, args: List[str]): if update.effective_chat.type == "private": if len(args) >= 1: if args[0].lower() == "help": send_help(update.effective_chat.id, HELP_STRINGS) elif args[0].lower().startswith("stngs_"): match = re.match("stngs_(.*)", args[0].lower()) chat = dispatcher.bot.getChat(match.group(1)) if is_user_admin(chat, update.effective_user.id): send_settings(match.group(1), update.effective_user.id, False) else: send_settings(match.group(1), update.effective_user.id, True) elif args[0][1:].isdigit() and "rules" in IMPORTED: IMPORTED["rules"].send_rules(update, args[0], from_pm=True) else: first_name = update.effective_user.first_name update.effective_message.reply_text(PM_START_TEXT.format( escape_markdown(first_name), escape_markdown(bot.first_name), OWNER_ID), parse_mode=ParseMode.MARKDOWN) else: update.effective_message.reply_text("Yo, whadup?")
def enforce_gmute(bot: Bot, update: Update): # Not using @restrict handler to avoid spamming - just ignore if cant gmute. if sql.does_chat_gmute( update.effective_chat.id) and update.effective_chat.get_member( bot.id).can_restrict_members: user = update.effective_user # type: Optional[User] chat = update.effective_chat # type: Optional[Chat] msg = update.effective_message # type: Optional[Message] if user and not is_user_admin(chat, user.id): check_and_mute(bot, update, user.id, should_message=True) if msg.new_chat_members: new_members = update.effective_message.new_chat_members for mem in new_members: check_and_mute(bot, update, mem.id, should_message=True) if msg.reply_to_message: user = msg.reply_to_message.from_user # type: Optional[User] if user and not is_user_admin(chat, user.id): check_and_mute(bot, update, user.id, should_message=True)
def kickme(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, "I wish I could... but you're an 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, "No problem.")) else: update.effective_message.reply_text(tld(chat.id, "Huh? I can't :/"))
def check_update(self, update): chat = update.effective_chat # type: Optional[Chat] user = update.effective_user # type: Optional[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 get_settings(bot: Bot, update: Update): chat = update.effective_chat # type: Optional[Chat] user = update.effective_user # type: Optional[User] msg = update.effective_message # type: Optional[Message] args = msg.text.split(None, 1) # ONLY send settings in PM if chat.type != chat.PRIVATE: if is_user_admin(chat, user.id): text = "Click here to get this chat's settings, as well as yours." msg.reply_text(text, reply_markup=InlineKeyboardMarkup([[ InlineKeyboardButton( text="Settings", url="t.me/{}?start=stngs_{}".format( bot.username, chat.id)) ]])) else: text = "Click here to check your settings." else: send_settings(chat.id, user.id, True)
def mute(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 = extract_user(message, args) if not user_id: message.reply_text(tld(chat.id, "You'll need to either give me a username to mute, or reply to someone to be muted.")) return "" if user_id == bot.id: message.reply_text(tld(chat.id, "I'm not muting myself!")) return "" member = chat.get_member(int(user_id)) if member: if is_user_admin(chat, user_id, member=member): message.reply_text(tld(chat.id, "Afraid I can't stop an admin from talking!")) elif member.can_send_messages is None or member.can_send_messages: bot.restrict_chat_member(chat.id, user_id, can_send_messages=False) message.reply_text(tld(chat.id, "Muted!")) return "<b>{}:</b>" \ "\n#MUTE" \ "\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)) else: message.reply_text(tld(chat.id, "This user is already muted!")) else: message.reply_text(tld(chat.id, "This user isn't in the chat!")) return ""
def warn(user: User, chat: Chat, reason: str, message: Message, warner: User = None) -> str: if is_user_admin(chat, user.id): message.reply_text(tld(chat.id, "Damn admins, can't even be warned!")) return "" if warner: warner_tag = mention_html(warner.id, warner.first_name) else: warner_tag = "Automated warn filter." 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, "{} warnings, {} has been kicked!").format( limit, mention_html(user.id, user.first_name)) else: # ban chat.kick_member(user.id) reply = tld(chat.id, "{} warnings, {} has been banned!").format( limit, mention_html(user.id, user.first_name)) for warn_reason in reasons: reply += "\n - {}".format(html.escape(warn_reason)) message.bot.send_sticker(chat.id, BAN_STICKER) # banhammer marie sticker keyboard = [] log_reason = "<b>{}:</b>" \ "\n#WARN_BAN" \ "\n<b>Admin:</b> {}" \ "\n<b>User:</b> {}" \ "\n<b>Reason:</b> {}".format(html.escape(chat.title), warner_tag, mention_html(user.id, user.first_name), reason) else: keyboard = InlineKeyboardMarkup([[ InlineKeyboardButton(tld(chat.id, "Remove warn"), callback_data="rm_warn({})".format(user.id)) ]]) reply = tld(chat.id, "{} has {}/{} warnings... watch out!").format( mention_html(user.id, user.first_name), num_warns, limit) if reason: reply += tld(chat.id, "\nReason for last warn:\n{}").format( html.escape(reason)) log_reason = "<b>{}:</b>" \ "\n#WARN" \ "\n<b>Admin:</b> {}" \ "\n<b>User:</b> {}" \ "\n<b>Reason:</b> {}".format(html.escape(chat.title), warner_tag, mention_html(user.id, user.first_name), reason) try: message.reply_text(reply, reply_markup=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=keyboard, parse_mode=ParseMode.HTML, quote=False) else: raise return log_reason
def unlock(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] 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, "Unlocked {} for everyone!").format(args[0])) 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, "Unlocked {} for everyone!").format(args[0])) message.reply_text( tld( chat.id, "NOTE: due to a recent abuse of locking, {} will now only be deleting messages, and not " "restricting users via the tg api. This shouldn't affect all you users though, so dont worry! " "Just means that any restricted users should be manually unrestricted from the chat " "admin pannel.").format(bot.first_name)) 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, "What are you trying to unlock...? Try /locktypes for the list of lockables" )) else: bot.sendMessage(chat.id, tld(chat.id, "What are you trying to unlock...?")) return ""