Skip to content

Commit 4b420c7

Browse files
authored
Merge pull request #23 from pythonplayer123/improve-tags
improved tags
2 parents fad5e1c + cf50027 commit 4b420c7

File tree

10 files changed

+681
-107
lines changed

10 files changed

+681
-107
lines changed

.github/workflows/lint.yml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
uses: actions/setup-python@v4
2121
id: cp311
2222
with:
23-
python-version: 3.11
23+
python-version: 3.12
2424

2525
- name: Cache Dependencies
2626
uses: actions/cache@v3
@@ -34,8 +34,11 @@ jobs:
3434
run: |
3535
pip install .[dev]
3636
37-
- name: Run Linter
38-
run: pylint src
37+
- uses: chartboost/ruff-action@v1
38+
39+
- uses: chartboost/ruff-action@v1
40+
with:
41+
args: 'format --check'
3942

4043
- name: Run mypy
4144
run: mypy src/SideBot

pyproject.toml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ readme = "README.md"
99
requires-python = ">=3.12"
1010
dependencies = [
1111
"discord.py>=2.3.2",
12-
"psycopg2==2.9.9",
12+
"asyncpg>=0.29.0",
1313
]
1414
classifiers = [
1515
"Programming Language :: Python :: 3",
@@ -18,11 +18,11 @@ classifiers = [
1818

1919
[project.optional-dependencies]
2020
dev = [
21-
"build",
22-
"pylint",
23-
"mypy",
24-
"ruff",
25-
"types-psycopg2",
21+
"build>=1.2.1",
22+
"pylint>=3.1.0",
23+
"asyncpg-stubs>=0.29.1",
24+
"mypy>=1.9.0",
25+
"ruff>=0.3.7",
2626
"pyannotate>=1.2.0",
2727
]
2828

ruff.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ target-version = "py311"
3737
[lint]
3838
# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default.
3939
select = ["ALL"]
40-
ignore = ["N999", "ANN101", "ANN102"]
40+
ignore = ["N999", "ANN101", "ANN102", "ANN401", "PLR0913"]
4141

4242
# Allow fix for all enabled rules (when `--fix`) is provided.
4343
fixable = ["ALL"]

src/SideBot/__init__.py

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
import pathlib
66
import typing
77

8+
import asyncpg
89
import discord
9-
import psycopg2
1010
from discord.ext import commands
1111
from discord.ext.commands import AutoShardedBot, Bot, when_mentioned_or
1212

13+
from .utils import ButtonLink, DiscordUser
14+
1315

1416
class SideBot(Bot):
1517
"""Custom SideBot class to simplify start up."""
@@ -22,15 +24,17 @@ def __init__(self, config: dict[str, str]) -> None:
2224

2325
intents = discord.Intents.all()
2426

25-
super().__init__(command_prefix=when_mentioned_or("##"), intents=intents)
27+
super().__init__(
28+
command_prefix=when_mentioned_or("##"),
29+
intents=intents,
30+
)
2631

2732
self.owner_id = int(self.config["OWNER"])
2833
self.conf_cogs = self.config["COGS"].split(",")
29-
self.connection = self.setup_connection()
3034

31-
def setup_connection(self) -> psycopg2.extensions.connection:
35+
async def setup_connection(self) -> asyncpg.Connection:
3236
"""Set up the database connection."""
33-
return psycopg2.connect(self.config["DATABASE_URL"])
37+
return await asyncpg.connect(self.config["DATABASE_URL"])
3438

3539
async def setup_hook(self) -> None:
3640
"""Set up cogs and app commands."""
@@ -43,12 +47,36 @@ async def setup_hook(self) -> None:
4347
async def on_ready(self) -> None:
4448
"""Handle bot ready status."""
4549
if self.user:
46-
self.logger.info("Logged in as %s (ID: %s)", self.user, self.user.id)
50+
self.logger.info(
51+
"Logged in as %s (ID: %s)",
52+
self.user,
53+
self.user.id,
54+
)
55+
self.connection: asyncpg.Connection = await self.setup_connection()
56+
57+
await self.connection.set_type_codec(
58+
"discorduser",
59+
encoder=DiscordUser.to_tuple,
60+
decoder=DiscordUser.from_tuple,
61+
format="tuple",
62+
)
63+
64+
await self.connection.set_type_codec(
65+
"buttonlink",
66+
encoder=ButtonLink.to_tuple,
67+
decoder=ButtonLink.from_tuple,
68+
format="tuple",
69+
)
70+
4771
else:
4872
self.logger.error("Error getting user")
4973

5074
# pylint: disable=W0221
51-
async def on_command_error(self, ctx: commands.Context[Bot | AutoShardedBot], error: Exception) -> None:
75+
async def on_command_error(
76+
self,
77+
ctx: commands.Context[Bot | AutoShardedBot],
78+
error: Exception,
79+
) -> None:
5280
"""Handle unhandled command errors."""
5381
self.logger.error(ctx)
5482
self.logger.error(error)
@@ -61,8 +89,8 @@ def run(
6189
) -> None:
6290
"""Run the bot with the given token."""
6391
if token:
64-
return super().run(token, root_logger=True, *args, **kwargs)
65-
return super().run(self.__tok, root_logger=True, *args, **kwargs)
92+
return super().run(token, *args, root_logger=True, **kwargs)
93+
return super().run(self.__tok, *args, root_logger=True, **kwargs)
6694

6795
@classmethod
6896
def from_env(cls, path: str = ".env") -> "SideBot":

src/SideBot/cogs/admin.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import discord
77
from discord import Interaction, Member, Message, TextChannel
8-
from discord.app_commands import default_permissions, command, describe, errors
8+
from discord.app_commands import command, default_permissions, describe, errors
99
from discord.ext import tasks
1010
from discord.ext.commands import Bot
1111

@@ -81,7 +81,12 @@ def __init__(self, bot: Bot, channels_max: int = 4) -> None:
8181
@describe(count="Amount of messages to delete")
8282
@describe(member="The member to delete the messages from")
8383
@default_permissions(manage_messages=True)
84-
async def clean(self, inter: Interaction, count: int, member: Member | None = None) -> None:
84+
async def clean(
85+
self,
86+
inter: Interaction,
87+
count: int,
88+
member: Member | None = None,
89+
) -> None:
8590
"""Clean `count` messages from optional `member` in the channel it's used."""
8691
if not isinstance(inter.channel, TextChannel):
8792
return await inter.response.send_message(
@@ -106,7 +111,11 @@ async def clean(self, inter: Interaction, count: int, member: Member | None = No
106111
return None
107112

108113
@clean.error
109-
async def app_command_error(self, inter: Interaction, err: errors.AppCommandError) -> None:
114+
async def app_command_error(
115+
self,
116+
inter: Interaction,
117+
err: errors.AppCommandError,
118+
) -> None:
110119
"""Handle app command errors."""
111120
if isinstance(err, errors.MissingPermissions):
112121
return await inter.response.send_message(
@@ -131,7 +140,12 @@ async def on_message(self, message: Message) -> None:
131140
self.spammers.append(
132141
SpamUser(
133142
message.author.id,
134-
[SpamChannel(message.channel.id, [SpamMessage(message.id)])],
143+
[
144+
SpamChannel(
145+
message.channel.id,
146+
[SpamMessage(message.id)],
147+
),
148+
],
135149
),
136150
)
137151
return

src/SideBot/cogs/developer.py

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ def __init__(self, bot: Bot) -> None:
3030
super().__init__(bot)
3131
self.description = "This is for ny only"
3232

33-
async def cog_before_invoke(self, ctx: commands.Context[Bot | AutoShardedBot]) -> None:
33+
async def cog_before_invoke(
34+
self,
35+
ctx: commands.Context[Bot | AutoShardedBot],
36+
) -> None:
3437
"""Delete text command messages."""
3538
try:
3639
await ctx.message.delete()
@@ -48,13 +51,19 @@ async def load(self, inter: Interaction, cog: str) -> None:
4851
"""Load `cog`'s extension into the bot."""
4952
try:
5053
await self.bot.load_extension(f"SideBot.cogs.{cog}")
51-
return await inter.response.send_message(f"Loaded {cog}!", ephemeral=True)
54+
return await inter.response.send_message(
55+
f"Loaded {cog}!",
56+
ephemeral=True,
57+
)
5258
except (ExtensionAlreadyLoaded, ExtensionNotFound) as err:
5359
if isinstance(err, ExtensionAlreadyLoaded):
5460
msg = f"{cog} is already loaded!"
5561
else:
5662
msg = f"{cog} could not be found!"
57-
return await inter.response.send_message(f"{msg}\n{err}", ephemeral=True)
63+
return await inter.response.send_message(
64+
f"{msg}\n{err}",
65+
ephemeral=True,
66+
)
5867
except Exception as err: # pylint: disable=W0718 # noqa: BLE001
5968
return await inter.response.send_message(
6069
f"Failed to load {cog}!\n{err}",
@@ -71,7 +80,10 @@ async def unload(self, inter: Interaction, cog: str) -> None:
7180
)
7281
try:
7382
await self.bot.unload_extension(f"SideBot.cogs.{cog}")
74-
return await inter.response.send_message(f"Unloaded {cog}!", ephemeral=True)
83+
return await inter.response.send_message(
84+
f"Unloaded {cog}!",
85+
ephemeral=True,
86+
)
7587
except ExtensionNotLoaded:
7688
return await inter.response.send_message(
7789
f"Failed to unload non-loaded {cog}!",
@@ -85,7 +97,10 @@ async def reload(self, inter: Interaction, cog: str) -> None:
8597
"""Reload `cog`'s extension file."""
8698
try:
8799
await self.bot.reload_extension(f"SideBot.cogs.{cog}")
88-
return await inter.response.send_message(f"Reloaded {cog}!", ephemeral=True)
100+
return await inter.response.send_message(
101+
f"Reloaded {cog}!",
102+
ephemeral=True,
103+
)
89104
except (ExtensionNotLoaded, ExtensionNotFound) as err:
90105
if isinstance(err, ExtensionNotLoaded):
91106
msg = f"Cannot reload {cog}! Did you forget to /load it?"
@@ -142,12 +157,19 @@ async def sync(
142157
else:
143158
ret += 1
144159

145-
await ctx.send(f"Synced the tree to {ret}/{len(guilds)}.", delete_after=5)
160+
await ctx.send(
161+
f"Synced the tree to {ret}/{len(guilds)}.",
162+
delete_after=5,
163+
)
146164

147165
@load.error
148166
@unload.error
149167
@reload.error
150-
async def app_command_error(self, inter: Interaction, err: errors.AppCommandError) -> None:
168+
async def app_command_error(
169+
self,
170+
inter: Interaction,
171+
err: errors.AppCommandError,
172+
) -> None:
151173
"""Handle app command errors."""
152174
if isinstance(err, errors.CheckFailure):
153175
if self.bot.owner_id != inter.user.id:

0 commit comments

Comments
 (0)