有没有一种简单的方法可以同步发送一条消息到不和谐?

Posted

技术标签:

【中文标题】有没有一种简单的方法可以同步发送一条消息到不和谐?【英文标题】:Is there a simple way to send a single message synchronously to discord? 【发布时间】:2020-07-12 19:43:46 【问题描述】:

我正在开发一个定期向我的不和谐频道发布消息的程序。由于发布到 discord 不是程序的主要功能,我已经同步编写了程序,所以我无法与异步 discord.py API 交互。

到目前为止,我能做的最好的事情如下:

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.")

以上实质上创建了一个新的事件循环,登录,发送消息,注销,然后关闭事件循环。但是,它非常不稳定,执行所需的任务需要 5-6 秒(迄今为止最昂贵的操作是 client.wait_until_ready(),它会登录到 discord)。我想知道是否有更好的方法来做到这一点,除了将我的整个程序重写为异步。

【问题讨论】:

【参考方案1】:

如果您想每 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()

【讨论】:

问题是当我的程序没有发布到 discord 时(它每小时只发布一次或两次),它正在执行其他同步任务。因此,除非这是在另一个线程中执行的(我宁愿不必这样做),否则其他程序任务会阻止它。理想情况下,我觉得应该有一种方法可以同步地告诉程序“将此状态更新发送到不和谐”,而不必保持循环不间断。 任务是异步的,这里看不出问题。 @Verify OP 谈论的是同步代码,而不是相反的异步代码。

以上是关于有没有一种简单的方法可以同步发送一条消息到不和谐?的主要内容,如果未能解决你的问题,请参考以下文章

一种让不和谐机器人在设定的时间发送私人消息的方法?

将 mongodb 集合项添加到不和谐嵌入

如何通过 webhook 将 heroku 日志发送到不和谐?

如何将许多不和谐嵌入附加到一条消息中?

如何使用谷歌助手 IFTTT 将 webhook 发送到不和谐

将计算机信息发送到不和谐机器人