dshellInterpreter 0.2.16.0__tar.gz → 0.2.16.2__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 (36) hide show
  1. dshellinterpreter-0.2.16.2/Dshell/DISCORD_COMMANDS/utils/utils_global.py +139 -0
  2. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/utils/utils_list.py +1 -1
  3. dshellinterpreter-0.2.16.2/Dshell/DISCORD_COMMANDS/utils/utils_member.py +30 -0
  4. dshellinterpreter-0.2.16.2/Dshell/DISCORD_COMMANDS/utils/utils_permissions.py +77 -0
  5. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/_DshellInterpreteur/dshell_interpreter.py +9 -103
  6. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/_DshellTokenizer/dshell_keywords.py +12 -1
  7. {dshellinterpreter-0.2.16.0/dshellInterpreter.egg-info → dshellinterpreter-0.2.16.2}/PKG-INFO +1 -1
  8. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2/dshellInterpreter.egg-info}/PKG-INFO +1 -1
  9. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/dshellInterpreter.egg-info/SOURCES.txt +2 -0
  10. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/setup.py +1 -1
  11. dshellinterpreter-0.2.16.0/Dshell/DISCORD_COMMANDS/utils/utils_global.py +0 -15
  12. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/__init__.py +0 -0
  13. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/dshell_channel.py +0 -0
  14. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/dshell_interaction.py +0 -0
  15. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/dshell_member.py +0 -0
  16. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/dshell_message.py +0 -0
  17. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/dshell_pastbin.py +0 -0
  18. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/dshell_role.py +0 -0
  19. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/utils/__init__.py +0 -0
  20. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/utils/utils_message.py +0 -0
  21. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/DISCORD_COMMANDS/utils/utils_thread.py +0 -0
  22. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/_DshellInterpreteur/__init__.py +0 -0
  23. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/_DshellParser/__init__.py +0 -0
  24. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/_DshellParser/ast_nodes.py +0 -0
  25. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/_DshellParser/dshell_parser.py +0 -0
  26. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/_DshellTokenizer/__init__.py +0 -0
  27. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/_DshellTokenizer/dshell_token_type.py +0 -0
  28. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/_DshellTokenizer/dshell_tokenizer.py +0 -0
  29. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/__init__.py +0 -0
  30. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/Dshell/_utils.py +0 -0
  31. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/LICENSE +0 -0
  32. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/README.md +0 -0
  33. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/dshellInterpreter.egg-info/dependency_links.txt +0 -0
  34. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/dshellInterpreter.egg-info/requires.txt +0 -0
  35. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/dshellInterpreter.egg-info/top_level.txt +0 -0
  36. {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.2}/setup.cfg +0 -0
@@ -0,0 +1,139 @@
1
+ __all__ = [
2
+ "utils_len",
3
+ "utils_get_name",
4
+ "utils_get_id",
5
+ "utils_get_roles",
6
+ ]
7
+
8
+ from discord import Message, Role, TextChannel, VoiceChannel, CategoryChannel, ForumChannel, Thread, Member, Guild
9
+ from discord.utils import get
10
+ from typing import Union
11
+ from enum import StrEnum
12
+
13
+
14
+ class DiscordType(StrEnum):
15
+ MEMBER = "member"
16
+ ROLE = "role"
17
+ TEXT_CHANNEL = "text_channel"
18
+ VOICE_CHANNEL = "voice_channel"
19
+ CATEGORY_CHANNEL = "category_channel"
20
+ FORUM_CHANNEL = "forum_channel"
21
+ THREAD = "thread"
22
+ UNKNOWN = "unknown"
23
+
24
+ def utils_what_discord_type_is(ctx: Union[Message, Guild], value: int) -> tuple[str, Union[Member, Role, TextChannel, VoiceChannel, CategoryChannel, ForumChannel, Thread, None]]:
25
+ """
26
+ Return an enum of what the value is (str, int, list, Member, Role, Channel, etc.)
27
+ :param ctx:
28
+ :param value:
29
+ :return:
30
+ """
31
+ guild = ctx if isinstance(ctx, Guild) else ctx.guild
32
+
33
+ if member := guild.get_member(value):
34
+ return DiscordType.MEMBER, member
35
+
36
+ elif role := guild.get_role(value):
37
+ return DiscordType.ROLE, role
38
+
39
+ elif (channel := guild.get_channel(value)) and isinstance(channel, TextChannel):
40
+ return DiscordType.TEXT_CHANNEL, channel
41
+
42
+ elif (channel := guild.get_channel(value)) and isinstance(channel, VoiceChannel):
43
+ return DiscordType.VOICE_CHANNEL, channel
44
+
45
+ elif (channel := guild.get_channel(value)) and isinstance(channel, CategoryChannel):
46
+ return DiscordType.CATEGORY_CHANNEL, channel
47
+
48
+ elif (channel := guild.get_channel(value)) and isinstance(channel, ForumChannel):
49
+ return DiscordType.FORUM_CHANNEL, channel
50
+
51
+ elif (channel := guild.get_channel(value)) and isinstance(channel, Thread):
52
+ return DiscordType.THREAD, channel
53
+ else:
54
+ return DiscordType.UNKNOWN, None
55
+
56
+ async def utils_len(ctx: Message, value):
57
+ """
58
+ Return the length of a list, or a string
59
+ :param value:
60
+ :return:
61
+ """
62
+ from ..._DshellParser.ast_nodes import ListNode
63
+ if not isinstance(value, (str, ListNode)):
64
+ raise TypeError(f"value must be a list or a string in len command, not {type(value)}")
65
+
66
+ return len(value)
67
+
68
+ async def utils_get_name(ctx : Message, value: int) -> Union[str, None]:
69
+ """
70
+ Return the name of a role, member, or channel.
71
+ If not found, return None.
72
+ :param value:
73
+ :return:
74
+ """
75
+
76
+ if not isinstance(value, int):
77
+ raise TypeError(f"value must be an int in name command, not {type(value)}")
78
+
79
+ guild = ctx.guild
80
+ result = None
81
+
82
+ if role := guild.get_role(value):
83
+ result = role.name
84
+
85
+ elif member := guild.get_member(value):
86
+ result = member.name
87
+
88
+ if channel := guild.get_channel(value) :
89
+ result = channel.name
90
+
91
+ return result
92
+
93
+ async def utils_get_id(ctx : Message, value: str) -> Union[int, None]:
94
+ """
95
+ Return the id of a role, member, or channel.
96
+ If not found, return None.
97
+ :param value:
98
+ :return:
99
+ """
100
+
101
+ if not isinstance(value, str):
102
+ raise TypeError(f"value must be a str in id command, not {type(value)}")
103
+
104
+ guild = ctx.guild
105
+ result = None
106
+
107
+ if role := get(guild.roles, name=value):
108
+ result = role.id
109
+
110
+ elif member := get(guild.members, name=value):
111
+ result = member.id
112
+
113
+ if channel := get(guild.channels, name=value) :
114
+ result = channel.id
115
+
116
+ return result
117
+
118
+ async def utils_get_roles(ctx: Message, value: int):
119
+ """
120
+ Return the roles of a member.
121
+ :param value:
122
+ :return:
123
+ """
124
+
125
+ if not isinstance(value, int):
126
+ raise TypeError(f"value must be an int in roles command, not {type(value)}")
127
+
128
+ guild = ctx.guild
129
+
130
+ what_is, member = utils_what_discord_type_is(ctx, value)
131
+
132
+ if what_is == DiscordType.UNKNOWN:
133
+ raise ValueError(f"{value} member not found in guild {guild.name}")
134
+
135
+ if what_is != DiscordType.MEMBER:
136
+ raise TypeError(f"value must be a member id in roles command, not {what_is}")
137
+
138
+ from ..._DshellParser.ast_nodes import ListNode
139
+ return ListNode([i.id for i in member.roles])
@@ -94,7 +94,7 @@ async def utils_list_reverse(ctx, value: "ListNode"):
94
94
  value.reverse()
95
95
  return value
96
96
 
97
- async def utils_list_get_value(ctx, value: "ListNode", index: int):
97
+ async def utils_list_get_value(ctx, value: "ListNode", index: int = 0):
98
98
  """
99
99
  Get a value from a list
100
100
  :param value:
@@ -0,0 +1,30 @@
1
+ __all__ = [
2
+ "utils_has_permissions",
3
+ ]
4
+ from discord import Message, PermissionOverwrite
5
+
6
+ from .utils_global import utils_what_discord_type_is, DiscordType
7
+
8
+ async def utils_has_permissions(ctx: Message, member: int, permission: dict[None, PermissionOverwrite]) -> bool:
9
+ """
10
+ Return True if the member has the specified permissions.
11
+ :param member:
12
+ :param permission:
13
+ :return:
14
+ """
15
+
16
+ if not isinstance(member, int):
17
+ raise TypeError(f"member must be an int in has_perms command, not {type(member)}")
18
+
19
+ if not isinstance(permission, dict):
20
+ raise TypeError(f"permissions must be a permission bloc in has_perms command, not {type(permission)}")
21
+
22
+ if None not in permission:
23
+ raise ValueError(f"permissions must have simple 'allow' permission in has_perms command, not {permission.keys()}")
24
+
25
+ discord_type, member = utils_what_discord_type_is(ctx, member)
26
+
27
+ if discord_type != DiscordType.MEMBER:
28
+ raise ValueError(f"No member found with ID {member} in has_perms command.")
29
+
30
+ return (member.guild_permissions & permission[None].pair()[0]) == permission[None].pair()[0]
@@ -0,0 +1,77 @@
1
+ from typing import Union, TYPE_CHECKING
2
+ from discord import Guild, Member, Role, Permissions, PermissionOverwrite
3
+
4
+ from ..._DshellParser.ast_nodes import ListNode
5
+ from .utils_global import utils_what_discord_type_is, DiscordType
6
+
7
+ class DshellPermissions:
8
+
9
+ def __init__(self, target: dict[str, list[int]]):
10
+ """
11
+ Creates a Dshell permissions object.
12
+ :param target: A dictionary containing parameters and their values.
13
+ Expected parameters: “allow”, “deny”, ‘members’, “roles”.
14
+ For “members” and “roles”, values must be ID ListNodes.
15
+ """
16
+ self.target: dict[str, Union[ListNode, int]] = target
17
+
18
+ @staticmethod
19
+ def get_member(guild, member_id: int) -> Member:
20
+ """
21
+ Return a Member object from a member ID.
22
+ :param member_id:
23
+ :return:
24
+ """
25
+ discord_type, instance = utils_what_discord_type_is(guild, member_id)
26
+ if discord_type == DiscordType.MEMBER:
27
+ return instance
28
+ raise ValueError(f"No member found with ID {member_id} in perm command.")
29
+
30
+ @staticmethod
31
+ def get_role(guild, role_id: int) -> Role:
32
+ """
33
+ Return a Role object from a role ID.
34
+ :param role_id:
35
+ :return:
36
+ """
37
+ discord_type, instance = utils_what_discord_type_is(guild, role_id)
38
+ if discord_type == DiscordType.ROLE:
39
+ return instance
40
+ raise ValueError(f"No role found with ID {role_id} in perm command.")
41
+
42
+ def get_permission_overwrite(self, guild: Guild) -> dict[Union[Member, Role, None], PermissionOverwrite]:
43
+ """
44
+ Returns a PermissionOverwrite object with member and role permissions.
45
+ If no members or roles are specified, it returns a PermissionOverwrite with None key.
46
+ :param guild: The Discord server
47
+ :return: A dictionary of PermissionOverwrite objects with members and roles as keys
48
+ """
49
+ permissions: dict[Union[Member, Role, None], PermissionOverwrite] = {}
50
+ target_keys = self.target.keys()
51
+
52
+ if 'members' in target_keys:
53
+ for member_id in (
54
+ self.target['members'] if isinstance(self.target['members'], ListNode) else [
55
+ self.target['members']]): # allow a single ID
56
+ member = self.get_member(guild, member_id)
57
+ permissions[member] = PermissionOverwrite.from_pair(
58
+ allow=Permissions(permissions=self.target.get('allow', 0)),
59
+ deny=Permissions(permissions=self.target.get('deny', 0))
60
+ )
61
+
62
+ elif 'roles' in target_keys:
63
+ for role_id in (
64
+ self.target['roles'] if isinstance(self.target['roles'], ListNode) else [
65
+ self.target['roles']]): # allow a single ID
66
+ role = self.get_role(guild, role_id)
67
+ permissions[role] = PermissionOverwrite.from_pair(
68
+ allow=Permissions(permissions=self.target.get('allow', 0)),
69
+ deny=Permissions(permissions=self.target.get('deny', 0))
70
+ )
71
+ else:
72
+ permissions[None] = PermissionOverwrite.from_pair(
73
+ allow=Permissions(permissions=self.target.get('allow', 0)),
74
+ deny=Permissions(permissions=self.target.get('deny', 0))
75
+ )
76
+
77
+ return permissions
@@ -10,6 +10,7 @@ from discord.ui import Button
10
10
  from discord.abc import PrivateChannel
11
11
 
12
12
  from .._DshellParser.ast_nodes import *
13
+ from ..DISCORD_COMMANDS.utils.utils_permissions import DshellPermissions
13
14
  from .._DshellParser.dshell_parser import parse
14
15
  from .._DshellParser.dshell_parser import to_postfix, print_ast
15
16
  from .._DshellTokenizer.dshell_keywords import *
@@ -72,6 +73,11 @@ class DshellInterpreteur:
72
73
  '__guild_emojis__': ListNode([emoji.id for emoji in message.channel.guild.emojis]),
73
74
  '__guild_emojis_count__': len(message.channel.guild.emojis),
74
75
  '__guild_channels__': ListNode([channel.id for channel in message.channel.guild.channels]),
76
+ '__guild_text_channels__': ListNode([channel.id for channel in message.channel.guild.text_channels]),
77
+ '__guild_voice_channels__': ListNode([channel.id for channel in message.channel.guild.voice_channels]),
78
+ '__guild_categories__': ListNode([channel.id for channel in message.channel.guild.categories]),
79
+ '__guild_stage_channels__': ListNode([channel.id for channel in message.channel.guild.stage_channels]),
80
+ '__guild_forum_channels__': ListNode([channel.id for channel in message.channel.guild.forum_channels]),
75
81
  '__guild_channels_count__': len(message.channel.guild.channels),
76
82
 
77
83
  } if message is not None and not debug else {} # {} is used in debug mode, when ctx is None
@@ -102,7 +108,9 @@ class DshellInterpreteur:
102
108
  await self.execute(node.body)
103
109
 
104
110
  if isinstance(node, CommandNode):
105
- self.env['__ret__'] = await call_function(dshell_commands[node.name], node.body, self)
111
+ result = await call_function(dshell_commands[node.name], node.body, self)
112
+ self.env[f'__{node.name}__'] = result # return value of the command
113
+ self.env['__ret__'] = result # global return variable for all commands
106
114
 
107
115
  elif isinstance(node, ParamNode):
108
116
  params = get_params(node, self)
@@ -627,105 +635,3 @@ class DshellIterator:
627
635
  return value
628
636
 
629
637
 
630
- class DshellPermissions:
631
-
632
- def __init__(self, target: dict[str, list[int]]):
633
- """
634
- Creates a Dshell permissions object.
635
- :param target: A dictionary containing parameters and their values.
636
- Expected parameters: “allow”, “deny”, ‘members’, “roles”.
637
- For “members” and “roles”, values must be ID ListNodes.
638
- """
639
- self.target: dict[str, Union[ListNode, int]] = target
640
-
641
- @staticmethod
642
- def get_instance(guild: Guild, target_id: int) -> Union[Member, Role]:
643
- """
644
- Returns the instance corresponding to the given id. Only a Member or Role.
645
- :param guild: The Discord server in which to search
646
- :param target_id: The ID of the member or role
647
- :return: An instance of Member or Role
648
- """
649
- try:
650
- member = DshellPermissions.get_member(guild, target_id)
651
- except ValueError:
652
- member = None
653
-
654
- try:
655
- role = DshellPermissions.get_role(guild, target_id)
656
- except ValueError:
657
- role = None
658
-
659
- if member is not None:
660
- return member
661
-
662
- elif role is not None:
663
- return role
664
-
665
- else:
666
- raise ValueError(f"No member or role found with ID {target_id} in guild {guild.name}.")
667
-
668
- @staticmethod
669
- def get_member(guild: Guild, target_id: int) -> Member:
670
- """
671
- Returns the Member instance corresponding to the given id.
672
- :param guild: The Discord server to search
673
- :param target_id: The member ID
674
- :return: A Member instance
675
- """
676
- member = guild.get_member(target_id)
677
- if member is not None:
678
- return member
679
-
680
- raise ValueError(f"No member found with ID {target_id} in guild {guild.name}.")
681
-
682
- @staticmethod
683
- def get_role(guild: Guild, target_id: int) -> Role:
684
- """
685
- Returns the Role instance corresponding to the given id.
686
- :param guild: The Discord server to search
687
- :param target_id: The role ID
688
- :return: A Role instance
689
- """
690
- role = guild.get_role(target_id)
691
- if role is not None:
692
- return role
693
-
694
- raise ValueError(f"No role found with ID {target_id} in guild {guild.name}.")
695
-
696
- def get_permission_overwrite(self, guild: Guild) -> dict[Union[Member, Role], PermissionOverwrite]:
697
- """
698
- Returns a PermissionOverwrite object with member and role permissions.
699
- If no members or roles are specified, it returns a PermissionOverwrite with None key.
700
- :param guild: The Discord server
701
- :return: A dictionary of PermissionOverwrite objects with members and roles as keys
702
- """
703
- permissions: dict[Union[Member, Role, None], PermissionOverwrite] = {}
704
- target_keys = self.target.keys()
705
-
706
- if 'members' in target_keys:
707
- for member_id in (
708
- self.target['members'] if isinstance(self.target['members'], ListNode) else [
709
- self.target['members']]): # allow a single ID
710
- member = self.get_member(guild, member_id)
711
- permissions[member] = PermissionOverwrite.from_pair(
712
- allow=Permissions(permissions=self.target.get('allow', 0)),
713
- deny=Permissions(permissions=self.target.get('deny', 0))
714
- )
715
-
716
- elif 'roles' in target_keys:
717
- for role_id in (
718
- self.target['roles'] if isinstance(self.target['roles'], ListNode) else [
719
- self.target['roles']]): # allow a single ID
720
- role = self.get_role(guild, role_id)
721
- permissions[role] = PermissionOverwrite.from_pair(
722
- allow=Permissions(permissions=self.target.get('allow', 0)),
723
- deny=Permissions(permissions=self.target.get('deny', 0))
724
- )
725
- else:
726
- permissions[None] = PermissionOverwrite.from_pair(
727
- allow=Permissions(permissions=self.target.get('allow', 0)),
728
- deny=Permissions(permissions=self.target.get('deny', 0))
729
- )
730
-
731
- return permissions
@@ -10,7 +10,6 @@ __all__ = [
10
10
 
11
11
  from typing import Callable
12
12
 
13
- from ..DISCORD_COMMANDS import utils_len, utils_list_add
14
13
  from ..DISCORD_COMMANDS.dshell_channel import *
15
14
  from ..DISCORD_COMMANDS.dshell_member import *
16
15
  from ..DISCORD_COMMANDS.dshell_message import *
@@ -19,6 +18,7 @@ from ..DISCORD_COMMANDS.dshell_role import *
19
18
  from ..DISCORD_COMMANDS.dshell_interaction import *
20
19
  from ..DISCORD_COMMANDS.utils.utils_global import *
21
20
  from ..DISCORD_COMMANDS.utils.utils_list import *
21
+ from ..DISCORD_COMMANDS.utils.utils_member import *
22
22
 
23
23
  dshell_keyword: set[str] = {
24
24
  'if', 'else', 'elif', 'loop', '#end', 'var', '#loop', '#if', 'sleep', 'param', '#param'
@@ -29,6 +29,7 @@ dshell_discord_keyword: set[str] = {
29
29
  }
30
30
  dshell_commands: dict[str, Callable] = {
31
31
 
32
+ ## List utils
32
33
  'length': utils_len,
33
34
  'len': utils_len,
34
35
  'add': utils_list_add,
@@ -39,8 +40,18 @@ dshell_commands: dict[str, Callable] = {
39
40
  'reverse': utils_list_reverse,
40
41
  'get': utils_list_get_value,
41
42
 
43
+ ## Discord utils
44
+ 'name': utils_get_name, # get the name from id (channel, role, member)
45
+ 'id': utils_get_id, # get the id from name (channel, role, member)
46
+ 'roles': utils_get_roles, # get all roles of a member
47
+
48
+ ## Member utils
49
+ 'has_perms': utils_has_permissions, # check if a member has the specified permissions
50
+
51
+ ## Pastbin command
42
52
  "gp": dshell_get_pastbin, # get pastbin
43
53
 
54
+ ## Discord commands
44
55
  "sm": dshell_send_message, # send message
45
56
  "spm": dshell_send_private_message, # send private message
46
57
  "srm": dshell_respond_message, # respond to a message
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dshellInterpreter
3
- Version: 0.2.16.0
3
+ Version: 0.2.16.2
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: 0.2.16.0
3
+ Version: 0.2.16.2
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
@@ -13,7 +13,9 @@ Dshell/DISCORD_COMMANDS/dshell_role.py
13
13
  Dshell/DISCORD_COMMANDS/utils/__init__.py
14
14
  Dshell/DISCORD_COMMANDS/utils/utils_global.py
15
15
  Dshell/DISCORD_COMMANDS/utils/utils_list.py
16
+ Dshell/DISCORD_COMMANDS/utils/utils_member.py
16
17
  Dshell/DISCORD_COMMANDS/utils/utils_message.py
18
+ Dshell/DISCORD_COMMANDS/utils/utils_permissions.py
17
19
  Dshell/DISCORD_COMMANDS/utils/utils_thread.py
18
20
  Dshell/_DshellInterpreteur/__init__.py
19
21
  Dshell/_DshellInterpreteur/dshell_interpreter.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.16.0",
8
+ version="0.2.16.2",
9
9
  author="Chronos",
10
10
  author_email="vagabonwalybi@gmail.com",
11
11
  description="A Discord bot interpreter for creating custom commands and automations.",
@@ -1,15 +0,0 @@
1
- __all__ = [
2
- "utils_len",
3
- ]
4
-
5
- async def utils_len(ctx, value):
6
- """
7
- Return the length of a list, or a string
8
- :param value:
9
- :return:
10
- """
11
- from ..._DshellParser.ast_nodes import ListNode
12
- if not isinstance(value, (str, ListNode)):
13
- raise TypeError(f"value must be a list or a string in len command, not {type(value)}")
14
-
15
- return len(value)