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.
- Dshell/DISCORD_COMMANDS/__init__.py +7 -0
- Dshell/DISCORD_COMMANDS/dshell_channel.py +612 -0
- Dshell/DISCORD_COMMANDS/dshell_interaction.py +89 -0
- Dshell/DISCORD_COMMANDS/dshell_member.py +274 -0
- Dshell/DISCORD_COMMANDS/dshell_message.py +444 -0
- Dshell/DISCORD_COMMANDS/dshell_pastbin.py +28 -0
- Dshell/DISCORD_COMMANDS/dshell_role.py +128 -0
- Dshell/DISCORD_COMMANDS/utils/__init__.py +8 -0
- Dshell/DISCORD_COMMANDS/utils/utils_global.py +155 -0
- Dshell/DISCORD_COMMANDS/utils/utils_list.py +109 -0
- Dshell/DISCORD_COMMANDS/utils/utils_member.py +30 -0
- Dshell/DISCORD_COMMANDS/utils/utils_message.py +78 -0
- Dshell/DISCORD_COMMANDS/utils/utils_permissions.py +94 -0
- Dshell/DISCORD_COMMANDS/utils/utils_string.py +157 -0
- Dshell/DISCORD_COMMANDS/utils/utils_thread.py +35 -0
- Dshell/_DshellInterpreteur/__init__.py +4 -0
- Dshell/_DshellInterpreteur/cached_messages.py +4 -0
- Dshell/_DshellInterpreteur/dshell_arguments.py +74 -0
- Dshell/_DshellInterpreteur/dshell_interpreter.py +671 -0
- Dshell/_DshellInterpreteur/errors.py +8 -0
- Dshell/_DshellParser/__init__.py +2 -0
- Dshell/_DshellParser/ast_nodes.py +675 -0
- Dshell/_DshellParser/dshell_parser.py +408 -0
- Dshell/_DshellTokenizer/__init__.py +4 -0
- Dshell/_DshellTokenizer/dshell_keywords.py +193 -0
- Dshell/_DshellTokenizer/dshell_token_type.py +58 -0
- Dshell/_DshellTokenizer/dshell_tokenizer.py +146 -0
- Dshell/__init__.py +3 -0
- Dshell/_utils.py +1 -0
- dshellinterpreter-0.2.21.7.dist-info/METADATA +37 -0
- dshellinterpreter-0.2.21.7.dist-info/RECORD +34 -0
- dshellinterpreter-0.2.21.7.dist-info/WHEEL +5 -0
- dshellinterpreter-0.2.21.7.dist-info/licenses/LICENSE +21 -0
- dshellinterpreter-0.2.21.7.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
from discord import Embed, Message, PartialMessage
|
|
2
|
+
from discord.ext import commands
|
|
3
|
+
from typing import Optional
|
|
4
|
+
|
|
5
|
+
from pycordViews import EasyModifiedViews
|
|
6
|
+
|
|
7
|
+
from .utils.utils_message import utils_get_message, utils_autorised_mentions
|
|
8
|
+
from .._DshellInterpreteur.cached_messages import dshell_cached_messages
|
|
9
|
+
from .._utils import NoneType
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
'dshell_send_message',
|
|
13
|
+
'dshell_respond_message',
|
|
14
|
+
'dshell_delete_message',
|
|
15
|
+
'dshell_purge_message',
|
|
16
|
+
'dshell_edit_message',
|
|
17
|
+
'dshell_get_history_messages',
|
|
18
|
+
'dshell_add_reactions',
|
|
19
|
+
'dshell_remove_reactions',
|
|
20
|
+
'dshell_clear_message_reactions',
|
|
21
|
+
'dshell_clear_one_reactions',
|
|
22
|
+
'dshell_pin_message',
|
|
23
|
+
'dshell_get_content_message',
|
|
24
|
+
'dshell_get_author_id_message',
|
|
25
|
+
'dshell_get_message_link',
|
|
26
|
+
'dshell_get_message_category_id',
|
|
27
|
+
'dshell_get_message_attachments',
|
|
28
|
+
'dshell_get_channel_pined_messages',
|
|
29
|
+
'dshell_is_message_system',
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
async def dshell_send_message(ctx: Message,
|
|
34
|
+
message=None,
|
|
35
|
+
delete=None,
|
|
36
|
+
channel=None,
|
|
37
|
+
global_mentions: bool = None,
|
|
38
|
+
everyone_mention: bool = True,
|
|
39
|
+
roles_mentions: bool = True,
|
|
40
|
+
users_mentions: bool = True,
|
|
41
|
+
reply_mention: bool = False,
|
|
42
|
+
embeds=None,
|
|
43
|
+
view=None) -> int:
|
|
44
|
+
"""
|
|
45
|
+
Sends a message on Discord
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
if delete is not None and not isinstance(delete, (int, float)):
|
|
49
|
+
raise Exception(f'Delete parameter must be a number (seconds) or None, not {type(delete)} !')
|
|
50
|
+
|
|
51
|
+
channel_to_send = ctx.channel if channel is None else ctx.channel.guild.get_channel(channel)
|
|
52
|
+
allowed_mentions = utils_autorised_mentions(global_mentions, everyone_mention, roles_mentions, users_mentions, reply_mention)
|
|
53
|
+
|
|
54
|
+
if channel_to_send is None:
|
|
55
|
+
raise Exception(f'Channel {channel} not found!')
|
|
56
|
+
|
|
57
|
+
from .._DshellParser.ast_nodes import ListNode
|
|
58
|
+
|
|
59
|
+
if not isinstance(embeds, (ListNode, Embed, NoneType)):
|
|
60
|
+
raise Exception(f'Embeds must be a list of Embed objects or a single Embed object, not {type(embeds)} !')
|
|
61
|
+
|
|
62
|
+
if embeds is None:
|
|
63
|
+
embeds = ListNode([])
|
|
64
|
+
|
|
65
|
+
elif isinstance(embeds, Embed):
|
|
66
|
+
embeds = ListNode([embeds])
|
|
67
|
+
|
|
68
|
+
if not isinstance(view, (EasyModifiedViews, NoneType)):
|
|
69
|
+
raise Exception(f'Channel must be an UI or None, not {type(channel_to_send)} !')
|
|
70
|
+
|
|
71
|
+
sended_message = await channel_to_send.send(message,
|
|
72
|
+
delete_after=delete,
|
|
73
|
+
embeds=embeds,
|
|
74
|
+
allowed_mentions=allowed_mentions,
|
|
75
|
+
view=view)
|
|
76
|
+
|
|
77
|
+
cached_messages = dshell_cached_messages.get()
|
|
78
|
+
cached_messages[sended_message.id] = sended_message
|
|
79
|
+
dshell_cached_messages.set(cached_messages)
|
|
80
|
+
|
|
81
|
+
return sended_message.id
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
async def dshell_respond_message(ctx: Message,
|
|
85
|
+
message=None,
|
|
86
|
+
content: str = None,
|
|
87
|
+
global_mentions: bool = None,
|
|
88
|
+
everyone_mention: bool = True,
|
|
89
|
+
roles_mentions: bool = True,
|
|
90
|
+
users_mentions: bool = True,
|
|
91
|
+
reply_mention: bool = False,
|
|
92
|
+
delete=None,
|
|
93
|
+
embeds=None):
|
|
94
|
+
"""
|
|
95
|
+
Responds to a message on Discord
|
|
96
|
+
"""
|
|
97
|
+
if delete is not None and not isinstance(delete, (int, float)):
|
|
98
|
+
raise Exception(f'Delete parameter must be a number (seconds) or None, not {type(delete)} !')
|
|
99
|
+
|
|
100
|
+
respond_message = ctx if message is None else utils_get_message(ctx, message) # builds a reference to the message (even if it doesn't exist)
|
|
101
|
+
autorised_mentions = utils_autorised_mentions(global_mentions, everyone_mention, roles_mentions, users_mentions, reply_mention)
|
|
102
|
+
mention_author = True if reply_mention else False
|
|
103
|
+
|
|
104
|
+
from .._DshellParser.ast_nodes import ListNode
|
|
105
|
+
|
|
106
|
+
if not isinstance(embeds, (ListNode, Embed, NoneType)):
|
|
107
|
+
raise Exception(f'Embeds must be a list of Embed objects or a single Embed object, not {type(embeds)} !')
|
|
108
|
+
|
|
109
|
+
if embeds is None:
|
|
110
|
+
embeds = ListNode([])
|
|
111
|
+
|
|
112
|
+
elif isinstance(embeds, Embed):
|
|
113
|
+
embeds = ListNode([embeds])
|
|
114
|
+
|
|
115
|
+
sended_message = await respond_message.reply(
|
|
116
|
+
content=str(content),
|
|
117
|
+
mention_author=mention_author,
|
|
118
|
+
allowed_mentions=autorised_mentions,
|
|
119
|
+
delete_after=delete,
|
|
120
|
+
embeds=embeds)
|
|
121
|
+
|
|
122
|
+
cached_messages = dshell_cached_messages.get()
|
|
123
|
+
cached_messages[sended_message.id] = sended_message
|
|
124
|
+
dshell_cached_messages.set(cached_messages)
|
|
125
|
+
|
|
126
|
+
return sended_message.id
|
|
127
|
+
|
|
128
|
+
return sended_message.id
|
|
129
|
+
|
|
130
|
+
async def dshell_delete_message(ctx: Message, message=None, reason=None, delay=0):
|
|
131
|
+
"""
|
|
132
|
+
Deletes a message
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
delete_message = ctx if message is None else utils_get_message(ctx, message)
|
|
136
|
+
|
|
137
|
+
if not isinstance(delay, int):
|
|
138
|
+
raise Exception(f'Delete delay must be an integer, not {type(delay)} !')
|
|
139
|
+
|
|
140
|
+
if delay > 3600:
|
|
141
|
+
raise Exception(f'The message deletion delay is too long! ({delay} seconds)')
|
|
142
|
+
|
|
143
|
+
await delete_message.delete(delay=delay, reason=reason)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
async def dshell_purge_message(ctx: Message, message_number: int, channel=None, reason=None):
|
|
147
|
+
"""
|
|
148
|
+
Purges messages from a channel
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
if not isinstance(message_number, int):
|
|
152
|
+
raise Exception(f'Message number must be an integer, not {type(message_number)} !')
|
|
153
|
+
|
|
154
|
+
purge_channel = ctx.channel if channel is None else ctx.channel.guild.get_channel(channel)
|
|
155
|
+
|
|
156
|
+
if purge_channel is None:
|
|
157
|
+
raise Exception(f"Channel {channel} to purge not found!")
|
|
158
|
+
|
|
159
|
+
await purge_channel.purge(limit=message_number, reason=reason)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
async def dshell_edit_message(ctx: Message, message, new_content=None, embeds=None, view=None) -> int:
|
|
163
|
+
"""
|
|
164
|
+
Edits a message
|
|
165
|
+
"""
|
|
166
|
+
edit_message = utils_get_message(ctx, message)
|
|
167
|
+
|
|
168
|
+
from .._DshellParser.ast_nodes import ListNode
|
|
169
|
+
|
|
170
|
+
if not isinstance(embeds, (ListNode, Embed, NoneType)):
|
|
171
|
+
raise Exception(f'Embeds must be a list of Embed objects or a single Embed object, not {type(embeds)} !')
|
|
172
|
+
|
|
173
|
+
if not isinstance(view, (EasyModifiedViews, NoneType)):
|
|
174
|
+
raise Exception(f'View must be an UI bloc or None, not {type(view)} !')
|
|
175
|
+
|
|
176
|
+
if embeds is None:
|
|
177
|
+
embeds = ListNode([])
|
|
178
|
+
|
|
179
|
+
elif isinstance(embeds, Embed):
|
|
180
|
+
embeds = ListNode([embeds])
|
|
181
|
+
|
|
182
|
+
await edit_message.edit(content=new_content, embeds=embeds, view=view)
|
|
183
|
+
|
|
184
|
+
return edit_message.id
|
|
185
|
+
|
|
186
|
+
async def dshell_add_reactions(ctx: Message, reactions, message=None):
|
|
187
|
+
"""
|
|
188
|
+
Adds reactions to a message
|
|
189
|
+
"""
|
|
190
|
+
message = ctx if message is None else utils_get_message(ctx, message)
|
|
191
|
+
|
|
192
|
+
if isinstance(reactions, str):
|
|
193
|
+
reactions = (reactions,)
|
|
194
|
+
|
|
195
|
+
for reaction in reactions:
|
|
196
|
+
await message.add_reaction(reaction)
|
|
197
|
+
|
|
198
|
+
return message.id
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
async def dshell_remove_reactions(ctx: Message, reactions, message=None):
|
|
202
|
+
"""
|
|
203
|
+
Removes reactions from a message
|
|
204
|
+
"""
|
|
205
|
+
message = ctx if message is None else utils_get_message(ctx, message)
|
|
206
|
+
|
|
207
|
+
if isinstance(reactions, str):
|
|
208
|
+
reactions = [reactions]
|
|
209
|
+
|
|
210
|
+
for reaction in reactions:
|
|
211
|
+
await message.clear_reaction(reaction)
|
|
212
|
+
|
|
213
|
+
return message.id
|
|
214
|
+
|
|
215
|
+
async def dshell_clear_message_reactions(ctx: Message, message):
|
|
216
|
+
"""
|
|
217
|
+
Clear all reaction on the target message
|
|
218
|
+
"""
|
|
219
|
+
message = ctx if message is None else utils_get_message(ctx, message)
|
|
220
|
+
|
|
221
|
+
if message is None:
|
|
222
|
+
raise Exception(f'Message not found !')
|
|
223
|
+
|
|
224
|
+
await message.clear_reactions()
|
|
225
|
+
|
|
226
|
+
return message.id
|
|
227
|
+
|
|
228
|
+
async def dshell_clear_one_reactions(ctx: Message, message, emoji):
|
|
229
|
+
"""
|
|
230
|
+
Clear one emoji on the target message
|
|
231
|
+
"""
|
|
232
|
+
|
|
233
|
+
if not isinstance(emoji, str):
|
|
234
|
+
raise Exception(f'Emoji must be string, not {type(emoji)}')
|
|
235
|
+
|
|
236
|
+
target_message = ctx if message is None else utils_get_message(ctx, message)
|
|
237
|
+
|
|
238
|
+
await target_message.clear_reaction(emoji)
|
|
239
|
+
|
|
240
|
+
return target_message.id
|
|
241
|
+
|
|
242
|
+
async def dshell_pin_message(ctx: Message, message=None):
|
|
243
|
+
"""
|
|
244
|
+
Pin a message
|
|
245
|
+
"""
|
|
246
|
+
|
|
247
|
+
target_message = ctx if message is None else utils_get_message(ctx, message)
|
|
248
|
+
|
|
249
|
+
await target_message.pin()
|
|
250
|
+
|
|
251
|
+
return target_message.id
|
|
252
|
+
|
|
253
|
+
async def dshell_unpin_message(ctx: Message, message=None, reason=None):
|
|
254
|
+
"""
|
|
255
|
+
Unpin a message
|
|
256
|
+
"""
|
|
257
|
+
|
|
258
|
+
target_message = ctx if message is None else utils_get_message(ctx, message)
|
|
259
|
+
|
|
260
|
+
if reason is not None and not isinstance(reason, str):
|
|
261
|
+
raise Exception(f'Reason must be a string or None, not {type(reason)} !')
|
|
262
|
+
|
|
263
|
+
await target_message.unpin()
|
|
264
|
+
|
|
265
|
+
return target_message.id
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
################################# GET MESSAGE INFO #################################
|
|
269
|
+
|
|
270
|
+
async def dshell_get_history_messages(ctx: Message,
|
|
271
|
+
channel=None,
|
|
272
|
+
limit=None) -> "ListNode":
|
|
273
|
+
"""
|
|
274
|
+
Searches for messages matching a regex in a channel
|
|
275
|
+
"""
|
|
276
|
+
|
|
277
|
+
if limit is not None and not isinstance(limit, int):
|
|
278
|
+
raise Exception(f"Limit must be an integer or None, not {type(limit)}!")
|
|
279
|
+
|
|
280
|
+
search_channel = ctx.channel if channel is None else ctx.channel.guild.get_channel(channel)
|
|
281
|
+
|
|
282
|
+
if search_channel is None:
|
|
283
|
+
raise Exception(f"Channel {channel} to search not found!")
|
|
284
|
+
|
|
285
|
+
from .._DshellParser.ast_nodes import ListNode
|
|
286
|
+
|
|
287
|
+
cached_messages = dshell_cached_messages.get()
|
|
288
|
+
messages = ListNode([])
|
|
289
|
+
async for message in search_channel.history(limit=limit):
|
|
290
|
+
message_id = message.id
|
|
291
|
+
messages.add(message_id)
|
|
292
|
+
cached_messages[message_id] = message
|
|
293
|
+
|
|
294
|
+
dshell_cached_messages.set(cached_messages)
|
|
295
|
+
return messages
|
|
296
|
+
|
|
297
|
+
async def dshell_get_content_message(ctx: Message, message=None):
|
|
298
|
+
"""
|
|
299
|
+
Get the content of a message
|
|
300
|
+
"""
|
|
301
|
+
|
|
302
|
+
target_message = ctx if message is None else utils_get_message(ctx, message)
|
|
303
|
+
|
|
304
|
+
if isinstance(target_message, PartialMessage):
|
|
305
|
+
try:
|
|
306
|
+
fetch_target_message = await target_message.fetch()
|
|
307
|
+
except:
|
|
308
|
+
raise Exception(f'Message not found !')
|
|
309
|
+
else:
|
|
310
|
+
fetch_target_message = target_message
|
|
311
|
+
|
|
312
|
+
return fetch_target_message.content
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
async def dshell_get_author_id_message(ctx: Message, message: Optional[int] = None):
|
|
316
|
+
"""
|
|
317
|
+
Return author ID of the message given (or ctx if message=None)
|
|
318
|
+
:param ctx:
|
|
319
|
+
:param message: message ID
|
|
320
|
+
:return:
|
|
321
|
+
"""
|
|
322
|
+
if message is not None and not isinstance(message, int):
|
|
323
|
+
raise Exception(f'Message parameter must be an integer or None, not {type(message)} !')
|
|
324
|
+
|
|
325
|
+
target_message = ctx
|
|
326
|
+
if message is not None:
|
|
327
|
+
target_message = utils_get_message(ctx, message)
|
|
328
|
+
|
|
329
|
+
if isinstance(target_message, PartialMessage):
|
|
330
|
+
try:
|
|
331
|
+
target_message = await target_message.fetch()
|
|
332
|
+
except:
|
|
333
|
+
raise Exception(f"[message_author] Author ID message to get is not found !")
|
|
334
|
+
|
|
335
|
+
return target_message.author.id
|
|
336
|
+
|
|
337
|
+
async def dshell_get_message_link(ctx: Message, message: int):
|
|
338
|
+
"""
|
|
339
|
+
Return the link of a message given its ID
|
|
340
|
+
:param ctx:
|
|
341
|
+
:param message: message ID
|
|
342
|
+
:return:
|
|
343
|
+
"""
|
|
344
|
+
if not isinstance(message, int):
|
|
345
|
+
raise Exception(f'Message parameter must be an integer, not {type(message)} !')
|
|
346
|
+
|
|
347
|
+
target_message = utils_get_message(ctx, message)
|
|
348
|
+
|
|
349
|
+
return target_message.jump_url
|
|
350
|
+
|
|
351
|
+
async def dshell_get_message_category_id(ctx: Message, message: int = None):
|
|
352
|
+
"""
|
|
353
|
+
Return the category ID of a message given its ID
|
|
354
|
+
:param ctx:
|
|
355
|
+
:param message: message ID
|
|
356
|
+
:return:
|
|
357
|
+
"""
|
|
358
|
+
if message is not None and not isinstance(message, int):
|
|
359
|
+
raise Exception(f'Message parameter must be an integer, not {type(message)} !')
|
|
360
|
+
|
|
361
|
+
target_message = ctx
|
|
362
|
+
if message is not None:
|
|
363
|
+
target_message = utils_get_message(ctx, message)
|
|
364
|
+
|
|
365
|
+
if isinstance(target_message, PartialMessage):
|
|
366
|
+
try:
|
|
367
|
+
target_message = await target_message.fetch()
|
|
368
|
+
except:
|
|
369
|
+
raise Exception(f"[category_message] Message ID to get is not found !")
|
|
370
|
+
|
|
371
|
+
return target_message.channel.category.id if target_message.channel.category is not None else 0
|
|
372
|
+
|
|
373
|
+
async def dshell_get_message_attachments(ctx: Message, message: int = None):
|
|
374
|
+
"""
|
|
375
|
+
Return the attachments of a message given its ID
|
|
376
|
+
:param ctx:
|
|
377
|
+
:param message: message ID
|
|
378
|
+
:return:
|
|
379
|
+
"""
|
|
380
|
+
if message is not None and not isinstance(message, int):
|
|
381
|
+
raise Exception(f'Message parameter must be an integer, not {type(message)} !')
|
|
382
|
+
|
|
383
|
+
target_message = ctx
|
|
384
|
+
if message is not None:
|
|
385
|
+
target_message = utils_get_message(ctx, message)
|
|
386
|
+
|
|
387
|
+
if isinstance(target_message, PartialMessage):
|
|
388
|
+
try:
|
|
389
|
+
target_message = await target_message.fetch()
|
|
390
|
+
except:
|
|
391
|
+
raise Exception(f"[attachments_message] Message ID to get is not found !")
|
|
392
|
+
|
|
393
|
+
from .._DshellParser.ast_nodes import ListNode
|
|
394
|
+
|
|
395
|
+
attachments = ListNode([])
|
|
396
|
+
|
|
397
|
+
for attachment in target_message.attachments:
|
|
398
|
+
attachments.add(attachment.url)
|
|
399
|
+
|
|
400
|
+
return attachments
|
|
401
|
+
|
|
402
|
+
async def dshell_get_channel_pined_messages(ctx: Message, channel=None):
|
|
403
|
+
"""
|
|
404
|
+
Returns a list of pined messages IDs in a channel.
|
|
405
|
+
"""
|
|
406
|
+
|
|
407
|
+
channel_to_check = ctx.channel if channel is None else ctx.channel.guild.get_channel(channel)
|
|
408
|
+
|
|
409
|
+
if channel_to_check is None:
|
|
410
|
+
raise Exception(f"Channel {channel} not found !")
|
|
411
|
+
|
|
412
|
+
pinned_messages = await channel_to_check.pins()
|
|
413
|
+
|
|
414
|
+
from .._DshellParser.ast_nodes import ListNode
|
|
415
|
+
messages_list = ListNode([])
|
|
416
|
+
|
|
417
|
+
cached_messages = dshell_cached_messages.get()
|
|
418
|
+
for message in pinned_messages:
|
|
419
|
+
messages_list.add(message.id)
|
|
420
|
+
cached_messages[message.id] = message
|
|
421
|
+
|
|
422
|
+
return messages_list
|
|
423
|
+
|
|
424
|
+
async def dshell_is_message_system(ctx: Message, message: int = None):
|
|
425
|
+
"""
|
|
426
|
+
Return if the message is a system message
|
|
427
|
+
:param ctx:
|
|
428
|
+
:param message: message ID
|
|
429
|
+
:return:
|
|
430
|
+
"""
|
|
431
|
+
if message is not None and not isinstance(message, int):
|
|
432
|
+
raise Exception(f'Message parameter must be an integer, not {type(message)} !')
|
|
433
|
+
|
|
434
|
+
target_message = ctx
|
|
435
|
+
if message is not None:
|
|
436
|
+
target_message = utils_get_message(ctx, message)
|
|
437
|
+
|
|
438
|
+
if isinstance(target_message, PartialMessage):
|
|
439
|
+
try:
|
|
440
|
+
target_message = await target_message.fetch()
|
|
441
|
+
except:
|
|
442
|
+
raise Exception(f"[is_system_message] Message ID to get is not found !")
|
|
443
|
+
|
|
444
|
+
return target_message.is_system()
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from discord import Message
|
|
2
|
+
from requests import get
|
|
3
|
+
|
|
4
|
+
__all__ = [
|
|
5
|
+
'dshell_get_pastbin'
|
|
6
|
+
]
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
async def dshell_get_pastbin(ctx: Message, code: str) -> "ListNode":
|
|
10
|
+
"""
|
|
11
|
+
Get a pastbin from a code snippet.
|
|
12
|
+
"""
|
|
13
|
+
if not isinstance(code, str):
|
|
14
|
+
raise Exception(f'Code must be a string, not {type(code)} !')
|
|
15
|
+
|
|
16
|
+
from .._DshellParser.ast_nodes import ListNode
|
|
17
|
+
|
|
18
|
+
content = ListNode([]) # Initialize content to an empty string
|
|
19
|
+
|
|
20
|
+
with get(f"https://pastebin.com/raw/{code}", stream=True, timeout=10) as response:
|
|
21
|
+
|
|
22
|
+
if not response.ok:
|
|
23
|
+
raise Exception(f"Failed to retrieve pastbin with code {code} !")
|
|
24
|
+
|
|
25
|
+
for line in response.iter_lines(decode_unicode=True, chunk_size=512):
|
|
26
|
+
content.add(line)
|
|
27
|
+
|
|
28
|
+
return content
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
from discord import MISSING, Message, PermissionOverwrite
|
|
2
|
+
from discord.utils import _MissingSentinel
|
|
3
|
+
from typing import Union
|
|
4
|
+
from .._utils import NoneType
|
|
5
|
+
|
|
6
|
+
__all__ = [
|
|
7
|
+
'dshell_create_role',
|
|
8
|
+
'dshell_delete_roles',
|
|
9
|
+
'dshell_edit_role'
|
|
10
|
+
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
async def dshell_create_role(ctx: Message,
|
|
14
|
+
name: str = MISSING,
|
|
15
|
+
permissions: dict[None, PermissionOverwrite] = MISSING,
|
|
16
|
+
color: int = MISSING,
|
|
17
|
+
hoist: bool = MISSING,
|
|
18
|
+
mentionable: bool = MISSING,
|
|
19
|
+
reason: str = None):
|
|
20
|
+
"""
|
|
21
|
+
Creates a role on the server.
|
|
22
|
+
"""
|
|
23
|
+
if not isinstance(name, (str, _MissingSentinel)):
|
|
24
|
+
raise Exception(f"Name must be a string, not {type(name)} !")
|
|
25
|
+
|
|
26
|
+
if not isinstance(permissions, (dict, _MissingSentinel)):
|
|
27
|
+
raise Exception(f"Permissions must be a PermissionNode, not {type(permissions)} !")
|
|
28
|
+
|
|
29
|
+
from .._DshellInterpreteur.dshell_interpreter import build_colour
|
|
30
|
+
|
|
31
|
+
if not isinstance(color, _MissingSentinel):
|
|
32
|
+
color = build_colour(color)
|
|
33
|
+
|
|
34
|
+
if not isinstance(hoist, (bool, _MissingSentinel)):
|
|
35
|
+
raise Exception(f"Hoist must be a boolean, not {type(permissions)} !")
|
|
36
|
+
|
|
37
|
+
if not isinstance(mentionable, (bool, _MissingSentinel)):
|
|
38
|
+
raise Exception(f"Mentionable must be a boolean, not {type(permissions)} !")
|
|
39
|
+
|
|
40
|
+
if isinstance(permissions, dict):
|
|
41
|
+
if None in permissions:
|
|
42
|
+
allow, deny = permissions[None].pair()
|
|
43
|
+
permissions = allow
|
|
44
|
+
|
|
45
|
+
created_role = await ctx.guild.create_role(name=name,
|
|
46
|
+
permissions=permissions,
|
|
47
|
+
colour=color,
|
|
48
|
+
hoist=hoist,
|
|
49
|
+
mentionable=mentionable,
|
|
50
|
+
reason=str(reason))
|
|
51
|
+
|
|
52
|
+
return created_role.id
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
async def dshell_delete_roles(ctx: Message, roles, reason=None):
|
|
56
|
+
"""
|
|
57
|
+
Delete the role on the server
|
|
58
|
+
"""
|
|
59
|
+
from .._DshellInterpreteur.dshell_interpreter import ListNode
|
|
60
|
+
roles: Union[int, ListNode]
|
|
61
|
+
if not isinstance(roles, (int, ListNode)):
|
|
62
|
+
raise Exception(f"Role must be a int, role mention or NodeList of both, not {type(roles)} !")
|
|
63
|
+
|
|
64
|
+
if isinstance(roles, int):
|
|
65
|
+
roles: tuple = (roles, )
|
|
66
|
+
|
|
67
|
+
for i in roles:
|
|
68
|
+
role_to_delete = ctx.guild.get_role(i)
|
|
69
|
+
|
|
70
|
+
if role_to_delete is None:
|
|
71
|
+
raise Exception(f'Role {i} not found in the server !')
|
|
72
|
+
|
|
73
|
+
await role_to_delete.delete(reason=str(reason))
|
|
74
|
+
|
|
75
|
+
return role_to_delete.id
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
async def dshell_edit_role(ctx: Message,
|
|
79
|
+
role,
|
|
80
|
+
name=None,
|
|
81
|
+
permissions: dict[None, PermissionOverwrite]=None,
|
|
82
|
+
color=None,
|
|
83
|
+
hoist=None,
|
|
84
|
+
mentionable=None,
|
|
85
|
+
position=None,
|
|
86
|
+
reason=None,):
|
|
87
|
+
"""
|
|
88
|
+
Edit the current role
|
|
89
|
+
"""
|
|
90
|
+
if not isinstance(role, int):
|
|
91
|
+
raise Exception(f"Role must be a int or role mention not {type(role)} !")
|
|
92
|
+
|
|
93
|
+
role_to_edit = ctx.guild.get_role(role)
|
|
94
|
+
|
|
95
|
+
if not isinstance(name, (str, NoneType)):
|
|
96
|
+
raise Exception(f"Name must be a string, not {type(name)} !")
|
|
97
|
+
|
|
98
|
+
if not isinstance(permissions, (dict, NoneType)):
|
|
99
|
+
raise Exception(f"Permissions must be a PermissionNode, not {type(permissions)} !")
|
|
100
|
+
|
|
101
|
+
if isinstance(permissions, dict):
|
|
102
|
+
if None in permissions:
|
|
103
|
+
allow, deny = permissions[None].pair()
|
|
104
|
+
permissions = allow
|
|
105
|
+
|
|
106
|
+
from .._DshellInterpreteur.dshell_interpreter import build_colour
|
|
107
|
+
|
|
108
|
+
if color is not None:
|
|
109
|
+
color = build_colour(color)
|
|
110
|
+
|
|
111
|
+
if not isinstance(hoist, (bool, NoneType)):
|
|
112
|
+
raise Exception(f"Hoist must be a boolean, not {type(permissions)} !")
|
|
113
|
+
|
|
114
|
+
if not isinstance(mentionable, (bool, NoneType)):
|
|
115
|
+
raise Exception(f"Mentionable must be a boolean, not {type(permissions)} !")
|
|
116
|
+
|
|
117
|
+
if not isinstance(position, (int, NoneType)):
|
|
118
|
+
raise Exception(f"Position must be an integer, not {type(permissions)} !")
|
|
119
|
+
|
|
120
|
+
await role_to_edit.edit(name=name if name is not None else role_to_edit.name,
|
|
121
|
+
permissions=permissions if permissions is not None else role_to_edit.permissions,
|
|
122
|
+
colour=color if color is not None else role_to_edit.colour,
|
|
123
|
+
hoist=hoist if hoist is not None else role_to_edit.hoist,
|
|
124
|
+
mentionable=mentionable if mentionable is not None else role_to_edit.mentionable,
|
|
125
|
+
position=position if position is not None else role_to_edit.position,
|
|
126
|
+
reason=str(reason))
|
|
127
|
+
|
|
128
|
+
return role_to_edit.id
|