当前位置: 首页 > 知识库问答 >
问题:

已解决: Discord.py的“on_message”在我实现“时间表”后无法工作

杜嘉木
2023-03-14

我不熟悉Python,所以我担心这对你们所有人来说都是一个愚蠢的问题,但我已经尽力解决了。

我自己做了一个项目,制作一个机器人来做一些无聊的任务,只是为了好玩。

首先,我做了一个函数,让它接收一个带有“on_message”事件的消息,这很好

import discord
import os

discordClient = discord.Client()

@discordClient.event  #event register
async def on_ready():  
    print('Logged in as {0.user}'.format(discordClient))
    await routineAnnouncer.createDisocrdRoutine(discordClient)

@discordClient.event
async def on_message(message):
    checked = False

    if message.author == discordClient.user:
      checked = True
      return
    else:
      print("Get Message {0.content} from {0.author.name} ({0.author.id}) @{0.channel.name} ({0.channel.id})".
      format(message))

#-------------------------- RUN ----------------------

print('Registering EVENTS COMPLETE')
discordClient.run(os.environ['discordToken'])

我在Repl上编码。它和“os.environ”是它的检索方式。环境。

以下是“on_ready”事件中使用的“routineAnnouncer”中的代码

import os  #ใช้ดึง .env (secret)
import schedule
import time

def scheduleAnnouncer(discordClient,announceType,announceDetail):
  print("Announcing {} {}".format(announceType,announceDetail))
  lzChannel = discordClient.get_channel(int(os.environ['lz_token_test']))
  discordClient.loop.create_task(lzChannel.send("Announcing {} {}".format(announceType,announceDetail)))

async def createDisocrdRoutine(discordClient):
  print("Registering CRONJOBS...")
  scheduleAnnouncer(discordClient,"headerTest","descTest")
  schedule.every(5).seconds.do(scheduleAnnouncer,discordClient,"header1","desc1")
  schedule.every(10).seconds.do(scheduleAnnouncer,discordClient,"header2","desc2")
  # while True:
    #   schedule.run_pending()
    #   time.sleep(5)

因此,它应该在连接准备好并设置调度文本后创建DiscrdRoutine()。

正如您所看到的,代码的最后一部分被注释了。它应该是一个循环,触发通过discord发送到指定频道的预定文本。身份证件

到这一点。代码工作正常。on_message(消息)部分能够打印出发送到信道的任何内容。该功能"安排公告"也工作正常。它可以向信道发送消息。不和谐屏幕Repl.it屏幕

在循环后,“同时:真实”是未注释的,以便让计划工作。循环工作正常。它打印出文本,如环路所示。但是不和谐无法检测到以前发送到同一频道的任何文本。甚至应该发送消息的功能“时间表播音员”也坏了。感觉一旦“当:真实”没有被评论,任何与不和谐有关的东西都被打破了。不和谐屏幕Repl.it屏幕

我试图将调度分离到另一个线程中,但它不起作用。我试图使用其他cronwork管理,如cronwork,sched或其他东西。他们中的大多数让我面对其他问题。

  • 我需要将参数发送到任务中(discordClient、announceType、announceDetail)

先谢谢你。我不知道下一步该做什么或检查。每次我试图解决它。我总是循环回到“时间表”,并尝试一遍又一遍地处理它。

我希望这些信息足够了。非常感谢您抽出时间。

共有1个答案

刘阳舒
2023-03-14

时间。sleep()不是异步的,因此它将冻结您的程序。使用wait asyncio。sleep()。这是因为它暂停了整个程序,而不仅仅是该功能。

在这里使用wait()的原因是wait()是非阻塞的,而time是非阻塞的。sleep()正在阻塞。这意味着当你利用时间的时候。sleep(),您将阻止主线程在等待sleep()调用结束时继续运行。wait()解决了这个问题。

引用RealPython

 类似资料:
  • 问题内容: 在Xcode中编译项目时出现错误,它说: 表达过于复杂,无法在合理的时间内解决;考虑将表达式分解为不同的子表达式 这是代码: 问题答案: 为什么不通过将表达式分解为两个子表达式来降低编译器的复杂性? 您也可以使用(或更多的“ Swifty” 或)来提高可读性。如果我记得,它是标头中定义的无符号32位Integer最大值的十六进制值。

  • 我正在为Minecraft服务器的discord制作一个机器人。我在下面有一个on_会员加入事件和on_消息事件。on_member_join工作得很好,但是当我在discord服务器中发送消息时,on_message事件内部不会发生任何事情。这是我的代码,如果有人有可能的解决方案,我会非常感激。

  • 本文向大家介绍JS设置时间无效问题的解决办法,包括了JS设置时间无效问题的解决办法的使用技巧和注意事项,需要的朋友参考一下 在发送短信息验证码的时候要用到js设置时间倒序问题:有时候这种常规写法会导致js失效,试了很多方法才找到问题所在,可能是因为js版本过低导致。 解决方法: 或者: jquery代码:必须用input设置value值,以便利用jquery更改value值 以上所述是小编给大家介

  • 我已经修复了firebase实时数据库上的读取和正确规则,但我仍然无法对其进行读取和写入。 我也试过这个: Firebase存储规则: Firebase存储规则工作正常,因为图像已上载并调用onSuccessListener。 我用来在数据库上设置值的代码如下所示,我已经将引用定义为:

  • 希望有人能帮上忙。 我们为一个客户端创建了一个应用程序,该应用程序创建了预填充的Google表单,这些表单链接回一个公共电子表格,其他表单链接到表单。表单完成后,脚本将定位相应的表单,打开表单并从电子表格中取消表单链接。然后从电子表格中删除未链接表单的工作表 99%的时间按预期工作,但有时无法删除工作表,也无法通过代码或手动取消链接删除表单。 我们还可以在工作表名称后面添加冲突消息。例如,这是创建

  • 我有多张图纸,将由最终用户命名。这些图纸的名称存储在命名范围内,最终用户也会更新该范围。这些工作表中的每一张都包含需要拉入主工作表的数据。为了清晰起见,让我们为他们提供一些名称: 工作表包含提取的数据 范围包含工作表名称 例如,工作表,包含要提取的数据,并且该名称存在于