首页 > 解决方案 > 为什么 discord.py 中的 add_roles() 方法在这里失败?

问题描述

以下方法在来自烧瓶应用程序的不和谐机器人线程上调用。所有打印检查都显示正确的数据,因此该方法正在成功运行,但是最终的 fstring

f'{role} added to {member}'

不会输出到控制台,这让我觉得

await member.add_roles(role)

没有正确执行。控制台中没有显示错误。其他每一行似乎都运行正常。我已经包含了下面的相关方法,包括烧瓶应用程序中线程的结构方式

client_loop = asyncio.get_event_loop()
intents = discord.Intents(messages=True, guilds=True, members=True)
client = commands.Bot(command_prefix='$', help_command=None, intents = intents)

@client.event
async def on_ready():
    print(f'{client.user} is online!')
    return

async def start_bot():
    print(os.getenv("TOKEN"))
    await client.start(os.getenv("TOKEN"))


def run_it_forever(loop):
    loop.run_forever()

async def api_add_role(user, role_to_assign):
    guild = client.guilds[0]
    members = await guild.fetch_members(limit=None).flatten()
    role = discord.utils.get(guild.roles, name=role_to_assign)
    print("role")
    print(role)
    member = [m for m in members if m.name == user][0]
    print("member")
    print(member)
    await member.add_roles(role)
    print(f'{role} added to {member}')

app = Flask(__name__)

@app.route("/add_role")
def add_role_to_member():
    name = request.args.get('name')
    role = request.args.get('role')
    coroutine = asyncio.run_coroutine_threadsafe(api_add_role(name, role), client_loop)
    return "okay"

if __name__ == '__main__':
    asyncio.get_child_watcher()
    client_loop.create_task(start_bot())
    botThread = threading.Thread(target=run_it_forever, args=(client_loop,))
    def interrupt():
        global botThread
        botThread.join()
    atexit.register(interrupt)
    botThread.start()
    print("server starting....")
    app.run(host='0.0.0.0', port=5000)

标签: python-3.xflaskdiscord.pypython-asyncio

解决方案


我还没有看到有人使用你的方法来获取成员对象。有get_member_named什么是为此而生的。

async def api_add_role(user, role_to_assign):
    guild = client.guilds[0]

    role = discord.utils.get(guild.roles, name=role_to_assign)
    print(f"role: {role}")

    member = guild.get_member_named(user) # name or name#tag
    print(f"Member: {member}")

    if member and role: # if both exist
        await member.add_roles(role)
        print(f'{role.name} added to {member.name}')

推荐阅读