dshellInterpreter 1.2.2.0__tar.gz → 1.2.2.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 (54) hide show
  1. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/dshell_channel.py +1 -1
  2. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/dshell_interaction.py +3 -3
  3. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/dshell_member.py +1 -1
  4. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/dshell_message.py +1 -1
  5. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/dshell_role.py +2 -2
  6. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/dshell_ui.py +1 -1
  7. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_embed.py +1 -1
  8. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_file.py +1 -1
  9. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_global.py +2 -2
  10. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_message.py +2 -2
  11. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_thread.py +1 -1
  12. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellInterpreteur/__init__.py +3 -0
  13. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellInterpreteur/dshell_arguments.py +5 -0
  14. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellInterpreteur/dshell_interpreter.py +6 -49
  15. dshellinterpreter-1.2.2.1/Dshell/DshellInterpreteur/dshell_iterators.py +54 -0
  16. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellInterpreteur/utils_interpreter.py +67 -53
  17. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellTokenizer/dshell_keywords.py +7 -3
  18. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellTokenizer/dshell_tokenizer.py +3 -3
  19. {dshellinterpreter-1.2.2.0/dshellInterpreter.egg-info → dshellinterpreter-1.2.2.1}/PKG-INFO +1 -1
  20. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1/dshellInterpreter.egg-info}/PKG-INFO +1 -1
  21. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/dshellInterpreter.egg-info/SOURCES.txt +1 -0
  22. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/setup.py +1 -1
  23. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/__init__.py +0 -0
  24. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/dshell_embed.py +0 -0
  25. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/dshell_file.py +0 -0
  26. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/dshell_pastbin.py +0 -0
  27. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/__init__.py +0 -0
  28. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_list.py +0 -0
  29. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_member.py +0 -0
  30. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_numbers.py +0 -0
  31. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_permissions.py +0 -0
  32. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_string.py +0 -0
  33. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DISCORD_COMMANDS/utils/utils_type_validation.py +0 -0
  34. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellInterpreteur/cached_messages.py +0 -0
  35. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellInterpreteur/dshell_global_variables.py +0 -0
  36. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellInterpreteur/dshell_scope.py +0 -0
  37. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellInterpreteur/errors.py +0 -0
  38. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellParser/__init__.py +0 -0
  39. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellParser/ast_nodes.py +0 -0
  40. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellParser/dshell_parser.py +0 -0
  41. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellParser/errors.py +0 -0
  42. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellPreProcess/__init__.py +0 -0
  43. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellPreProcess/dshell_preprocess.py +0 -0
  44. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellTokenizer/__init__.py +0 -0
  45. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/DshellTokenizer/dshell_token_type.py +0 -0
  46. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/__init__.py +0 -0
  47. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/full_import.py +0 -0
  48. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/Dshell/regex_test.py +0 -0
  49. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/LICENSE +0 -0
  50. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/README.md +0 -0
  51. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/dshellInterpreter.egg-info/dependency_links.txt +0 -0
  52. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/dshellInterpreter.egg-info/requires.txt +0 -0
  53. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/dshellInterpreter.egg-info/top_level.txt +0 -0
  54. {dshellinterpreter-1.2.2.0 → dshellinterpreter-1.2.2.1}/setup.cfg +0 -0
@@ -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
 
@@ -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
 
@@ -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
 
@@ -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, )
@@ -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
 
@@ -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
@@ -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__} !")
@@ -2,3 +2,6 @@ from .dshell_interpreter import *
2
2
  from .errors import *
3
3
  from .cached_messages import dshell_cached_messages
4
4
  from .dshell_arguments import DshellArguments
5
+ from .dshell_iterators import *
6
+ from .dshell_scope import *
7
+ from .dshell_global_variables import *
@@ -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, get_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,54 @@
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
@@ -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 sub, escape
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, normalises the arguments (make value lowercase).
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
- elif parameter_type == DTT.PARAMETERS:
140
- regrouped_parameters.set_parameter(StrNode(var), ListNode(variables_non_specified_parameters[index_variable:]), parameter_type)
141
- break
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:
@@ -10,7 +10,8 @@ __all__ = [
10
10
 
11
11
  from ..DISCORD_COMMANDS import *
12
12
 
13
- from Dshell.full_import import Callable
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: ListNode([IntNode(i) for i in range(IntNode(a), IntNode(b))])
187
- if a <= b else ListNode([IntNode(i) for i in range(IntNode(a), IntNode(b), -1)]), 5, 2, 2)
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
  }
@@ -71,14 +71,14 @@ table_regex: dict[DTT, Pattern] = {
71
71
 
72
72
  class DshellTokenizer:
73
73
 
74
- def __init__(self, code: str, math_any_character: bool = False):
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 math_any_character: Whether to match any character
78
+ :param match_any_character: Whether to match any character
79
79
  """
80
80
  self.code: str = code
81
- self.match_any_character: bool = math_any_character
81
+ self.match_any_character: bool = match_any_character
82
82
  self.data_pre_processor: list[PreProcessorData] = []
83
83
 
84
84
  def start(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dshellInterpreter
3
- Version: 1.2.2.0
3
+ Version: 1.2.2.1
4
4
  Summary: A Discord bot interpreter for creating custom commands and automations.
5
5
  Home-page: https://github.com/BOXERRMD/Dshell_Interpreter
6
6
  Author: Chronos
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dshellInterpreter
3
- Version: 1.2.2.0
3
+ Version: 1.2.2.1
4
4
  Summary: A Discord bot interpreter for creating custom commands and automations.
5
5
  Home-page: https://github.com/BOXERRMD/Dshell_Interpreter
6
6
  Author: Chronos
@@ -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.2.0",
8
+ version="1.2.2.1",
9
9
  author="Chronos",
10
10
  author_email="vagabonwalybi@gmail.com",
11
11
  description="A Discord bot interpreter for creating custom commands and automations.",