【问题标题】:Python Discord Bot - VPS Reboot Behaviors?Python Discord Bot - VPS 重启行为?
【发布时间】:2021-05-03 16:16:48
【问题描述】:

我们和我的一个朋友在 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)

我们对 python 有点了解,但我们并不真正了解不和谐机器人的工作原理:

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

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

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

【问题讨论】:

    标签: python-3.x bots discord.py vps python-datetime


    【解决方案1】:

    您可以创建一个每 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.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 都会更改机器人昵称

    参考:

    【讨论】:

    • 感谢您的回答,所以在这种情况下,如果托管机器人的 VPS 在凌晨 2:00 崩溃并重新启动它不会造成任何问题?
    • 没错,无论机器人在什么时间启动/重启,循环总是会延迟到 00:00
    【解决方案2】:

    Ł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, 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)
    

    【讨论】:

    • 您可以简单地编辑我的答案或发表评论
    猜你喜欢
    • 2018-10-31
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2021-07-18
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多