async def check_message(self, message: discord.Message): if message.guild is None or \ message.webhook_id is not None or \ message.author == message.guild.me: return ctx = await self.bot.get_context(message) if Permissioncheckers.get_user_lvl(ctx.guild, ctx.author) >= 2: return blacklist = Configuration.get_var(message.guild.id, "CENSORING", "TOKEN_BLACKLIST") word_blacklist = Configuration.get_var(message.guild.id, "CENSORING", "WORD_BLACKLIST") guilds = Configuration.get_var(message.guild.id, "CENSORING", "INVITE_WHITELIST") content = message.content.replace('\\', '') decoded_content = parse.unquote(content) censored = False if len(guilds) is not 0: codes = INVITE_MATCHER.findall(decoded_content) for code in codes: try: invite: discord.Invite = await self.bot.fetch_invite(code) except discord.NotFound: await self.censor_invite(ctx, code, "INVALID INVITE") except KeyError: await self.censor_invite(ctx, code, "DM group") censored = True else: if invite.guild is None or ( not invite.guild.id in guilds and invite.guild.id != message.guild.id): await self.censor_invite(ctx, code, invite.guild.name) censored = True if not censored: content = content.lower() for bad in (w.lower() for w in blacklist): if bad in content: await self.censor_message(message, bad) break if not censored and len(word_blacklist) > 0: if ctx.guild.id not in self.regexes: regex = re.compile( r"\b(" + '|'.join(re.escape(word) for word in word_blacklist) + r")\b", re.IGNORECASE) self.regexes[ctx.guild.id] = regex else: regex = self.regexes[ctx.guild.id] match = regex.findall(message.content) if len(match): await self.censor_message(message, match[0], "_word")
async def check_message(self, member, content, channel, message_id): if Permissioncheckers.get_user_lvl(member.guild, member) >= 2: return censorlist = Configuration.get_var(member.guild.id, "CENSORING", "TOKEN_CENSORLIST") word_censorlist = Configuration.get_var(member.guild.id, "CENSORING", "WORD_CENSORLIST") guilds = Configuration.get_var(member.guild.id, "CENSORING", "ALLOWED_INVITE_LIST") domain_list = Configuration.get_var(member.guild.id, "CENSORING", "DOMAIN_LIST") domains_allowed = Configuration.get_var(member.guild.id, "CENSORING", "DOMAIN_LIST_ALLOWED") full_message_list = Configuration.get_var(member.guild.id, "CENSORING", "FULL_MESSAGE_LIST") censor_emoji_message = Configuration.get_var( member.guild.id, "CENSORING", "CENSOR_EMOJI_ONLY_MESSAGES") content = content.replace('\\', '') decoded_content = parse.unquote(content) if len(guilds) is not 0: codes = INVITE_MATCHER.findall(decoded_content) for code in codes: try: invite: discord.Invite = await self.bot.fetch_invite(code) except discord.NotFound: await self.censor_invite(member, message_id, channel, code, "INVALID INVITE", content) return if invite.guild is None: await self.censor_invite(member, message_id, channel, code, "DM group", content) return else: if invite.guild is None or ( not invite.guild.id in guilds and invite.guild.id != member.guild.id): await self.censor_invite(member, message_id, channel, code, invite.guild.name, content) return content = content.lower() if content in full_message_list: await self.censor_message(message_id, content, channel, member, "", "_content") return for bad in (w.lower() for w in censorlist): if bad in content: await self.censor_message(message_id, content, channel, member, bad) return if len(word_censorlist) > 0: if channel.guild.id not in self.regexes: regex = re.compile( r"\b(" + '|'.join(re.escape(word) for word in word_censorlist) + r")\b", re.IGNORECASE) self.regexes[channel.guild.id] = regex else: regex = self.regexes[channel.guild.id] match = regex.findall(content) if len(match): await self.censor_message(message_id, content, channel, member, match[0], "_word") return if len(domain_list) > 0: link_list = URL_MATCHER.findall(content) for link in link_list: url = urlparse(link) domain = url.hostname if (domain in domain_list) is not domains_allowed: await self.censor_message(message_id, content, channel, member, url.hostname, "_domain_blocked") return if censor_emoji_message and content is not None and len(content) > 0: new_content = ''.join(c for c in content if c not in emoji.UNICODE_EMOJI) new_content = re.sub(EMOJI_REGEX, '', new_content) if new_content == '': await self.censor_message(message_id, content, channel, member, '', "_emoji_only") return
async def censor_message(self, message: discord.Message): if message.guild is None or \ message.webhook_id is not None or \ message.author == message.guild.me: return ctx = await self.bot.get_context(message) if Permissioncheckers.get_user_lvl(ctx) >= 2: return blacklist = Configuration.get_var(message.guild.id, "WORD_BLACKLIST") max_mentions = Configuration.get_var(message.guild.id, "MAX_MENTIONS") guilds = Configuration.get_var(message.guild.id, "INVITE_WHITELIST") content = message.content.replace('\\', '') decoded_content = parse.unquote(content) censored = False if len(guilds) is not 0: codes = INVITE_MATCHER.findall(decoded_content) for code in codes: try: invite: discord.Invite = await self.bot.fetch_invite(code) except discord.NotFound: await censor_invite(ctx, code, "INVALID INVITE") except KeyError: await censor_invite(ctx, code, "DM group") censored = True else: if invite.guild is None or ( not invite.guild.id in guilds and invite.guild.id != message.guild.id): await censor_invite(ctx, code, invite.guild.name) censored = True if not censored: content = content.lower() for bad in (w.lower() for w in blacklist): if bad in content: if message.channel.permissions_for( message.guild.me).manage_messages: try: self.bot.data["message_deletes"].add(message.id) await message.delete() except discord.NotFound as ex: pass # lost the race with another bot? else: clean_message = await clean_content().convert( ctx, message.content) GearbotLogging.log_to( ctx.guild.id, 'censored_message', user=message.author, user_id=message.author.id, message=clean_message, sequence=bad, channel=message.channel.mention) else: clean_message = await clean_content().convert( ctx, message.content) GearbotLogging.log_to(ctx.guild.id, 'censor_message_failed', user=message.author, user_id=message.author.id, message=clean_message, sequence=bad, link=message.jump_url) mentions = len(message.mentions) + len(message.role_mentions) if mentions > max_mentions > 4: self.bot.data["forced_exits"].add(message.author.id) reason = Translator.translate('autoban_too_many_mentions', message.guild.id, count=mentions) if message.guild.me.guild_permissions.ban_members: await message.guild.ban(message.author, reason=reason) else: self.bot.data["forced_exits"].remove(message.author.id) GearbotLogging.log_to(message.guild.id, 'automod_ban_failed', user=message.author, user_id=message.author.id, reason=reason)
async def censor_message(self, message: discord.Message): if message.guild is None or \ message.webhook_id is not None or \ message.author == message.guild.me: return ctx = await self.bot.get_context(message) if Permissioncheckers.get_user_lvl(ctx.guild, ctx.author) >= 2: return blacklist = Configuration.get_var(message.guild.id, "CENSORING", "WORD_BLACKLIST") guilds = Configuration.get_var(message.guild.id, "CENSORING", "INVITE_WHITELIST") content = message.content.replace('\\', '') decoded_content = parse.unquote(content) censored = False if len(guilds) is not 0: codes = INVITE_MATCHER.findall(decoded_content) for code in codes: try: invite: discord.Invite = await self.bot.fetch_invite(code) except discord.NotFound: await self.censor_invite(ctx, code, "INVALID INVITE") except KeyError: await self.censor_invite(ctx, code, "DM group") censored = True else: if invite.guild is None or ( not invite.guild.id in guilds and invite.guild.id != message.guild.id): await self.censor_invite(ctx, code, invite.guild.name) censored = True if not censored: content = content.lower() for bad in (w.lower() for w in blacklist): if bad in content: if message.channel.permissions_for( message.guild.me).manage_messages: try: self.bot.data["message_deletes"].add(message.id) await message.delete() except discord.NotFound as ex: break # lost the race with another bot? else: clean_message = await clean_content().convert( ctx, message.content) GearbotLogging.log_key( ctx.guild.id, 'censored_message', user=message.author, user_id=message.author.id, message=clean_message, sequence=bad, channel=message.channel.mention) self.bot.dispatch("user_censored", ctx.message) break else: clean_message = await clean_content().convert( ctx, message.content) GearbotLogging.log_key(ctx.guild.id, 'censor_message_failed', user=message.author, user_id=message.author.id, message=clean_message, sequence=bad, link=message.jump_url) self.bot.dispatch("user_censored", ctx.message)
async def check_message(self, message: discord.Message): if message.guild is None or \ message.webhook_id is not None or \ message.author == message.guild.me: return ctx = await self.bot.get_context(message) if Permissioncheckers.get_user_lvl(ctx.guild, ctx.author) >= 2: return censorlist = Configuration.get_var(message.guild.id, "CENSORING", "TOKEN_CENSORLIST") word_censorlist = Configuration.get_var(message.guild.id, "CENSORING", "WORD_CENSORLIST") guilds = Configuration.get_var(message.guild.id, "CENSORING", "ALLOWED_INVITE_LIST") domain_list = Configuration.get_var(message.guild.id, "CENSORING", "DOMAIN_LIST") domains_allowed = Configuration.get_var(message.guild.id, "CENSORING", "DOMAIN_LIST_ALLOWED") content = message.content.replace('\\', '') decoded_content = parse.unquote(content) censored = False if len(guilds) is not 0: codes = INVITE_MATCHER.findall(decoded_content) for code in codes: try: invite: discord.Invite = await self.bot.fetch_invite(code) except discord.NotFound: await self.censor_invite(ctx, code, "INVALID INVITE") return if invite.guild is None: await self.censor_invite(ctx, code, "DM group") censored = True else: if invite.guild is None or ( not invite.guild.id in guilds and invite.guild.id != message.guild.id): await self.censor_invite(ctx, code, invite.guild.name) censored = True if not censored: content = content.lower() for bad in (w.lower() for w in censorlist): if bad in content: await self.censor_message(message, bad) censored = True break if not censored and len(word_censorlist) > 0: if ctx.guild.id not in self.regexes: regex = re.compile( r"\b(" + '|'.join(re.escape(word) for word in word_censorlist) + r")\b", re.IGNORECASE) self.regexes[ctx.guild.id] = regex else: regex = self.regexes[ctx.guild.id] match = regex.findall(message.content) if len(match): await self.censor_message(message, match[0], "_word") censored = True if not censored and len(domain_list) > 0: link_list = URL_MATCHER.findall(message.content) for link in link_list: url = urlparse(link) domain = url.hostname if (domain in domain_list) is not domains_allowed: await self.censor_message(message, url.hostname, "_domain_blocked") print(domain)
async def censor_message(self, message: discord.Message): ctx = await self.bot.get_context(message) if message.guild is None or \ message.webhook_id is not None or \ message.author == message.guild.me or \ not Configuration.get_var(message.guild.id, "CENSOR_MESSAGES") or \ Permissioncheckers.get_user_lvl(ctx) >= 2: return blacklist = Configuration.get_var(message.guild.id, "WORD_BLACKLIST") max_mentions = Configuration.get_var(message.guild.id, "MAX_MENTIONS") guilds = Configuration.get_var(message.guild.id, "INVITE_WHITELIST") content = message.content.replace('\\', '') censored = False if len(guilds) is not 0: codes = INVITE_MATCHER.findall(content) for code in codes: try: invite: discord.Invite = await self.bot.get_invite(code) except discord.NotFound: await censor_invite(ctx, code, "INVALID INVITE") except KeyError: await censor_invite(ctx, code, "DM group") censored = True else: if invite.guild is None or (not invite.guild.id in guilds and invite.guild.id != message.guild.id): await censor_invite(ctx, code, invite.guild.name) censored = True if not censored: content = content.lower() for bad in (w.lower() for w in blacklist): if bad in content: if message.channel.permissions_for(message.guild.me).manage_messages: try: self.bot.data["message_deletes"].add(message.id) await message.delete() except discord.NotFound as ex: pass # lost the race with another bot? else: clean_message = await clean_content().convert(ctx, message.content) GearbotLogging.log_to(ctx.guild.id, "CENSORED_MESSAGES", f":no_entry_sign: {Translator.translate('censored_message', ctx.guild.id, user=message.author, user_id=message.author.id, message=clean_message, sequence=bad, channel=message.channel.mention)}") else: clean_message = await clean_content().convert(ctx, message.content) GearbotLogging.log_to(ctx.guild.id, "CENSORED_MESSAGES", f":no_entry_sign: {Translator.translate('censor_message_failed', ctx.guild.id, user=message.author, user_id=message.author.id, message=clean_message, sequence=bad, link=message.jump_url)}") mentions = len(message.mentions) + len(message.role_mentions) if mentions > max_mentions > 4: self.bot.data["forced_exits"].add(message.author.id) reason = Translator.translate('autoban_too_many_mentions', message.guild.id, count=mentions) if message.guild.me.guild_permissions.ban_members: await message.guild.ban(message.author, reason=reason) Infraction.update(active=False).where( (Infraction.user_id == message.author.id) & (Infraction.type == "Unban") & (Infraction.guild_id == ctx.guild.id)).execute() InfractionUtils.add_infraction(message.guild.id, message.author.id, self.bot.user.id, "AUTOBAN", reason) GearbotLogging.log_to(ctx.guild.id, "MOD_ACTIONS", f":door: {Translator.translate('ban_log', ctx.guild.id, user=message.author, user_id=message.author.id, moderator=self.bot.user, moderator_id=self.bot.user.id, reason=reason)}") else: self.bot.data["forced_exits"].remove(message.author.id) translated = Translator.translate('automod_ban_failed', message.guild.id, user=message.author, user_id=message.author.id, reason=reason) GearbotLogging.log_to(message.guild.id, "MOD_ACTIONS", f"{Emoji.get_chat_emoji('WARNING')} {translated}")
async def check_message(self, member, content, channel, message_id, edit, reply, attachments): if Permissioncheckers.get_user_lvl(member.guild, member) >= 2: return censorlist = Configuration.get_var(member.guild.id, "CENSORING", "TOKEN_CENSORLIST") word_censorlist = Configuration.get_var(member.guild.id, "CENSORING", "WORD_CENSORLIST") guilds = Configuration.get_var(member.guild.id, "CENSORING", "ALLOWED_INVITE_LIST") domain_list = Configuration.get_var(member.guild.id, "CENSORING", "DOMAIN_LIST") domains_allowed = Configuration.get_var(member.guild.id, "CENSORING", "DOMAIN_LIST_ALLOWED") full_message_list = Configuration.get_var(member.guild.id, "CENSORING", "FULL_MESSAGE_LIST") censor_emoji_message = Configuration.get_var( member.guild.id, "CENSORING", "CENSOR_EMOJI_ONLY_MESSAGES") content = content.replace('\\', '') if Configuration.get_var(member.guild.id, "CENSORING", "IGNORE_IDS"): content = re.sub(r'(<(?:@|#|@&|@!)[0-9]{15,20}>)', '', content) content = re.sub(r'<a?:[^: \n]+:([0-9]{15,20})>', '', content) content = re.sub( r"(https://(?:canary|ptb)?\.?discord(?:app)?.com/channels/\d{15,20}/\d{15,20}/\d{15,20})", '', content) decoded_content = parse.unquote(content) if len(guilds) != 0: codes = INVITE_MATCHER.findall(decoded_content) for code in codes: try: invite: disnake.Invite = await self.bot.fetch_invite(code) except disnake.NotFound: await self.censor_invite(member, message_id, channel, code, "INVALID INVITE", content, edit, reply, attachments) return if invite.guild is None: await self.censor_invite(member, message_id, channel, code, "DM group", content, edit, reply, attachments) return else: if invite.guild is None or ( not invite.guild.id in guilds and invite.guild.id != member.guild.id): await self.censor_invite(member, message_id, channel, code, invite.guild.name, content, edit, reply, attachments) return content = content.lower() if content in full_message_list: await self.censor_message(message_id, content, channel, member, "", "_content", edit=edit, reply=reply, attachments=attachments) return for bad in (w.lower() for w in censorlist): if bad in content: await self.censor_message(message_id, content, channel, member, bad, edit=edit, reply=reply, attachments=attachments) return if len(word_censorlist) > 0: if channel.guild.id not in self.regexes: regex = re.compile( r"(:?\b| )(" + '|'.join(re.escape(word) for word in word_censorlist) + r")(:?\b| )", re.IGNORECASE | re.MULTILINE) self.regexes[channel.guild.id] = regex else: regex = self.regexes[channel.guild.id] match = regex.findall(content) if len(match) > 0: m = match[0] if isinstance(m, tuple): m = m[1] await self.censor_message(message_id, content, channel, member, m, "_word", edit=edit, reply=reply, attachments=attachments) return if len(domain_list) > 0: link_list = URL_MATCHER.findall(content) for link in link_list: url = urlparse(link) domain = url.hostname if (domain in domain_list) is not domains_allowed: await self.censor_message(message_id, content, channel, member, url.hostname, "_domain_blocked", edit=edit, reply=reply, attachments=attachments) return if censor_emoji_message and content is not None and len(content) > 0: new_content = ''.join(c for c in content if c not in emoji.UNICODE_EMOJI) new_content = re.sub(EMOJI_REGEX, '', new_content) if new_content == '': await self.censor_message(message_id, content, channel, member, '', "_emoji_only", edit=edit, reply=reply, attachments=attachments) return