es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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']

“`

Tags:  , ,

Answer

  1. Avatar for 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 error RuntimeError: Event loop is closed. Además, llamar a client.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:

    # discord_bot.py
    import discord
    
    client = discord.Client()
    
    @client.event
    async def on_ready():
        # coloca tu código de on_ready aquí
    
    def run(token):
        client.run(token)
    
    # flask_app.py
    from flask import Flask, request
    import json
    import redis
    import discord_bot
    
    app = Flask(__name__)
    
    # configura una cola de mensajes Redis
    redis_conn = redis.Redis()
    
    CHANNEL = <id>
    
    @app.route('/purchase', methods=['POST'])
    def purchase():
        data = json.loads(request.data)
    
        # inserta un mensaje en la cola
        redis_conn.lpush('discord_bot_queue', json.dumps(data))
    
        return data['products'][0]['custom_fields'][0]['discord']
    
    # inicia el proceso discord_bot
    discord_bot.run('token')  # ejecutar en un proceso separado
    
    # escucha los mensajes en la cola de Redis
    while True:
        data = redis_conn.brpop('discord_bot_queue', timeout=5)
    
        if data is not None:
            # inicia la función on_ready en el proceso del cliente
            discord_bot.client.loop.create_task(discord_bot.on_ready())
    
        # coloca aquí cualquier otra cosa necesaria para la aplicación Flask
    

    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ón on_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.

Comments are closed.