dshellInterpreter 0.1.2__py3-none-any.whl → 0.1.4__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.

Potentially problematic release.


This version of dshellInterpreter might be problematic. Click here for more details.

@@ -2,7 +2,7 @@ from asyncio import sleep
2
2
  from re import findall
3
3
  from typing import TypeVar, Union, Any, Optional, Callable
4
4
 
5
- from discord import AutoShardedBot, Embed, Colour
5
+ from discord import AutoShardedBot, Embed, Colour, PermissionOverwrite, Permissions
6
6
  from discord.abc import GuildChannel, PrivateChannel
7
7
 
8
8
  from .._DshellTokenizer.dshell_keywords import *
@@ -23,7 +23,7 @@ class DshellInterpreteur:
23
23
  """
24
24
  Interpreter Dshell code or AST.
25
25
  """
26
- self.ast: StartNode = parse(DshellTokenizer(ast_or_code).start(), StartNode([]))[0]
26
+ self.ast: list[ASTNode] = parse(DshellTokenizer(ast_or_code).start(), StartNode([]))[0]
27
27
  self.env: dict[str, Any] = {}
28
28
  self.ctx: context = ctx
29
29
  if debug:
@@ -33,8 +33,10 @@ class DshellInterpreteur:
33
33
  """
34
34
  Execute l'arbre syntaxique.
35
35
  """
36
+ if ast is None:
37
+ ast = self.ast
36
38
 
37
- for node in self.ast:
39
+ for node in ast:
38
40
 
39
41
  if isinstance(node, StartNode):
40
42
  await self.execute(node.body)
@@ -73,6 +75,9 @@ class DshellInterpreteur:
73
75
  elif isinstance(first_node, EmbedNode):
74
76
  self.env[node.name.value] = build_embed(first_node.body, first_node.fields, self)
75
77
 
78
+ elif isinstance(first_node, PermissionNode):
79
+ self.env[node.name.value] = build_permission(first_node.body, self)
80
+
76
81
  else:
77
82
  self.env[node.name.value] = eval_expression(node.body, self)
78
83
 
@@ -91,6 +96,7 @@ class DshellInterpreteur:
91
96
 
92
97
  await sleep(sleep_time)
93
98
 
99
+
94
100
  elif isinstance(node, EndNode):
95
101
  raise RuntimeError(f"Execution interromput -> #end atteint")
96
102
 
@@ -108,6 +114,8 @@ class DshellInterpreteur:
108
114
  return float(token.value)
109
115
  elif token.type == DTT.BOOL:
110
116
  return token.value.lower() == "true"
117
+ elif token.type == DTT.NONE:
118
+ return None
111
119
  elif token.type == DTT.LIST:
112
120
  return ListNode(
113
121
  [self.eval_data_token(tok) for tok in token.value]) # token.value contient déjà une liste de Token
@@ -188,7 +196,7 @@ async def call_function(function: Callable, args: ArgsCommandNode, interpreter:
188
196
  return await function(*absolute_args, **keyword_args)
189
197
 
190
198
 
191
- def regroupe_commandes(body: list[Token], interpreter: DshellInterpreteur) -> dict[Union[str, Token], list[Token]]:
199
+ def regroupe_commandes(body: list[Token], interpreter: DshellInterpreteur) -> dict[Union[str, Token], list[Any]]:
192
200
  """
193
201
  Regroupe les arguments de la commande sous la forme d'un dictionnaire python.
194
202
  Sachant que l'on peut spécifier le paramètre que l'on souhaite passer via -- suivit du nom du paramètre. Mais ce n'est pas obligatoire !
@@ -219,7 +227,7 @@ def build_embed(body: list[Token], fields: list[FieldEmbedNode], interpreter: Ds
219
227
  """
220
228
  Construit un embed à partir des informations de la commande.
221
229
  """
222
- args_main_embed: dict[Union[str, Token], list[Token]] = regroupe_commandes(body, interpreter)
230
+ args_main_embed: dict[Union[str, Token], list[Any]] = regroupe_commandes(body, interpreter)
223
231
  args_main_embed.pop('*') # on enlève les paramètres non spécifié pour l'embed
224
232
  args_main_embed: dict[str, Token] # on précise se qu'il contient dorénavant
225
233
 
@@ -240,6 +248,29 @@ def build_embed(body: list[Token], fields: list[FieldEmbedNode], interpreter: Ds
240
248
 
241
249
  return embed
242
250
 
251
+ def build_permission(body: list[Token], interpreter: DshellInterpreteur) -> PermissionOverwrite:
252
+ """
253
+ Construit un dictionnaire de permissions à partir des informations de la commande.
254
+ """
255
+ args_permissions: dict[Union[str, Token], list[Any]] = regroupe_commandes(body, interpreter)
256
+ args_permissions.pop('*') # on enlève les paramètres non spécifié pour les permissions
257
+ args_permissions: dict[str, Token] # on précise se qu'il contient dorénavant
258
+
259
+ permissions = PermissionOverwrite()
260
+
261
+ for key, value in args_permissions.items():
262
+
263
+ if key == 'allowed':
264
+ permissions.update(**PermissionOverwrite.from_pair(Permissions(value), Permissions())._values)
265
+
266
+ elif key == 'denied':
267
+ permissions.update(**PermissionOverwrite.from_pair(Permissions(), Permissions(value))._values)
268
+
269
+ else:
270
+ permissions.update(**{key: value})
271
+
272
+ return permissions
273
+
243
274
 
244
275
  class DshellIterator:
245
276
  """
@@ -17,7 +17,8 @@ __all__ = [
17
17
  'EmbedNode',
18
18
  'SleepNode',
19
19
  'IdentOperationNode',
20
- 'ListNode'
20
+ 'ListNode',
21
+ 'PermissionNode'
21
22
  ]
22
23
 
23
24
  class ASTNode:
@@ -121,6 +122,13 @@ class EmbedNode(ASTNode):
121
122
  def __repr__(self):
122
123
  return f"<EMBED> - {self.body}"
123
124
 
125
+ class PermissionNode(ASTNode):
126
+ def __init__(self, body: list[Token]):
127
+ self.body = body
128
+
129
+ def __repr__(self):
130
+ return f"<PERMISSION> - {self.body}"
131
+
124
132
 
125
133
  class SleepNode(ASTNode):
126
134
  def __init__(self, body: list[Token]):
@@ -21,6 +21,7 @@ from .ast_nodes import (ASTNode,
21
21
  IdentOperationNode,
22
22
  EmbedNode,
23
23
  FieldEmbedNode,
24
+ PermissionNode,
24
25
  StartNode)
25
26
  from .._DshellTokenizer.dshell_token_type import DshellTokenType as DTT
26
27
  from .._DshellTokenizer.dshell_token_type import Token
@@ -157,6 +158,19 @@ def parse(token_lines: list[list[Token]], start_node: ASTNode) -> tuple[list[AST
157
158
  raise SyntaxError(f'[FIELD] Aucun embed ouvert ligne {first_token_line.position} !')
158
159
  last_block.fields.append(FieldEmbedNode(tokens_by_line[1:]))
159
160
 
161
+ elif first_token_line.value in ('perm', 'permission'):
162
+ perm_node = PermissionNode(body=[])
163
+ var_node = VarNode(tokens_by_line[1], body=[perm_node])
164
+ last_block.body.append(var_node)
165
+ _, p = parse(token_lines[pointeur + 1:], perm_node)
166
+ pointeur += p + 1
167
+
168
+ elif first_token_line.value in ('#perm', '#permission'):
169
+ if not isinstance(last_block, PermissionNode):
170
+ raise SyntaxError(f'[#PERM] Aucun permission ouvert ligne {first_token_line.position} !')
171
+ blocks.pop()
172
+ return blocks, pointeur
173
+
160
174
  ############################## AUTRE ##############################
161
175
 
162
176
  elif first_token_line.type == DTT.IDENT:
@@ -271,7 +285,7 @@ def parse_postfix_expression(postfix_tokens: list[Token]) -> list[IdentOperation
271
285
  return stack
272
286
 
273
287
 
274
- def print_ast(ast: ASTNode, decalage: int = 0):
288
+ def print_ast(ast: list[ASTNode], decalage: int = 0):
275
289
  for i in ast:
276
290
 
277
291
  if isinstance(i, StartNode):
@@ -14,10 +14,10 @@ dshell_keyword: set[str] = {
14
14
  'if', 'else', 'elif', 'loop', '#end', 'var', '#loop', '#if', 'sleep'
15
15
  }
16
16
 
17
+
17
18
  dshell_discord_keyword: set[str] = {
18
- 'embed', '#embed', 'field'
19
+ 'embed', '#embed', 'field', 'perm', 'permission', '#perm', '#permission'
19
20
  }
20
-
21
21
  dshell_commands: dict[str, Callable] = {
22
22
  "sm": dshell_send_message, # send message
23
23
  "dm": dshell_delete_message,
@@ -14,7 +14,8 @@ class DshellTokenType(Enum):
14
14
  INT = auto()
15
15
  FLOAT = auto()
16
16
  STR = auto()
17
- BOOL = auto()
17
+ BOOL = auto(),
18
+ NONE = auto(),
18
19
  LIST = auto()
19
20
  CALL_ARGS = auto()
20
21
  DICT = auto()
@@ -29,6 +29,7 @@ table_regex: dict[DTT, Pattern] = {
29
29
  DTT.FLOAT: compile(r"(\d+\.\d+)"),
30
30
  DTT.INT: compile(r"(\d+)"),
31
31
  DTT.BOOL: compile(r"(True|False)", flags=IGNORECASE),
32
+ DTT.NONE: compile(r"(None)", flags=IGNORECASE),
32
33
  DTT.IDENT: compile(rf"([A-Za-z0-9_]+)")
33
34
  }
34
35
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dshellInterpreter
3
- Version: 0.1.2
3
+ Version: 0.1.4
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
@@ -0,0 +1,18 @@
1
+ Dshell/__init__.py,sha256=UPvXnewe_8FX9aoevMA78UN1k8AY-u8LTY3vEVxaDxw,72
2
+ Dshell/DISCORD_COMMANDS/__init__.py,sha256=s58iMazDXNPDLZ3Hvymh__C5w7lcgEvaYfX0-SHocRo,62
3
+ Dshell/DISCORD_COMMANDS/dshell_channel.py,sha256=IubzNzBtGEcbgkL_NJOWRY1oqE3Yb-ySDMUmoHKjGzM,2135
4
+ Dshell/DISCORD_COMMANDS/dshell_message.py,sha256=jgSGBeDDHVy8u9fX2WN6wzh7I9WqVkeySlpmbJsBZjs,1919
5
+ Dshell/_DshellInterpreteur/__init__.py,sha256=xy5-J-R3YmY99JF3NBHTRRLsComFxpjnCA5xacISctU,35
6
+ Dshell/_DshellInterpreteur/dshell_interpreter.py,sha256=PvEmcUbXAsMP6mtmTgVJzDsnh3LwEAUQjkDQgJe4HLo,12023
7
+ Dshell/_DshellParser/__init__.py,sha256=ONDfhZMvClqP_6tE8SLjp-cf3pXL-auQYnfYRrHZxC4,56
8
+ Dshell/_DshellParser/ast_nodes.py,sha256=tAoLhxR0koG4iqWx0x9TvgHqamz5VHYisDjpAxnbJVE,5683
9
+ Dshell/_DshellParser/dshell_parser.py,sha256=mA8uA-xBhKcfnSKfLfePwI_fD0GrHbj0VBVeJPbcGas,13956
10
+ Dshell/_DshellTokenizer/__init__.py,sha256=LIQSRhDx2B9pmPx5ADMwwD0Xr9ybneVLhHH8qrJWw_s,172
11
+ Dshell/_DshellTokenizer/dshell_keywords.py,sha256=KR9xVtinuisGe59juHcBngbKOG5jH0f1MFTTd-CBCQA,3663
12
+ Dshell/_DshellTokenizer/dshell_token_type.py,sha256=EG-0I3mq4XznW75JVowOmlrWS3-WsBJPFcE6pjqrXwM,958
13
+ Dshell/_DshellTokenizer/dshell_tokenizer.py,sha256=T-AKxnpFbJa-3rtknZEuNrPyGvCTfFXQeU2GsJqHzt8,5745
14
+ dshellinterpreter-0.1.4.dist-info/licenses/LICENSE,sha256=lNgcw1_xb7QENAQi3uHGymaFtbs0RV-ihiCd7AoLQjA,1082
15
+ dshellinterpreter-0.1.4.dist-info/METADATA,sha256=nH-VEca_4tFl-8Ysy0i5lmw9UiM4FBtccuxdruK0c2g,1093
16
+ dshellinterpreter-0.1.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
+ dshellinterpreter-0.1.4.dist-info/top_level.txt,sha256=B4CMhtmchGwPQJLuqUy0GhRG-0cUGxKL4GqEbCiB_vE,7
18
+ dshellinterpreter-0.1.4.dist-info/RECORD,,
@@ -1,18 +0,0 @@
1
- Dshell/__init__.py,sha256=UPvXnewe_8FX9aoevMA78UN1k8AY-u8LTY3vEVxaDxw,72
2
- Dshell/DISCORD_COMMANDS/__init__.py,sha256=s58iMazDXNPDLZ3Hvymh__C5w7lcgEvaYfX0-SHocRo,62
3
- Dshell/DISCORD_COMMANDS/dshell_channel.py,sha256=IubzNzBtGEcbgkL_NJOWRY1oqE3Yb-ySDMUmoHKjGzM,2135
4
- Dshell/DISCORD_COMMANDS/dshell_message.py,sha256=jgSGBeDDHVy8u9fX2WN6wzh7I9WqVkeySlpmbJsBZjs,1919
5
- Dshell/_DshellInterpreteur/__init__.py,sha256=xy5-J-R3YmY99JF3NBHTRRLsComFxpjnCA5xacISctU,35
6
- Dshell/_DshellInterpreteur/dshell_interpreter.py,sha256=Vs5tojqiI0QMSrc3Ze2MQCojAvqWag7S2biTMnaYxF0,10770
7
- Dshell/_DshellParser/__init__.py,sha256=ONDfhZMvClqP_6tE8SLjp-cf3pXL-auQYnfYRrHZxC4,56
8
- Dshell/_DshellParser/ast_nodes.py,sha256=ArTyuk7AykJ3xKiW656BOdZg92YEwbfAlzZF1YQeZoA,5483
9
- Dshell/_DshellParser/dshell_parser.py,sha256=PscOxBG2PXuoTJoKJhw1QRFSMyEMm4-aFxbEkoeXCwc,13241
10
- Dshell/_DshellTokenizer/__init__.py,sha256=LIQSRhDx2B9pmPx5ADMwwD0Xr9ybneVLhHH8qrJWw_s,172
11
- Dshell/_DshellTokenizer/dshell_keywords.py,sha256=NFa4VdfX26X5lU1Ps05hZkZg5IyBDpG9WgT9L1oTckM,3617
12
- Dshell/_DshellTokenizer/dshell_token_type.py,sha256=Gp-Vg2P96oTaKpOEKGHAvER7l98mbcuwmapLVJgmoCI,937
13
- Dshell/_DshellTokenizer/dshell_tokenizer.py,sha256=9ycZhz2X2uvZynE0illgi5AhtNyR_c5o1KX-pwCP1xM,5692
14
- dshellinterpreter-0.1.2.dist-info/licenses/LICENSE,sha256=lNgcw1_xb7QENAQi3uHGymaFtbs0RV-ihiCd7AoLQjA,1082
15
- dshellinterpreter-0.1.2.dist-info/METADATA,sha256=lNxkmuQIfqCTn9vb9dn3_WdYkzhlZXfST5h2Z4maa3o,1093
16
- dshellinterpreter-0.1.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
- dshellinterpreter-0.1.2.dist-info/top_level.txt,sha256=B4CMhtmchGwPQJLuqUy0GhRG-0cUGxKL4GqEbCiB_vE,7
18
- dshellinterpreter-0.1.2.dist-info/RECORD,,