From bb8820c9df9a01f39e3d97f76ca25007dd9f4c9e Mon Sep 17 00:00:00 2001 From: kosayoda Date: Sun, 7 Mar 2021 01:35:49 +0800 Subject: Unify emoji count and emoji information to a cog. --- bot/exts/evergreen/emoji.py | 122 ++++++++++++++++++++++++++++++++++++++ bot/exts/evergreen/emoji_count.py | 97 ------------------------------ bot/exts/evergreen/emojis.py | 39 ------------ 3 files changed, 122 insertions(+), 136 deletions(-) create mode 100644 bot/exts/evergreen/emoji.py delete mode 100644 bot/exts/evergreen/emoji_count.py delete mode 100644 bot/exts/evergreen/emojis.py (limited to 'bot') diff --git a/bot/exts/evergreen/emoji.py b/bot/exts/evergreen/emoji.py new file mode 100644 index 00000000..a24d420c --- /dev/null +++ b/bot/exts/evergreen/emoji.py @@ -0,0 +1,122 @@ +import datetime +import logging +import random +import textwrap +from collections import defaultdict +from typing import List, Tuple + +from discord import Color, Embed, Emoji +from discord.ext import commands + +from bot.constants import Colours, ERROR_REPLIES +from bot.utils.pagination import LinePaginator +from bot.utils.time import time_since + +log = logging.getLogger(__name__) + + +class Emoji(commands.Cog): + """A collection of commands related to emojis in the server.""" + + def __init__(self, bot: commands.Bot): + self.bot = bot + + @staticmethod + def embed_builder(emoji: dict) -> Tuple[Embed, List[str]]: + """Generates an embed with the emoji names and count.""" + embed = Embed( + color=Colours.orange, + title="Emoji Count", + timestamp=datetime.datetime.utcnow() + ) + msg = [] + + if len(emoji) == 1: + for category_name, category_emojis in emoji.items(): + if len(category_emojis) == 1: + msg.append(f"There is **{len(category_emojis)}** emoji in **{category_name}** category") + else: + msg.append(f"There are **{len(category_emojis)}** emojis in **{category_name}** category") + embed.set_thumbnail(url=random.choice(category_emojis).url) + + else: + for category_name, category_emojis in emoji.items(): + emoji_choice = random.choice(category_emojis) + if len(category_emojis) > 1: + emoji_info = f"There are **{len(category_emojis)}** emojis in **{category_name}** category" + else: + emoji_info = f"There is **{len(category_emojis)}** emoji in **{category_name}** category" + if emoji_choice.animated: + msg.append(f' {emoji_info}') + else: + msg.append(f'<:{emoji_choice.name}:{emoji_choice.id}> {emoji_info}') + return embed, msg + + @staticmethod + def generate_invalid_embed(emojis: list) -> Tuple[Embed, List[str]]: + """Generates error embed.""" + embed = Embed( + color=Colours.soft_red, + title=random.choice(ERROR_REPLIES) + ) + msg = [] + + emoji_dict = defaultdict(list) + for emoji in emojis: + emoji_dict[emoji.name.split("_")[0]].append(emoji) + + error_comp = ', '.join(emoji_dict) + msg.append(f"These are the valid categories\n```{error_comp}```") + return embed, msg + + @commands.group(name="emoji", invoke_without_command=True) + async def emoji_group(self, ctx: commands.Context) -> None: + """A group of commands related to emojis.""" + await ctx.send_help(ctx.command) + + @emoji_group.command(name="count", aliases=("c",)) + async def count_command(self, ctx: commands.Context, *, category_query: str = None) -> None: + """Returns embed with emoji category and info given by the user.""" + emoji_dict = defaultdict(list) + + if not ctx.guild.emojis: + await ctx.send("No emojis found.") + return + log.trace(f"Emoji Category {'' if category_query else 'not '}provided by the user") + for emoji in ctx.guild.emojis: + emoji_category = emoji.name.split("_")[0] + + if category_query is not None and emoji_category not in category_query: + continue + + emoji_dict[emoji_category].append(emoji) + + if not emoji_dict: + log.trace("Invalid name provided by the user") + embed, msg = self.generate_invalid_embed(ctx.guild.emojis) + else: + embed, msg = self.embed_builder(emoji_dict) + await LinePaginator.paginate(lines=msg, ctx=ctx, embed=embed) + + @emoji_group.command(name="info", aliases=("i",)) + async def info_command(self, ctx: commands.Context, emoji: Emoji) -> None: + """Returns relevant information about a Discord Emoji.""" + emoji_information = Embed( + title=f'Information about "{emoji.name}"', + description=textwrap.dedent(f""" + Name: {emoji.name} + Created: {time_since(emoji.created_at, precision="hours")} + ID: {emoji.id} + [Emoji source image]({emoji.url}) + """), + color=Color.blurple() + ) + emoji_information.set_thumbnail( + url=emoji.url + ) + await ctx.send(embed=emoji_information) + + +def setup(bot: commands.Bot) -> None: + """Add the Emoji cog into the bot.""" + bot.add_cog(Emoji(bot)) diff --git a/bot/exts/evergreen/emoji_count.py b/bot/exts/evergreen/emoji_count.py deleted file mode 100644 index cc43e9ab..00000000 --- a/bot/exts/evergreen/emoji_count.py +++ /dev/null @@ -1,97 +0,0 @@ -import datetime -import logging -import random -from collections import defaultdict -from typing import List, Tuple - -import discord -from discord.ext import commands - -from bot.constants import Colours, ERROR_REPLIES -from bot.utils.pagination import LinePaginator - -log = logging.getLogger(__name__) - - -class EmojiCount(commands.Cog): - """Command that give random emoji based on category.""" - - def __init__(self, bot: commands.Bot): - self.bot = bot - - @staticmethod - def embed_builder(emoji: dict) -> Tuple[discord.Embed, List[str]]: - """Generates an embed with the emoji names and count.""" - embed = discord.Embed( - color=Colours.orange, - title="Emoji Count", - timestamp=datetime.datetime.utcnow() - ) - msg = [] - - if len(emoji) == 1: - for category_name, category_emojis in emoji.items(): - if len(category_emojis) == 1: - msg.append(f"There is **{len(category_emojis)}** emoji in **{category_name}** category") - else: - msg.append(f"There are **{len(category_emojis)}** emojis in **{category_name}** category") - embed.set_thumbnail(url=random.choice(category_emojis).url) - - else: - for category_name, category_emojis in emoji.items(): - emoji_choice = random.choice(category_emojis) - if len(category_emojis) > 1: - emoji_info = f"There are **{len(category_emojis)}** emojis in **{category_name}** category" - else: - emoji_info = f"There is **{len(category_emojis)}** emoji in **{category_name}** category" - if emoji_choice.animated: - msg.append(f' {emoji_info}') - else: - msg.append(f'<:{emoji_choice.name}:{emoji_choice.id}> {emoji_info}') - return embed, msg - - @staticmethod - def generate_invalid_embed(emojis: list) -> Tuple[discord.Embed, List[str]]: - """Generates error embed.""" - embed = discord.Embed( - color=Colours.soft_red, - title=random.choice(ERROR_REPLIES) - ) - msg = [] - - emoji_dict = defaultdict(list) - for emoji in emojis: - emoji_dict[emoji.name.split("_")[0]].append(emoji) - - error_comp = ', '.join(emoji_dict) - msg.append(f"These are the valid categories\n```{error_comp}```") - return embed, msg - - @commands.command(name="emojicount", aliases=["ec", "emojis"]) - async def emoji_count(self, ctx: commands.Context, *, category_query: str = None) -> None: - """Returns embed with emoji category and info given by the user.""" - emoji_dict = defaultdict(list) - - if not ctx.guild.emojis: - await ctx.send("No emojis found.") - return - log.trace(f"Emoji Category {'' if category_query else 'not '}provided by the user") - for emoji in ctx.guild.emojis: - emoji_category = emoji.name.split("_")[0] - - if category_query is not None and emoji_category not in category_query: - continue - - emoji_dict[emoji_category].append(emoji) - - if not emoji_dict: - log.trace("Invalid name provided by the user") - embed, msg = self.generate_invalid_embed(ctx.guild.emojis) - else: - embed, msg = self.embed_builder(emoji_dict) - await LinePaginator.paginate(lines=msg, ctx=ctx, embed=embed) - - -def setup(bot: commands.Bot) -> None: - """Emoji Count Cog load.""" - bot.add_cog(EmojiCount(bot)) diff --git a/bot/exts/evergreen/emojis.py b/bot/exts/evergreen/emojis.py deleted file mode 100644 index 9f825e6d..00000000 --- a/bot/exts/evergreen/emojis.py +++ /dev/null @@ -1,39 +0,0 @@ -import textwrap - -from discord import Color, Embed, Emoji -from discord.ext import commands - -from bot.utils.time import time_since - - -class Emojis(commands.Cog): - """Has commands related to emojis.""" - - @commands.group(name="emoji", invoke_without_command=True) - async def emojis_group(self, ctx: commands.Context, emoji: Emoji) -> None: - """A group of commands related to emojis.""" - # No parameters = same as invoking info subcommand - await ctx.invoke(self.info_command, emoji) - - @emojis_group.command(name="info") - async def info_command(self, ctx: commands.Context, emoji: Emoji) -> None: - """Returns relevant information about a Discord Emoji.""" - emoji_information = Embed( - title=f'Information about "{emoji.name}"', - description=textwrap.dedent(f""" - Name: {emoji.name} - Created: {time_since(emoji.created_at, precision="hours")} - ID: {emoji.id} - [Emoji source image]({emoji.url}) - """), - color=Color.blurple() - ) - emoji_information.set_thumbnail( - url=emoji.url - ) - await ctx.send(embed=emoji_information) - - -def setup(bot: commands.Bot) -> None: - """Add the Emojis cog into the bot.""" - bot.add_cog(Emojis()) -- cgit v1.2.3