Пример #1
0
    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")
Пример #2
0
    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
Пример #3
0
    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)
Пример #4
0
    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)
Пример #5
0
    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)
Пример #6
0
    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}")
Пример #7
0
    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