Python Discord.py |在_成员_加入时更新频道名称

Python Discord.py |在_成员_加入时更新频道名称,python,discord,discord.py,Python,Discord,Discord.py,当一个成员加入/退出服务器时,我试图更新频道名。 我有一个统计频道,在那里显示会员人数 我想我应该创建一个函数,从ID中获取通道,然后计算服务器成员数,最后使用正确的成员数更改通道名称 base.py 这是我在base.py文件中的函数 此外,在这个文件中,我处理有关成员加入/成员移除的事件。所以我想知道当用户进入或离开时如何调用refresh()函数 class base(commands.Cog): def __init__(self, client): self.c

当一个成员加入/退出服务器时,我试图更新频道名。 我有一个统计频道,在那里显示会员人数

我想我应该创建一个函数,从ID中获取通道,然后计算服务器成员数,最后使用正确的成员数更改通道名称

base.py

这是我在base.py文件中的函数 此外,在这个文件中,我处理有关成员加入/成员移除的事件。所以我想知道当用户进入或离开时如何调用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='You can do this in many ways, first of all. Why is refresh a client command? Do you want users to invoke it manually? If yes, set a default value for ctx.

@client.command()
async def refresh(self, ctx = None):
   #other stuff
   if ctx is not None:
        await ctx.send('refreshed member count')
类基(commands.Cog):
定义初始化(自我,客户机):
self.client=client
@client.command()
异步def刷新(自身、ctx):
stats\u channel=client.get\u channel(1234567890)
membri=len(ctx.guild.members)

wait stats_channel.edit(name='首先,您可以通过多种方式执行此操作。为什么要刷新客户端命令?是否希望用户手动调用它?如果是,请为ctx设置默认值

@client.command()
异步def刷新(自,ctx=None):
#其他东西
如果ctx不是无:
等待ctx.send('刷新的成员计数')
或者如果你不需要它作为命令

async def refresh(self):#没有client.command()修饰符
#在这里做事
不要

不要每次成员加入服务器时都更新频道名称。为什么

Discord对您可以更改频道名称的时间有很高的速率限制,即每10分钟更改2次。超过2次将限制您的速率。这是为了完全删除像您这样的计数器机器人

Do

如果仍要执行此操作,您可以检查服务器上的成员数量并每隔一段时间(最好每30分钟或一小时)更改通道名称,而不是每次更新\u member\u join事件触发器

您可以使用
tasks.loop
decorator以一定的间隔触发函数。该函数由库提供

这里是一个您应该执行的解决方案,而不是使用on_member_join事件

#定义一个变量来存储旧金额。
旧金额=0
@tasks.loop(分钟=30)
异步def成员检查程序():
#获取帮会对象
帮会=机器人。获取帮会(你的帮会ID)
#检查是否不相同,如果是,则更新频道。
如果旧会员人数!=帮会会员人数:
#更新旧金额,并更新您的频道。
旧会员数量=公会会员数量
你的频道=帮会。获取频道(你的频道ID)
等待你的频道。编辑(名称=公会。会员人数)
#此功能在循环发生之前触发
@循环前的成员检查程序
循环发生之前的异步定义()
#您还需要这样做,以避免循环在此之前运行
#准备就绪时,这是为了避免bot.get\u guild返回None
等待机器人。等待直到准备就绪()
#从某处开始这项任务
成员\u checker.start()

刷新
的签名所示,它采用
ctx
(上下文)参数,就像任何其他Cog(或非Cog)命令一样。我认为成员对象(在
on_Member_join
处理程序中给出)传递的内容与预期的内容相同。调用
self.refresh可能会成功(member)
。这样做是可以避免的,但这是一种不好的做法,可能会使您和其他人在以后查看代码时感到困惑。不一定,因为“上下文”如果我记得的话,它首先是一种松散对象类型。它是多种不同对象类型的抽象表示。编辑:我可能在想雪花或其他东西……无论如何,我同意你的答案——如果它实际上不是一个命令,那么就不要将其作为框架。我的意图是自动编辑名称。无论如何,我同意你的回答我已经试过了,我放了@client.command,因为它找不到ctx,我知道这是错误的。只要删除ctx,你为什么要添加ctx。它有效,谢谢。我添加ctx是因为我从另一个函数复制了一些行,创建了统计类别和频道。如果它有效,你可以接受我尝试过的答案,我最初放了member_checker.start()在on_member_join中,但它不起作用。然后我决定将member_checker.start()放在一个简单的“while True”中,但它在循环发生之前就被卡住了。请实际阅读文档。member_checker.start()应该调用一次。不要将其放在\u member\u join中,只调用此方法一次。您可以在启动bot时将其放在bot声明的正下方。