Exemplo n.º 1
0
    async def botinfo(self, ctx):
        """Shows information about the bot."""

        # Get some data...
        guilds = await self.bot.db.fetch("SELECT COUNT(*) FROM guilds")
        guilds = int(guilds[0][0])
        members = await self.bot.db.fetch("SELECT COUNT(*) FROM guild_members")
        members = int(members[0][0])

        # Define embed fields data.
        fields = {
            'Creator': '<@462311999980961793>',
            'Servers active': f'{guilds} ({members} total members)',
            'Last update':
            f'{subprocess.check_output(["git", "log", "-1", "--format=%cd "]).strip().decode("utf-8")}',
            'Source code': 'https://github.com/niekesselink/Goose-Bot'
        }

        # Create and send the embed.
        await ctx.send(embed=embed.create(
            self,
            title=await language.get(self, ctx, 'info.title'),
            description=await language.get(self, ctx, 'info.description'),
            colour=0x303136,
            thumbnail=ctx.bot.user.avatar.url,
            fields=fields))
Exemplo n.º 2
0
    async def list(self, ctx):
        """"Gives a list of groups."""

        # Open database and get the results.
        groups = await self.bot.db.fetch("SELECT g.name, g.description, "
                                         "(SELECT COUNT(*) FROM group_members AS gm WHERE gm.group_id = g.id) AS membercount "
                                         "FROM groups AS g WHERE g.guild_id = $1 "
                                         "ORDER BY membercount", ctx.guild.id)

        # Are there even any groups?
        if not groups:
            return await ctx.send(await language.get(self, ctx, 'groups.no_groups'))

        # Get the correct language for members string and define a field variable.
        members = await language.get(self, ctx, 'groups.list.members')
        fields = {}

        # Fill in the groups in the fields list.
        for data in groups:
            fields.update({ data['name'] + ' (' + str(data['membercount']) + f' {members})': data['description'] })

        # Send the embed...
        await ctx.send(embed=embed.create(
            self,
            title=await language.get(self, ctx, 'groups.list.title'),
            description=await language.get(self, ctx, 'groups.list.description'),
            fields=fields
        ))
Exemplo n.º 3
0
    async def leaderboard(self, ctx):
        """Get's the top 10 people of the server."""

        # Get the top ten members.
        result = await self.bot.db.fetch(
            "SELECT member_id, xp, level FROM levels WHERE guild_id = $1 "
            "ORDER BY xp DESC LIMIT 10", ctx.guild.id)

        # Generate a proper list now...
        message = ''
        for i, member in enumerate(result):
            user = ctx.guild.get_member(member['member_id'])

            # Get the correct notation...
            if i + 1 == 1:
                message += f":first_place:) **{user.name}** (Level {member['level']}, {member['xp']} XP)\n"
            elif i + 1 == 2:
                message += f":second_place:) **{user.name}** (Level {member['level']}, {member['xp']} XP)\n"
            elif i + 1 == 3:
                message += f":third_place:) **{user.name}** (Level {member['level']}, {member['xp']} XP)\n"
            else:
                message += f"{i + 1}) **{user.name}** (Level {member['level']}, {member['xp']} XP)\n"

        # Create and send the embed.
        await ctx.send(embed=embed.create(
            self, title='Leaderboard', description=message, colour=0x303136))
Exemplo n.º 4
0
    async def pull(self, ctx):
        """Pulls the most recent version from the repository."""

        # Start typing indicator...
        await ctx.channel.trigger_typing()

        # Execture "git pull" command in shell.
        stdout, stderr = await self.run_process('git pull')

        # Inform the report.
        await ctx.send(embed=embed.create(
            self,
            title=await language.get(self, ctx, 'debug.git_pull'),
            description=f'```diff\n{stdout}\n{stderr}\n```',
            colour=0x303136))
Exemplo n.º 5
0
    async def pip(self, ctx, name):
        """Updates a pip package."""

        # Start typing indicator...
        await ctx.channel.trigger_typing()

        # Run the pip command.
        stdout, stderr = await self.run_process(
            f'pip3 install --upgrade {name}')

        # Inform the report.
        await ctx.send(embed=embed.create(
            self,
            title=await language.get(self, ctx, 'debug.update'),
            description=f'```diff\n{stdout}\n{stderr}\n```',
            colour=0x303136))
Exemplo n.º 6
0
    async def rank(self, ctx, username: str = None):
        """Get information about your current level."""

        # Command only works when levels are activated.
        if ctx.guild.id not in self.bot.memory['levels']:
            return

        # Get the user if given, else resort to self.
        user = ctx.author
        if username is not None:
            user_id = re.findall("\d+", username)
            user = ctx.guild.get_member(
                int(user_id[0]) if len(user_id) > 0 else username)
            user = user if user is not None else ctx.author

        # Get user info from the database.
        result = await self.bot.db.fetch(
            "WITH summary AS (SELECT member_id, xp, level, ROW_NUMBER() OVER(ORDER BY xp DESC) AS rank FROM levels WHERE guild_id = $1) "
            "SELECT xp, level, rank FROM summary WHERE member_id = $2",
            ctx.guild.id, user.id)

        # If no user found then that person is likely not ranked.
        if not result:
            return await ctx.send(await language.get(self, ctx,
                                                     'levels.norank'))

        # Author field.
        author = {
            'name': f'{user.name}#{user.discriminator}',
            'icon': user.avatar.url
        }

        # Create and send the embed.
        message = await language.get(self, ctx, 'levels.rank')
        await ctx.send(embed=embed.create(
            self,
            description=message.format(
                result[0]['rank'], result[0]['level'], result[0]['xp'],
                int(self.get_xp_treshold(result[0]['level'] + 1))),
            colour=0x303136,
            author=author))
Exemplo n.º 7
0
    async def info(self, ctx, *, data: str = None):
        """Shows information about yours or someone elses their account."""

        # Get the correct data from the message.
        username = None
        if data is not None:
            data = data.split(' ', 1)
            username = data[0]

        # Get the user
        user = ctx.author
        if username is not None:

            # Only set the about field if username is 'set'.
            if username.lower() == 'set':
                await self.bot.db.execute(
                    "UPDATE guild_members SET about = $1 WHERE guild_id = $2 AND id = $3",
                    data[1] if len(data) > 1 else '', ctx.guild.id,
                    ctx.author.id)
                return await ctx.message.add_reaction('👌')

            # We're not setting, now check if user is getable, other just refer to yourself.
            user_id = re.findall("\d+", username)
            user = ctx.guild.get_member(
                int(user_id[0]) if len(user_id) > 0 else username)
            user = user if user is not None else ctx.author

        # Author field.
        author = {
            'name': f'{user.name}#{user.discriminator}',
            'icon': user.avatar.url
        }

        # Get about field.
        about = await self.bot.db.fetch(
            "SELECT about FROM guild_members WHERE guild_id = $1 AND id = $2",
            ctx.guild.id, user.id)
        about = about[0]['about'] if about[0][
            'about'] is not None else await language.get(
                self, ctx, 'info.empty_about')

        # Define embed fields data.
        format = '%d/%m/%Y'
        fields = {
            await language.get(self, ctx, 'info.joined') + f' {ctx.guild.name}':
            user.joined_at.strftime(format),
            await language.get(self, ctx, 'info.created'):
            user.created_at.strftime(format)
        }

        # Get additional fields from cogs.
        for cog in self.bot.cogs:
            cog = self.bot.get_cog(cog)
            if 'member_info_field' in dir(cog):
                value = await cog.member_info_field(ctx, user)
                if value is not None:
                    fields.update(value)

        # Create and send the embed.
        await ctx.send(embed=embed.create(self,
                                          description=about,
                                          colour=0x303136,
                                          fields=fields,
                                          author=author))