Я работаю над программой, которая периодически отправляет сообщения на мой канал разногласий. Поскольку отправка на дискорд не является основной функцией программы, я написал программу синхронно, поэтому у меня возникают проблемы при взаимодействии с асинхронным 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 (), который входит в систему с разногласиями). Мне интересно, есть ли лучший способ сделать это, кроме переписывания всей моей программы, чтобы она была асинхронной.