Python Discord Bot - Не позволяйте парсеру сообщений в реальном времени блокировать асинхронность - PullRequest
0 голосов
/ 20 июня 2020

Я пишу Discord Bot, чтобы принимать сообщения из живого чата и ретранслировать их на канал Discord, но хочу, чтобы у него были другие адаптивные функции. В настоящее время скрипт передает сообщения, вводя while loop, который выполняется до тех пор, пока не будет получено нужное сообщение.

def chat_parser():
    resp = sock.recv(4096).decode('utf-8')
    #print(' - ', end='')
    filtered_response = filter_fighter_announce(resp)

    if resp.startswith('PING'):
        # sock.send("PONG :tmi.twitch.tv\n".encode('utf-8'))
        print("Ponging iirc server")
        sock.send("PONG\n".encode('utf-8'))
        return ''

    elif (len(filtered_response) > 0):
        if (filtered_response.count('ets are OPEN for') > 0):
            filtered_response = get_fighters(filtered_response)
            return filtered_response

    return ''

fight = fight_tracker('')  #initialize first fight object

def message_loop():
    global first_loop_global

    while True:    
        chat_reception = chat_parser()
        if (chat_reception == ''):
            continue
        fight.set_variables(chat_reception)
        return fight.announcement

    return  ''

Проблема в том, что ответные функции для Discord застревают в ожидании этого l oop to fini sh. Вот другой код для справки.

@client.event
async def on_ready():

    print('Finding channel...')
    for guild in client.guilds:
        if guild.name == GUILD:
            break

    channel = guild.get_channel(salty_bet_chat_id)
    print('Connected to Channel.')

    try:
        print('Beginning main loop.')
        while True:
            message_out = await message_loop()
            if (message_out != None and message_out != None):

                print('Sending to Discord: ', message_out)
                msg = await channel.send(message_out)
                await msg.add_reaction(fight.fighter_1[1])
                await msg.add_reaction(fight.fighter_2[1])
                print('message sent...')

    except KeyboardInterrupt:
        print('KeyboardInterrupt')
        sock.close()
        exit()

@client.event
async def on_raw_reaction_add(reaction):
    print(reaction)

@client.event
async def on_message(message):
    print(message.author)
    print(client.user)

client.run(TOKEN)

Я пробовал создавать асинхронные c функции из chat_parser() и message_loo() и ожидаю их возврата там, где они вызываются, но код все еще блокируется для l oop. Я новичок как в asyn c, так и в кодировании с помощью библиотеки Discord, поэтому я не уверен, как сделать функцию asyn c l oop, когда единственный способ запустить клиент Discord - это client.run(TOKEN), что я не мог понять как включить в другое событие l oop.

...