微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python Discord Bot - VPS 重启行为? 参考:

如何解决Python Discord Bot - VPS 重启行为? 参考:

我们和我的一个朋友在 python 中创建了一个简单的 discord bot,首先让我解释一下它是如何工作的:

我们创建了 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)

我们对 Python 有所了解,但我们并不真正了解 discord 机器人的工作原理:

我们不太确定如何指示它在每天午夜自动发布:我们想到了一个在其末尾带有 sleep(50) BUT 的 While 循环: 它将如何处理危险的 VPS 重启?如果 vps 在睡眠中重启,它是否会重置它并将下一个发布时间移到 0:00 之后?

另一方面,如果我们不使用While循环,但是如果我们使用Linux中的CRON系统每天午夜检查并启动脚本,是否意味着bot会在23h59离线显示/24 在 discord 上并保持在线只是为了发布消息? => 我们想稍后添加更多功能,因此我们需要机器人 24/24 运行

另外,如果我们在代码中做错了,请不要犹豫指出它(͡°͜ʖ͡°)

解决方法

您可以创建一个每 24 小时迭代一次的循环并更改机器人的昵称,您可以通过一些简单的数学运算获得直到午夜的秒数,然后睡眠这些秒

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.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 更改机器人昵称

参考:

,

Łukasz 的代码有一个小缺陷,future 变量初始化错误,但其他一切都正常工作!这应该可以解决问题:

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,0
    now = datetime.now()
    future = datetime(now.year,minute)
    delta = (future - now).seconds
    await asyncio.sleep(delta)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。