aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts/evergreen/githubinfo.py
blob: 2e38e3abb68be6aadd18e07cb2cbd61ffd348cee (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import logging
import random
from datetime import datetime
from typing import Optional

import discord
from discord.ext import commands
from discord.ext.commands.cooldowns import BucketType

from bot.constants import NEGATIVE_REPLIES

log = logging.getLogger(__name__)


class GithubInfo(commands.Cog):
    """Fetches info from GitHub."""

    def __init__(self, bot: commands.Bot):
        self.bot = bot

    async def fetch_data(self, url: str) -> dict:
        """Retrieve data as a dictionary."""
        async with self.bot.http_session.get(url) as r:
            return await r.json()

    @commands.command(name='github', aliases=['gh'])
    @commands.cooldown(1, 60, BucketType.user)
    async def get_github_info(self, ctx: commands.Context, username: Optional[str]) -> None:
        """
        Fetches a user's GitHub information.

        Username is optional and sends the help command if not specified.
        """
        if username is None:
            await ctx.invoke(self.bot.get_command('help'), 'github')
            ctx.command.reset_cooldown(ctx)
            return

        async with ctx.typing():
            user_data = await self.fetch_data(f"https://api.github.com/users/{username}")

            # User_data will not have a message key if the user exists
            if user_data.get('message') is not None:
                await ctx.send(embed=discord.Embed(title=random.choice(NEGATIVE_REPLIES),
                                                   description=f"The profile for `{username}` was not found.",
                                                   colour=discord.Colour.red()))
                return

            org_data = await self.fetch_data(user_data['organizations_url'])
            orgs = [f"[{org['login']}](https://github.com/{org['login']})" for org in org_data]
            orgs_to_add = ' | '.join(orgs)

            gists = user_data['public_gists']

            # Forming blog link
            if user_data['blog'].startswith("http"):  # Blog link is complete
                blog = user_data['blog']
            elif user_data['blog']:  # Blog exists but the link is not complete
                blog = f"https://{user_data['blog']}"
            else:
                blog = "No website link available"

            embed = discord.Embed(
                title=f"`{user_data['login']}`'s GitHub profile info",
                description=f"```{user_data['bio']}```\n" if user_data['bio'] is not None else "",
                colour=0x7289da,
                url=user_data['html_url'],
                timestamp=datetime.strptime(user_data['created_at'], "%Y-%m-%dT%H:%M:%SZ")
            )
            embed.set_thumbnail(url=user_data['avatar_url'])
            embed.set_footer(text="Account created at")

            if user_data['type'] == "User":

                embed.add_field(name="Followers",
                                value=f"[{user_data['followers']}]({user_data['html_url']}?tab=followers)")
                embed.add_field(name="\u200b", value="\u200b")
                embed.add_field(name="Following",
                                value=f"[{user_data['following']}]({user_data['html_url']}?tab=following)")

            embed.add_field(name="Public repos",
                            value=f"[{user_data['public_repos']}]({user_data['html_url']}?tab=repositories)")
            embed.add_field(name="\u200b", value="\u200b")

            if user_data['type'] == "User":
                embed.add_field(name="Gists", value=f"[{gists}](https://gist.github.com/{username})")

                embed.add_field(name=f"Organization{'s' if len(orgs)!=1 else ''}",
                                value=orgs_to_add if orgs else "No organizations")
                embed.add_field(name="\u200b", value="\u200b")
            embed.add_field(name="Website", value=blog)

        await ctx.send(embed=embed)


def setup(bot: commands.Bot) -> None:
    """Adding the cog to the bot."""
    bot.add_cog(GithubInfo(bot))