diff options
Diffstat (limited to 'bot/exts/evergreen')
| -rw-r--r-- | bot/exts/evergreen/fun.py | 22 | ||||
| -rw-r--r-- | bot/exts/evergreen/githubinfo.py | 98 | ||||
| -rw-r--r-- | bot/exts/evergreen/issues.py | 5 | ||||
| -rw-r--r-- | bot/exts/evergreen/trivia_quiz.py | 6 | 
4 files changed, 116 insertions, 15 deletions
| diff --git a/bot/exts/evergreen/fun.py b/bot/exts/evergreen/fun.py index de6a92c6..231e6d54 100644 --- a/bot/exts/evergreen/fun.py +++ b/bot/exts/evergreen/fun.py @@ -7,7 +7,7 @@ from typing import Callable, Iterable, Tuple, Union  from discord import Embed, Message  from discord.ext import commands -from discord.ext.commands import Bot, Cog, Context, MessageConverter, clean_content +from discord.ext.commands import BadArgument, Bot, Cog, Context, MessageConverter, clean_content  from bot import utils  from bot.constants import Colours, Emojis @@ -57,18 +57,20 @@ class Fun(Cog):          with Path("bot/resources/evergreen/caesar_info.json").open("r", encoding="UTF-8") as f:              self._caesar_cipher_embed = json.load(f) +    @staticmethod +    def _get_random_die() -> str: +        """Generate a random die emoji, ready to be sent on Discord.""" +        die_name = f"dice_{random.randint(1, 6)}" +        return getattr(Emojis, die_name) +      @commands.command()      async def roll(self, ctx: Context, num_rolls: int = 1) -> None:          """Outputs a number of random dice emotes (up to 6).""" -        output = "" -        if num_rolls > 6: -            num_rolls = 6 -        elif num_rolls < 1: -            output = ":no_entry: You must roll at least once." -        for _ in range(num_rolls): -            dice = f"dice_{random.randint(1, 6)}" -            output += getattr(Emojis, dice, '') -        await ctx.send(output) +        if 1 <= num_rolls <= 6: +            dice = " ".join(self._get_random_die() for _ in range(num_rolls)) +            await ctx.send(dice) +        else: +            raise BadArgument("`!roll` only supports between 1 and 6 rolls.")      @commands.command(name="uwu", aliases=("uwuwize", "uwuify",))      async def uwu_command(self, ctx: Context, *, text: clean_content(fix_channel_mentions=True)) -> None: diff --git a/bot/exts/evergreen/githubinfo.py b/bot/exts/evergreen/githubinfo.py new file mode 100644 index 00000000..2e38e3ab --- /dev/null +++ b/bot/exts/evergreen/githubinfo.py @@ -0,0 +1,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)) diff --git a/bot/exts/evergreen/issues.py b/bot/exts/evergreen/issues.py index 5a5c82e7..97ee6a12 100644 --- a/bot/exts/evergreen/issues.py +++ b/bot/exts/evergreen/issues.py @@ -38,7 +38,7 @@ class Issues(commands.Cog):      ) -> None:          """Command to retrieve issue(s) from a GitHub repository."""          links = [] -        numbers = set(numbers) +        numbers = set(numbers)  # Convert from list to set to remove duplicates, if any          if not numbers:              await ctx.invoke(self.bot.get_command('help'), 'issue') @@ -53,8 +53,7 @@ class Issues(commands.Cog):              await ctx.send(embed=embed)              return -        for number in set(numbers): -            # Convert from list to set to remove duplicates, if any. +        for number in numbers:              url = f"https://api.github.com/repos/{user}/{repository}/issues/{number}"              merge_url = f"https://api.github.com/repos/{user}/{repository}/pulls/{number}/merge" diff --git a/bot/exts/evergreen/trivia_quiz.py b/bot/exts/evergreen/trivia_quiz.py index 8dceceac..fe692c2a 100644 --- a/bot/exts/evergreen/trivia_quiz.py +++ b/bot/exts/evergreen/trivia_quiz.py @@ -121,8 +121,10 @@ class TriviaQuiz(commands.Cog):              # A function to check whether user input is the correct answer(close to the right answer)              def check(m: discord.Message) -> bool: -                ratio = fuzz.ratio(answer.lower(), m.content.lower()) -                return ratio > 85 and m.channel == ctx.channel +                return ( +                    m.channel == ctx.channel +                    and fuzz.ratio(answer.lower(), m.content.lower()) > 85 +                )              try:                  msg = await self.bot.wait_for('message', check=check, timeout=10) | 
