【问题标题】:Why does the add_roles() method from discord.py fail here?为什么 discord.py 中的 add_roles() 方法在这里失败?
【发布时间】:2021-04-12 20:52:33
【问题描述】:

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

【问题讨论】:

  • 还有一件事,您似乎正在使用烧瓶服务器来处理您的 API。那可能是没有必要的。您的代码已经可以访问您正在做的任何事情,因此不需要任何 API 内容。不过,您可以让烧瓶服务器在自己的线程中运行以使其永远不会脱机。
  • 这肯定是必要的
  • 机器人需要在烧瓶中从自己的进程中运行。请,如果你不理解你正在阅读的代码,最好不要参与这个问题
  • 哦,有道理。我会提出另一个答案,希望它能更好地帮助你。

标签: python-3.x flask discord.py python-asyncio


【解决方案1】:

我还没有看到有人使用你的方法来获取成员对象。 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}')

【讨论】:

  • 嗯,谢谢。不知道。这只是我遵循我的思考过程并阅读文档。无论如何它都可以工作,在打印语句中选择并输出正确的成员。但是感谢您的提示
  • 角色添加了吗?
  • 不。我使用的方法也是选择正确的成员对象。问题似乎与等待电话有关。它永远不会回来。我不知道为什么
  • 那么它打印出正确的角色和成员吗?但不加?
  • 正确是的。我认为这是在 asyncio 子例程中使用 await 语句的某种错误,但在其上找不到任何东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 2011-03-19
  • 2017-06-22
  • 2014-01-29
  • 1970-01-01
相关资源
最近更新 更多