我如何每 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的主要内容,如果未能解决你的问题,请参考以下文章