dshellInterpreter 0.2.21.7__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.
Files changed (34) hide show
  1. Dshell/DISCORD_COMMANDS/__init__.py +7 -0
  2. Dshell/DISCORD_COMMANDS/dshell_channel.py +612 -0
  3. Dshell/DISCORD_COMMANDS/dshell_interaction.py +89 -0
  4. Dshell/DISCORD_COMMANDS/dshell_member.py +274 -0
  5. Dshell/DISCORD_COMMANDS/dshell_message.py +444 -0
  6. Dshell/DISCORD_COMMANDS/dshell_pastbin.py +28 -0
  7. Dshell/DISCORD_COMMANDS/dshell_role.py +128 -0
  8. Dshell/DISCORD_COMMANDS/utils/__init__.py +8 -0
  9. Dshell/DISCORD_COMMANDS/utils/utils_global.py +155 -0
  10. Dshell/DISCORD_COMMANDS/utils/utils_list.py +109 -0
  11. Dshell/DISCORD_COMMANDS/utils/utils_member.py +30 -0
  12. Dshell/DISCORD_COMMANDS/utils/utils_message.py +78 -0
  13. Dshell/DISCORD_COMMANDS/utils/utils_permissions.py +94 -0
  14. Dshell/DISCORD_COMMANDS/utils/utils_string.py +157 -0
  15. Dshell/DISCORD_COMMANDS/utils/utils_thread.py +35 -0
  16. Dshell/_DshellInterpreteur/__init__.py +4 -0
  17. Dshell/_DshellInterpreteur/cached_messages.py +4 -0
  18. Dshell/_DshellInterpreteur/dshell_arguments.py +74 -0
  19. Dshell/_DshellInterpreteur/dshell_interpreter.py +671 -0
  20. Dshell/_DshellInterpreteur/errors.py +8 -0
  21. Dshell/_DshellParser/__init__.py +2 -0
  22. Dshell/_DshellParser/ast_nodes.py +675 -0
  23. Dshell/_DshellParser/dshell_parser.py +408 -0
  24. Dshell/_DshellTokenizer/__init__.py +4 -0
  25. Dshell/_DshellTokenizer/dshell_keywords.py +193 -0
  26. Dshell/_DshellTokenizer/dshell_token_type.py +58 -0
  27. Dshell/_DshellTokenizer/dshell_tokenizer.py +146 -0
  28. Dshell/__init__.py +3 -0
  29. Dshell/_utils.py +1 -0
  30. dshellinterpreter-0.2.21.7.dist-info/METADATA +37 -0
  31. dshellinterpreter-0.2.21.7.dist-info/RECORD +34 -0
  32. dshellinterpreter-0.2.21.7.dist-info/WHEEL +5 -0
  33. dshellinterpreter-0.2.21.7.dist-info/licenses/LICENSE +21 -0
  34. dshellinterpreter-0.2.21.7.dist-info/top_level.txt +1 -0
@@ -0,0 +1,89 @@
1
+ __all__ = [
2
+ 'dshell_respond_interaction',
3
+ 'dshell_defer_interaction',
4
+ 'dshell_delete_original_message'
5
+ ]
6
+
7
+ from types import NoneType
8
+ from discord import Interaction, Embed, AllowedMentions
9
+ from pycordViews import EasyModifiedViews
10
+
11
+ from .utils.utils_message import utils_autorised_mentions
12
+
13
+ async def dshell_respond_interaction(ctx: Interaction,
14
+ content: str = None,
15
+ delete=None,
16
+ global_mentions: bool = None,
17
+ everyone_mention: bool = True,
18
+ roles_mentions: bool = True,
19
+ users_mentions: bool = True,
20
+ reply_mention: bool = False,
21
+ hide: bool = False,
22
+ embeds=None,
23
+ view=None) -> int:
24
+ """
25
+ Responds to a message interaction on Discord
26
+ """
27
+
28
+ if not isinstance(ctx, Interaction):
29
+ raise Exception(f'Respond to an interaction must be used in an interaction context, not {type(ctx)} !')
30
+
31
+ if delete is not None and not isinstance(delete, (int, float)):
32
+ raise Exception(f'Delete parameter must be a number (seconds) or None, not {type(delete)} !')
33
+
34
+ if not isinstance(hide, bool):
35
+ raise Exception(f'Hide parameter must be a boolean, not {type(hide)} !')
36
+
37
+ allowed_mentions = utils_autorised_mentions(global_mentions,
38
+ everyone_mention,
39
+ roles_mentions,
40
+ users_mentions,
41
+ reply_mention)
42
+
43
+ from .._DshellParser.ast_nodes import ListNode
44
+
45
+ if not isinstance(embeds, (ListNode, Embed, NoneType)):
46
+ raise Exception(f'Embeds must be a list of Embed objects or a single Embed object, not {type(embeds)} !')
47
+
48
+ if embeds is None:
49
+ embeds = ListNode([])
50
+
51
+ elif isinstance(embeds, Embed):
52
+ embeds = ListNode([embeds])
53
+
54
+ if not isinstance(view, (EasyModifiedViews, NoneType)):
55
+ raise Exception(f'View must be an UI bloc or None, not {type(view)} !')
56
+
57
+ sended_message = await ctx.response.send_message(
58
+ content=str(content),
59
+ ephemeral=hide,
60
+ allowed_mentions=allowed_mentions,
61
+ delete_after=delete,
62
+ embeds=embeds,
63
+ view=view)
64
+
65
+ return sended_message.id
66
+
67
+ async def dshell_defer_interaction(ctx: Interaction) -> bool:
68
+ """
69
+ Defer a message interaction on Discord
70
+ """
71
+
72
+ if not isinstance(ctx, Interaction):
73
+ raise Exception(f'Respond to an interaction must be used in an interaction context, not {type(ctx)} !')
74
+
75
+ await ctx.response.defer()
76
+
77
+ return True
78
+
79
+ async def dshell_delete_original_message(ctx: Interaction) -> int:
80
+ """
81
+ Delete the original message of an interaction on Discord
82
+ """
83
+
84
+ if not isinstance(ctx, Interaction):
85
+ raise Exception(f'Respond to an interaction must be used in an interaction context, not {type(ctx)} !')
86
+
87
+ await ctx.delete_original_message()
88
+
89
+ return ctx.message.id
@@ -0,0 +1,274 @@
1
+ from datetime import timedelta, datetime, UTC
2
+
3
+ from discord import MISSING, Message, Member, Permissions, Role, Embed
4
+
5
+ __all__ = [
6
+ "dshell_send_private_message",
7
+ "dshell_ban_member",
8
+ "dshell_unban_member",
9
+ "dshell_kick_member",
10
+ "dshell_rename_member",
11
+ "dshell_add_roles",
12
+ "dshell_remove_roles",
13
+ "dshell_check_permissions",
14
+ "dshell_timeout_member",
15
+ "dshell_move_member",
16
+ "dshell_give_member_roles",
17
+ "dshell_remove_member_roles"
18
+ ]
19
+
20
+ async def dshell_send_private_message(ctx: Message, message: str = None, member: int = None, delete: int = None, embeds = None, ):
21
+ """
22
+ Sends a private message to a member.
23
+ If member is None, sends the message to the author of the command.
24
+ If delete is specified, deletes the message after the specified time in seconds.
25
+ """
26
+ if delete is not None and not isinstance(delete, (int, float)):
27
+ raise Exception(f'Delete parameter must be a number (seconds) or None, not {type(delete)} !')
28
+
29
+ member_to_send = ctx.author if member is None else ctx.channel.guild.get_member(member)
30
+
31
+ if member_to_send is None:
32
+ raise Exception(f'Member {member} not found!')
33
+
34
+ from .._DshellParser.ast_nodes import ListNode
35
+
36
+ if embeds is None:
37
+ embeds = ListNode([])
38
+
39
+ elif isinstance(embeds, Embed):
40
+ embeds = ListNode([embeds])
41
+
42
+ else:
43
+ raise Exception(f'Embeds must be a list of Embed objects or a single Embed object, not {type(embeds)} !')
44
+
45
+ sended_message = await member_to_send.send(message, delete_after=delete, embeds=embeds)
46
+
47
+ return sended_message.id
48
+
49
+
50
+ async def dshell_ban_member(ctx: Message, member: int, reason: str = MISSING):
51
+ """
52
+ Bans a member from the server.
53
+ """
54
+ banned_member = ctx.channel.guild.get_member(member)
55
+
56
+ if not banned_member:
57
+ raise Exception(f'Member {member} not found in the server !')
58
+
59
+ await ctx.channel.guild.ban(banned_member, reason=reason)
60
+
61
+ return banned_member.id
62
+
63
+
64
+ async def dshell_unban_member(ctx: Message, user: int, reason: str = MISSING):
65
+ """
66
+ Unbans a user from the server.
67
+ """
68
+ banned_users = ctx.channel.guild.bans()
69
+ user_to_unban = None
70
+
71
+ async for ban_entry in banned_users:
72
+ if ban_entry.user.id == user:
73
+ user_to_unban = ban_entry.user
74
+ break
75
+
76
+ if not user_to_unban:
77
+ raise Exception(f'User {user} not found in the banned list')
78
+
79
+ await ctx.channel.guild.unban(user_to_unban, reason=reason)
80
+
81
+ return user_to_unban.id
82
+
83
+
84
+ async def dshell_kick_member(ctx: Message, member: int, reason: str = MISSING):
85
+ """
86
+ Kicks a member from the server.
87
+ """
88
+ kicked_member = ctx.channel.guild.get_member(member)
89
+
90
+ if not kicked_member:
91
+ raise Exception(f'Member {member} not found in the server !')
92
+
93
+ await ctx.channel.guild.kick(kicked_member, reason=reason)
94
+
95
+ return kicked_member.id
96
+
97
+
98
+ async def dshell_timeout_member(ctx: Message, duration: int, member=None, reason: str = MISSING):
99
+ """
100
+ Timeouts a member in the server for a specified duration.
101
+ """
102
+ target_member = ctx.author if member is None else ctx.channel.guild.get_member(member)
103
+
104
+ if not target_member:
105
+ raise Exception(f'Member {member} not found in the server !')
106
+
107
+ if not isinstance(duration, int):
108
+ raise TypeError("Duration must be an integer representing seconds.")
109
+
110
+ if duration < 0:
111
+ raise ValueError("Duration must be a non-negative integer.")
112
+
113
+ await target_member.timeout(until=datetime.now(UTC) + timedelta(seconds=duration), reason=reason)
114
+
115
+ return target_member.id
116
+
117
+
118
+ async def dshell_rename_member(ctx: Message, new_name, member=None):
119
+ """
120
+ Renames a member in the server.
121
+ """
122
+ renamed_member = ctx.channel.guild.get_member(member)
123
+
124
+ if not renamed_member:
125
+ raise Exception(f'Member {member} not found in the server !')
126
+
127
+ await renamed_member.edit(nick=new_name)
128
+
129
+ return renamed_member.id
130
+
131
+
132
+ async def dshell_add_roles(ctx: Message, roles: list[int] | int, member=None, reason: str = None):
133
+ """
134
+ Adds roles to a member in the server.
135
+ """
136
+ target_member: Member = ctx.author if member is None else ctx.channel.guild.get_member(member)
137
+
138
+ if not target_member:
139
+ raise Exception(f'Member {member} not found in the server !')
140
+
141
+ if isinstance(roles, int):
142
+ roles = [roles]
143
+
144
+ roles_to_add = [ctx.channel.guild.get_role(role_id) for role_id in roles if ctx.channel.guild.get_role(role_id)]
145
+
146
+ if not roles_to_add:
147
+ raise Exception(f'No role found !')
148
+
149
+ await target_member.add_roles(*roles_to_add, reason=reason)
150
+
151
+ return target_member.id
152
+
153
+
154
+ async def dshell_remove_roles(ctx: Message, roles: list[int] | int, member=None, reason: str = None):
155
+ """
156
+ Removes roles from a member in the server.
157
+ """
158
+ target_member: Member = ctx.author if member is None else ctx.channel.guild.get_member(member)
159
+
160
+ if not target_member:
161
+ raise Exception(f'Member {member} not found in the server !')
162
+
163
+ if isinstance(roles, int):
164
+ roles = [roles]
165
+
166
+ roles_to_remove = [ctx.channel.guild.get_role(role_id) for role_id in roles if ctx.channel.guild.get_role(role_id)]
167
+
168
+ if not roles_to_remove:
169
+ raise Exception(f'No role found !')
170
+
171
+ await target_member.remove_roles(*roles_to_remove, reason=reason)
172
+
173
+ return target_member.id
174
+
175
+
176
+ async def dshell_check_permissions(ctx: Message, permissions, member=None):
177
+ """
178
+ Checks if a member has specific permissions in the server.
179
+ """
180
+ target_member: Member = ctx.author if member is None else ctx.channel.guild.get_member(member)
181
+
182
+ if not target_member:
183
+ raise Exception(f'Member {member} not found in the server !')
184
+
185
+ if not isinstance(permissions, int):
186
+ raise TypeError("Permissions must be an integer representing permissions flags.")
187
+
188
+ permissions_to_check = Permissions(permissions)
189
+ member_permissions = target_member.guild_permissions
190
+
191
+ if (permissions_to_check.value & member_permissions.value) != 0:
192
+ return True
193
+ return False
194
+
195
+
196
+ async def dshell_move_member(ctx: Message, member=None, channel=None, disconnect: bool = False, reason=None):
197
+ """
198
+ Moves a member to another channel.
199
+ If channel is None, disconnect the member from their current voice channel.
200
+ """
201
+ target_member = ctx.author if member is None else ctx.channel.guild.get_member(member)
202
+ target_channel = ctx.channel if channel is None else ctx.channel.guild.get_channel(channel)
203
+
204
+ if not target_member:
205
+ raise Exception(f'Member {member} not found in the server !')
206
+
207
+ if target_member.voice.channel is None:
208
+ raise Exception(f'Member {target_member.name} is not in a voice channel !')
209
+
210
+ if not target_channel:
211
+ raise Exception(f'Channel {channel} not found in the server !')
212
+
213
+ if disconnect:
214
+ await target_member.move_to(None, reason=reason)
215
+ else:
216
+ await target_member.move_to(target_channel, reason=reason)
217
+
218
+ return target_member.id
219
+
220
+
221
+ async def dshell_give_member_roles(ctx: Message, roles, member=None, reason=None):
222
+ """
223
+ Give roles to the target member
224
+ """
225
+ target_member = ctx.author if member is None else ctx.guild.get_member(member)
226
+
227
+ if target_member is None:
228
+ raise Exception(f'Member {member} not found in the server !')
229
+
230
+ if isinstance(roles, int):
231
+ roles = (roles, )
232
+
233
+ list_roles: list[Role] = []
234
+ for i in roles:
235
+ role_to_give = ctx.guild.get_role(i)
236
+
237
+ if role_to_give is None:
238
+ raise Exception(f'Role {i} not found in the server !')
239
+
240
+ list_roles.append(role_to_give)
241
+
242
+ list_roles.extend(target_member.roles)
243
+
244
+ await target_member.edit(roles=list_roles, reason=str(reason))
245
+
246
+ return target_member.id
247
+
248
+
249
+ async def dshell_remove_member_roles(ctx: Message, roles, member=None, reason=None):
250
+ """
251
+ Remove roles to the target member
252
+ """
253
+ target_member = ctx.author if member is None else ctx.guild.get_member(member)
254
+
255
+ if target_member is None:
256
+ raise Exception(f'Member {member} not found in the server !')
257
+
258
+ if isinstance(roles, int):
259
+ roles = (roles,)
260
+
261
+ list_roles: set[Role] = set()
262
+ for i in roles:
263
+ role_to_give = target_member.get_role(i)
264
+
265
+ if role_to_give is None:
266
+ raise Exception(f"{target_member.name} member doesn't have {i} role !")
267
+
268
+ list_roles.add(role_to_give)
269
+
270
+ new_set_role = list(set(target_member.roles) - list_roles)
271
+
272
+ await target_member.edit(roles=new_set_role, reason=str(reason))
273
+
274
+ return target_member.id