我们和我的一个朋友一起在python中创建了一个简单的不和谐机器人,首先让我解释一下它是如何工作的:
我们创建了366个不同的用户名,一年中每一天都有一个。每天早上0:01分,机器人应该自动发布一条消息:
的用户名重命名自己的用户名。
这是我们制定的代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import discord
from discord.ext import commands
from dotenv import load_dotenv
from datetime import datetime
load_dotenv()
TOKEN = os.getenv('DISCORD_TOKEN')
GUILD = os.getenv('DISCORD_GUILD')
client = discord.Client()
channel = client.get_channel(CHANNELID)
bissextileSpec = datetime.today().strftime('%m-%d') # To handle bissextile years
nickFile = open("nicknames.txt", "r")
nickList = nickFile.readlines()
dayNumber = datetime.now().timetuple().tm_yday
# We also made special dates
if bissextileSpec == '06-01' :
nickOfTheDay = 'SpecialNick1'
elif bissextileSpec == '07-14' :
nickOfTheDay = 'SpecialNick2'
elif bissextileSpec == '30-12' :
nickOfTheDay = 'SpecialNick3'
elif bissextileSpec == '17-06' :
nickOfTheDay = 'SpecialNick4'
elif bissextileSpec == '05-04' :
nickOfTheDay = 'SpecialNick5'
else :
nickOfTheDay = nickList[dayNumber - 1]
await channel.send('MSG CONTENT', nickOfTheDay, 'MSG CONTENT')
await client.user.edit(username=nickOfTheDay)我们对蟒蛇有一点了解,但我们并不真正知道机器人是如何运作的:
我们不太清楚如何指示它每天午夜自动投递:我们想到了一个with循环,它的末端有一个睡眠(50),但是:它将如何处理危险的VPS重新启动?,如果vps在睡眠中重新启动,它会重置它并将下一个发布时间移到0:00以后吗?
另一方面,如果我们不使用循环,但是如果我们每天午夜使用Linux中的CRON系统来检查和启动脚本,这是否意味着bot将在不和谐的情况下显示脱机23h59/24,并仅停留在网上发布消息? =>我们希望以后再添加几个特性,所以我们需要该机器人运行24/24。
同样,如果我们在代码中做错了什么,不要犹豫地指出它(͡°͜ʖ͡°)
发布于 2021-01-30 01:03:36
Łukasz的代码有一个微小的缺陷,未来的变量被错误地初始化了,但是其他的都在相应地工作!这应该能起作用:
import asyncio
from discord.ext import tasks
from datetime import datetime
@tasks.loop(hours=24)
async def change_nickname(guild):
nick = ""
await guild.me.edit(nick=nick)
@change_nickname.before_loop
async def before_change_nickname():
hour, minute = 0, 0
now = datetime.now()
future = datetime(now.year, now.month, now.day + 1, hour, minute)
delta = (future - now).seconds
await asyncio.sleep(delta)发布于 2021-01-29 18:35:05
您可以创建一个循环,每24小时迭代一次,并更改bot的昵称,您可以通过一些简单的数学和睡眠来获得到午夜的秒数。
import asyncio
from discord.ext import tasks
from datetime import datetime
@tasks.loop(hours=24)
async def change_nickname(guild):
"""Loops every 24 hours and changes the bots nick"""
nick = "" # Get the nick of the corresponding day
await guild.me.edit(nick=nick)
@change_nickname.before_loop
async def before_change_nickname(guild):
"""Delays the `change_nickname` loop to start at 00:00"""
hour, minute = 0, 0
now = datetime.now()
future = datetime(now.year, now.month, now.day + 1, now.month, now.day, hour, minute)
delta = (future - now).seconds
await asyncio.sleep(delta)要启动它,您需要传递一个discord.Guild实例(应该更改昵称的主公会)
change_nickname.start(guild) # You can start it in the `on_ready` event or some command or in the global scope, don't forget to pass the guild instance不管机器人启动了什么时间,循环都会在每天00:00改变机器人尼克。
参考资料:
https://stackoverflow.com/questions/65959647
复制相似问题