首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python机器人按顺序发送消息

Python机器人按顺序发送消息
EN

Stack Overflow用户
提问于 2018-06-16 00:17:42
回答 2查看 745关注 0票数 2

在不一致中,发送消息有2000个字符的限制,因此我们需要拆分并发送多个消息。我使用下面的代码,它可以工作,但是消息不会按指定的顺序发送,所以我在每条消息之后都使用了sleep()。现在它可以工作了,但有时消息仍然不符合顺序。由于顺序混杂,在阅读长消息时会让人感到困惑。

代码语言:javascript
复制
@bot.command(pass_context=True)
async def ping(ctx):
    msg = "Message 1".format(ctx.message)
    await bot.say(msg)
    await sleep(.5)

    msg = "Message 2".format(ctx.message)
    await bot.say(msg)
    await sleep(.5)

    msg = "Message 3".format(ctx.message)
    await bot.say(msg)
    await sleep(.5)

    msg = "Message 4 {0.author.mention}".format(ctx.message)
    await bot.say(msg)

我需要在每条消息之后,它应该检查发送的消息,然后它应该发送最后一条消息后的第二条消息。或者,有没有其他解决方案来解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-18 00:05:49

这似乎是一项简单的任务,但实际上却相当复杂。也可以推荐使用bot.wait_for_message(...),但该逻辑中存在漏洞(机器人发送了消息wait_for_message is ready),因为它不是用来执行任务的。

我现在能想到的最好的方法是创建一个自定义的未来事件,并在发送消息后添加一个wait_for。将来应该注册一个on_message事件来检查机器人的消息是否已经发送。

代码语言:javascript
复制
import asyncio

def wait(check):
    f = asyncio.Future(loop=bot.loop)

    async def _wait(future, check):
        @bot.listen()
        async def on_message(msg):
            if check(msg):
                bot.remove_listener(on_message)
                future.set_result(msg)

    asyncio.ensure_future(_wait(f, check), loop=bot.loop)
    return f

def ping_check(content):
    def check(msg):
        if msg.content == content and msg.author == bot.user:
            return True
        return False
    return check

@bot.command(pass_context=True)
async def ping(ctx):
    msg = "Message 1 {0.author.mention}".format(ctx.message)
    f = wait(ping_check(msg))
    await bot.say(msg)
    await asyncio.wait_for(f, None, loop=bot.loop)

    msg = "Message 2 {0.author.mention}".format(ctx.message)
    f = wait(ping_check(msg))
    await bot.say(msg)
    await asyncio.wait_for(f, None, loop=bot.loop)

    msg = "Message 3 {0.author.mention}".format(ctx.message)
    f = wait(ping_check(msg))
    await bot.say(msg)
    await asyncio.wait_for(f, None, loop=bot.loop)

    msg = "Message 4 {0.author.mention}".format(ctx.message)
    f = wait(ping_check(msg))
    await bot.say(msg)
    await asyncio.wait_for(f, None, loop=bot.loop)

我进一步编辑了这个解决方案以包含一个check(),这使得wait()函数变得更加灵活,从而删除了以前硬编码的检查。

票数 2
EN

Stack Overflow用户

发布于 2018-06-16 01:17:21

只需在消息之间添加一个微小的延迟:

代码语言:javascript
复制
from asyncio import sleep

@bot.command(pass_context=True)
async def ping(ctx):
    msg = "Message 1 {0.author.mention}".format(ctx.message)
    await bot.say(msg)
    await sleep(.5)

    msg = "Message 2 {0.author.mention}".format(ctx.message)
    await bot.say(msg)
    await sleep(.5)

    msg = "Message 3 {0.author.mention}".format(ctx.message)
    await bot.say(msg)
    await sleep(.5)

    msg = "Message 4 {0.author.mention}".format(ctx.message)
    await bot.say(msg)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50879405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档