Есть ли простой способ отправить одно сообщение синхронно на дискорд? - PullRequest
0 голосов
/ 01 апреля 2020

Я работаю над программой, которая периодически отправляет сообщения на мой канал разногласий. Поскольку отправка на дискорд не является основной функцией программы, я написал программу синхронно, поэтому у меня возникают проблемы при взаимодействии с асинхронным API-интерфейсом discord.py.

На данный момент, лучшее, что мне удалось do следующее:

import discord
import asyncio

discord_token = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456"
discord_channel_ids = { 'test_channel': 012345678901234567 }

async def send_msg_async(client, channel_ids, message):
    await client.wait_until_ready()
    for cid in channel_ids:
        channel = client.get_channel(cid)
        await channel.send(message)
    await client.logout()

def send_message(channel_names, message):
    try:
        loop = asyncio.new_event_loop()
        client = discord.Client(loop=loop)

        channel_ids = [discord_channel_ids[cname] for cname in channel_names]
        client.loop.create_task(send_msg_async(client, channel_ids, message))
        client.run(discord_token)
    except Exception as e:
        print(f"Exception sending message to discord: {e}")

if __name__ == "__main__":
    send_message(["test_channel"], "This is a test.")

Вышеприведенное, по сути, создает новое событие l oop, регистрируется, отправляет сообщение, выходит из системы, а затем закрывает событие l oop. Тем не менее, он крайне нестабилен и требует 5-6 секунд для выполнения желаемой задачи (безусловно, самая дорогая операция - это client.wait_until_ready (), который входит в систему с разногласиями). Мне интересно, есть ли лучший способ сделать это, кроме переписывания всей моей программы, чтобы она была асинхронной.

1 Ответ

0 голосов
/ 01 апреля 2020

Если вы хотите сделать что-то каждые n время, библиотека расширения Discord предоставляет задач , которые выполняются асинхронно.

Пример:

import discord
from discord.ext import commands, tasks

client = commands.Bot()

@tasks.loop(seconds=15.0)
async def my_task():
    print('I am a task, hello')

@client.event
async def on_ready():
  my_task.start()
...