Skip to content

Commit ccf3d37

Browse files
authored
Merge pull request #19 from r-liner/develop
v0.8.0
2 parents 794c9c3 + 5ba1661 commit ccf3d37

13 files changed

+222
-30
lines changed

.gitignore

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Python cache / Optimized files
2+
__pycache__/
3+
*.py[cod]
4+
5+
# Environment
6+
.env
7+
.venv
8+
env/
9+
venv/
10+
ENV/
11+
12+
# PyCharm
13+
.idea/
14+
15+
# Vs Code
16+
.vscode/
17+
18+
# Config files / Databases
19+
*.ini
20+
*.db
21+
22+
# Logs
23+
*.log
24+
logs/

CHANGELOG.md

+49
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,54 @@
11
# Discord Commands Bot - Changelog
22

3+
## [v0.8.0](https://github.com/r-liner/discord-commands-bot/releases/tag/v0.8.0) (2024-02-14)
4+
5+
[Full Changelog](https://github.com/r-liner/discord-commands-bot/compare/v0.7.8...v0.8.0)
6+
7+
### Features
8+
- Slash commands migration!
9+
- **main.py:** added dependency checker, added update notifier
10+
- **cogs/fun.py@Fun:weather:** command is inactive if no openweather token
11+
12+
### New Files
13+
- cogs/utils/
14+
- __init\__.py
15+
- decorators.py
16+
- dependecies.py
17+
- github.py
18+
- version.py
19+
- .gitignore
20+
21+
### Documentation
22+
- **cogs/\*.py:** added docstrings to all functions
23+
- **version.txt:** version bumped to 0.8.0
24+
- **README.md:** fixed typo
25+
26+
### Chore
27+
- **main.py:** fixed typo
28+
- **requirements.txt:** updated dependencies
29+
30+
## [v0.7.8](https://github.com/r-liner/discord-commands-bot/releases/tag/v0.7.8) (2024-02-13)
31+
32+
[Full Changelog](https://github.com/r-liner/discord-commands-bot/compare/v0.7.7...v0.7.8)
33+
34+
### Documentation
35+
- **README.md:** fixed typos. Added link to changelog
36+
- **config.yml:** added emoji to `name`
37+
- **version.txt:** version bumber to 0.7.8
38+
- **CHANGELOG.md:** added v0.7.7 release notes, changelog adjusted
39+
40+
### Tweak
41+
- **start_win.bat:** compatibility with new Python version. Minor correction
42+
43+
### Chore
44+
- **config.ini.sample:** removed useless info
45+
46+
### Bugfix
47+
- **main.py:** moved universal exception handling to the end of the try-except block
48+
49+
50+
51+
352
## [v0.7.7](https://github.com/r-liner/discord-commands-bot/releases/tag/v0.7.7) (2024-02-12)
453

554
[Full Changelog](https://github.com/r-liner/discord-commands-bot/compare/v0.7.6...v0.7.7)

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ pip install -r requirements.txt
9191
```sh
9292
git clone https://github.com/r-liner/discord-commands-bot
9393
```
94-
3. Launch `setup.py` and complete setup procces.
94+
3. Launch `setup.py` and complete setup process.
9595
4. Done. Now you can launch the bot.
9696

9797
## Launch

cogs/admin.py

+37-11
Original file line numberDiff line numberDiff line change
@@ -13,32 +13,52 @@ def __init__(self, client):
1313

1414
@application_checks.is_owner()
1515
@nextcord.slash_command()
16-
async def change_nickname(self, interaction, name: str = nextcord.SlashOption(default=None)):
16+
async def change_nickname(self, interaction, nickname: str = nextcord.SlashOption(default=None, required=False)):
1717
"""
1818
[ADMIN] Change bot nickname.
19+
20+
Parameters
21+
----------
22+
interaction: Interaction
23+
nickname: str
24+
Enter a new bot nickname.
1925
"""
20-
await interaction.guild.me.edit(nick=name)
26+
await interaction.guild.me.edit(nick=nickname)
2127

22-
if name:
23-
return await interaction.send(f"Display name of bot has changed on **{name}**")
28+
if nickname:
29+
return await interaction.send(f"Display name of bot has changed on **{nickname}**")
2430

25-
elif name is None:
31+
elif nickname is None:
2632
return await interaction.send(f"Nickname has cleared")
2733

2834
@application_checks.is_owner()
2935
@nextcord.slash_command(guild_ids=(admin_guilds,))
30-
async def change_username(self, interaction, name: str = nextcord.SlashOption(default=None)):
36+
async def change_username(self, interaction, username: str = nextcord.SlashOption(default=None, required=False)):
3137
"""
3238
[ADMIN] Change bot username.
39+
40+
Parameters
41+
----------
42+
interaction: Interaction
43+
username: str
44+
Enter a new bot username.
3345
"""
34-
await self.client.user.edit(username=name)
35-
await interaction.send(f"Username of bot has changed on **{name}**")
46+
await self.client.user.edit(username=username)
47+
await interaction.send(f"Username of bot has changed on **{username}**")
3648

3749
@application_checks.is_owner()
3850
@nextcord.slash_command()
3951
async def direct_message(self, interaction, user: nextcord.User, message: str):
4052
"""
4153
[ADMIN] Send direct message to selected user.
54+
55+
Parameters
56+
----------
57+
interaction: Interaction
58+
user: nextcord.User
59+
Choose an user to dm.
60+
message: str
61+
Enter a message to send.
4262
"""
4363
try:
4464
await user.send(message)
@@ -59,13 +79,19 @@ async def shutdown(self, interaction):
5979

6080
@application_checks.is_owner()
6181
@nextcord.slash_command(guild_ids=(admin_guilds,))
62-
async def eval(self, interaction, content):
82+
async def eval(self, interaction, expression: str):
6383
"""
6484
[ADMIN] Evaluates a Python expression.
85+
86+
Parameters
87+
----------
88+
interaction: Interaction
89+
expression: str
90+
Enter an expression to evaluate.
6591
"""
6692
try:
67-
embed = nextcord.Embed(description=content)
68-
embed.add_field(name="Result", value=eval(content))
93+
embed = nextcord.Embed(description=expression)
94+
embed.add_field(name="Result", value=eval(expression))
6995
await interaction.send(embed=embed)
7096

7197
except SyntaxError:

cogs/events.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ async def on_command_error(self, ctx, err: Exception):
2222

2323
@commands.Cog.listener()
2424
async def on_application_command_error(self, interaction, error: Exception):
25-
embed = nextcord.Embed(title="Error", colour=nextcord.Colors.light_red)
25+
embed = nextcord.Embed(title="Error", colour=nextcord.Color.red)
2626

2727
if isinstance(error, application_checks.errors.ApplicationMissingPermissions):
2828
embed.description = "You do not have permissions to perform this action."

cogs/fun.py

+31-8
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import math
1010
import configparser
1111

12-
from utils.decorators import is_weather_active
12+
from .utils import is_weather_active
1313

1414
config = configparser.ConfigParser()
1515
config.read("config.ini")
@@ -79,6 +79,12 @@ async def password(self, interaction, length: int = nextcord.SlashOption(min_val
7979
default=8)):
8080
"""
8181
Random password generator.
82+
83+
Parameters
84+
----------
85+
interaction: Interaction
86+
length: int
87+
Enter password length.
8288
"""
8389
password = ''.join(
8490
random.sample(string.ascii_lowercase + string.ascii_uppercase + string.digits + string.punctuation,
@@ -103,22 +109,33 @@ async def coin(self, interaction):
103109
await interaction.send(embed=embed)
104110

105111
@nextcord.slash_command()
106-
async def say(self, interaction, sentence):
112+
async def say(self, interaction, text: str):
107113
"""
108114
Say message as the bot.
115+
116+
Parameters
117+
----------
118+
interaction: Interaction
119+
text: str
120+
Enter a text to say.
109121
"""
110122
embed = nextcord.Embed(
111-
description=f'{sentence}',
123+
description=f'{text}',
112124
)
113125
await interaction.send(embed=embed)
114-
await interaction.message.delete()
115126

116127
@nextcord.slash_command()
117-
async def reverse(self, interaction, sentence):
128+
async def reverse(self, interaction, text: str):
118129
"""
119130
Reverse entered message.
131+
132+
Parameters
133+
----------
134+
interaction: Interaction
135+
text: str
136+
Enter a text to reverse.
120137
"""
121-
await interaction.send(f"{sentence[::-1]}")
138+
await interaction.send(f"{text[::-1]}")
122139

123140
@nextcord.slash_command()
124141
async def random(self, interaction,
@@ -137,11 +154,17 @@ async def random(self, interaction,
137154
embed.add_field(name="Result", value=f"{random.randint(first_num, second_num)}")
138155
await interaction.send(embed=embed)
139156

140-
@is_weather_active()
157+
@is_weather_active
141158
@nextcord.slash_command()
142-
async def weather(self, interaction, _city):
159+
async def weather(self, interaction, _city = nextcord.SlashOption(name="city")):
143160
"""
144161
Get a weather forecast in certain city.
162+
163+
Parameters
164+
----------
165+
interaction: Interaction
166+
_city: str
167+
Enter a city to get weather forecast.
145168
"""
146169
try:
147170
ow_token = config["bot"]["openweather_token"]

cogs/moderation.py

+40-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ async def unlock(self, interaction):
4949
async def ban(self, interaction, member: Member, reason: str = nextcord.SlashOption(default="No reason.")):
5050
"""
5151
Ban a certain user.
52+
53+
Parameters
54+
----------
55+
interaction: Interaction
56+
member: int
57+
Choose an user.
58+
reason: str
59+
Type a reason.
5260
"""
5361
embed = nextcord.Embed(title='Ban', colour=nextcord.Colors.light_red)
5462

@@ -73,7 +81,18 @@ async def ban(self, interaction, member: Member, reason: str = nextcord.SlashOpt
7381

7482
@application_checks.has_permissions(administrator=True)
7583
@nextcord.slash_command()
76-
async def unban(self, interaction, member, reason: str = nextcord.SlashOption(default="No reason.")):
84+
async def unban(self, interaction, member: nextcord.Member, reason: str = nextcord.SlashOption(default="No reason.")):
85+
"""
86+
Ban a certain user.
87+
88+
Parameters
89+
----------
90+
interaction: Interaction
91+
member: nextcord.Member
92+
Choose an user.
93+
reason: str
94+
Type a reason.
95+
"""
7796
banned_users = await interaction.guild.fetch_ban(user=member)
7897

7998
embed = nextcord.Embed(title='Unban')
@@ -109,6 +128,17 @@ async def unban(self, interaction, member, reason: str = nextcord.SlashOption(de
109128
@application_checks.has_permissions(kick_members=True)
110129
@nextcord.slash_command()
111130
async def kick(self, interaction, member: nextcord.Member, reason: str = nextcord.SlashOption(default="No reason.")):
131+
"""
132+
Kick an user.
133+
134+
Parameters
135+
----------
136+
interaction: Interaction
137+
member: nextcord.Member
138+
Choose an user.
139+
reason: str
140+
Type a reason.
141+
"""
112142
embed = nextcord.Embed(title='Kick')
113143

114144
if interaction.user.id == member.id:
@@ -136,6 +166,15 @@ async def kick(self, interaction, member: nextcord.Member, reason: str = nextcor
136166
@application_checks.has_permissions(manage_messages=True)
137167
@nextcord.slash_command()
138168
async def clear(self, interaction, amount: int = nextcord.SlashOption(min_value=1, max_value=100)):
169+
"""
170+
Kick an user.
171+
172+
Parameters
173+
----------
174+
interaction: Interaction
175+
member: int
176+
Type a count of messages to delete.
177+
"""
139178
deleted = await interaction.channel.purge(limit=amount)
140179

141180
msg = await interaction.send(f'Messages deleted: **{len(deleted)}**')

cogs/utils/__init__.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
from .dependecies import *
2-
from .decorators import *
2+
from .decorators import *
3+
from .github import *

cogs/utils/github.py

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import requests
2+
from bs4 import BeautifulSoup
3+
4+
def get_latest():
5+
response = requests.get("https://raw.githubusercontent.com/r-liner/discord-commands-bot/master/version.txt")
6+
return response.text
7+
8+
def check_for_updates(version):
9+
latest = get_latest()
10+
if latest > version:
11+
return True
12+
13+
return False
14+
15+
def changelog():
16+
latest = get_latest()
17+
response = requests.get(f"https://github.com/r-liner/discord-commands-bot/releases/tag/v{latest}")
18+
soup = BeautifulSoup(response.text, "html.parser")
19+
_changelog = soup.find("div", class_="markdown-body my-3").get_text()
20+
21+
return _changelog

cogs/utils/version.py

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
def get():
2+
with open("version.txt", "r", encoding="utf-8") as file:
3+
return file.read()

main.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import os
55
import sys
66
import configparser
7-
from .cogs.utils import dependecies
7+
from cogs.utils import dependecies, github, version
88

99
intents = nextcord.Intents.all()
1010

@@ -17,6 +17,11 @@
1717

1818
dependecies.check_installed()
1919

20+
if github.check_for_updates(version.get()):
21+
latest = github.get_latest()
22+
print(f"[GITHUB]: New update available: v{latest}")
23+
print(f"CHANGELOG:\n-----------\n{github.changelog()}-----------")
24+
2025
@client.event
2126
async def on_ready():
2227
await client.change_presence(activity=nextcord.Activity(type=nextcord.ActivityType.watching, name="bot status"))

0 commit comments

Comments
 (0)