From 47718c0df79af68c14cb4224758825e32ef415b8 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 14:52:00 +0300 Subject: [PATCH 01/16] Bug fixes (v0.8) --- cogs/fun.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cogs/fun.py b/cogs/fun.py index 547ceab..bc5090d 100644 --- a/cogs/fun.py +++ b/cogs/fun.py @@ -9,7 +9,7 @@ import math import configparser -from utils.decorators import is_weather_active +from .utils import is_weather_active config = configparser.ConfigParser() config.read("config.ini") @@ -137,9 +137,9 @@ async def random(self, interaction, embed.add_field(name="Result", value=f"{random.randint(first_num, second_num)}") await interaction.send(embed=embed) - @is_weather_active() + @is_weather_active @nextcord.slash_command() - async def weather(self, interaction, _city): + async def weather(self, interaction, _city = nextcord.SlashOption(name="city")): """ Get a weather forecast in certain city. """ From 89ebf96abd8fb88c14403a6363105db74c8a8a7e Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 14:57:40 +0300 Subject: [PATCH 02/16] Bug fix (v0.8) --- cogs/events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cogs/events.py b/cogs/events.py index 2eed6cb..e031406 100644 --- a/cogs/events.py +++ b/cogs/events.py @@ -22,7 +22,7 @@ async def on_command_error(self, ctx, err: Exception): @commands.Cog.listener() async def on_application_command_error(self, interaction, error: Exception): - embed = nextcord.Embed(title="Error", colour=nextcord.Colors.light_red) + embed = nextcord.Embed(title="Error", colour=nextcord.Color.red) if isinstance(error, application_checks.errors.ApplicationMissingPermissions): embed.description = "You do not have permissions to perform this action." From f62e252795bf5a2c4894b00ae5e2ab42c5583035 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 15:21:12 +0300 Subject: [PATCH 03/16] Fixed import (v0.8) --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 82652f0..4079984 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,7 @@ import os import sys import configparser -from .cogs.utils import dependecies +from cogs.utils import dependecies intents = nextcord.Intents.all() From 5b02c10cc0f2b2d161dffe36eecdd91d3c44c1f4 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 15:35:59 +0300 Subject: [PATCH 04/16] Update dependecies (v0.8) --- requirements.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4d4995b..7ed683e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -asyncio>=3.4.3 -nextcord>=2.4.2 -typing_extensions>=4.5.0 -psutil>=5.9.5 -requests>=2.31.0 +asyncio==3.4.3 +nextcord==2.6.0 +typing_extensions==4.9.0 +psutil==5.9.8 +requests==2.31.0 From 20c2edf19e53d234c85d021bfd0d0d7656eb9196 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 17:01:37 +0300 Subject: [PATCH 05/16] Bug fix (v0.8) --- cogs/fun.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cogs/fun.py b/cogs/fun.py index bc5090d..e52d3fb 100644 --- a/cogs/fun.py +++ b/cogs/fun.py @@ -111,7 +111,6 @@ async def say(self, interaction, sentence): description=f'{sentence}', ) await interaction.send(embed=embed) - await interaction.message.delete() @nextcord.slash_command() async def reverse(self, interaction, sentence): From 0c5a27e188ba8723cab87d45fdcf6b555c5343a1 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 17:13:04 +0300 Subject: [PATCH 06/16] Docstrings added and adjusted (v0.8) --- cogs/moderation.py | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/cogs/moderation.py b/cogs/moderation.py index 662574b..823871e 100644 --- a/cogs/moderation.py +++ b/cogs/moderation.py @@ -49,6 +49,14 @@ async def unlock(self, interaction): async def ban(self, interaction, member: Member, reason: str = nextcord.SlashOption(default="No reason.")): """ Ban a certain user. + + Parameters + ---------- + interaction: Interaction + member: int + Choose an user. + reason: str + Type a reason. """ embed = nextcord.Embed(title='Ban', colour=nextcord.Colors.light_red) @@ -73,7 +81,18 @@ async def ban(self, interaction, member: Member, reason: str = nextcord.SlashOpt @application_checks.has_permissions(administrator=True) @nextcord.slash_command() - async def unban(self, interaction, member, reason: str = nextcord.SlashOption(default="No reason.")): + async def unban(self, interaction, member: nextcord.Member, reason: str = nextcord.SlashOption(default="No reason.")): + """ + Ban a certain user. + + Parameters + ---------- + interaction: Interaction + member: nextcord.Member + Choose an user. + reason: str + Type a reason. + """ banned_users = await interaction.guild.fetch_ban(user=member) embed = nextcord.Embed(title='Unban') @@ -109,6 +128,17 @@ async def unban(self, interaction, member, reason: str = nextcord.SlashOption(de @application_checks.has_permissions(kick_members=True) @nextcord.slash_command() async def kick(self, interaction, member: nextcord.Member, reason: str = nextcord.SlashOption(default="No reason.")): + """ + Kick an user. + + Parameters + ---------- + interaction: Interaction + member: nextcord.Member + Choose an user. + reason: str + Type a reason. + """ embed = nextcord.Embed(title='Kick') if interaction.user.id == member.id: @@ -136,6 +166,15 @@ async def kick(self, interaction, member: nextcord.Member, reason: str = nextcor @application_checks.has_permissions(manage_messages=True) @nextcord.slash_command() async def clear(self, interaction, amount: int = nextcord.SlashOption(min_value=1, max_value=100)): + """ + Kick an user. + + Parameters + ---------- + interaction: Interaction + member: int + Type a count of messages to delete. + """ deleted = await interaction.channel.purge(limit=amount) msg = await interaction.send(f'Messages deleted: **{len(deleted)}**') From c5604f08ab33fdd4d342a8d5d6c1823575553eac Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 17:27:03 +0300 Subject: [PATCH 07/16] Dosctrings adjusted (v0.8) --- cogs/fun.py | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/cogs/fun.py b/cogs/fun.py index e52d3fb..705e306 100644 --- a/cogs/fun.py +++ b/cogs/fun.py @@ -79,6 +79,12 @@ async def password(self, interaction, length: int = nextcord.SlashOption(min_val default=8)): """ Random password generator. + + Parameters + ---------- + interaction: Interaction + length: int + Enter password length. """ password = ''.join( random.sample(string.ascii_lowercase + string.ascii_uppercase + string.digits + string.punctuation, @@ -103,21 +109,33 @@ async def coin(self, interaction): await interaction.send(embed=embed) @nextcord.slash_command() - async def say(self, interaction, sentence): + async def say(self, interaction, text: str): """ Say message as the bot. + + Parameters + ---------- + interaction: Interaction + text: str + Enter a text to say. """ embed = nextcord.Embed( - description=f'{sentence}', + description=f'{text}', ) await interaction.send(embed=embed) @nextcord.slash_command() - async def reverse(self, interaction, sentence): + async def reverse(self, interaction, text: str): """ Reverse entered message. + + Parameters + ---------- + interaction: Interaction + text: str + Enter a text to reverse. """ - await interaction.send(f"{sentence[::-1]}") + await interaction.send(f"{text[::-1]}") @nextcord.slash_command() async def random(self, interaction, @@ -141,6 +159,12 @@ async def random(self, interaction, async def weather(self, interaction, _city = nextcord.SlashOption(name="city")): """ Get a weather forecast in certain city. + + Parameters + ---------- + interaction: Interaction + _city: str + Enter a city to get weather forecast. """ try: ow_token = config["bot"]["openweather_token"] From 768460814e5f2f1955fd9c6329e32e4ed27e28d3 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 17:44:28 +0300 Subject: [PATCH 08/16] Added .gitignore (v0.8) --- .gitignore | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1c5878a --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Python cache / Optimized files +__pycache__/ +*.py[cod] + +# Environment +.env +.venv +env/ +venv/ +ENV/ + +# PyCharm +.idea/ + +# Vs Code +.vscode/ + +# Config files / Databases +*.ini +*.db + +# Logs +*.log +logs/ \ No newline at end of file From 05d54696d26590b1cf73e2e1c3bfa7f40e85b01e Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 17:55:11 +0300 Subject: [PATCH 09/16] Docstrings adjusted (v0.8) --- cogs/admin.py | 48 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/cogs/admin.py b/cogs/admin.py index a325636..b0f4cc5 100644 --- a/cogs/admin.py +++ b/cogs/admin.py @@ -13,32 +13,52 @@ def __init__(self, client): @application_checks.is_owner() @nextcord.slash_command() - async def change_nickname(self, interaction, name: str = nextcord.SlashOption(default=None)): + async def change_nickname(self, interaction, nickname: str = nextcord.SlashOption(default=None, required=False)): """ [ADMIN] Change bot nickname. + + Parameters + ---------- + interaction: Interaction + nickname: str + Enter a new bot nickname. """ - await interaction.guild.me.edit(nick=name) + await interaction.guild.me.edit(nick=nickname) - if name: - return await interaction.send(f"Display name of bot has changed on **{name}**") + if nickname: + return await interaction.send(f"Display name of bot has changed on **{nickname}**") - elif name is None: + elif nickname is None: return await interaction.send(f"Nickname has cleared") @application_checks.is_owner() @nextcord.slash_command(guild_ids=(admin_guilds,)) - async def change_username(self, interaction, name: str = nextcord.SlashOption(default=None)): + async def change_username(self, interaction, username: str = nextcord.SlashOption(default=None, required=False)): """ [ADMIN] Change bot username. + + Parameters + ---------- + interaction: Interaction + username: str + Enter a new bot username. """ - await self.client.user.edit(username=name) - await interaction.send(f"Username of bot has changed on **{name}**") + await self.client.user.edit(username=username) + await interaction.send(f"Username of bot has changed on **{username}**") @application_checks.is_owner() @nextcord.slash_command() async def direct_message(self, interaction, user: nextcord.User, message: str): """ [ADMIN] Send direct message to selected user. + + Parameters + ---------- + interaction: Interaction + user: nextcord.User + Choose an user to dm. + message: str + Enter a message to send. """ try: await user.send(message) @@ -59,13 +79,19 @@ async def shutdown(self, interaction): @application_checks.is_owner() @nextcord.slash_command(guild_ids=(admin_guilds,)) - async def eval(self, interaction, content): + async def eval(self, interaction, expression: str): """ [ADMIN] Evaluates a Python expression. + + Parameters + ---------- + interaction: Interaction + expression: str + Enter an expression to evaluate. """ try: - embed = nextcord.Embed(description=content) - embed.add_field(name="Result", value=eval(content)) + embed = nextcord.Embed(description=expression) + embed.add_field(name="Result", value=eval(expression)) await interaction.send(embed=embed) except SyntaxError: From 942265b879c1fdee0cba8fdc17017264d6c2cc38 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 19:52:17 +0300 Subject: [PATCH 10/16] v0.8 --- cogs/utils/__init__.py | 3 ++- cogs/utils/github.py | 21 +++++++++++++++++++++ cogs/utils/version.py | 3 +++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 cogs/utils/github.py create mode 100644 cogs/utils/version.py diff --git a/cogs/utils/__init__.py b/cogs/utils/__init__.py index 4f7dbd9..f5868c4 100644 --- a/cogs/utils/__init__.py +++ b/cogs/utils/__init__.py @@ -1,2 +1,3 @@ from .dependecies import * -from .decorators import * \ No newline at end of file +from .decorators import * +from .github import * \ No newline at end of file diff --git a/cogs/utils/github.py b/cogs/utils/github.py new file mode 100644 index 0000000..e1a1c0c --- /dev/null +++ b/cogs/utils/github.py @@ -0,0 +1,21 @@ +import requests +from bs4 import BeautifulSoup + +def get_latest(): + response = requests.get("https://raw.githubusercontent.com/r-liner/discord-commands-bot/master/version.txt") + return response.text + +def check_for_updates(version): + latest = get_latest() + if latest > version: + return True + + return False + +def changelog(): + latest = get_latest() + response = requests.get(f"https://github.com/r-liner/discord-commands-bot/releases/tag/v{latest}") + soup = BeautifulSoup(response.text, "html.parser") + _changelog = soup.find("div", class_="markdown-body my-3").get_text() + + return _changelog \ No newline at end of file diff --git a/cogs/utils/version.py b/cogs/utils/version.py new file mode 100644 index 0000000..c3f278a --- /dev/null +++ b/cogs/utils/version.py @@ -0,0 +1,3 @@ +def get(): + with open("version.txt", "r", encoding="utf-8") as file: + return file.read() \ No newline at end of file From 5952fd43c8f82671362f84fdf68bd7a39228545e Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 19:54:47 +0300 Subject: [PATCH 11/16] Added update notifier (v0.8) --- main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 4079984..5987ac4 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,7 @@ import os import sys import configparser -from cogs.utils import dependecies +from cogs.utils import dependecies, github, version intents = nextcord.Intents.all() @@ -17,6 +17,11 @@ dependecies.check_installed() +if github.check_for_updates(version.get()): + latest = github.get_latest() + print(f"[GITHUB]: New update avaliable: v{latest}") + print(f"CHANGELOG:\n-----------\n{github.changelog()}-----------") + @client.event async def on_ready(): await client.change_presence(activity=nextcord.Activity(type=nextcord.ActivityType.watching, name="bot status")) From c5b76fca4f534fb67313c1682babb76074082066 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 19:56:43 +0300 Subject: [PATCH 12/16] Fixed typo (v0.8) --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 5987ac4..707e1c0 100644 --- a/main.py +++ b/main.py @@ -19,7 +19,7 @@ if github.check_for_updates(version.get()): latest = github.get_latest() - print(f"[GITHUB]: New update avaliable: v{latest}") + print(f"[GITHUB]: New update available: v{latest}") print(f"CHANGELOG:\n-----------\n{github.changelog()}-----------") @client.event From 507ae575f3a478416ebca4ba103c01fc7631f9e9 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 19:59:31 +0300 Subject: [PATCH 13/16] Fixed typo (v0.8) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ae76f02..e4fef1a 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ pip install -r requirements.txt ```sh git clone https://github.com/r-liner/discord-commands-bot ``` -3. Launch `setup.py` and complete setup procces. +3. Launch `setup.py` and complete setup process. 4. Done. Now you can launch the bot. ## Launch From 103c2727341b7b70ccbbce8bde4bfd2d5d4b8a47 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 20:35:25 +0300 Subject: [PATCH 14/16] v0.8.0 --- CHANGELOG.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0e2645..438e265 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,54 @@ # Discord Commands Bot - Changelog +## [v0.8.0](https://github.com/r-liner/discord-commands-bot/releases/tag/v0.8.0) (2024-02-14) + +[Full Changelog](https://github.com/r-liner/discord-commands-bot/compare/v0.7.8...v0.8.0) + +### Features +- Slash commands migration! +- **main.py:** added dependency checker, added update notifier +- **cogs/fun.py@Fun:weather:** command is inactive if no openweather token + +### New Files +- cogs/utils/ + - __init\__.py + - decorators.py + - dependecies.py + - github.py + - version.py +- .gitignore + +### Documentation +- **cogs/\*.py:** added docstrings to all functions +- **version.txt:** version bumped to 0.8.0 +- **README.md:** fixed typo + +### Chore +- **main.py:** fixed typo +- **requirements.txt:** updated dependencies + +## [v0.7.8](https://github.com/r-liner/discord-commands-bot/releases/tag/v0.7.8) (2024-02-13) + +[Full Changelog](https://github.com/r-liner/discord-commands-bot/compare/v0.7.7...v0.7.8) + +### Documentation +- **README.md:** fixed typos. Added link to changelog +- **config.yml:** added emoji to `name` +- **version.txt:** version bumber to 0.7.8 +- **CHANGELOG.md:** added v0.7.7 release notes, changelog adjusted + +### Tweak +- **start_win.bat:** compatibility with new Python version. Minor correction + +### Chore +- **config.ini.sample:** removed useless info + +### Bugfix +- **main.py:** moved universal exception handling to the end of the try-except block + + + + ## [v0.7.7](https://github.com/r-liner/discord-commands-bot/releases/tag/v0.7.7) (2024-02-12) [Full Changelog](https://github.com/r-liner/discord-commands-bot/compare/v0.7.6...v0.7.7) From c17fe43ec76b82f48ae31ee2741178e3feef30d0 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 20:36:09 +0300 Subject: [PATCH 15/16] Dependencies updated (v0.8.0) --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 7ed683e..1df9227 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,4 @@ nextcord==2.6.0 typing_extensions==4.9.0 psutil==5.9.8 requests==2.31.0 +beautifulsoup4==4.12.3 \ No newline at end of file From 5ba1661d2a5cf9aef83ab7549ddd681283741832 Mon Sep 17 00:00:00 2001 From: r-liner Date: Wed, 14 Feb 2024 20:36:41 +0300 Subject: [PATCH 16/16] v0.8.0 --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index ce609ca..8adc70f 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.8 \ No newline at end of file +0.8.0 \ No newline at end of file