繁体   English   中英

下拉菜单,如何使角色按下 Python Discord.py

[英]Drop-down menu, how to make the role issued by pressing Python Discord.py

我开始在 Python 开发一个 Discord 机器人,我遇到了一个问题,我找不到关于如何使用菜单发布角色的信息我写的代码:`

class Dropdown(discord.ui.Select):
    def __init__(self):
        options = [

            discord.SelectOption(label="role1", description="Крутая роль", emoji=""),

            discord.SelectOption(label="role2", description="Богатая роль", emoji="🤳"),
            discord.SelectOption(label="role3", description="Игровая роль", emoji="🎮"),
        ]

        super().__init__(
            placeholder="Меню",
            max_values=1,
            min_values=1,
            options=options
        )
    
    async def callback(self, inter: discord.MessageInteraction):
        await inter.response.send_message(f"Вы выбрали роль {self.values[0]}")


class DropdownView(discord.ui.View):
    def __init__(self):
        super().__init__()
        self.add_item(Dropdown())


@bot.command()
async def role(ctx):
    await ctx.send("Выберите роль:", view=DropdownView())

`

我试图在源代码中找到它,即使我能找到一些东西,也没有用。

某些角色的选项

有多种方法可以做到这一点,但我建议根据该角色的 ID 为每个选项赋予价值。 您可以通过单击角色上的...按钮并复制 ID 来获取 ID。 然后你可以使用

from discord.utils import get

role = get(inter.guild.roles, id=role_id)

在我们继续之前,我需要提到收到的交互不是MessageInteraction而是Interaction ,因此我们可以访问它具有的 guild 属性。

考虑到这一点,将它们与您拥有的代码放在一起将是:

from discord.utils import get

class Dropdown(discord.ui.Select):
    def __init__(self):
        options = [

            discord.SelectOption(label="role1", value=str(roleid1) ,description="Крутая роль", emoji=""),

            discord.SelectOption(label="role2", value=str(roleid2), description="Богатая роль", emoji="🤳"),
            discord.SelectOption(label="role3", value=str(roleid3), description="Игровая роль", emoji="🎮"),
        ]

        super().__init__(placeholder="Меню",options=options)
    
    async def callback(self, inter: discord.Interaction):
        await inter.user.add_roles(get(inter.guild.roles, id=int(self.values[0])))
        await inter.response.send_message(f"Вы выбрали роль <@&{self.values[0]}>")


class DropdownView(discord.ui.View):
    def __init__(self):
        super().__init__()
        self.add_item(Dropdown())


@bot.command()
async def role(ctx):
    await ctx.send("Выберите роль:", view=DropdownView())

另请注意, min_values max_values默认值为 1,因此您可以跳过它们。 在这里查看更多信息

所有角色

您可以使用RoleSelect class 自动获取角色。 然后,您可以在交互中使用它的values属性来获取已选择的角色列表。 所有这一切看起来像这样

import discord.ui


@bot.command()
async def role(ctx):
    view = discord.ui.View()
    role_select = discord.ui.RoleSelect(placeholder="Меню")

    async def role_select_callback(inter):
        await inter.response.send_message(f"Вы выбрали роль {role_select.values[0]}")
    
    role_select.callback = role_select_callback
    view.add_item(role_select)
    await ctx.send("Выберите роль:", view=view)

要向发送此命令的用户添加角色,您所要做的就是更改回调 function,以便它向与消息交互的人添加角色

import discord.ui


@bot.command()
async def role(ctx):
    view = discord.ui.View()
    role_select = discord.ui.RoleSelect(placeholder="Меню")

    async def role_select_callback(inter):
        await inter.user.add_roles(role_select.values[0])
    
    role_select.callback = role_select_callback
    view.add_item(role_select)
    await ctx.send("Выберите роль:", view=view)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM