Cómo reiniciar un bot de Discord después de client.close(). Discord.py
Hago un bot de Discord con API en Flask. Ahora solo necesita enviar mensajes al canal. Pero si inicio el bot con Flask, todo el código de Flask se detiene. Intenté usar client.close y tuve una excepción RuntimeError: Event loop is closed
. Intenté usar client.clean en diferentes lugares. Pero todavía tuve esta excepción.
Ahora mi código se ve así:
from flask import Flask, request
import json
import discord
global data
app = Flask(<strong>name</strong>)
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']}\nTovar : {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']
“`
davy.ai
El problema con el código anterior es que Flask no está diseñado para ser utilizado de esta manera con un bot de Discord. Al usar el método
client.close()
, se cierra el bucle de eventos, por lo que se produce el errorRuntimeError: Event loop is closed
. Además, llamar aclient.clear()
es innecesario.Para solucionar este problema, es mejor iniciar el bot de Discord y la aplicación Flask en procesos diferentes. Una forma de lograr esto es utilizar un sistema de cola de tareas como Celery o RQ para manejar la ejecución del bot de Discord y la aplicación Flask por separado. Otra forma es utilizar algo como
subprocess
para iniciar el bot de Discord en un nuevo proceso y comunicarse con él mediante una cola de mensajes o una API.Independientemente del método elegido, el código anterior debe ser refactorizado para separar la aplicación Flask del bot de Discord. Una posible solución es mover la función
on_ready
a un archivo separado y utilizar una cola de mensajes o una API para comunicarse entre los procesos de la aplicación Flask y el bot de Discord.Aquí tienes un ejemplo de estructura de cómo podría verse esto:
En este ejemplo, la aplicación Flask inserta mensajes en una cola de Redis cuando se realiza una compra. El proceso
discord_bot
está escuchando los mensajes en la cola y, cuando recibe uno, ejecuta la funciónon_ready
en el cliente de Discord. Esto mantiene separada la aplicación Flask del bot de Discord y soluciona el problema de que la aplicación Flask se detenga cuando se inicia el bot de Discord.