如何通过按钮添加和删除角色?

问题描述 投票:0回答:1

我需要确保按下按钮即可删除一个角色并添加另一个角色。 这是我的代码:

class SimpleView(discord.ui.View):
    def __init__(self):
         self.start_time = None
         self.stop_time = None
         super().__init__(timeout=None)
        
        



    @discord.ui.button(label="𝑬𝑵𝑻𝑹𝑨𝑻𝑨⬆️", style=discord.ButtonStyle.green, custom_id="1")
    async def entrata(self, interaction: discord.Interaction, button: discord.ui.Button):
            orario_it = datetime.now(pytz.timezone('Europe/Rome'))
            orario = orario_it.strftime('%H:%M')
            
            allowed_role_id = 1215328270443094128
            added_role_id = 1215318583702454352
            removed_role_id = 1215328270443094128
            allowed_role = discord.utils.get(interaction.guild.roles, id=allowed_role_id)
            user = interaction.user

            if allowed_role is None or allowed_role not in interaction.user.roles:
                 await interaction.response.send_message(f"***Per poter entrare in servizio dei essere in: {allowed_role.mention}!***", ephemeral=True)

            if allowed_role in interaction.user.roles:

              
                 SimpleView.start_time = time.time()
                 channel = bot.get_channel(1214495527924928522)           
                 embed=discord.Embed(color=0x23a559)
                 embed.set_thumbnail(url="https://shft.cl/img/c/cdn.discordapp.com-101395680655364460.webp")
                 embed.add_field(name="⬆️𝑬𝑵𝑻𝑹𝑨𝑻𝑨⬆️", value="", inline=False)                                 #BOTTONE ENTRATA
                 embed.add_field(name="NOME:", value=f"{interaction.user.mention}", inline=True)
                 embed.add_field(name="", value="", inline=True)
                 embed.add_field(name="", value="", inline=False)
                 embed.add_field(name="", value="", inline=False)
                 embed.add_field(name="DATA:", value=f"{data}", inline=True)
                 embed.add_field(name="ORARIO:", value=f"{orario}", inline=True)
                 embed.set_footer(text="ARMERIA200")
                 await user.remove_roles(removed_role_id)
                 await user.add_roles(added_role_id)
                 await channel.send(embed=embed)
                 await interaction.response.send_message(f"***SEI ENTRATO IN SERVIZIO ALLE: {orario}.***", ephemeral=True)

我的代码不起作用,我该怎么办? 它应该添加和删除角色,但不起作用,请帮助我🥺

python discord discord.py discord-buttons
1个回答
0
投票

在上面的代码中,您必须在

discord.Role
的参数中传递
user.add_roles()
(也在
user.remove_roles
中),但在代码中,您在参数中给出角色 id。您必须在
discord.guild.get_role()
之前获得该角色。

您可以使用以下代码解决上述问题:

class SimpleView(discord.ui.View):
    def __init__(self):
         self.start_time = None
         self.stop_time = None
         super().__init__(timeout=None)
        
        



    @discord.ui.button(label="𝑬𝑵𝑻𝑹𝑨𝑻𝑨⬆️", style=discord.ButtonStyle.green, custom_id="1")
    async def entrata(self, interaction: discord.Interaction, button: discord.ui.Button):
            orario_it = datetime.now(pytz.timezone('Europe/Rome'))
            orario = orario_it.strftime('%H:%M')
            
            allowed_role_id = 1215328270443094128
            added_role_id = 1215318583702454352
            removed_role_id = 1215328270443094128
            allowed_role = interaction.guild.get_role(allowed_role_id) #here also you can use get_role instead of utils.get
            user = interaction.user

            if allowed_role is None or allowed_role not in interaction.user.roles:
                 await interaction.response.send_message(f"***Per poter entrare in servizio dei essere in: {allowed_role.mention}!***", ephemeral=True)

            if allowed_role in interaction.user.roles:

              
                 SimpleView.start_time = time.time()
                 channel = bot.get_channel(1214495527924928522)           
                 embed=discord.Embed(color=0x23a559)
                 embed.set_thumbnail(url="https://shft.cl/img/c/cdn.discordapp.com-101395680655364460.webp")
                 embed.add_field(name="⬆️𝑬𝑵𝑻𝑹𝑨𝑻𝑨⬆️", value="", inline=False)                                 #BOTTONE ENTRATA
                 embed.add_field(name="NOME:", value=f"{interaction.user.mention}", inline=True)
                 embed.add_field(name="", value="", inline=True)
                 embed.add_field(name="", value="", inline=False)
                 embed.add_field(name="", value="", inline=False)
                 embed.add_field(name="DATA:", value=f"{data}", inline=True)
                 embed.add_field(name="ORARIO:", value=f"{orario}", inline=True)
                 embed.set_footer(text="ARMERIA200")
                 added_role = interaction.guild.get_role(added_role_id) #getting the role here
                 removed_role = interaction.guild.get_role(removed_role_id) #getting the role here
                 await user.remove_roles(removed_role) #removing the role here
                 await user.add_roles(added_role) #adding the role here
                 await channel.send(embed=embed)
                 await interaction.response.send_message(f"***SEI ENTRATO IN SERVIZIO ALLE: {orario}.***", ephemeral=True)

您也可以使用此方法来代替

discord.utils.get

记住:机器人应该在服务器中拥有

Manage_roles
权限。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.