【问题标题】:Discord bot not updating statusDiscord 机器人不更新状态
【发布时间】:2021-07-29 11:13:03
【问题描述】:

我是 python 的新手,所以如果问题很愚蠢,我希望你们能帮助我。 机器人不是每 5 秒更新一次状态(我花了更多的时间,比如 5 分钟,但它也没有用)。它显示服务器的数量,并且不会更改为第二状态。

from discord.ext import commands, tasks
from itertools import cycle

@tasks.loop( seconds = 12 )
async def changeStatus():
    status = cycle( [f' on { len(client.guilds) } servers', '~help'] )
    await client.change_presence( activity = discord.Activity( type = discord.ActivityType.playing, name = next(status) ) )

@client.event
async def on_ready():
    print( 'bot connected' )
    changeStatus.start()

【问题讨论】:

  • 如果你无法解决这个方法,我使用 random.choice(list),它可以正常工作

标签: python discord discord.py bots


【解决方案1】:

自从

status = cycle( [f' on { len(client.guilds) } servers', '~help'] )

每次调用函数时都会调用它,它会被重新解释,这意味着next() 函数总是返回第一个元素。要解决此问题,您将需要一种不同的方法。例如,创建一个全局 iteration-variable 并将您的 cycle-list 声明为仅一个列表。

iterationPosition = 0

@tasks.loop( seconds = 12 )
async def changeStatus():
    status = [f' on { len(client.guilds) } servers', '~help']
    await client.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name=status[iterationPosition]))
    iterationPosition = 0 if (iterationPosition == len(status) - 1) else (iterationPosition + 1)

如果您已到达列表末尾,则需要跟踪。这是由最后一行代码完成的。

【讨论】:

  • 错误 - 内部后台任务“changeStatus”中未处理的异常。 await client.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name=status[iterationPosition])) UnboundLocalError: 分配前引用的局部变量“iterationPosition”
  • 这对我来说很奇怪。您可以尝试在函数调用中使用iterationPosition 作为变量iterationPosition = 0 changeStatus.start(functionPosition) 删除全局iterationPosition 并将其放在async def changeStatus(functionPosition)
  • 也许我理解错了,但是在我把iterationPosition 作为变量代码之后根本不起作用
  • 我的意思是这样@tasks.loop( seconds = 12 ) async def changeStatus(): iterationPosition = 0 status = [f' on { len(client.guilds) } servers', '~help'] await client.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name=status[iterationPosition])) iterationPosition = 0 if (iterationPosition is len(status) - 1) else (iterationPosition + 1)
  • 与我的预期不太一样,但您是否收到错误消息?
【解决方案2】:

它不会改变状态,因为您获得了每个会话 5/60 秒的状态更新速率限制。这些速率限制是动态的,所以不要太接近它们

【讨论】:

  • 这不是问题所在。这是一个需要考虑的因素,是的。但实际的问题是 next() 在这种情况下总是返回相同的元素。
【解决方案3】:

status = cycle( [f' on { len(client.guilds) } servers', '~help'] ) 这行应该在changeStatus 函数之外,因为无论何时调用它,它都会使[f' on { len(client.guilds) } servers 成为第一项。

【讨论】:

猜你喜欢
  • 2020-03-19
  • 2021-05-07
  • 2020-11-23
  • 2021-08-29
  • 2020-07-29
  • 2021-04-03
  • 2021-05-09
  • 2018-12-17
  • 2019-05-26
相关资源
最近更新 更多