如何在discord.py v1.3.4中获取向其发送消息的成员的数量?

时间:2020-07-31 07:02:28

标签: python python-3.x discord discord.py discord.py-rewrite

这是我的代码-

@client.command()
@commands.is_owner()
async def sendall(ctx, *, message):
    for m in client.get_all_members():
        try:
            await m.send(message)
        except:
            pass
    await ctx.send(f"sent the message -\n```{message}``` to {ctx.guild.member_count} users.")

到目前为止,它仅显示服务器的成员数,我需要它显示实际向其发送消息和未向其发送消息的成员数。 范例- 已将消息发送给[成功发送]用户。无法将其发送给[错误]用户,因为他们已关闭dms。

有人知道我该怎么做吗?

1 个答案:

答案 0 :(得分:0)

基本方法:

制作一个“计数器”变量,并在每条成功发送的消息上增加它。

@client.command()
@commands.is_owner()
async def sendall(ctx, *, message):
    success, errors = 0, 0
    for m in client.get_all_members():
        try:
            await m.send(message)
            success += 1
        except:
            errors += 1
    await ctx.send(f"sent the message -\n```{message}``` to {success} users.\nUnable to send {errors} messages")

反制方法:

您还可以使用内置Counter库中的collections对象。 如果您想要例如,那将很有用。也知道每个错误发生了多少。

from collections import Counter

...

@client.command()
@commands.is_owner()
async def sendall(ctx, *, message):
    c = Counter()
    for m in client.get_all_members():
        try:
            await m.send(message)
            c["Success"] += 1
        except Exception as e:
            c[e] += 1
    await ctx.send(f"sent the message -\n```{message}``` to {c['Success']} users.\nUnable to send to {c[discord.Forbidden]} users: Missing Permissions")

此外,请注意,您使用的是get_all_members方法。它将向所有成员实例发送消息。成员是公会中用户的实例,因此,例如,如果用户与一个机器人位于两个共享服务器中,则他将获得两次消息。如果要将消息发送给所有用户(机器人可以看到的唯一用户),请使用Client

users属性