dshellInterpreter 0.1.2__tar.gz → 0.1.4__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.
Potentially problematic release.
This version of dshellInterpreter might be problematic. Click here for more details.
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellInterpreteur/dshell_interpreter.py +36 -5
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellParser/ast_nodes.py +9 -1
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellParser/dshell_parser.py +15 -1
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellTokenizer/dshell_keywords.py +2 -2
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellTokenizer/dshell_token_type.py +2 -1
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellTokenizer/dshell_tokenizer.py +1 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/PKG-INFO +1 -1
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/dshellInterpreter.egg-info/PKG-INFO +1 -1
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/setup.py +1 -1
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/DISCORD_COMMANDS/__init__.py +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/DISCORD_COMMANDS/dshell_channel.py +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/DISCORD_COMMANDS/dshell_message.py +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellInterpreteur/__init__.py +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellParser/__init__.py +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellTokenizer/__init__.py +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/__init__.py +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/LICENSE +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/README.md +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/dshellInterpreter.egg-info/SOURCES.txt +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/dshellInterpreter.egg-info/dependency_links.txt +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/dshellInterpreter.egg-info/requires.txt +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/dshellInterpreter.egg-info/top_level.txt +0 -0
- {dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/setup.cfg +0 -0
{dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellInterpreteur/dshell_interpreter.py
RENAMED
|
@@ -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:
|
|
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
|
|
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[
|
|
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[
|
|
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):
|
{dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellTokenizer/dshell_keywords.py
RENAMED
|
@@ -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,
|
{dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/_DshellTokenizer/dshell_tokenizer.py
RENAMED
|
@@ -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
|
|
|
File without changes
|
{dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/DISCORD_COMMANDS/dshell_channel.py
RENAMED
|
File without changes
|
{dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/Dshell/DISCORD_COMMANDS/dshell_message.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/dshellInterpreter.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
{dshellinterpreter-0.1.2 → dshellinterpreter-0.1.4}/dshellInterpreter.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|