我如何每 6 小时提及一个不和谐机器人的用户列表-python

Posted

技术标签:

【中文标题】我如何每 6 小时提及一个不和谐机器人的用户列表-python【英文标题】:How do I mention a list of users with a discord bot every 6 hours- python 【发布时间】:2021-06-15 10:22:58 【问题描述】:

我正在尝试让 Discord 机器人每 6 小时 ping 一些用户,以提醒他们做某事。 (格林威治标准时间 00:00、6:00 等)

对于初学者,我尝试通过创建一个简单的命令来获取 ping。

@client.event
async def on_message(message):
  if message.author == client.user:
        return

  if message.content.startswith('$inspire'):
    names = ["Skapis9999","MEE6","Dank Memer"]
    discriminators = [XXXX,4876,5192]
    for x in range(len(names)):
      user = discord.utils.get(message.guild.members, name = names[x], discriminator = discriminators[x])
    # user = client.get_user_info(id) is used to get User from ID
      if user is None:  # or just: if x and x.user
        await message.channel.send('Null user')
      await message.channel.send(message.channel, user.mention)
    return

这里的错误是AttributeError: 'NoneType' object has no attribute 'mention',我收到了 Null 用户消息。为什么用户对象是空的?

然后我试着让它成为一个循环

import asyncio
import datetime as dt

@client.event
async def on_ready():
    print('We have logged in as 0.user'.format(client))

#initiate
@tasks.loop(hours=6)
async def ping(ctx):
    message_channel = bot.get_channel(821920520169062419)   #821920520169062419 is channel id
    await message_channel.send("test 1")
    

async def before_msg1():
    for _ in range(60*60*6):  # loop the hole 6 hours
        if dt.datetime.now().hour == 10+12:  # 24 hour format
            print('It is time for the Event')
            names = ["Skapis9999","MEE6","Dank Memer"]
            discriminators = [111,4876,5192]
            for x in range(len(names)):  
                user = discord.utils.get(message.guild.members, name = names[x], discriminator = discriminators[x])
                #user = discord.utils.get(message.server.members, name =names[x], discriminator = discriminators[x])  
                await message_channel.send(message_channel, user.mention)
            return
        await asyncio.sleep(0.01)# wait 0.01 seconds before looping again.

这里的主要问题是我必须在一天中的那个时间启动机器人,我希望它可以 ping 用户。此外,我在等待行中的语法出现错误。

【问题讨论】:

你试过用id代替名字吗? 【参考方案1】:

您发送消息的输入参数错误。 send() 没有作为通道的输入参数,因为它是通道的方法。

错误 await message_channel.send(message_channel, user.mention)

正确 await message_channel.send(user.mention)

现在应该可以发送消息了,但是您的代码还有一些其他问题需要修复:

    您的 ping 命令不是命令,而是任务。由于这个事实,它没有上下文作为输入参数。这没关系,因为你没有使用你的变量ctx,但是如果你尝试,你会收到一个错误。

    而不是做:

for x in range(len(names)):  
     user = discord.utils.get(message.guild.members, name = names[x], discriminator = discriminators[x])

,你可以这样做:

for name,discriminator in zip(names,discriminators):
   user = discord.utils.get(message.guild.members, name = name, discriminator = discriminator)

(有关此 zip() 的更多信息,例如,您可以找到 here)

所以新的任务代码是:

@tasks.loop(hours=6)
async def before_msg1():
     print('It is time for the Event')
     names = ["Skapis9999","MEE6","Dank Memer"]
     discriminators = [111,4876,5192]
     for name,discriminator in zip(names,discriminators):
          user = discord.utils.get(message.guild.members,
                                   name = name,
                                   discriminator = discriminator)
          await message_channel.send(user.mention)

这将在机器人启动后每 6 小时提及一次。所以你应该知道这个函数的执行时间,取决于你的机器时间和机器人启动时间。如果你想在特定的白天运行它,你可以使用像 apscheduler 这样的库(更多关于这个,你可以找到here)或者做这样的事情:

@tasks.loop(minutes=30.0)
async def task_everyday_at_5_59():
     # sleep until the specified datetime
     now = datetime.datetime.today()
     time_aim = datetime.datetime(2021, 2, 28, 5, 59)
     while now > time_aim:
          time_aim = time_aim + datetime.timedelta(hours=24)
     await asyncio.sleep(abs(time_aim - now).total_seconds())
     # do something

提示:不要忘记开始你的任务!

【讨论】:

以上是关于我如何每 6 小时提及一个不和谐机器人的用户列表-python的主要内容,如果未能解决你的问题,请参考以下文章

分配/删除不和谐角色

如何提及使用 Chat Discord.JS 发送消息的用户?

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

提及的不和谐机器人静音命令

Discord Bot,提到不和谐@users时出现问题

如何使不和谐的 js 机器人在某个时间在不和谐的确切文本通道中发送随机消息(我制作一个列表并发送它)