Exemple #1
0
    async def guild_logger(self, guild: discord.Guild, event: str):
        if event.casefold() == 'remove':
            colour = discord.Colour.red()
            title = 'Guild Left'
        elif event.casefold() == 'join':
            colour = discord.Colour.green()
            title = 'Guild Joined'

        embed = Embed(
            title = title,
            colour = colour,
            footer = f'Server Count: {len(self.bot.guilds)}',
            description = (
                f'Guild ID: {guild.id}\n'\
                f'Guild Name: {guild.name}\n'\
                f'Owner: {guild.owner} ({guild.owner.id})\n'\
                f'Membercount: {len(guild.members)}'
            )
        )

        if guild.icon:
            embed.set_thumbnail(url=guild.icon.url)

        webhook = discord.Webhook.from_url(url=os.getenv('DSCN_LOGGER'),
                                           session=self.bot.session)
        await webhook.send(embed=embed)
Exemple #2
0
    async def ping(self, ctx: Context):
        """Shows the bot's ping."""

        start = time.perf_counter()
        msg = await ctx.send('Pinging...')
        end = time.perf_counter()

        typing_latency = (end - start) * 1000
        websocket_latency = self.bot.latency * 1000

        start = time.perf_counter()
        await self.bot.settings.find_one({'guildId': ctx.guild.id})
        end = time.perf_counter()

        mongo_latency = (end - start) * 1000

        embed = Embed(title='\U0001f3d3 Pong!')
        embed.add_field(name='<a:typing:828718094959640616> | Typing',
                        value=f'`{typing_latency:.2f}ms`')
        embed.add_field(name='<a:settings:801424449542815744> | Websocket',
                        value=f'`{websocket_latency:.2f}ms`')
        embed.add_field(name='<:mongo:814706574928379914> | Database',
                        value=f'`{mongo_latency:.2f}ms`')

        await msg.edit(content=None, embed=embed)
Exemple #3
0
    async def avatar(self, ctx: Context, *, user: Optional[discord.User]):
        """Shows avatar of a user."""
        user = user or ctx.author

        def url_as(format: str) -> str:
            return user.avatar.with_format(format).url

        embed = Embed(
            title = f'Avatar for {user}',
            description=(
                f'Link As\n'\
                f'[png]({url_as("png")}) | [jpg]({url_as("jpg")}) | [webp]({url_as("webp")})'
            )
        )

        embed.set_image(url=user.avatar.url)
        await embed.send(ctx.channel)
Exemple #4
0
    async def on_member_update(self, before: discord.Member,
                               after: discord.Member):
        if before.bot:
            return

        channel = await self.check_log_channel(before.guild)
        if not channel:
            return

        if before.display_name != after.display_name:
            embed = Embed(
                author = after,
                colour = discord.Colour.blue(),
                footer = 'Modified At',
                title = 'Nickname Updated',
                description = (
                    f'**Before:** {before.display_name}\n'\
                    f'**After:** {after.display_name}'
                )
            )

            await embed.send(channel)

        if before.roles != after.roles:
            embed = Embed(title='Roles Updated',
                          colour=discord.Colour.blue(),
                          author=after,
                          footer='Modified At')

            temp: list[discord.Role] = list(set(before.roles + after.roles))
            added = []
            removed = []

            for role in temp:
                if role in before.roles and role not in after.roles:
                    removed.append(role)
                elif role in after.roles and role not in before.roles:
                    added.append(role)

            if added:
                embed.add_field(name='Roles Added',
                                value=', '.join([r.mention for r in added]),
                                inline=False)

            if removed:
                embed.add_field(name='Roles Removed',
                                value=', '.join([r.mention for r in removed]),
                                inline=False)

            await embed.send(channel)
Exemple #5
0
    async def on_member_remove(self, member: discord.Member):
        channel = await self.check_log_channel(member.guild)
        if not channel:
            return

        embed = Embed(
            author=member,
            title='Member Left',
            colour=discord.Colour.red(),
            footer=f'ID: {member.id}',
            description=
            (f'{member.mention} joined {humanize.naturaltime(member.joined_at, when=discord.utils.utcnow())}.\n'
             ))

        roles = member.roles
        roles.remove(member.guild.default_role)

        if roles:
            embed.add_field(name='Roles',
                            value=', '.join(r.mention for r in roles))

        await embed.send(channel)
Exemple #6
0
    async def invite(self, ctx: Context):
        """Gives an invite for the bot"""
        def get_link(permissions: discord.Permissions) -> str:
            return discord.utils.oauth_url(self.bot.user.id, permissions)

        embed = Embed(
            title = 'Invite Links',
            description = (
                f'[Invite Link (Minimal Perms)]({get_link(discord.Permissions(2147863616))})\n'\
                f'[Invite Link (Admin)]({get_link(discord.Permissions(8))})\n'\
                f'[Bot Server](https://discord.gg/2NVgaEwd2J)'
            )
        )

        await embed.send(ctx.channel)
Exemple #7
0
    async def prefix(self, ctx: Context):
        """Shows all the set prefix for the guild."""
        base = [self.bot.user.mention]
        settings = await self.bot.settings.find_one({'guildId': ctx.guild.id})
        if settings:
            base.extend(settings['prefixes'])
        else:
            base.append('.')

        embed = Embed(title=f'Prefixes for {ctx.guild.name}',
                      description='\n'.join(f'{i}. {p}'
                                            for i, p in enumerate(base, 1)),
                      footer=f'ID: {ctx.guild.id}')

        await embed.send(ctx.channel)
Exemple #8
0
    async def on_bulk_message_delete(self, messages: list[discord.Message]):

        deleted = [m for m in messages if len(m.content) <= 200]
        description = '\n'.join(f'**[{m.author}]:** {m.content}'
                                for m in deleted)
        dummy = messages[0]

        channel = await self.check_log_channel(dummy.guild)
        if not channel:
            return

        if len(description) > 2048:
            description = f'Too many messages to show. {len(messages)} messages were deleted'

        embed = Embed(
            colour=discord.Colour.red(),
            title=f'{len(messages)} messages deleted in #{dummy.channel}',
            description=description,
            footer=f'{len(deleted)} messages are shown.')

        await embed.send(channel)
Exemple #9
0
    async def on_member_join(self, member: discord.Member):
        channel = await self.check_log_channel(member.guild)
        if not channel:
            return

        new = ''
        if member.created_at.day < 3:
            new = '\N{WARNING SIGN} **New Member:** '

        embed = Embed(
            colour = discord.Colour.green(),
            footer = 'Joined At',
            author = member,
            title = 'Member Joined',
            description = (
                f'{member.mention} {humanize.intcomma(humanize.ordinal(len(member.guild.members)))} to join.\n'\
                f'{new}created {humanize.naturaltime(member.created_at, when=discord.utils.utcnow())}.'
            )
        )

        await embed.send(channel)
Exemple #10
0
    async def on_member_unban(self, guild: discord.Guild, user: discord.User):
        if not guild.me.guild_permissions.view_audit_log:
            return

        channel = await self.check_log_channel(guild)
        if not channel:
            return

        async for entry in guild.audit_logs(
                action=discord.AuditLogAction.unban):
            if entry.target.id == user.id:
                reason = (
                    f'**Reason:** {entry.reason if entry.reason else "No reason was provided."}\n'\
                    f'**Moderator:** {entry.user.mention} (ID: `{entry.user.id}`)'
                )
                break

        embed = Embed(title='Member Unbanned',
                      description=reason,
                      colour=discord.Colour.green(),
                      author=user)

        await embed.send(channel)
Exemple #11
0
    async def on_message_edit(self, before: discord.Message,
                              after: discord.Message):
        if not before.guild:
            return
        if before.author.bot:
            return
        channel = await self.check_log_channel(before.guild)
        if not channel:
            return

        if before.content != after.content:
            embed = Embed(author=before.author,
                          colour=discord.Colour.blue(),
                          footer='Modified At',
                          title='Message Edited',
                          description=f'**Channel:** {before.channel.mention}')

            embed.add_field(name='Before', value=before.content, inline=False)
            embed.add_field(name='After', value=after.content, inline=False)

            await embed.send(channel)
Exemple #12
0
    async def on_message_delete(self, message: discord.Message):
        if message.author.bot:
            return
        channel = await self.check_log_channel(message.guild)
        if channel is None:
            return

        embed = Embed(author=message.author,
                      colour=discord.Colour.red(),
                      footer='Deleted At',
                      title='Message Deleted',
                      description=f'**Channel:** {message.channel.mention}')

        if message.content:
            embed.add_field(name='Content',
                            value=message.content,
                            inline=False)

        if message.attachments:
            embed.add_field(name='Attachments',
                            value=', '.join(f'{a.filename} ({a.content_type})'
                                            for a in message.attachments))

        await embed.send(channel)