dshellInterpreter 0.2.16.0__tar.gz → 0.2.16.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.
Potentially problematic release.
This version of dshellInterpreter might be problematic. Click here for more details.
- dshellinterpreter-0.2.16.1/Dshell/DISCORD_COMMANDS/utils/utils_global.py +139 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/utils/utils_list.py +1 -1
- dshellinterpreter-0.2.16.1/Dshell/DISCORD_COMMANDS/utils/utils_member.py +27 -0
- dshellinterpreter-0.2.16.1/Dshell/DISCORD_COMMANDS/utils/utils_permissions.py +77 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellInterpreteur/dshell_interpreter.py +9 -103
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellTokenizer/dshell_keywords.py +12 -1
- {dshellinterpreter-0.2.16.0/dshellInterpreter.egg-info → dshellinterpreter-0.2.16.1}/PKG-INFO +1 -1
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1/dshellInterpreter.egg-info}/PKG-INFO +1 -1
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/dshellInterpreter.egg-info/SOURCES.txt +2 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/setup.py +1 -1
- dshellinterpreter-0.2.16.0/Dshell/DISCORD_COMMANDS/utils/utils_global.py +0 -15
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/__init__.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_channel.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_interaction.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_member.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_message.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_pastbin.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_role.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/utils/__init__.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/utils/utils_message.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/utils/utils_thread.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellInterpreteur/__init__.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellParser/__init__.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellParser/ast_nodes.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellParser/dshell_parser.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellTokenizer/__init__.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellTokenizer/dshell_token_type.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellTokenizer/dshell_tokenizer.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/__init__.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_utils.py +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/LICENSE +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/README.md +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/dshellInterpreter.egg-info/dependency_links.txt +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/dshellInterpreter.egg-info/requires.txt +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/dshellInterpreter.egg-info/top_level.txt +0 -0
- {dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/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 = 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 guild.get_member(value).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,27 @@
|
|
|
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: 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, PermissionOverwrite):
|
|
20
|
+
raise TypeError(f"permissions must be a permission bloc in has_perms command, not {type(permission)}")
|
|
21
|
+
|
|
22
|
+
discord_type, member = utils_what_discord_type_is(ctx, member)
|
|
23
|
+
|
|
24
|
+
if discord_type != DiscordType.MEMBER:
|
|
25
|
+
raise ValueError(f"No member found with ID {member} in has_perms command.")
|
|
26
|
+
|
|
27
|
+
return (member.guild_permissions & permission.pair()[0]) == permission.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], 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
|
-
|
|
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
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellTokenizer/dshell_keywords.py
RENAMED
|
@@ -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
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/dshellInterpreter.egg-info/SOURCES.txt
RENAMED
|
@@ -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.
|
|
8
|
+
version="0.2.16.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.",
|
|
@@ -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)
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/__init__.py
RENAMED
|
File without changes
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_channel.py
RENAMED
|
File without changes
|
|
File without changes
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_member.py
RENAMED
|
File without changes
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_message.py
RENAMED
|
File without changes
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_pastbin.py
RENAMED
|
File without changes
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/dshell_role.py
RENAMED
|
File without changes
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/DISCORD_COMMANDS/utils/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellInterpreteur/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellParser/dshell_parser.py
RENAMED
|
File without changes
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/Dshell/_DshellTokenizer/__init__.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.2.16.0 → dshellinterpreter-0.2.16.1}/dshellInterpreter.egg-info/requires.txt
RENAMED
|
File without changes
|
{dshellinterpreter-0.2.16.0 → dshellinterpreter-0.2.16.1}/dshellInterpreter.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|