dshellInterpreter 1.2.2.0__tar.gz → 1.2.3.0__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.
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_channel.py +1 -1
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_interaction.py +3 -3
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_member.py +1 -1
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_message.py +1 -1
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_role.py +2 -2
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_ui.py +1 -1
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_embed.py +1 -1
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_file.py +1 -1
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_global.py +2 -2
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_message.py +2 -2
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_thread.py +1 -1
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellInterpreteur/__init__.py +3 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellInterpreteur/dshell_arguments.py +5 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellInterpreteur/dshell_interpreter.py +6 -49
- dshellinterpreter-1.2.3.0/Dshell/DshellInterpreteur/dshell_iterators.py +57 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellInterpreteur/utils_interpreter.py +67 -53
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellTokenizer/dshell_keywords.py +7 -3
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellTokenizer/dshell_tokenizer.py +3 -3
- {dshellinterpreter-1.2.2.0/dshellInterpreter.egg-info → dshellinterpreter-1.2.3.0}/PKG-INFO +1 -1
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0/dshellInterpreter.egg-info}/PKG-INFO +1 -1
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/dshellInterpreter.egg-info/SOURCES.txt +1 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/setup.py +1 -1
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/__init__.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_embed.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_file.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_pastbin.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/__init__.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_list.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_member.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_numbers.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_permissions.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_string.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_type_validation.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellInterpreteur/cached_messages.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellInterpreteur/dshell_global_variables.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellInterpreteur/dshell_scope.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellInterpreteur/errors.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellParser/__init__.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellParser/ast_nodes.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellParser/dshell_parser.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellParser/errors.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellPreProcess/__init__.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellPreProcess/dshell_preprocess.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellTokenizer/__init__.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellTokenizer/dshell_token_type.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/__init__.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/full_import.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/regex_test.py +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/LICENSE +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/README.md +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/dshellInterpreter.egg-info/dependency_links.txt +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/dshellInterpreter.egg-info/requires.txt +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/dshellInterpreter.egg-info/top_level.txt +0 -0
- {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/setup.cfg +0 -0
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_channel.py
RENAMED
|
@@ -59,7 +59,7 @@ async def dshell_get_channel(ctx: Message, name: StrNode):
|
|
|
59
59
|
if isinstance(name, StrNode):
|
|
60
60
|
return next((IntNode(c.id) for c in ctx.channel.guild.channels if c.name == name), None)
|
|
61
61
|
|
|
62
|
-
raise Exception(f"Channel must be an integer or a string, not {type(name)} !")
|
|
62
|
+
raise Exception(f"Channel must be an integer or a string, not {type(name).__name__} !")
|
|
63
63
|
|
|
64
64
|
|
|
65
65
|
async def dshell_get_channels(ctx: Message, name: Optional[StrNode]=None, regex: Optional[StrNode]=None) -> ListNode:
|
|
@@ -73,7 +73,7 @@ async def dshell_respond_interaction(ctx: Interaction,
|
|
|
73
73
|
_CMD = "sri"
|
|
74
74
|
|
|
75
75
|
if not isinstance(ctx, Interaction):
|
|
76
|
-
raise Exception(f'Respond to an interaction must be used in an interaction context, not {type(ctx)} !')
|
|
76
|
+
raise Exception(f'Respond to an interaction must be used in an interaction context, not {type(ctx).__name__} !')
|
|
77
77
|
|
|
78
78
|
_validate_optional_string(content, "Content", _CMD)
|
|
79
79
|
_validate_optional_number(delete, "Delete", _CMD)
|
|
@@ -129,7 +129,7 @@ async def dshell_defer_interaction(ctx: Interaction) -> BoolNode:
|
|
|
129
129
|
"""
|
|
130
130
|
|
|
131
131
|
if not isinstance(ctx, Interaction):
|
|
132
|
-
raise Exception(f'Respond to an interaction must be used in an interaction context, not {type(ctx)} !')
|
|
132
|
+
raise Exception(f'Respond to an interaction must be used in an interaction context, not {type(ctx).__name__} !')
|
|
133
133
|
|
|
134
134
|
await ctx.response.defer()
|
|
135
135
|
|
|
@@ -154,7 +154,7 @@ async def dshell_delete_original_message(ctx: Interaction) -> IntNode:
|
|
|
154
154
|
"""
|
|
155
155
|
|
|
156
156
|
if not isinstance(ctx, Interaction):
|
|
157
|
-
raise Exception(f'Respond to an interaction must be used in an interaction context, not {type(ctx)} !')
|
|
157
|
+
raise Exception(f'Respond to an interaction must be used in an interaction context, not {type(ctx).__name__} !')
|
|
158
158
|
|
|
159
159
|
await ctx.delete_original_message()
|
|
160
160
|
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_member.py
RENAMED
|
@@ -95,7 +95,7 @@ async def dshell_send_private_message(ctx: Message,
|
|
|
95
95
|
embeds = ListNode([embeds])
|
|
96
96
|
|
|
97
97
|
else:
|
|
98
|
-
raise Exception(f'Embeds must be a list of Embed objects or a single Embed object, not {type(embeds)} !')
|
|
98
|
+
raise Exception(f'Embeds must be a list of Embed objects or a single Embed object, not {type(embeds).__name__} !')
|
|
99
99
|
|
|
100
100
|
sended_message = await member_to_send.send(message, delete_after=delete, embeds=embeds, files=final_files)
|
|
101
101
|
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_message.py
RENAMED
|
@@ -280,7 +280,7 @@ async def dshell_clear_one_reactions(ctx: Message, message: Union[IntNode, StrNo
|
|
|
280
280
|
"""
|
|
281
281
|
|
|
282
282
|
if not isinstance(emoji, StrNode):
|
|
283
|
-
raise Exception(f'Emoji must be StrNode, not {type(emoji)}')
|
|
283
|
+
raise Exception(f'Emoji must be StrNode, not {type(emoji).__name__}')
|
|
284
284
|
|
|
285
285
|
target_message = ctx if message is None else await utils_get_message(ctx, message)
|
|
286
286
|
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_role.py
RENAMED
|
@@ -117,13 +117,13 @@ async def dshell_delete_roles(ctx: Message, roles: Union[ListNode, IntNode], rea
|
|
|
117
117
|
_CMD = "dr"
|
|
118
118
|
|
|
119
119
|
if roles is not None and not isinstance(roles, (IntNode, ListNode)):
|
|
120
|
-
raise Exception(f"Roles must be a int, role mention or NodeList of both, not {type(roles)} !")
|
|
120
|
+
raise Exception(f"Roles must be a int, role mention or NodeList of both, not {type(roles).__name__} !")
|
|
121
121
|
|
|
122
122
|
_validate_optional_string(reason, "Reason", _CMD)
|
|
123
123
|
|
|
124
124
|
roles: Union[IntNode, ListNode]
|
|
125
125
|
if not isinstance(roles, (IntNode, ListNode)):
|
|
126
|
-
raise Exception(f"Role must be a int, role mention or NodeList of both, not {type(roles)} !")
|
|
126
|
+
raise Exception(f"Role must be a int, role mention or NodeList of both, not {type(roles).__name__} !")
|
|
127
127
|
|
|
128
128
|
if isinstance(roles, IntNode):
|
|
129
129
|
roles: tuple = (roles, )
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_ui.py
RENAMED
|
@@ -225,7 +225,7 @@ async def build_ui(ui_node: Union[UiButtonNode, UiSelectNode], interpreter: "Dsh
|
|
|
225
225
|
update_nbr_usage_scope(interpreter.scope_id, 1)
|
|
226
226
|
|
|
227
227
|
else:
|
|
228
|
-
raise TypeError(f"UI node must be UiButtonNode or UiSelectNode, not {type(ui_node)} !")
|
|
228
|
+
raise TypeError(f"UI node must be UiButtonNode or UiSelectNode, not {type(ui_node).__name__} !")
|
|
229
229
|
|
|
230
230
|
return view
|
|
231
231
|
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_embed.py
RENAMED
|
@@ -26,6 +26,6 @@ def utils_check_embeds_arguments(_CMD: StrNode,
|
|
|
26
26
|
|
|
27
27
|
final_embeds = embeds
|
|
28
28
|
else:
|
|
29
|
-
raise Exception(f"Embeds must be a embed object or a ListNode, not {type(embeds)} in '{_CMD}' command")
|
|
29
|
+
raise Exception(f"Embeds must be a embed object or a ListNode, not {type(embeds).__name__} in '{_CMD}' command")
|
|
30
30
|
|
|
31
31
|
return final_embeds
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_file.py
RENAMED
|
@@ -37,6 +37,6 @@ def utils_check_files_arguments(_CMD: StrNode, files: Optional[Union[FileNode, L
|
|
|
37
37
|
spoiler=file.spoiler))
|
|
38
38
|
|
|
39
39
|
else:
|
|
40
|
-
raise Exception(f"Files must be a FileNode or a ListNode, not {type(files)} in '{_CMD}' command")
|
|
40
|
+
raise Exception(f"Files must be a FileNode or a ListNode, not {type(files).__name__} in '{_CMD}' command")
|
|
41
41
|
|
|
42
42
|
return final_files if len(final_files) > 0 else None
|
|
@@ -188,7 +188,7 @@ async def utils_len(ctx: Message, value):
|
|
|
188
188
|
3
|
|
189
189
|
"""
|
|
190
190
|
if not isinstance(value, (StrNode, ListNode)):
|
|
191
|
-
raise TypeError(f"value must be a list or a string in len command, not {type(value)}")
|
|
191
|
+
raise TypeError(f"value must be a list or a string in len command, not {type(value).__name__}")
|
|
192
192
|
|
|
193
193
|
return IntNode(len(value))
|
|
194
194
|
|
|
@@ -347,7 +347,7 @@ def utils_build_colour(color: Union[IntNode, ListNode]) -> Union[Colour, IntNode
|
|
|
347
347
|
else:
|
|
348
348
|
return Colour.from_rgb(*color)
|
|
349
349
|
else:
|
|
350
|
-
raise TypeError(f"Color must be an integer or a ListNode, not {type(color)} !")
|
|
350
|
+
raise TypeError(f"Color must be an integer or a ListNode, not {type(color).__name__} !")
|
|
351
351
|
|
|
352
352
|
def utils_refactor_emoji(emoji: Union[StrNode, None]) -> Union[StrNode, None]:
|
|
353
353
|
"""
|
|
@@ -67,7 +67,7 @@ async def utils_get_message(ctx: Message, message: Union[IntNode, StrNode]) -> M
|
|
|
67
67
|
dshell_cached_messages.set(cached_messages)
|
|
68
68
|
return cached_messages[message_id]
|
|
69
69
|
|
|
70
|
-
raise Exception(f"Message must be an integer or a string, not {type(message)} !")
|
|
70
|
+
raise Exception(f"Message must be an integer or a string, not {type(message).__name__} !")
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
async def utils_fetch_partial_message(partial_message: Union[Message, PartialMessage]) -> Message:
|
|
@@ -81,7 +81,7 @@ async def utils_fetch_partial_message(partial_message: Union[Message, PartialMes
|
|
|
81
81
|
if not isinstance(partial_message, PartialMessage):
|
|
82
82
|
if isinstance(partial_message, Message):
|
|
83
83
|
return partial_message
|
|
84
|
-
raise Exception(f"Expected a PartialMessage or Message, got '{type(partial_message)}' !")
|
|
84
|
+
raise Exception(f"Expected a PartialMessage or Message, got '{type(partial_message).__name__}' !")
|
|
85
85
|
|
|
86
86
|
try:
|
|
87
87
|
message = await partial_message.fetch()
|
|
@@ -35,4 +35,4 @@ async def utils_get_thread(ctx: Message, thread: Union[IntNode, StrNode]) -> Uni
|
|
|
35
35
|
except NotFound:
|
|
36
36
|
raise Exception(f"Thread with ID {message_id} not found in channel {channel_id} !")
|
|
37
37
|
|
|
38
|
-
raise Exception(f"Thread must be an integer or a string, not {type(thread)} !")
|
|
38
|
+
raise Exception(f"Thread must be an integer or a string, not {type(thread).__name__} !")
|
|
@@ -28,6 +28,7 @@ class DshellArguments:
|
|
|
28
28
|
"""
|
|
29
29
|
Manage Dshell parameters and arguments passed to a command call.
|
|
30
30
|
Example: !ban @user reason for ban
|
|
31
|
+
"order" list store parameters order append to the class
|
|
31
32
|
"""
|
|
32
33
|
|
|
33
34
|
def __init__(self):
|
|
@@ -36,6 +37,8 @@ class DshellArguments:
|
|
|
36
37
|
'*': DshellArgumentsData([], False, DTT.LIST) # Non-specified parameters
|
|
37
38
|
}
|
|
38
39
|
|
|
40
|
+
self.order: list[tuple[str, DTT]] = []
|
|
41
|
+
|
|
39
42
|
def set_parameter(self, name: StrNode, value: Any, type_: DTT, obligatory: bool = False) -> None:
|
|
40
43
|
"""
|
|
41
44
|
Set a parameter with its type and value.
|
|
@@ -45,6 +48,7 @@ class DshellArguments:
|
|
|
45
48
|
:param obligatory: Whether this parameter is required
|
|
46
49
|
"""
|
|
47
50
|
self.parameters[name] = DshellArgumentsData(value, obligatory, type_)
|
|
51
|
+
self.order.append((name, type_))
|
|
48
52
|
|
|
49
53
|
def get_parameter(self, name: str) -> DshellArgumentsData:
|
|
50
54
|
"""
|
|
@@ -83,6 +87,7 @@ class DshellArguments:
|
|
|
83
87
|
:param value: The parameter value to add to the list
|
|
84
88
|
"""
|
|
85
89
|
self.parameters['*'].value.append(value)
|
|
90
|
+
self.order.append(('*', DTT.PARAMETER))
|
|
86
91
|
|
|
87
92
|
def __repr__(self) -> str:
|
|
88
93
|
return str(self.parameters)
|
|
@@ -11,8 +11,9 @@ from .utils_interpreter import get_params, eval_expression, eval_expression_inli
|
|
|
11
11
|
from ..DISCORD_COMMANDS.dshell_embed import build_embed, rebuild_embed
|
|
12
12
|
from ..DISCORD_COMMANDS.dshell_ui import build_ui
|
|
13
13
|
from ..DISCORD_COMMANDS.utils.utils_permissions import build_permission
|
|
14
|
-
from .dshell_scope import Scope, new_scope, get_scope, create_scope, update_nbr_usage_scope
|
|
14
|
+
from .dshell_scope import Scope, new_scope, get_scope, create_scope, update_nbr_usage_scope
|
|
15
15
|
from .dshell_global_variables import MAX_SLEEP_TIME_SECONDS, MIN_SLEEP_TIME_SECONDS
|
|
16
|
+
from .dshell_iterators import DshellIterator
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
All_nodes = TypeVar('All_nodes', IfNode, LoopNode, ElseNode, ElifNode, ArgsCommandNode, VarNode)
|
|
@@ -365,6 +366,10 @@ async def eval_CodeNode(eval_node: EvalNode, interpreter: DshellInterpreteur):
|
|
|
365
366
|
:param interpreter: The Dshell interpreter instance.
|
|
366
367
|
"""
|
|
367
368
|
codeNode = await interpreter.eval_data_token(eval_node.codeNode)
|
|
369
|
+
|
|
370
|
+
if not isinstance(codeNode, CodeNode):
|
|
371
|
+
raise TypeError(f"[EVAL] ident must be a CodeNode, not {type(codeNode).__name__} !")
|
|
372
|
+
|
|
368
373
|
argscommand = await regroupe_commandes(eval_node.argsNode.body, interpreter)
|
|
369
374
|
kwargs = argscommand.get_dict_parameters()
|
|
370
375
|
kwargs.pop('*', None)
|
|
@@ -375,51 +380,3 @@ async def eval_CodeNode(eval_node: EvalNode, interpreter: DshellInterpreteur):
|
|
|
375
380
|
result = interpreter.env.get('__ret__')
|
|
376
381
|
|
|
377
382
|
return result
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
class DshellIterator:
|
|
381
|
-
"""
|
|
382
|
-
Used to transform anything into an iterable
|
|
383
|
-
"""
|
|
384
|
-
|
|
385
|
-
def __init__(self, data):
|
|
386
|
-
self.data = self._check_data(data)
|
|
387
|
-
self.current = 0
|
|
388
|
-
|
|
389
|
-
def __iter__(self):
|
|
390
|
-
return self
|
|
391
|
-
|
|
392
|
-
def __next__(self):
|
|
393
|
-
return next(self.data)
|
|
394
|
-
|
|
395
|
-
def _check_data(self, data: Any):
|
|
396
|
-
|
|
397
|
-
if not isinstance(data, (StrNode, ListNode, FloatNode, IntNode, FileNode, FileStreamNode)):
|
|
398
|
-
raise Exception(f"{data} can't be in a loop !")
|
|
399
|
-
|
|
400
|
-
if isinstance(data, FileNode):
|
|
401
|
-
return data.stream()
|
|
402
|
-
|
|
403
|
-
elif isinstance(data, (FloatNode, IntNode)):
|
|
404
|
-
return IntIterator(IntNode(data))
|
|
405
|
-
|
|
406
|
-
else:
|
|
407
|
-
return data
|
|
408
|
-
|
|
409
|
-
class IntIterator:
|
|
410
|
-
|
|
411
|
-
def __init__(self, max_iterator: IntNode):
|
|
412
|
-
self.max_iterator = max_iterator
|
|
413
|
-
self.pointer = IntNode(0)
|
|
414
|
-
|
|
415
|
-
def __iter__(self) -> "IntIterator":
|
|
416
|
-
return self
|
|
417
|
-
|
|
418
|
-
def __next__(self) -> IntNode:
|
|
419
|
-
if self.pointer >= self.max_iterator:
|
|
420
|
-
self.pointer = IntNode(0)
|
|
421
|
-
raise StopIteration
|
|
422
|
-
|
|
423
|
-
current = self.pointer
|
|
424
|
-
self.pointer += 1
|
|
425
|
-
return current
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from ..full_import import Any
|
|
2
|
+
from ..DshellParser.ast_nodes import IntNode, FloatNode, StrNode, ListNode, FileNode, FileStreamNode
|
|
3
|
+
|
|
4
|
+
class DshellIterator:
|
|
5
|
+
"""
|
|
6
|
+
Used to transform anything into an iterable
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
def __init__(self, data):
|
|
10
|
+
self.data = self._check_data(data)
|
|
11
|
+
self.current = 0
|
|
12
|
+
|
|
13
|
+
def __iter__(self):
|
|
14
|
+
return self
|
|
15
|
+
|
|
16
|
+
def __next__(self):
|
|
17
|
+
return next(self.data)
|
|
18
|
+
|
|
19
|
+
def _check_data(self, data: Any):
|
|
20
|
+
|
|
21
|
+
if not isinstance(data, (StrNode, ListNode, FloatNode, IntNode, FileNode, FileStreamNode, IntIterator)):
|
|
22
|
+
raise Exception(f"{data} can't be in a loop !")
|
|
23
|
+
|
|
24
|
+
if isinstance(data, FileNode):
|
|
25
|
+
return data.stream()
|
|
26
|
+
|
|
27
|
+
elif isinstance(data, (FloatNode, IntNode)):
|
|
28
|
+
return IntIterator(IntNode(data))
|
|
29
|
+
|
|
30
|
+
else:
|
|
31
|
+
return data
|
|
32
|
+
|
|
33
|
+
class IntIterator:
|
|
34
|
+
|
|
35
|
+
def __init__(self, max_iterator: IntNode,
|
|
36
|
+
min_iterator: IntNode = IntNode(0),
|
|
37
|
+
step: IntNode = IntNode(1)):
|
|
38
|
+
|
|
39
|
+
self.max_iterator = max_iterator
|
|
40
|
+
self.min_iterator = min_iterator
|
|
41
|
+
self.step = step
|
|
42
|
+
self.pointer = self.min_iterator
|
|
43
|
+
|
|
44
|
+
def __iter__(self) -> "IntIterator":
|
|
45
|
+
return self
|
|
46
|
+
|
|
47
|
+
def __next__(self) -> IntNode:
|
|
48
|
+
if self.pointer == self.max_iterator:
|
|
49
|
+
self.pointer = self.min_iterator
|
|
50
|
+
raise StopIteration
|
|
51
|
+
|
|
52
|
+
current = self.pointer
|
|
53
|
+
self.pointer += self.step
|
|
54
|
+
return current
|
|
55
|
+
|
|
56
|
+
def __repr__(self):
|
|
57
|
+
return f"<INT_ITERATOR> - {self.min_iterator} to {self.max_iterator} with step {self.step}"
|
|
@@ -6,8 +6,7 @@ from ..DshellTokenizer.dshell_token_type import DTT_DATA
|
|
|
6
6
|
from ..DshellParser.ast_nodes import IfNode, ParamNode, ListNode, StrNode
|
|
7
7
|
from ..DshellParser.dshell_parser import to_postfix
|
|
8
8
|
|
|
9
|
-
from Dshell.full_import import
|
|
10
|
-
from Dshell.full_import import Any, TYPE_CHECKING
|
|
9
|
+
from Dshell.full_import import Any, Union, TYPE_CHECKING
|
|
11
10
|
|
|
12
11
|
if TYPE_CHECKING:
|
|
13
12
|
from ..DshellInterpreteur.dshell_interpreter import DshellInterpreteur
|
|
@@ -23,7 +22,7 @@ async def regroupe_commandes(body: list[Token], interpreter: "DshellInterpreteur
|
|
|
23
22
|
|
|
24
23
|
:param body: The list of tokens to group.
|
|
25
24
|
:param interpreter: The Dshell interpreter instance.
|
|
26
|
-
:param normalise: If True,
|
|
25
|
+
:param normalise: If True, normalizes the arguments (make value lowercase).
|
|
27
26
|
"""
|
|
28
27
|
# tokens to return
|
|
29
28
|
|
|
@@ -67,10 +66,10 @@ async def regroupe_commandes(body: list[Token], interpreter: "DshellInterpreteur
|
|
|
67
66
|
|
|
68
67
|
while (index + 1) < n and body[index + 1].type not in (DTT.PARAMETER, DTT.STR_PARAMETER, DTT.PARAMETERS):
|
|
69
68
|
|
|
70
|
-
final_argument += body[index + 1].value + ''
|
|
69
|
+
final_argument += body[index + 1].value + ' '
|
|
71
70
|
index += 1
|
|
72
|
-
instance_dhsell_arguments.set_parameter(body[current_index].value, StrNode(final_argument), type_=DTT.STR_PARAMETER)
|
|
73
71
|
|
|
72
|
+
instance_dhsell_arguments.set_parameter(body[current_index].value, StrNode(final_argument), type_=DTT.STR_PARAMETER)
|
|
74
73
|
index += 1
|
|
75
74
|
|
|
76
75
|
elif body[index].type == DTT.PARAMETERS:
|
|
@@ -81,8 +80,8 @@ async def regroupe_commandes(body: list[Token], interpreter: "DshellInterpreteur
|
|
|
81
80
|
|
|
82
81
|
list_parameters.append(await interpreter.eval_data_token(body[index + 1]))
|
|
83
82
|
index += 1
|
|
84
|
-
instance_dhsell_arguments.set_parameter(body[current_index].value, ListNode(list_parameters), type_=DTT.PARAMETERS)
|
|
85
83
|
|
|
84
|
+
instance_dhsell_arguments.set_parameter(body[current_index].value, ListNode(list_parameters), type_=DTT.PARAMETERS)
|
|
86
85
|
index += 1
|
|
87
86
|
|
|
88
87
|
else:
|
|
@@ -93,60 +92,75 @@ async def regroupe_commandes(body: list[Token], interpreter: "DshellInterpreteur
|
|
|
93
92
|
|
|
94
93
|
async def get_params(node: ParamNode, interpreter: "DshellInterpreteur") -> dict[StrNode, Any]:
|
|
95
94
|
"""
|
|
96
|
-
Get the parameters from a ParamNode
|
|
95
|
+
Get the parameters from a ParamNode and replace their value if an input user is valide
|
|
97
96
|
:param node: The ParamNode to get the parameters from.
|
|
98
97
|
:param interpreter: The Dshell interpreter instance.
|
|
99
98
|
:return: A dictionary of parameters.
|
|
100
99
|
"""
|
|
101
|
-
def replace_match(match) -> StrNode:
|
|
102
|
-
special_char = match.group(1)
|
|
103
|
-
if special_char:
|
|
104
|
-
return ''
|
|
105
|
-
return StrNode(match.group(4))
|
|
106
|
-
|
|
107
|
-
variables = interpreter.vars
|
|
108
|
-
regrouped_parameters: DshellArguments = await regroupe_commandes(node.body, interpreter)
|
|
109
|
-
|
|
110
|
-
from ..DshellTokenizer.dshell_tokenizer import DshellTokenizer
|
|
111
|
-
_ = DshellTokenizer(variables, math_any_character=True).start()
|
|
112
|
-
regrouped_variables = await regroupe_commandes(_[0] if _ else tuple(), interpreter)
|
|
113
|
-
|
|
114
|
-
already_modified = set()
|
|
115
|
-
variables_non_specified_parameters = regrouped_variables.parameters.pop('*', None).value # remove non-specified parameters
|
|
116
|
-
|
|
117
|
-
for param_name, param_data in regrouped_variables.parameters.items():
|
|
118
|
-
regrouped_parameters.update_parameter(param_name, param_data)
|
|
119
|
-
variables = sub(rf"--([*']?)({escape(param_name)})\s+(.*)\s*?(.*)$", replace_match, variables, count=1)
|
|
120
|
-
already_modified.add(param_name)
|
|
121
|
-
|
|
122
|
-
index_variable = 0
|
|
123
|
-
for var in regrouped_parameters.parameters.keys():
|
|
124
|
-
if var not in already_modified:
|
|
125
|
-
|
|
126
|
-
parameter_type = regrouped_parameters.get_parameter(var).type
|
|
127
|
-
|
|
128
|
-
if parameter_type == DTT.PARAMETER and index_variable < len(variables_non_specified_parameters):
|
|
129
|
-
regrouped_parameters.set_parameter(StrNode(var), variables_non_specified_parameters[index_variable], parameter_type) # variables_post_regrouped[index_variable] is not a token so cannot be evaluated! causes problems in commands that require something other than str
|
|
130
|
-
index_variable += 1
|
|
131
|
-
|
|
132
|
-
elif parameter_type == DTT.STR_PARAMETER:
|
|
133
|
-
variables_post_regrouped: list[StrNode] = StrNode(variables.strip().split(' ')) if variables else [] # set only for full str parameters
|
|
134
|
-
str_parameters_set_for_variables = variables_post_regrouped[index_variable:]
|
|
135
|
-
# the line below allows setting a full str parameter with multiple words. If the remaining variables are empty, we use the default value (must use str function because otherwise it puts a DshellArgumentsData)
|
|
136
|
-
regrouped_parameters.set_parameter(StrNode(var), StrNode(' '.join(str_parameters_set_for_variables) if str_parameters_set_for_variables else [StrNode(regrouped_parameters.parameters.get(var, ''))]), parameter_type)
|
|
137
|
-
break
|
|
138
100
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
101
|
+
user_input: list[str] = interpreter.vars.strip().split()
|
|
102
|
+
param_node_arguments: DshellArguments = await regroupe_commandes(node.body, interpreter)
|
|
103
|
+
param_node_arguments_dict: dict[str, Union[Any, None]] = param_node_arguments.get_dict_parameters()
|
|
104
|
+
param_node_arguments_order: list[tuple[str, DTT]] = param_node_arguments.order
|
|
105
|
+
|
|
106
|
+
index_user_input: int = 0
|
|
107
|
+
index_order: int = 0
|
|
108
|
+
|
|
109
|
+
while index_order < len(param_node_arguments_order) and index_user_input < len(user_input):
|
|
110
|
+
|
|
111
|
+
# traitement des paramètres simple à tokeniser
|
|
112
|
+
if param_node_arguments_order[index_order][1] == DTT.PARAMETER:
|
|
113
|
+
old_index_order = index_order
|
|
114
|
+
tmp_parameter = ''
|
|
115
|
+
while (index_order < len(param_node_arguments_order) and
|
|
116
|
+
param_node_arguments_order[index_order][1] == DTT.PARAMETER and
|
|
117
|
+
index_user_input < len(user_input)):
|
|
118
|
+
|
|
119
|
+
tmp_parameter += user_input[index_user_input] + ' '
|
|
120
|
+
index_user_input += 1
|
|
121
|
+
index_order += 1
|
|
122
|
+
|
|
123
|
+
from ..DshellTokenizer.dshell_tokenizer import DshellTokenizer
|
|
124
|
+
tmp_tokens = DshellTokenizer(tmp_parameter).start()
|
|
125
|
+
|
|
126
|
+
if tmp_tokens and len(tmp_tokens[0]) > 0:
|
|
127
|
+
for i in range(old_index_order, index_order):
|
|
128
|
+
param_node_arguments_dict[param_node_arguments_order[i][0]] = tmp_tokens[0][i]
|
|
129
|
+
|
|
130
|
+
# traitement des paramètres à tokeniser à la chaine
|
|
131
|
+
elif param_node_arguments_order[index_order][1] == DTT.PARAMETERS:
|
|
132
|
+
old_index_order = index_order
|
|
133
|
+
tmp_parameter = ''
|
|
134
|
+
while index_user_input < len(user_input):
|
|
135
|
+
|
|
136
|
+
tmp_parameter += user_input[index_user_input] + ' '
|
|
137
|
+
index_user_input += 1
|
|
138
|
+
|
|
139
|
+
from ..DshellTokenizer.dshell_tokenizer import DshellTokenizer
|
|
140
|
+
tmp_tokens = DshellTokenizer(tmp_parameter).start()
|
|
141
|
+
|
|
142
|
+
if tmp_tokens and len(tmp_tokens[0]) > 0:
|
|
143
|
+
param_node_arguments_dict[param_node_arguments_order[old_index_order][0]] = ListNode(tmp_tokens[0])
|
|
144
|
+
|
|
145
|
+
# traitement des paramètres à considéré comme une chaine de caractère à la chaine
|
|
146
|
+
elif param_node_arguments_order[index_order][1] == DTT.STR_PARAMETER:
|
|
147
|
+
old_index_order = index_order
|
|
148
|
+
tmp_parameter = ''
|
|
149
|
+
while index_user_input < len(user_input):
|
|
150
|
+
|
|
151
|
+
tmp_parameter += user_input[index_user_input] + ' '
|
|
152
|
+
index_user_input += 1
|
|
153
|
+
|
|
154
|
+
param_node_arguments_dict[param_node_arguments_order[old_index_order][0]] = StrNode(tmp_parameter)
|
|
155
|
+
|
|
156
|
+
else:
|
|
157
|
+
raise Exception(f"Parameter type {param_node_arguments_order[index_order][1]} not found !\n"
|
|
158
|
+
f"Please, use : -- or --' or --*")
|
|
159
|
+
|
|
160
|
+
param_node_arguments_dict.pop('*')
|
|
161
|
+
return {StrNode(key): value for key, value in param_node_arguments_dict.items()}
|
|
142
162
|
|
|
143
|
-
for param_name, param_data in regrouped_parameters.parameters.items():
|
|
144
|
-
if param_data.obligatory and param_data.value == '*':
|
|
145
|
-
raise Exception(f"Parameter '{param_name}' is obligatory but not specified!")
|
|
146
163
|
|
|
147
|
-
x = regrouped_parameters.get_dict_parameters()
|
|
148
|
-
x.pop('*', None)
|
|
149
|
-
return x
|
|
150
164
|
|
|
151
165
|
|
|
152
166
|
async def eval_expression_inline(if_node: IfNode, interpreter: "DshellInterpreteur") -> Token:
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellTokenizer/dshell_keywords.py
RENAMED
|
@@ -10,7 +10,8 @@ __all__ = [
|
|
|
10
10
|
|
|
11
11
|
from ..DISCORD_COMMANDS import *
|
|
12
12
|
|
|
13
|
-
from
|
|
13
|
+
from ..full_import import Callable
|
|
14
|
+
from ..DshellInterpreteur.dshell_iterators import IntIterator
|
|
14
15
|
|
|
15
16
|
dshell_keyword: set[str] = {
|
|
16
17
|
'if', 'else', 'elif', 'loop', '#end', 'var', '#loop', '#if', 'sleep', 'param', '#param', 'code', '#code', 'eval', 'return', 'break'
|
|
@@ -183,8 +184,11 @@ dshell_mathematical_operators: dict[str, tuple[Callable, int, int, int]] = {
|
|
|
183
184
|
r"%": (lambda a, b: a % b, 7, 2, 2),
|
|
184
185
|
r"-": (lambda a, b=None: a-b if b is not None else -a, 6, 1, 2),
|
|
185
186
|
r"+": (lambda a, b: a + b, 6, 2, 2),
|
|
186
|
-
r"..": (lambda a, b:
|
|
187
|
-
|
|
187
|
+
r"..": (lambda a, b: (IntIterator(
|
|
188
|
+
min_iterator=IntNode(a),
|
|
189
|
+
max_iterator=IntNode(b),
|
|
190
|
+
step= IntNode(1 if a <= b else -1))
|
|
191
|
+
), 5, 2, 2)
|
|
188
192
|
# warning: ambiguity between unary and binary to be handled in your parser
|
|
189
193
|
|
|
190
194
|
}
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellTokenizer/dshell_tokenizer.py
RENAMED
|
@@ -71,14 +71,14 @@ table_regex: dict[DTT, Pattern] = {
|
|
|
71
71
|
|
|
72
72
|
class DshellTokenizer:
|
|
73
73
|
|
|
74
|
-
def __init__(self, code: str,
|
|
74
|
+
def __init__(self, code: str, match_any_character: bool = False):
|
|
75
75
|
"""
|
|
76
76
|
Initialize the tokenizer.
|
|
77
77
|
:param code: The code to tokenize
|
|
78
|
-
:param
|
|
78
|
+
:param match_any_character: Whether to match any character
|
|
79
79
|
"""
|
|
80
80
|
self.code: str = code
|
|
81
|
-
self.match_any_character: bool =
|
|
81
|
+
self.match_any_character: bool = match_any_character
|
|
82
82
|
self.data_pre_processor: list[PreProcessorData] = []
|
|
83
83
|
|
|
84
84
|
def start(self):
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/dshellInterpreter.egg-info/SOURCES.txt
RENAMED
|
@@ -31,6 +31,7 @@ Dshell/DshellInterpreteur/cached_messages.py
|
|
|
31
31
|
Dshell/DshellInterpreteur/dshell_arguments.py
|
|
32
32
|
Dshell/DshellInterpreteur/dshell_global_variables.py
|
|
33
33
|
Dshell/DshellInterpreteur/dshell_interpreter.py
|
|
34
|
+
Dshell/DshellInterpreteur/dshell_iterators.py
|
|
34
35
|
Dshell/DshellInterpreteur/dshell_scope.py
|
|
35
36
|
Dshell/DshellInterpreteur/errors.py
|
|
36
37
|
Dshell/DshellInterpreteur/utils_interpreter.py
|
|
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
|
|
|
5
5
|
|
|
6
6
|
setup(
|
|
7
7
|
name="dshellInterpreter",
|
|
8
|
-
version="1.2.
|
|
8
|
+
version="1.2.3.0",
|
|
9
9
|
author="Chronos",
|
|
10
10
|
author_email="vagabonwalybi@gmail.com",
|
|
11
11
|
description="A Discord bot interpreter for creating custom commands and automations.",
|
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_embed.py
RENAMED
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_file.py
RENAMED
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/dshell_pastbin.py
RENAMED
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/__init__.py
RENAMED
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DISCORD_COMMANDS/utils/utils_list.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellInterpreteur/cached_messages.py
RENAMED
|
File without changes
|
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellInterpreteur/dshell_scope.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellParser/dshell_parser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellPreProcess/dshell_preprocess.py
RENAMED
|
File without changes
|
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/Dshell/DshellTokenizer/dshell_token_type.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/dshellInterpreter.egg-info/requires.txt
RENAMED
|
File without changes
|
{dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.3.0}/dshellInterpreter.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|