easterobot 1.1.0__tar.gz → 1.1.1__tar.gz
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.
- {easterobot-1.1.0 → easterobot-1.1.1}/PKG-INFO +1 -1
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/base.py +31 -6
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/enable.py +5 -1
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/game.py +1 -1
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/search.py +1 -1
- {easterobot-1.1.0 → easterobot-1.1.1}/pyproject.toml +1 -1
- {easterobot-1.1.0 → easterobot-1.1.1}/uv.lock +1 -1
- {easterobot-1.1.0 → easterobot-1.1.1}/.dockerignore +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.editorconfig +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.github/actions/setup-project/action.yml +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.github/workflows/docs.yml +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.github/workflows/lint.yml +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.github/workflows/publish.yml +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.github/workflows/tests.yml +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.gitignore +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.pre-commit-config.yaml +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.vscode/extensions.json +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.vscode/ltex.dictionary.en-US.txt +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.vscode/ltex.hiddenFalsePositives.en-US.txt +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/.vscode/settings.json +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/Dockerfile +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/LICENSE +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/README.rst +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/conftest.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/docker-compose.yml +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/docs/conf.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/docs/index.rst +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/docs/references.rst +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/docs/resources/favicon.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/__init__.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/__main__.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/alembic/env.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/alembic/script.py.mako +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/alembic/versions/2f0d4305e320_init_database.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/alembic/versions/940c3b9c702d_add_lock_on_eggs.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/bot.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/cli.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/__init__.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/basket.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/disable.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/edit.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/help.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/reset.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/top.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/config.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/games/__init__.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/games/connect.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/games/game.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/games/rock_paper_scissor.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/games/tic_tac_toe.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/hunts/__init__.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/hunts/hunt.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/hunts/rank.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/info.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/logger.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/models.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/py.typed +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/alembic.ini +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/config.example.yml +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/credits.txt +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_01.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_02.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_03.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_04.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_05.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_06.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_07.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_08.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_09.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_10.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_11.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_12.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_13.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_14.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_15.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_16.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_17.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_18.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_19.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_20.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/icons/arrow.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/icons/end.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/icons/versus.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/icons/wait.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/logging.conf +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/logo.png +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/entrypoint.sh +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/tests/__init__.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/tests/test_cli.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/tests/test_config.py +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/tools/chatgpt.txt +0 -0
- {easterobot-1.1.0 → easterobot-1.1.1}/tools/cropping.py +0 -0
@@ -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
|
-
*,
|
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(
|
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:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{easterobot-1.1.0 → easterobot-1.1.1}/easterobot/alembic/versions/2f0d4305e320_init_database.py
RENAMED
File without changes
|
{easterobot-1.1.0 → easterobot-1.1.1}/easterobot/alembic/versions/940c3b9c702d_add_lock_on_eggs.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|