easterobot 1.1.0__py3-none-any.whl → 1.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,10 +5,10 @@ import functools
5
5
  import logging
6
6
  from collections.abc import Coroutine
7
7
  from time import time
8
- from typing import Any, Callable, TypeVar, Union, cast
8
+ from typing import Any, Callable, Optional, TypeVar, Union, cast
9
9
 
10
10
  import discord
11
- from discord import app_commands
11
+ from discord import Permissions, app_commands
12
12
  from sqlalchemy import and_, delete
13
13
  from sqlalchemy.ext.asyncio import AsyncSession
14
14
  from typing_extensions import Concatenate, ParamSpec
@@ -54,19 +54,22 @@ Interaction = discord.Interaction[Easterobot]
54
54
  Coro = Coroutine[Any, Any, T]
55
55
 
56
56
 
57
- def controlled_command(
58
- *, cooldown: bool = True, **perms: bool
57
+ def controlled_command( # noqa: C901, PLR0915
58
+ *,
59
+ cooldown: bool = True,
60
+ channel_permissions: Optional[dict[str, bool]] = None,
61
+ **perms: bool,
59
62
  ) -> Callable[
60
63
  [Callable[Concatenate[Context, P], Coro[None]]],
61
64
  Callable[Concatenate[Interaction, P], Coro[None]],
62
65
  ]:
63
66
  """Add a cooldown and permission check."""
64
67
 
65
- def decorator(
68
+ def decorator( # noqa: C901
66
69
  f: Callable[Concatenate[Context, P], Coro[None]],
67
70
  ) -> Callable[Concatenate[Interaction, P], Coro[None]]:
68
71
  @functools.wraps(f)
69
- async def decorated(
72
+ async def decorated( # noqa: C901, PLR0911, PLR0912
70
73
  interaction: Interaction, *args: P.args, **kwargs: P.kwargs
71
74
  ) -> None:
72
75
  # Check if interaction is valid
@@ -91,6 +94,28 @@ def controlled_command(
91
94
  logger.warning("No channel provided %s", interaction)
92
95
  return
93
96
 
97
+ # Check bot can speak
98
+ if channel_permissions:
99
+ client_perms = discord.Permissions()
100
+ if interaction.client.user:
101
+ client_member = interaction.guild.get_member(
102
+ interaction.client.user.id
103
+ )
104
+ if client_member is not None:
105
+ client_perms = interaction.channel.permissions_for(
106
+ client_member
107
+ )
108
+ needed_channel_perms = Permissions(**channel_permissions)
109
+ if not client_perms.is_superset(needed_channel_perms):
110
+ logger.warning(
111
+ "%s failed for wrong channel permissions", event_repr
112
+ )
113
+ await interaction.response.send_message(
114
+ "Le bot n'a pas la permission",
115
+ ephemeral=True,
116
+ )
117
+ return
118
+
94
119
  # Compute needed permissions
95
120
  needed_perms = discord.Permissions(**perms)
96
121
  have_perms = interaction.user.guild_permissions.is_superset(
@@ -11,7 +11,11 @@ from .base import Context, controlled_command, egg_command_group
11
11
  @egg_command_group.command(
12
12
  name="enable", description="Activer la chasse dans le salon"
13
13
  )
14
- @controlled_command(cooldown=True, manage_channels=True)
14
+ @controlled_command(
15
+ cooldown=True,
16
+ channel_permissions={"send_messages": True},
17
+ manage_channels=True,
18
+ )
15
19
  async def enable_command(
16
20
  ctx: Context,
17
21
  ) -> None:
@@ -150,7 +150,7 @@ async def game_dual( # noqa: C901, D103, PLR0912
150
150
  @egg_command_group.command(
151
151
  name="connect4", description="Lancer une partie de puissance 4."
152
152
  )
153
- @controlled_command(cooldown=True)
153
+ @controlled_command(cooldown=True, channel_permissions={"send_messages": True})
154
154
  async def connect4_command(
155
155
  ctx: Context,
156
156
  member: Optional[discord.Member] = None,
@@ -22,7 +22,7 @@ logger = logging.getLogger("easterobot")
22
22
 
23
23
 
24
24
  @egg_command_group.command(name="search", description="Rechercher un œuf")
25
- @controlled_command(cooldown=True)
25
+ @controlled_command(cooldown=True, channel_permissions={"send_messages": True})
26
26
  async def search_command(ctx: Context) -> None:
27
27
  """Search command."""
28
28
  async with AsyncSession(ctx.client.engine) as session:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: easterobot
3
- Version: 1.1.0
3
+ Version: 1.1.1
4
4
  Summary: Discord bot for Easter.
5
5
  Project-URL: Homepage, https://github.com/Dashstrom/easterobot
6
6
  Project-URL: Repository, https://github.com/Dashstrom/easterobot
@@ -12,15 +12,15 @@ easterobot/alembic/script.py.mako,sha256=3qBrHBf7F7ChKDUIdiNItiSXrDpgQdM7sR0YKzp
12
12
  easterobot/alembic/versions/2f0d4305e320_init_database.py,sha256=Y8pkYG_8i3jymbTxg5ANaaShpadPo5J2TUp2ZSKxffM,2245
13
13
  easterobot/alembic/versions/940c3b9c702d_add_lock_on_eggs.py,sha256=lGGjeXzrHgRAP-i4kfMh6841EcOr3y8D1PRWaMV7ozA,943
14
14
  easterobot/commands/__init__.py,sha256=vzVx4DrveAKl4c71VRMvQjzrWzuWmayAkd0f4k7JNt4,1026
15
- easterobot/commands/base.py,sha256=j2OdmwnSphkDJUNF6ArNn3I8BqwK4Sn7IuCDDtH1yFw,5906
15
+ easterobot/commands/base.py,sha256=_P6xsre6gDdS4h2-DXfhpLBgYW774eHOSc0p6iLv7iY,7054
16
16
  easterobot/commands/basket.py,sha256=sV6JfPxg4U98dTTA5tr1wnMVM5DI9UXGL6FWL9OphTw,2924
17
17
  easterobot/commands/disable.py,sha256=qjgLRQZUXK9toq-vJdE6qOYX5Pxb9wjIyvWrKJ22GAo,970
18
18
  easterobot/commands/edit.py,sha256=QfQJoLKl3ox6evA4D_Bt8BMqT_M5w5b7z7-Rk9JXIK8,2134
19
- easterobot/commands/enable.py,sha256=IRIwIHgZS3kz60CCfQBR8sBRs25CEyvxYewsTW--TrI,1034
20
- easterobot/commands/game.py,sha256=5idVI7WOsBlYCWXYGPtwRC6rVX5PuaKrIoqrvhFFWTs,5996
19
+ easterobot/commands/enable.py,sha256=bgoXg7vVThmbJBt4Q2H9R-gWGBmyjWbu18xl_-gcTI8,1094
20
+ easterobot/commands/game.py,sha256=q1C34Grd_rNt6YfbTp-bU2HcdvQRX3mMiBRc2aytrTY,6041
21
21
  easterobot/commands/help.py,sha256=KquNRRgUStMuu4w26icYgSF4K-HJNLl96ZNbEg3as3U,1082
22
22
  easterobot/commands/reset.py,sha256=B_dTUawmXWBgbJkAyYYkyw_QjAvqvPoGTXLzUtLFPAc,3748
23
- easterobot/commands/search.py,sha256=WE7w18vPNDlWgpoj-RIZZZqGBMLjvQoygex79iPFZJU,4345
23
+ easterobot/commands/search.py,sha256=7rQGL7d7ftKqXvJdRPEpZeUcF72lf_b15vtXQkI3igM,4390
24
24
  easterobot/commands/top.py,sha256=qjtRtvBKeKq228nRm_RYLY8HMrnz3n_fteBlr4WCpG0,3017
25
25
  easterobot/games/__init__.py,sha256=WHqTEE4OW1kwOZlzQslkXYMf38nDX5gT01zsgDAr80g,259
26
26
  easterobot/games/connect.py,sha256=tEwYv5nuSF_wbc4wqhizYnX5LcLwygylAskD7604kZo,6397
@@ -59,8 +59,8 @@ easterobot/resources/emotes/icons/arrow.png,sha256=ZkAicY2AONJUQRTdvkG77wPO5EYE9
59
59
  easterobot/resources/emotes/icons/end.png,sha256=8jkufw0aS99tyZCb80PUzT2mkipQrYxwuFOFmOH6UNk,24526
60
60
  easterobot/resources/emotes/icons/versus.png,sha256=Ss9PZu4nENB7xo8Kdunt0STvCSrMbo-bTaYz-NJ8tfI,29212
61
61
  easterobot/resources/emotes/icons/wait.png,sha256=xXK6bKtPpD1f5wSjMGqzuPzVdV4gkOgMSJ_fVjuzJp4,20378
62
- easterobot-1.1.0.dist-info/METADATA,sha256=SAZsbRjw-Akcp2ypf7U9pVkW9FquARz7cjUAbBNxBfY,7467
63
- easterobot-1.1.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
64
- easterobot-1.1.0.dist-info/entry_points.txt,sha256=KaH17cNnu7qbWxFcMaj1wZ9GPTjWJ1OTqkBMhoLOmCQ,57
65
- easterobot-1.1.0.dist-info/licenses/LICENSE,sha256=kYRz570GVPktzhJxWtaencsrsjdKSetpe5WISlDrvnY,1093
66
- easterobot-1.1.0.dist-info/RECORD,,
62
+ easterobot-1.1.1.dist-info/METADATA,sha256=wHgO2um5ocgHwFIOFA4lqQmZhu_JJpwrrm_P4BiAwx8,7467
63
+ easterobot-1.1.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
64
+ easterobot-1.1.1.dist-info/entry_points.txt,sha256=KaH17cNnu7qbWxFcMaj1wZ9GPTjWJ1OTqkBMhoLOmCQ,57
65
+ easterobot-1.1.1.dist-info/licenses/LICENSE,sha256=kYRz570GVPktzhJxWtaencsrsjdKSetpe5WISlDrvnY,1093
66
+ easterobot-1.1.1.dist-info/RECORD,,