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.
Files changed (92) hide show
  1. {easterobot-1.1.0 → easterobot-1.1.1}/PKG-INFO +1 -1
  2. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/base.py +31 -6
  3. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/enable.py +5 -1
  4. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/game.py +1 -1
  5. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/search.py +1 -1
  6. {easterobot-1.1.0 → easterobot-1.1.1}/pyproject.toml +1 -1
  7. {easterobot-1.1.0 → easterobot-1.1.1}/uv.lock +1 -1
  8. {easterobot-1.1.0 → easterobot-1.1.1}/.dockerignore +0 -0
  9. {easterobot-1.1.0 → easterobot-1.1.1}/.editorconfig +0 -0
  10. {easterobot-1.1.0 → easterobot-1.1.1}/.github/actions/setup-project/action.yml +0 -0
  11. {easterobot-1.1.0 → easterobot-1.1.1}/.github/workflows/docs.yml +0 -0
  12. {easterobot-1.1.0 → easterobot-1.1.1}/.github/workflows/lint.yml +0 -0
  13. {easterobot-1.1.0 → easterobot-1.1.1}/.github/workflows/publish.yml +0 -0
  14. {easterobot-1.1.0 → easterobot-1.1.1}/.github/workflows/tests.yml +0 -0
  15. {easterobot-1.1.0 → easterobot-1.1.1}/.gitignore +0 -0
  16. {easterobot-1.1.0 → easterobot-1.1.1}/.pre-commit-config.yaml +0 -0
  17. {easterobot-1.1.0 → easterobot-1.1.1}/.vscode/extensions.json +0 -0
  18. {easterobot-1.1.0 → easterobot-1.1.1}/.vscode/ltex.dictionary.en-US.txt +0 -0
  19. {easterobot-1.1.0 → easterobot-1.1.1}/.vscode/ltex.hiddenFalsePositives.en-US.txt +0 -0
  20. {easterobot-1.1.0 → easterobot-1.1.1}/.vscode/settings.json +0 -0
  21. {easterobot-1.1.0 → easterobot-1.1.1}/Dockerfile +0 -0
  22. {easterobot-1.1.0 → easterobot-1.1.1}/LICENSE +0 -0
  23. {easterobot-1.1.0 → easterobot-1.1.1}/README.rst +0 -0
  24. {easterobot-1.1.0 → easterobot-1.1.1}/conftest.py +0 -0
  25. {easterobot-1.1.0 → easterobot-1.1.1}/docker-compose.yml +0 -0
  26. {easterobot-1.1.0 → easterobot-1.1.1}/docs/conf.py +0 -0
  27. {easterobot-1.1.0 → easterobot-1.1.1}/docs/index.rst +0 -0
  28. {easterobot-1.1.0 → easterobot-1.1.1}/docs/references.rst +0 -0
  29. {easterobot-1.1.0 → easterobot-1.1.1}/docs/resources/favicon.png +0 -0
  30. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/__init__.py +0 -0
  31. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/__main__.py +0 -0
  32. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/alembic/env.py +0 -0
  33. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/alembic/script.py.mako +0 -0
  34. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/alembic/versions/2f0d4305e320_init_database.py +0 -0
  35. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/alembic/versions/940c3b9c702d_add_lock_on_eggs.py +0 -0
  36. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/bot.py +0 -0
  37. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/cli.py +0 -0
  38. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/__init__.py +0 -0
  39. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/basket.py +0 -0
  40. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/disable.py +0 -0
  41. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/edit.py +0 -0
  42. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/help.py +0 -0
  43. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/reset.py +0 -0
  44. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/commands/top.py +0 -0
  45. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/config.py +0 -0
  46. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/games/__init__.py +0 -0
  47. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/games/connect.py +0 -0
  48. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/games/game.py +0 -0
  49. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/games/rock_paper_scissor.py +0 -0
  50. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/games/tic_tac_toe.py +0 -0
  51. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/hunts/__init__.py +0 -0
  52. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/hunts/hunt.py +0 -0
  53. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/hunts/rank.py +0 -0
  54. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/info.py +0 -0
  55. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/logger.py +0 -0
  56. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/models.py +0 -0
  57. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/py.typed +0 -0
  58. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/alembic.ini +0 -0
  59. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/config.example.yml +0 -0
  60. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/credits.txt +0 -0
  61. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_01.png +0 -0
  62. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_02.png +0 -0
  63. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_03.png +0 -0
  64. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_04.png +0 -0
  65. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_05.png +0 -0
  66. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_06.png +0 -0
  67. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_07.png +0 -0
  68. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_08.png +0 -0
  69. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_09.png +0 -0
  70. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_10.png +0 -0
  71. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_11.png +0 -0
  72. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_12.png +0 -0
  73. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_13.png +0 -0
  74. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_14.png +0 -0
  75. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_15.png +0 -0
  76. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_16.png +0 -0
  77. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_17.png +0 -0
  78. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_18.png +0 -0
  79. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_19.png +0 -0
  80. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/eggs/egg_20.png +0 -0
  81. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/icons/arrow.png +0 -0
  82. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/icons/end.png +0 -0
  83. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/icons/versus.png +0 -0
  84. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/emotes/icons/wait.png +0 -0
  85. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/logging.conf +0 -0
  86. {easterobot-1.1.0 → easterobot-1.1.1}/easterobot/resources/logo.png +0 -0
  87. {easterobot-1.1.0 → easterobot-1.1.1}/entrypoint.sh +0 -0
  88. {easterobot-1.1.0 → easterobot-1.1.1}/tests/__init__.py +0 -0
  89. {easterobot-1.1.0 → easterobot-1.1.1}/tests/test_cli.py +0 -0
  90. {easterobot-1.1.0 → easterobot-1.1.1}/tests/test_config.py +0 -0
  91. {easterobot-1.1.0 → easterobot-1.1.1}/tools/chatgpt.txt +0 -0
  92. {easterobot-1.1.0 → easterobot-1.1.1}/tools/cropping.py +0 -0
@@ -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
@@ -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
  [project]
2
2
  name = "easterobot"
3
- version = "1.1.0"
3
+ version = "1.1.1"
4
4
  description = "Discord bot for Easter."
5
5
  authors = [
6
6
  { name = "Dashstrom", email = "dashstrom.pro@gmail.com" }
@@ -541,7 +541,7 @@ wheels = [
541
541
 
542
542
  [[package]]
543
543
  name = "easterobot"
544
- version = "1.1.0"
544
+ version = "1.1.1"
545
545
  source = { editable = "." }
546
546
  dependencies = [
547
547
  { name = "aiosqlite" },
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