11
11
if TYPE_CHECKING :
12
12
from nextcord .abc import Snowflake
13
13
14
-
15
14
GUILD_ID = int (getenv ("GUILD_ID" , 0 ))
16
- UPDATES_ROLE_ID = int (getenv ("UPDATES_ROLE_ID" , 0 ))
17
- NEWS_ROLE_ID = int (getenv ("NEWS_ROLE_ID" , 0 ))
18
-
19
- ROLE_VALUES : dict [str , int ] = {
20
- "updates" : UPDATES_ROLE_ID ,
21
- "news" : NEWS_ROLE_ID ,
22
- }
15
+ ASSIGNABLE_ROLE_IDS = {int (r ) for r in getenv ("ASSIGNABLE_ROLE_IDS" , "[]" ).split ("," )}
23
16
24
17
25
18
class RolesView (View ):
26
- def __init__ (self , * , user : Member | None ):
19
+ def __init__ (self , * , member : Member | None ):
27
20
super ().__init__ (timeout = None )
28
21
29
- self .add_item (RolesSelect (user = user ))
22
+ self .add_item (RolesSelect (member = member ))
30
23
31
24
32
25
class FakeMember (Member ):
@@ -38,25 +31,25 @@ def get_role(self, *_):
38
31
39
32
40
33
class RolesSelect (Select ["RolesView" ]):
41
- def __init__ (self , * , user : Member | None ):
34
+ def __init__ (self , * , member : Member | None ):
42
35
# this is being invoked to add persistency
43
36
# we only care about custom_id for the store
44
37
# we cannot use guild.me as the bot is not ready so a guild is not available
45
- if user is None :
46
- user = FakeMember ()
38
+ if member is None :
39
+ member = FakeMember ()
47
40
48
41
super ().__init__ (
49
42
custom_id = "roles:select" ,
50
43
placeholder = "Select your new roles" ,
51
44
min_values = 0 ,
52
- max_values = 2 ,
45
+ max_values = len ( ASSIGNABLE_ROLE_IDS ) ,
53
46
options = [
54
47
SelectOption (
55
- label = name . capitalize (),
56
- value = name ,
57
- default = user .get_role (role_id ) is not None ,
48
+ label = member . guild . get_role ( role_id ). name , # type: ignore
49
+ value = str ( role_id ) ,
50
+ default = member .get_role (role_id ) is not None ,
58
51
)
59
- for name , role_id in ROLE_VALUES . items ()
52
+ for role_id in ASSIGNABLE_ROLE_IDS
60
53
],
61
54
)
62
55
@@ -67,27 +60,33 @@ async def callback(self, interaction: Interaction):
67
60
# since list is invariant, it cannot be a union
68
61
# but apparently Role does not implement Snowflake, this may need a fix
69
62
70
- for role , role_id in ROLE_VALUES .items ():
71
- if interaction .user .get_role (role_id ) is None and role in self .values :
63
+ for role_id in ASSIGNABLE_ROLE_IDS :
64
+ if (
65
+ interaction .user .get_role (role_id ) is None
66
+ and str (role_id ) in self .values
67
+ ):
72
68
# user does not have the role but wants it
73
69
roles .append (Object (role_id ))
74
- option = get (self .options , value = role )
70
+ option = get (self .options , value = str ( role_id ) )
75
71
if option is not None :
76
72
option .default = True
77
73
elif (
78
74
interaction .user .get_role (role_id ) is not None
79
- and role not in self .values
75
+ and str ( role_id ) not in self .values
80
76
):
81
77
# user has the role but does not want it
82
78
role_ids = [r .id for r in roles ]
83
79
roles .pop (role_ids .index (role_id ))
84
- option = get (self .options , value = role )
80
+ option = get (self .options , value = str ( role_id ) )
85
81
if option is not None :
86
82
option .default = False
87
83
88
84
await interaction .user .edit (roles = roles )
89
85
90
- new_roles = [value .capitalize () for value in self .values ]
86
+ new_roles = [
87
+ interaction .guild .get_role (int (value )).name # type: ignore
88
+ for value in self .values
89
+ ]
91
90
92
91
await interaction .edit (
93
92
content = f"You now have { ', ' .join (new_roles ) or 'no roles' } " , view = self .view
@@ -102,7 +101,7 @@ def __init__(self, bot):
102
101
103
102
async def create_views (self ):
104
103
if getattr (self .bot , "role_view_set" , False ) is False :
105
- self .bot .add_view (RolesView (user = None ))
104
+ self .bot .add_view (RolesView (member = None ))
106
105
# the view will accept None and only give us a select with a custom_id
107
106
108
107
self .bot .role_view_set = True
@@ -115,7 +114,7 @@ async def roles(self, interaction: Interaction):
115
114
116
115
await interaction .send (
117
116
"Select your new roles" ,
118
- view = RolesView (user = interaction .user ),
117
+ view = RolesView (member = interaction .user ),
119
118
ephemeral = True ,
120
119
)
121
120
0 commit comments