【发布时间】: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