Ejemplo n.º 1
0
    async def on_message(self, message):
        if r.findall(message.content):
            me = message.channel.guild.me if message.channel.guild else self.bot.user
            if not check_botperm('add_reactions', channel=message.channel, me=me):
                return

            await message.add_reaction('🇫')
Ejemplo n.º 2
0
    async def on_raw_reaction_add(self, payload):
        if payload.emoji.name == '🇳🇿':
            channel = self.bot.get_channel(payload.channel_id)
            me = channel.guild.me if channel.guild else self.bot.user
            if not check_botperm('add_reactions', channel=channel, me=me):
                return

            if payload.user_id == self.bot.user.id:
                return

            await self.bot.http.add_reaction(payload.message_id,
                                             payload.channel_id, '🇳🇿')
Ejemplo n.º 3
0
    async def colors(self, ctx):
        """Shows the colors on this guild"""
        guild = ctx.guild
        colors = self._colors.get(guild.id)
        if not colors:
            return await ctx.send("This guild doesn't have any color roles")

        if not check_botperm('attach_files', ctx=ctx):
            for msg in self.text_only_colors(colors):
                await ctx.send(msg)

            return

        data = await self.bot.loop.run_in_executor(self.bot.threadpool,
                                                   self._sorted_color_image,
                                                   list(colors.values()))
        await ctx.send(file=discord.File(data, 'colors.png'))
Ejemplo n.º 4
0
    async def on_message(self, message):
        if not self.bot.antispam:
            return

        guild = message.guild
        if not guild or guild.id not in self.main_whitelist:
            return

        if message.webhook_id:
            return

        if message.author.bot:
            return

        if message.type != discord.MessageType.default:
            return

        moderator = self.bot.get_cog('Moderator')
        if not moderator:
            return

        blacklist = moderator.automute_blacklist.get(guild.id, ())

        if message.channel.id in blacklist or message.channel.id in (
                384422173462364163, 484450452243742720):
            return

        user = message.author
        whitelist = moderator.automute_whitelist.get(guild.id, ())
        invulnerable = discord.utils.find(lambda r: r.id in whitelist,
                                          user.roles)

        if invulnerable is not None:
            return

        mute_role = self.bot.guild_cache.mute_role(message.guild.id)
        mute_role = discord.utils.find(lambda r: r.id == mute_role,
                                       message.guild.roles)
        if not mute_role:
            return

        if not isinstance(user, discord.Member):
            user = guild.get_member(user.id)
            if not user:
                logger.debug(
                    f'User found when expected member and member not found in guild {guild.name} user {user} in channel {message.channel.name}'
                )
                return

        if mute_role in user.roles:
            return

        if not check_botperm(
                'manage_roles', guild=message.guild, channel=message.channel):
            return

        key = f'{message.guild.id}:{user.id}'
        value = await self.redis.get(key)
        if value:
            score, repeats, last_msg = value.split(':', 2)
            score = float(score)
            repeats = int(repeats)
        else:
            score, repeats, last_msg = 0, 0, None

        ttl = await self.redis.ttl(key)
        certainty = 0
        created_td = (datetime.utcnow() - user.created_at)
        joined_td = (datetime.utcnow() - user.joined_at)
        if joined_td.days > 14:
            joined = 0.2  # 2/sqrt(1)*2
        else:
            # seconds to days
            # value is max up to 1 day after join
            joined = max(joined_td.total_seconds() / 86400, 1)
            joined = 2 / sqrt(joined) * 2
            certainty += joined * 4

        if created_td.days > 14:
            created = 0.2  # 2/(7**(1/4))*4
        else:
            # Calculated the same as join
            created = max(created_td.total_seconds() / 86400, 1)
            created = 2 / (created**(1 / 5)) * 4
            certainty += created * 4

        points = created + joined

        old_ttl = 10
        if ttl > 0:
            old_ttl = min(ttl + 2, 10)

        if ttl > 4:
            ttl = max(10 - ttl, 0.5)
            points += 6 * 1 / sqrt(ttl)

        if user.avatar is None:
            points += 5 * max(created / 2, 1)
            certainty += 20

        msg = message.content

        if msg:
            msg = msg.lower()
            len_multi = max(sqrt(len(msg)) / 18, 0.5)
            if msg == last_msg:
                repeats += 1
                points += 5 * ((created + joined) / 5) * len_multi
                points += repeats * 3 * len_multi
                certainty += repeats * 4

        else:
            msg = ''

        score += points

        needed_for_mute = 50

        needed_for_mute += min(joined_td.days, 14) * 2.14
        needed_for_mute += min(created_td.days, 21) * 1.42

        certainty *= 100 / needed_for_mute
        certainty = min(round(certainty, 1), 100)

        if score > needed_for_mute and certainty > 55:
            certainty = str(certainty) + '%'
            channel = self.bot.get_channel(252872751319089153)
            if channel:
                await channel.send(
                    f'{user.mention} got muted for spam with score of {score} at {message.created_at}'
                )

            time = timedelta(hours=2)
            await moderator.add_timeout(
                message.channel,
                guild.id,
                user.id,
                datetime.utcnow() + time,
                time.total_seconds(),
                reason='Automuted for spam. Certainty %s' % certainty)

            d = 'Automuted user {0} `{0.id}` for {1}'.format(
                message.author, time)

            await message.author.add_roles(mute_role, reason='[Automute] Spam')
            url = f'https://discordapp.com/channels/{guild.id}/{message.channel.id}/{message.id}'
            embed = discord.Embed(title='Moderation action [AUTOMUTE]',
                                  description=d,
                                  timestamp=datetime.utcnow())
            embed.add_field(name='Reason', value='Spam')
            embed.add_field(name='Certainty', value=certainty)
            embed.add_field(name='link', value=url)
            embed.set_thumbnail(url=user.avatar_url or user.default_avatar_url)
            embed.set_footer(text=str(self.bot.user),
                             icon_url=self.bot.user.avatar_url
                             or self.bot.user.default_avatar_url)
            await moderator.send_to_modlog(guild, embed=embed)

            score = 0
            msg = ''

        await self.redis.set(key, f'{score}:{repeats}:{msg}', expire=old_ttl)
Ejemplo n.º 5
0
    def __local_check(ctx):
        if not check_botperm('attach_files', ctx=ctx):
            raise BotMissingPermissions(('attach_files', ))

        return True