From f2a0a565001a224c5f65d31b1894f7c8573911ec Mon Sep 17 00:00:00 2001 From: alexraskin Date: Tue, 21 May 2024 23:29:10 -0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Refactor:=20Update=20bot=20commands?= =?UTF-8?q?=20for=20fetching=20cat=20facts.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .dockerignore | 16 ---------------- .zed/settings.json | 16 ---------------- README.md | 12 +----------- bot/cogs/fun.py | 15 +++++++++++++++ bot/cogs/lhguess.py | 2 +- bot/cogs/static/images/favicon.ico | Bin 32038 -> 0 bytes example-files/example.env | 5 ----- 7 files changed, 17 insertions(+), 49 deletions(-) delete mode 100644 .dockerignore delete mode 100644 .zed/settings.json delete mode 100644 bot/cogs/static/images/favicon.ico diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 30fa272..0000000 --- a/.dockerignore +++ /dev/null @@ -1,16 +0,0 @@ -.mypy_cache -example.config.json -README.md -.pylintrc -.github/ -.gitignore -.gitattributes -Procfile -runtime.txt -infrastructure/terraform/ -Makefile -tests/ -setup.sh -LICENSE -example-files/ -.vscode/ diff --git a/.zed/settings.json b/.zed/settings.json deleted file mode 100644 index de934d6..0000000 --- a/.zed/settings.json +++ /dev/null @@ -1,16 +0,0 @@ -// Folder-specific settings -// -// For a full list of overridable settings, and general information on folder-specific settings, -// see the documentation: https://zed.dev/docs/configuring-zed#folder-specific-settings -{ - "language_overrides": { - "Python": { - "format_on_save": { - "external": { - "command": "black", - "arguments": ["-"] - } - } - } - } -} diff --git a/README.md b/README.md index d0f4d33..aa0143c 100644 --- a/README.md +++ b/README.md @@ -20,26 +20,16 @@ If you follow LhCloudy on twitch, you will know, that he will not share what Lh ## Deploy -This bot is completely managed by terraform and is deployed on [Railway](https://railway.app/). If you are wanting to deploy this bot, you can do so by following the instructions below. - A few things you will need: - Discord bot - Mongo database (I use atlas) - A Railway account -- Amazon S3 Bucket Take a look in the [`/example-files`](https://github.com/alexraskin/lhbot/tree/main/example-files) folder for examples of the files you will need to create. -## Deploying the bot to Railway via Terraform - -1. Clone the repository -2. Change `dir` to `infrastructure/terraform/bot` -3. Create a `terraform.tfvars` The bot will look for all these environment variables [in this file](hhttps://github.com/alexraskin/lhbot/blob/main/infrastructure/terraform/bot/shared-envs.tf) -4. Run `terraform init` -5. Run `terraform apply` - ___ + ## Run the bot locally To run the bot locally, you will need to fill in the `.env` file all the values that are missing. diff --git a/bot/cogs/fun.py b/bot/cogs/fun.py index ee17c17..9ed85d6 100644 --- a/bot/cogs/fun.py +++ b/bot/cogs/fun.py @@ -82,6 +82,21 @@ async def cat(self, ctx: commands.Context): return else: await ctx.send(f"{cat_url}/cat/{data['_id']}") + + @commands.hybrid_command(name="catfact", with_app_command=True) + @commands.guild_only() + @app_commands.guild_only() + async def cat_fact(self, ctx: commands.Context): + """ + Get a random cat fact from catfact.ninja + """ + response = await self.client.session.get("https://catfact.ninja/fact") + data = await response.json() + if response.status != 200: + await ctx.send("Could not find a cat fact!") + return + else: + await ctx.send(data["fact"]) @commands.hybrid_command( name="dog", aliases=["dogpic", "doggo"], with_app_command=True diff --git a/bot/cogs/lhguess.py b/bot/cogs/lhguess.py index 43b1480..87c529e 100644 --- a/bot/cogs/lhguess.py +++ b/bot/cogs/lhguess.py @@ -188,7 +188,7 @@ async def lhdelete(self, ctx: commands.Context, guess_id: int): if ctx.guild.id != self.client.config.main_guild: await ctx.send("This command can only be used in Cloudy's Discord.") return - guess = await self.collection.find_one({"_id": ObjectId(guess_id)}) # type: ignore + guess = await self.collection.find_one({"_id": ObjectId(guess_id)}) if not guess: raise commands.BadArgument("Could not find a guess with that ID!") diff --git a/bot/cogs/static/images/favicon.ico b/bot/cogs/static/images/favicon.ico deleted file mode 100644 index 13af62dd2286631352d0d20980a812792f34b145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32038 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

gDNO~Fpx)aeaE?qvFnjcz5J6_yFYc{SUZ(ko$ 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