diff --git a/jarvis/cogs/jokes.py b/jarvis/cogs/jokes.py deleted file mode 100644 index 7697d37..0000000 --- a/jarvis/cogs/jokes.py +++ /dev/null @@ -1,122 +0,0 @@ -"""J.A.R.V.I.S. Jokes module.""" -import html -import re -import traceback -from datetime import datetime -from random import randint - -from dis_snek import InteractionContext, Scale, Snake -from dis_snek.models.discord.embed import EmbedField -from dis_snek.models.snek.application_commands import ( - OptionTypes, - slash_command, - slash_option, -) -from dis_snek.models.snek.command import cooldown -from dis_snek.models.snek.cooldowns import Buckets -from jarvis_core.db import q -from jarvis_core.db.models import Joke - -from jarvis.utils import build_embed - - -class JokeCog(Scale): - """ - Joke library for J.A.R.V.I.S. - - May adapt over time to create jokes using machine learning - """ - - def __init__(self, bot: Snake): - self.bot = bot - - # TODO: Make this a command group with subcommands - @slash_command( - name="joke", - description="Hear a joke", - ) - @slash_option(name="id", description="Joke ID", required=False, opt_type=OptionTypes.INTEGER) - @cooldown(bucket=Buckets.CHANNEL, rate=1, interval=10) - async def _joke(self, ctx: InteractionContext, id: str = None) -> None: - """Get a joke from the database.""" - try: - if randint(1, 100_000) == 5779 and id is None: # noqa: S311 - await ctx.send(f"<@{ctx.message.author.id}>") - return - # TODO: Add this as a parameter that can be passed in - threshold = 500 # Minimum score - result = None - if id: - result = await Joke.find_one(q(rid=id)) - else: - pipeline = [ - {"$match": {"score": {"$gt": threshold}}}, - {"$sample": {"size": 1}}, - ] - result = Joke.objects().aggregate(pipeline).next() - while result["body"] in ["[removed]", "[deleted]"]: - result = Joke.objects().aggregate(pipeline).next() - - if result is None: - await ctx.send("Humor module failed. Please try again later.", ephemeral=True) - return - emotes = re.findall(r"(&#x[a-fA-F0-9]*;)", result["body"]) - for match in emotes: - result["body"] = result["body"].replace(match, html.unescape(match)) - emotes = re.findall(r"(&#x[a-fA-F0-9]*;)", result["title"]) - for match in emotes: - result["title"] = result["title"].replace(match, html.unescape(match)) - body_chunks = [] - - body = "" - for word in result["body"].split(" "): - if len(body) + 1 + len(word) > 1024: - body_chunks.append(EmbedField("​", body, False)) - body = "" - if word == "\n" and body == "": - continue - elif word == "\n": - body += word - else: - body += " " + word - - desc = "" - title = result["title"] - if len(title) > 256: - new_title = "" - limit = False - for word in title.split(" "): - if len(new_title) + len(word) + 1 > 253 and not limit: - new_title += "..." - desc = "..." - limit = True - if not limit: - new_title += word + " " - else: - desc += word + " " - - body_chunks.append(EmbedField("​", body, False)) - - fields = body_chunks - fields.append(EmbedField("Score", result["score"])) - # Field( - # "Created At", - # str(datetime.fromtimestamp(result["created_utc"])), - # ), - fields.append(EmbedField("ID", result["rid"])) - embed = build_embed( - title=title, - description=desc, - fields=fields, - url=f"https://reddit.com/r/jokes/comments/{result['rid']}", - timestamp=datetime.fromtimestamp(result["created_utc"]), - ) - await ctx.send(embed=embed) - except Exception: - await ctx.send("Encountered error:\n```\n" + traceback.format_exc() + "\n```") - # await ctx.send(f"**{result['title']}**\n\n{result['body']}") - - -def setup(bot: Snake) -> None: - """Add JokeCog to J.A.R.V.I.S.""" - JokeCog(bot)