def check_and_ban(update, user_id, should_message=True): chat = update.effective_chat message = update.effective_message try: if sw != None: sw_ban = sw.get_ban(user_id) if sw_ban: spamwatch_reason = sw_ban.reason chat.kick_member(user_id) if should_message: message.reply_text( tld(chat.id, "antispam_spamwatch_banned").format( spamwatch_reason), parse_mode=ParseMode.HTML, ) return else: return except Exception: pass if sql.is_user_gbanned(user_id): chat.kick_member(user_id) if should_message: userr = sql.get_gbanned_user(user_id) usrreason = userr.reason if not usrreason: usrreason = tld(chat.id, "antispam_no_reason") message.reply_text( tld(chat.id, "antispam_checkban_user_removed").format(usrreason), parse_mode=ParseMode.MARKDOWN, ) return
def check_update(self, update): if isinstance(update, Update) and ( update.message or update.edited_message and self.allow_edited): message = update.message or update.edited_message if sql.is_user_gbanned(update.effective_user.id): return False if message.text and message.text.startswith("/") and len( message.text) > 1: first_word = message.text_html.split(None, 1)[0] if len(first_word) > 1 and first_word.startswith("/"): command = first_word[1:].split("@") command.append( message.bot.username ) # in case the command was sent without a username if not (command[0].lower() in self.command and command[1].lower() == message.bot.username.lower()): return False if self.filters is None: res = True elif isinstance(self.filters, list): res = any(func(message) for func in self.filters) else: res = self.filters(message) return res return False
def __user_info__(user_id, chat_id): is_gbanned = sql.is_user_gbanned(user_id) if not user_id in SUDO_USERS: text = tld(chat_id, "antispam_userinfo_gbanned") if is_gbanned: text = text.format(tld(chat_id, "common_yes")) text += tld(chat_id, "anitspam_appeal") user = sql.get_gbanned_user(user_id) if user.reason: text += tld(chat_id, "antispam_userinfo_gban_reason").format( html.escape(user.reason)) else: text = text.format(tld(chat_id, "common_no")) return text else: return ""
def left_member(bot: Bot, update: Update): chat = update.effective_chat # type: Optional[Chat] should_goodbye, cust_goodbye, cust_content, goodbye_type = sql.get_gdbye_pref( chat.id) cust_goodbye = markdown_to_html(cust_goodbye) if should_goodbye: left_mem = update.effective_message.left_chat_member if left_mem: if is_user_gbanned(left_mem.id): return if sw != None: sw_ban = sw.get_ban(left_mem.id) if sw_ban: return # Ignore bot being kicked if left_mem.id == bot.id: return # Give the owner a special goodbye if left_mem.id == OWNER_ID: update.effective_message.reply_text( tld(chat.id, "welcome_bot_owner_left")) return # if media goodbye, use appropriate function for it if goodbye_type != sql.Types.TEXT and goodbye_type != sql.Types.BUTTON_TEXT: reply = update.message.message_id cleanserv = sql.clean_service(chat.id) # Clean service welcome if cleanserv: try: dispatcher.bot.delete_message( chat.id, update.message.message_id) except BadRequest: pass reply = False # Formatting text first_name = ( left_mem.first_name or "PersonWithNoName" ) # edge case of empty name - occurs for some bugs. if left_mem.last_name: fullname = "{} {}".format(first_name, left_mem.last_name) else: fullname = first_name count = chat.get_members_count() mention = mention_html(left_mem.id, first_name) if left_mem.username: username = "******" + escape(left_mem.username) else: username = mention formatted_text = cust_goodbye.format( first=escape(first_name), last=escape(left_mem.last_name or first_name), fullname=escape(fullname), username=username, mention=mention, count=count, chatname=escape(chat.title), id=left_mem.id, ) # Build keyboard buttons = sql.get_gdbye_buttons(chat.id) keyb = build_keyboard(buttons) keyboard = InlineKeyboardMarkup(keyb) # Send message ENUM_FUNC_MAP[goodbye_type]( chat.id, cust_content, caption=formatted_text, reply_markup=keyboard, parse_mode="html", reply_to_message_id=reply, ) return first_name = (left_mem.first_name or "PersonWithNoName" ) # edge case of empty name - occurs for some bugs. if cust_goodbye: if left_mem.last_name: fullname = "{} {}".format(first_name, left_mem.last_name) else: fullname = first_name count = chat.get_members_count() mention = mention_html(left_mem.id, first_name) if left_mem.username: username = "******" + escape(left_mem.username) else: username = mention valid_format = escape_invalid_curly_brackets( cust_goodbye, VALID_WELCOME_FORMATTERS) res = valid_format.format( first=escape(first_name), last=escape(left_mem.last_name or first_name), fullname=escape(fullname), username=username, mention=mention, count=count, chatname=escape(chat.title), id=left_mem.id, ) buttons = sql.get_gdbye_buttons(chat.id) keyb = build_keyboard(buttons) else: res = sql.DEFAULT_GOODBYE keyb = [] keyboard = InlineKeyboardMarkup(keyb) send(update, res, keyboard, sql.DEFAULT_GOODBYE)
def new_member(bot: Bot, update: Update): chat = update.effective_chat # type: Optional[Chat] should_welc, cust_welcome, cust_content, welc_type = sql.get_welc_pref( chat.id) cust_welcome = markdown_to_html(cust_welcome) if should_welc: sent = None new_members = update.effective_message.new_chat_members for new_mem in new_members: # Give start information when add bot to group if is_user_gbanned(new_mem.id): return if sw != None: sw_ban = sw.get_ban(new_mem.id) if sw_ban: return if new_mem.id == bot.id: bot.send_message( MESSAGE_DUMP, "I have been added to {} with ID: <pre>{}</pre>".format( chat.title, chat.id), parse_mode=ParseMode.HTML, ) bot.send_message(chat.id, tld(chat.id, "welcome_added_to_grp")) else: if is_user_gbanned(new_mem.id): return # If welcome message is media, send with appropriate function if welc_type != sql.Types.TEXT and welc_type != sql.Types.BUTTON_TEXT: reply = update.message.message_id cleanserv = sql.clean_service(chat.id) # Clean service welcome if cleanserv: try: dispatcher.bot.delete_message( chat.id, update.message.message_id) except BadRequest: pass reply = False # Formatting text first_name = ( new_mem.first_name or "PersonWithNoName" ) # edge case of empty name - occurs for some bugs. if new_mem.last_name: fullname = "{} {}".format(first_name, new_mem.last_name) else: fullname = first_name count = chat.get_members_count() mention = mention_html(new_mem.id, first_name) if new_mem.username: username = "******" + escape(new_mem.username) else: username = mention formatted_text = cust_welcome.format( first=escape(first_name), last=escape(new_mem.last_name or first_name), fullname=escape(fullname), username=username, mention=mention, count=count, chatname=escape(chat.title), id=new_mem.id, ) # Build keyboard buttons = sql.get_welc_buttons(chat.id) keyb = build_keyboard(buttons) getsec, mutetime, custom_text = sql.welcome_security( chat.id) member = chat.get_member(new_mem.id) # If user ban protected don't apply security on him if is_user_ban_protected(chat, new_mem.id, chat.get_member(new_mem.id)): pass elif getsec: # If mute time is turned on if mutetime: if mutetime[:1] == "0": if (member.can_send_messages is None or member.can_send_messages): try: bot.restrict_chat_member( chat.id, new_mem.id, can_send_messages=False) canrest = True except BadRequest: canrest = False else: canrest = False else: mutetime = extract_time( update.effective_message, mutetime) if (member.can_send_messages is None or member.can_send_messages): try: bot.restrict_chat_member( chat.id, new_mem.id, until_date=mutetime, can_send_messages=False, ) canrest = True except BadRequest: canrest = False else: canrest = False # If security welcome is turned on if canrest: sql.add_to_userlist(chat.id, new_mem.id) keyb.append([ InlineKeyboardButton( text=str(custom_text), callback_data="check_bot_({})".format( new_mem.id), ) ]) keyboard = InlineKeyboardMarkup(keyb) # Send message ENUM_FUNC_MAP[welc_type]( chat.id, cust_content, caption=formatted_text, reply_markup=keyboard, parse_mode="html", reply_to_message_id=reply, ) return # else, move on first_name = ( new_mem.first_name or "PersonWithNoName" ) # edge case of empty name - occurs for some bugs. if cust_welcome: if new_mem.last_name: fullname = "{} {}".format(first_name, new_mem.last_name) else: fullname = first_name count = chat.get_members_count() mention = mention_html(new_mem.id, first_name) if new_mem.username: username = "******" + escape(new_mem.username) else: username = mention valid_format = escape_invalid_curly_brackets( cust_welcome, VALID_WELCOME_FORMATTERS) res = valid_format.format( first=escape(first_name), last=escape(new_mem.last_name or first_name), fullname=escape(fullname), username=username, mention=mention, count=count, chatname=escape(chat.title), id=new_mem.id, ) buttons = sql.get_welc_buttons(chat.id) keyb = build_keyboard(buttons) else: res = sql.DEFAULT_WELCOME.format(first=first_name) keyb = [] getsec, mutetime, custom_text = sql.welcome_security(chat.id) member = chat.get_member(new_mem.id) # If user ban protected don't apply security on him if is_user_ban_protected(chat, new_mem.id, chat.get_member(new_mem.id)): pass elif getsec: if mutetime: if mutetime[:1] == "0": if (member.can_send_messages is None or member.can_send_messages): try: bot.restrict_chat_member( chat.id, new_mem.id, can_send_messages=False) canrest = True except BadRequest: canrest = False else: canrest = False else: mutetime = extract_time(update.effective_message, mutetime) if (member.can_send_messages is None or member.can_send_messages): try: bot.restrict_chat_member( chat.id, new_mem.id, until_date=mutetime, can_send_messages=False, ) canrest = True except BadRequest: canrest = False else: canrest = False if canrest: sql.add_to_userlist(chat.id, new_mem.id) keyb.append([ InlineKeyboardButton( text=str(custom_text), callback_data="check_bot_({})".format( new_mem.id), ) ]) keyboard = InlineKeyboardMarkup(keyb) sent = send(update, res, keyboard, sql.DEFAULT_WELCOME.format( first=first_name)) # type: Optional[Message] prev_welc = sql.get_clean_pref(chat.id) if prev_welc: try: bot.delete_message(chat.id, prev_welc) except BadRequest as excp: pass if sent: sql.set_clean_welcome(chat.id, sent.message_id)
def gban(bot: Bot, update: Update, args: List[str]): message = update.effective_message chat = update.effective_chat banner = update.effective_user user_id, reason = extract_user_and_text(message, args) if not user_id: message.reply_text(tld(chat.id, "common_err_no_user")) return if int(user_id) in SUDO_USERS: message.reply_text(tld(chat.id, "antispam_err_usr_sudo")) return if int(user_id) in SUPPORT_USERS: message.reply_text(tld(chat.id, "antispam_err_usr_support")) return if user_id == bot.id: message.reply_text(tld(chat.id, "antispam_err_usr_bot")) 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(tld(chat.id, "antispam_err_not_usr")) return if user_chat.first_name == "": message.reply_text(tld(chat.id, "antispam_err_usr_deleted")) return if not reason: message.reply_text("Global Ban must have a reason!") return full_reason = html.escape( f"{reason} // GBanned by {banner.first_name} id {banner.id}") if sql.is_user_gbanned(user_id): old_reason = (sql.update_gban_reason( user_id, user_chat.username or user_chat.first_name, full_reason) or "None") try: bot.send_message( GBAN_DUMP, tld(chat.id, "antispam_logger_update_gban").format( mention_html(banner.id, banner.first_name), mention_html(user_chat.id, user_chat.first_name or "Deleted Account"), user_chat.id, old_reason, full_reason, ), parse_mode=ParseMode.HTML, ) except Exception: pass message.reply_text( tld(chat.id, "antispam_reason_updated").format(html.escape(old_reason), html.escape(full_reason)), parse_mode=ParseMode.HTML, ) return starting = tld(chat.id, "antispam_new_gban").format( mention_html(user_chat.id, user_chat.first_name or "Deleted Account"), user_chat.id, reason, ) message.reply_text(starting, parse_mode=ParseMode.HTML) try: bot.send_message( GBAN_DUMP, tld(chat.id, "antispam_logger_new_gban").format( mention_html(banner.id, banner.first_name), mention_html(user_chat.id, user_chat.first_name), user_chat.id, full_reason or tld(chat.id, "antispam_no_reason"), ), parse_mode=ParseMode.HTML, ) except Exception: print("nut") try: bot.kick_chat_member(chat.id, user_chat.id) except BadRequest as excp: if excp.message in GBAN_ERRORS: pass sql.gban_user(user_id, user_chat.username or user_chat.first_name, full_reason)
def ungban(bot: Bot, update: Update, args: List[str]): message = update.effective_message chat = update.effective_chat user_id, reason = extract_user_and_text(message, args) reason = html.escape(reason) if not user_id: message.reply_text(tld(chat.id, "common_err_no_user")) return user_chat = bot.get_chat(user_id) if user_chat.type != "private": message.reply_text(tld(chat.id, "antispam_err_not_usr")) return if not sql.is_user_gbanned(user_id): message.reply_text(tld(chat.id, "antispam_user_not_gbanned")) return if not reason: message.reply_text( "Removal of Global Ban requires a reason to do so, why not send me one?" ) return banner = update.effective_user message.reply_text( "<b>Initializing Global Ban Removal</b>\n<b>Sudo Admin:</b> {}\n<b>User:</b> {}\n<b>ID:</b> <code>{}</code>\n<b>Reason:</b> {}" .format( mention_html(banner.id, banner.first_name), mention_html(user_chat.id, user_chat.first_name), user_chat.id, reason, ), parse_mode=ParseMode.HTML, ) try: bot.send_message( GBAN_DUMP, tld(chat.id, "antispam_logger_ungban").format( mention_html(banner.id, banner.first_name), mention_html(user_chat.id, user_chat.first_name), user_chat.id, reason, ), parse_mode=ParseMode.HTML, ) except Exception: pass # 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: # member = bot.get_chat_member(chat_id, user_id) # if member.status == 'kicked': # bot.unban_chat_member(chat_id, user_id) # except BadRequest as excp: # if excp.message in UNGBAN_ERRORS: # pass # else: # message.reply_text( # tld(chat.id, "antispam_err_ungban").format(excp.message)) # bot.send_message( # OWNER_ID, # tld(chat.id, "antispam_err_ungban").format(excp.message)) # return # except TelegramError: # pass sql.ungban_user(user_id) message.reply_text( "This user have been ungbanned succesfully, they might have to ask 'admins' of chats they were banned to unban manually due to global ban." "\n\nPlease forward this message to them or let them know about this.")