如何在client.close().Discord.py之后重新启动dicord机器人



我在烧瓶中用api制作disocord bot。现在它只需要向频道发送消息。但如果我用烧瓶启动bot,所有的烧瓶代码都会停止。我尝试使用client.close,但出现了异常RuntimeError: Event loop is closed。我试着在不同的地方使用client.clean。但我还是有这个例外。

现在我的代码看起来是这样的:

from flask import Flask, request
import json
import discord
global data
app = Flask(__name__)
client = discord.Client()
CHANNEL = <id>
@client.event
async def on_ready():
global data
channel = client.get_channel(id=CHANNEL)
await channel.send(f"{data['products'][0]['custom_fields'][0]['discord']}nТовар : {data['products'][0]['name']}")
await client.close()
client.clear()
@app.route('/purchase', methods=['POST'])
def purchase():
global data
data = json.loads(request.data)
client.run('token')
return data['products'][0]['custom_fields'][0]['discord']

我可以建议在线程中运行它。当我不得不不屏蔽游戏客户端的主线程时,我也遇到了同样的问题(我相信这也应该适用于Flask(。示例可以在这里找到:

import discord
import asyncio
discord_loop = asyncio.get_event_loop()
client = discord.Client(loop=discord_loop, heartbeat_timeout=20, intents=discord.Intents.all())
def init():
try:
asyncio.get_child_watcher()
global discord_loop
discord_loop = asyncio.get_event_loop()
thread = threading.Thread(target=discord_loop.run_forever)
thread.start()
asyncio.run_coroutine_threadsafe(client.connect(reconnect=True), discord_loop)
asyncio.run_coroutine_threadsafe(client.login(token=DiscordSettings.TOKEN, bot=True), discord_loop)
except:
utils.get_and_log_exception_info()

def stop():
asyncio.run_coroutine_threadsafe(client.logout(), discord_loop)
discord_loop.call_soon_threadsafe(discord_loop.stop)

def reconnect():
client.clear()
asyncio.run_coroutine_threadsafe(client.connect(reconnect=True), discord_loop)

最新更新