【发布时间】:2021-06-22 19:27:33
【问题描述】:
当成员加入/退出服务器时,我正在尝试更新频道名称。 我有一个统计频道,其中显示了成员数。
我想我会创建一个函数,它从 ID 获取频道,然后计算服务器成员数,最后用正确的成员数更改频道名称。
base.py
这是我在文件 base.py 中的函数 同样在这个文件中,我处理 on_member_join / on_member_remove 事件。所以我想知道当用户进入或离开时如何调用 refresh() 函数。
class base(commands.Cog):
def __init__(self, client):
self.client = client
@client.command()
async def refresh(self, ctx):
stats_channel = client.get_channel(1234567890)
membri = len(ctx.guild.members)
await stats_channel.edit(name='???? Users: {}'.format(membri))
一旦我定义了刷新函数,我会尝试在用户进入时调用它
@commands.Cog.listener()
async def on_member_join(self, member):
await self.refresh()
print("Other stuff")
但是一旦有会员进入服务器,就会出现这个错误:
Ignoring exception in on_member_join
Traceback (most recent call last):
File "C:\Users\Matteo\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\discord\client.py", line 343, in _run_event
await coro(*args, **kwargs)
File "C:\Users\Matteo\Desktop\Bot\comandi\base.py", line 33, in on_member_join
await self.refresh()
File "C:\Users\Matteo\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\discord\ext\commands\core.py", line 372, in __call__
return await self.callback(self.cog, *args, **kwargs)
TypeError: refresh() missing 1 required positional argument: 'ctx'
我尝试了几种方法来尝试修复它,但都没有成功。
【问题讨论】:
-
从
refresh的签名中可以看出,它需要一个ctx(上下文)参数,就像任何其他 Cog(或非 Cog)命令一样。我认为 Member 对象(您在on_member_join处理程序中给出)传递了预期的相同内容。你也许可以打电话给self.refresh(member)。 -
这样做你会侥幸成功,但这是不好的做法,可能会让你和其他人在稍后查看你的代码时感到困惑。
-
不一定,因为“上下文”是一个松散的对象类型,如果我记得的话。它是多种不同可能对象类型的抽象表示。 编辑:我可能在想雪花,或者别的什么...
-
无论如何,我同意你的回答——如果它实际上不是一个命令,那么就不要这样框定它。
标签: python discord discord.py