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('🇫')
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, '🇳🇿')
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'))
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)
def __local_check(ctx): if not check_botperm('attach_files', ctx=ctx): raise BotMissingPermissions(('attach_files', )) return True