dshellInterpreter 0.2.3__tar.gz → 0.2.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.

Files changed (26) hide show
  1. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/DISCORD_COMMANDS/__init__.py +1 -0
  2. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/DISCORD_COMMANDS/dshell_pastbin.py +1 -1
  3. dshellinterpreter-0.2.4/Dshell/DISCORD_COMMANDS/dshell_role.py +116 -0
  4. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/_DshellInterpreteur/dshell_interpreter.py +27 -6
  5. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/_DshellTokenizer/dshell_keywords.py +5 -0
  6. {dshellinterpreter-0.2.3/dshellInterpreter.egg-info → dshellinterpreter-0.2.4}/PKG-INFO +2 -1
  7. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4/dshellInterpreter.egg-info}/PKG-INFO +2 -1
  8. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/dshellInterpreter.egg-info/SOURCES.txt +1 -0
  9. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/dshellInterpreter.egg-info/requires.txt +1 -0
  10. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/setup.py +2 -2
  11. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/DISCORD_COMMANDS/dshell_channel.py +0 -0
  12. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/DISCORD_COMMANDS/dshell_member.py +0 -0
  13. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/DISCORD_COMMANDS/dshell_message.py +0 -0
  14. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/_DshellInterpreteur/__init__.py +0 -0
  15. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/_DshellParser/__init__.py +0 -0
  16. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/_DshellParser/ast_nodes.py +0 -0
  17. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/_DshellParser/dshell_parser.py +0 -0
  18. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/_DshellTokenizer/__init__.py +0 -0
  19. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/_DshellTokenizer/dshell_token_type.py +0 -0
  20. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/_DshellTokenizer/dshell_tokenizer.py +0 -0
  21. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/Dshell/__init__.py +0 -0
  22. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/LICENSE +0 -0
  23. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/README.md +0 -0
  24. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/dshellInterpreter.egg-info/dependency_links.txt +0 -0
  25. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/dshellInterpreter.egg-info/top_level.txt +0 -0
  26. {dshellinterpreter-0.2.3 → dshellinterpreter-0.2.4}/setup.cfg +0 -0
@@ -2,3 +2,4 @@ from .dshell_channel import *
2
2
  from .dshell_message import *
3
3
  from .dshell_member import *
4
4
  from .dshell_pastbin import *
5
+ from .dshell_role import *
@@ -22,7 +22,7 @@ async def dshell_get_pastbin(ctx: Message, code: str):
22
22
 
23
23
  for line in response.iter_lines(decode_unicode=True, chunk_size=512):
24
24
  len_content = len(content)
25
- if line and len_content < 4000 and len_content + len(line) <= 4000:
25
+ if len_content < 4000 and len_content + len(line) <= 4000:
26
26
  content += line + '\n'
27
27
  else:
28
28
  break
@@ -0,0 +1,116 @@
1
+ from discord import MISSING, Message, Role, Permissions, PermissionOverwrite
2
+ from discord.utils import _MissingSentinel
3
+ from .._DshellInterpreteur.dshell_interpreter import build_colour, ListNode
4
+
5
+ __all__ = [
6
+ 'dshell_create_role',
7
+ 'dshell_delete_roles',
8
+ 'dshell_edit_role'
9
+
10
+ ]
11
+
12
+ async def dshell_create_role(ctx: Message,
13
+ name: str = MISSING,
14
+ permissions: dict[None, PermissionOverwrite] = MISSING,
15
+ color: int = MISSING,
16
+ hoist: bool = MISSING,
17
+ mentionable: bool = MISSING,
18
+ reason: str = None):
19
+ """
20
+ Creates a role on the server.
21
+ """
22
+ if not isinstance(name, (str, _MissingSentinel)):
23
+ raise Exception(f"Name must be a string, not {type(name)} !")
24
+
25
+ if not isinstance(permissions, (dict, _MissingSentinel)):
26
+ raise Exception(f"Permissions must be a PermissionNode, not {type(permissions)} !")
27
+
28
+ colour = build_colour(color)
29
+
30
+ if not isinstance(hoist, (bool, _MissingSentinel)):
31
+ raise Exception(f"Hoist must be a boolean, not {type(permissions)} !")
32
+
33
+ if not isinstance(mentionable, (bool, _MissingSentinel)):
34
+ raise Exception(f"Mentionable must be a boolean, not {type(permissions)} !")
35
+
36
+ if isinstance(permissions, dict):
37
+ if None in permissions:
38
+ allow, deny = permissions[None].pair()
39
+ permissions = allow
40
+
41
+ created_role = await ctx.guild.create_role(name=name,
42
+ permissions=permissions,
43
+ colour=colour,
44
+ hoist=hoist,
45
+ mentionable=mentionable,
46
+ reason=str(reason))
47
+
48
+ return created_role.id
49
+
50
+
51
+ async def dshell_delete_roles(ctx: Message, roles, reason=None):
52
+ """
53
+ Delete the role on the server
54
+ """
55
+ roles: int | ListNode
56
+ if not isinstance(roles, (int, ListNode)):
57
+ raise Exception(f"Role must be a int, role mention or NodeList of both, not {type(roles)} !")
58
+
59
+ if isinstance(roles, int):
60
+ roles: tuple = (roles, )
61
+
62
+ for i in roles:
63
+ role_to_delete = ctx.guild.get_role(i)
64
+
65
+ if role_to_delete is None:
66
+ raise Exception(f'Role {i} not found in the server !')
67
+
68
+ await role_to_delete.delete(reason=str(reason))
69
+
70
+
71
+ async def dshell_edit_role(ctx: Message,
72
+ role,
73
+ name=None,
74
+ permissions: dict[None, PermissionOverwrite]=None,
75
+ color=None,
76
+ hoist=None,
77
+ mentionable=None,
78
+ position=None,
79
+ reason=None,):
80
+ """
81
+ Edit the current role
82
+ """
83
+ if not isinstance(role, int):
84
+ raise Exception(f"Role must be a int or role mention not {type(role)} !")
85
+
86
+ role_to_edit = ctx.guild.get_role(role)
87
+
88
+ if not isinstance(name, (str, None)):
89
+ raise Exception(f"Name must be a string, not {type(name)} !")
90
+
91
+ if not isinstance(permissions, (dict, None)):
92
+ raise Exception(f"Permissions must be a PermissionNode, not {type(permissions)} !")
93
+
94
+ if isinstance(permissions, dict):
95
+ if None in permissions:
96
+ allow, deny = permissions[None].pair()
97
+ permissions = allow
98
+
99
+ colour = build_colour(color)
100
+
101
+ if not isinstance(hoist, (bool, None)):
102
+ raise Exception(f"Hoist must be a boolean, not {type(permissions)} !")
103
+
104
+ if not isinstance(mentionable, (bool, None)):
105
+ raise Exception(f"Mentionable must be a boolean, not {type(permissions)} !")
106
+
107
+ if not isinstance(position, (int, None)):
108
+ raise Exception(f"Position must be an integer, not {type(permissions)} !")
109
+
110
+ await role_to_edit.edit(name=name if name is not None else role_to_edit.name,
111
+ permissions=permissions if permissions is not None else role_to_edit.permissions,
112
+ colour=colour if color is not None else role_to_edit.colour,
113
+ hoist=hoist if hoist is not None else role_to_edit.hoist,
114
+ mentionable=mentionable if mentionable is not None else role_to_edit.mentionable,
115
+ position=position if position is not None else role_to_edit.position,
116
+ reason=str(reason))
@@ -366,9 +366,8 @@ def build_embed(body: list[Token], fields: list[FieldEmbedNode], interpreter: Ds
366
366
  a: dict[str, Token]
367
367
  args_fields.append(a)
368
368
 
369
- if 'color' in args_main_embed and isinstance(args_main_embed['color'],
370
- ListNode): # if color is a ListNode, convert it to Colour
371
- args_main_embed['color'] = Colour.from_rgb(*args_main_embed['color'])
369
+ if 'color' in args_main_embed:
370
+ args_main_embed['color'] = build_colour(args_main_embed['color']) # convert color to Colour object or int
372
371
 
373
372
  embed = Embed(**args_main_embed) # build the main embed
374
373
  for field in args_fields:
@@ -376,6 +375,21 @@ def build_embed(body: list[Token], fields: list[FieldEmbedNode], interpreter: Ds
376
375
 
377
376
  return embed
378
377
 
378
+ def build_colour(color: Union[int, ListNode]) -> Union[Colour, int]:
379
+ """
380
+ Builds a Colour object from an integer or a ListNode.
381
+ :param color: The color to build.
382
+ :return: A Colour object.
383
+ """
384
+ if isinstance(color, int):
385
+ return color
386
+ elif isinstance(color, (ListNode, list)):
387
+ if not len(color) == 3:
388
+ raise ValueError(f"Color must be a list of 3 integers, not {len(color)} elements !")
389
+ return Colour.from_rgb(*color)
390
+ else:
391
+ raise TypeError(f"Color must be an integer or a ListNode, not {type(color)} !")
392
+
379
393
 
380
394
  def build_permission(body: list[Token], interpreter: DshellInterpreteur) -> dict[
381
395
  Union[Member, Role], PermissionOverwrite]:
@@ -446,9 +460,12 @@ class DshellPermissions:
446
460
  if member is not None:
447
461
  return member
448
462
 
449
- if role is not None:
463
+ elif role is not None:
450
464
  return role
451
465
 
466
+ else:
467
+ raise ValueError(f"No member or role found with ID {target_id} in guild {guild.name}.")
468
+
452
469
  @staticmethod
453
470
  def get_member(guild: Guild, target_id: int) -> Member:
454
471
  """
@@ -480,10 +497,11 @@ class DshellPermissions:
480
497
  def get_permission_overwrite(self, guild: Guild) -> dict[Union[Member, Role], PermissionOverwrite]:
481
498
  """
482
499
  Returns a PermissionOverwrite object with member and role permissions.
500
+ If no members or roles are specified, it returns a PermissionOverwrite with None key.
483
501
  :param guild: The Discord server
484
502
  :return: A dictionary of PermissionOverwrite objects with members and roles as keys
485
503
  """
486
- permissions: dict[Union[Member, Role], PermissionOverwrite] = {}
504
+ permissions: dict[Union[Member, Role, None], PermissionOverwrite] = {}
487
505
  target_keys = self.target.keys()
488
506
 
489
507
  if 'members' in target_keys:
@@ -506,6 +524,9 @@ class DshellPermissions:
506
524
  deny=Permissions(permissions=self.target.get('deny', 0))
507
525
  )
508
526
  else:
509
- raise ValueError("No members or roles specified in the permissions target.")
527
+ permissions[None] = PermissionOverwrite.from_pair(
528
+ allow=Permissions(permissions=self.target.get('allow', 0)),
529
+ deny=Permissions(permissions=self.target.get('deny', 0))
530
+ )
510
531
 
511
532
  return permissions
@@ -13,6 +13,7 @@ from ..DISCORD_COMMANDS.dshell_channel import *
13
13
  from ..DISCORD_COMMANDS.dshell_member import *
14
14
  from ..DISCORD_COMMANDS.dshell_message import *
15
15
  from ..DISCORD_COMMANDS.dshell_pastbin import *
16
+ from ..DISCORD_COMMANDS.dshell_role import *
16
17
 
17
18
  dshell_keyword: set[str] = {
18
19
  'if', 'else', 'elif', 'loop', '#end', 'var', '#loop', '#if', 'sleep', 'param', '#param'
@@ -49,6 +50,10 @@ dshell_commands: dict[str, Callable] = {
49
50
  "ec": dshell_edit_text_channel, # edit text channel
50
51
  "evc": dshell_edit_voice_channel, # edit voice channel
51
52
 
53
+ "cr": dshell_create_role,
54
+ "dr": dshell_delete_roles,
55
+ "er": dshell_edit_role,
56
+
52
57
  "amr": dshell_add_reactions, # add reactions to a message
53
58
  "rmr": dshell_remove_reactions, # remove reactions from a message
54
59
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dshellInterpreter
3
- Version: 0.2.3
3
+ Version: 0.2.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
@@ -16,6 +16,7 @@ Requires-Python: >=3.9
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: py-cord==2.6.1
19
+ Requires-Dist: requests
19
20
  Dynamic: author
20
21
  Dynamic: author-email
21
22
  Dynamic: classifier
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dshellInterpreter
3
- Version: 0.2.3
3
+ Version: 0.2.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
@@ -16,6 +16,7 @@ Requires-Python: >=3.9
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: py-cord==2.6.1
19
+ Requires-Dist: requests
19
20
  Dynamic: author
20
21
  Dynamic: author-email
21
22
  Dynamic: classifier
@@ -7,6 +7,7 @@ Dshell/DISCORD_COMMANDS/dshell_channel.py
7
7
  Dshell/DISCORD_COMMANDS/dshell_member.py
8
8
  Dshell/DISCORD_COMMANDS/dshell_message.py
9
9
  Dshell/DISCORD_COMMANDS/dshell_pastbin.py
10
+ Dshell/DISCORD_COMMANDS/dshell_role.py
10
11
  Dshell/_DshellInterpreteur/__init__.py
11
12
  Dshell/_DshellInterpreteur/dshell_interpreter.py
12
13
  Dshell/_DshellParser/__init__.py
@@ -5,7 +5,7 @@ with open("README.md", "r") as fh:
5
5
 
6
6
  setup(
7
7
  name="dshellInterpreter",
8
- version="0.2.3",
8
+ version="0.2.4",
9
9
  author="Chronos",
10
10
  author_email="vagabonwalybi@gmail.com",
11
11
  description="A Discord bot interpreter for creating custom commands and automations.",
@@ -14,7 +14,7 @@ setup(
14
14
  url="https://github.com/BOXERRMD/Dshell_Interpreter",
15
15
  packages=["Dshell", "Dshell._DshellInterpreteur", "Dshell._DshellTokenizer", "Dshell._DshellParser",
16
16
  "Dshell.DISCORD_COMMANDS"],
17
- install_requires=["py-cord==2.6.1"],
17
+ install_requires=["py-cord==2.6.1", "requests"],
18
18
  classifiers=[
19
19
  "Programming Language :: Python :: 3",
20
20
  "License :: OSI Approved :: MIT License",