Discord.py 如果成员 customstatus 包含 hi,则授予角色

Discord.py Give role if member customstatus contains hi

我正在开发一个循环,每 5 秒检查一次用户状态是否包含“hi”,如果是这样,它应该给用户一个角色。
我真的不知道该怎么做,但也许有人可以提供帮助。

我的代码:

#Here is a little base for the Command i asked...
#I hope it can help you
@tasks.loop(seconds=15)
async def status_role():
    if "hi" in ???.lower()
    #here comes the code
    #(Idk what the code is so i asked you guys :D)
    member = ctx.message.author
    role = get(member.server.roles, name="Friendly dude")
    await bot.add_roles(member, role)

您可以使用 member.activities。这将为您 return 提供会员活动列表。据我所知,您可以使用 member.avtivities[0].name 获得自定义状态。这会return你一串会员的自定义activity。

此外,您不能使用 ctx.message.author。您需要遍历公会中的成员以检查他们的每个 activity.

所以你可以简单地做:

@tasks.loop(seconds=15)
async def status_role():
    guild = client.get_guild(your guilds id) 
    role = get(guild.roles, name='Friendly dude') 
    [await member.add_roles(role) for member in guild.members if 'hi' in member.activities[0].name.lower()]

编辑

discord.py 1.5.x 中有一些关于 Intents 的更新。您需要先定义它,然后再定义 client = discord.Bot(prefix='') 以获得公会、频道等

import discord
intents = discord.Intents().all()
client = discord.Bot(prefix='', intents=intents)

编辑 2

如果成员没有状态,它将 return 一个空元组,这就是你得到 IndexError 的原因。为防止这种情况,您可以在代码中添加一个简单的 if 块。

async def status_role():
    guild = client.get_guild(your guilds id) 
    role = get(guild.roles, name='Friendly dude') 
    [await member.add_roles(role) for member in guild.members if member.activities[0] and 'hi' in member.activities[0].name.lower()]

还是一样的错误

Unhandled exception in internal background task 'status_role'.
Traceback (most recent call last):
  File "C:\Users\lequi\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\tasks\__init__.py", line 101, in _loop
    await self.coro(*args, **kwargs)
  File "C:\Users\lequi\Desktop\Programs\Clipox\ClipoxMain\main.py", line 136, in status_role
    [await member.add_roles(role) for member in guild.members if 'hi' in member.activities[0].name.lower()]
  File "C:\Users\lequi\Desktop\Programs\Clipox\ClipoxMain\main.py", line 136, in <listcomp>
    [await member.add_roles(role) for member in guild.members if 'hi' in member.activities[0].name.lower()]
IndexError: tuple index out of range

查看您的新错误,您得到一个 IndexError,因为您的一个成员没有 activity 集,所以 activities[0] 不存在。使用 if-statement 来检查。要查看 tuple 是否为空,只需执行 if tuple(因为空 lists/tuples 为 falsy),因此下面的代码应该可以解决该问题:

@tasks.loop(seconds=15)
async def status_role():
    guild = client.get_guild(your guilds id) 
    role = get(guild.roles, name='Friendly dude') 
    for member in guild.members:
        if member.activities and 'hi' in member.activities[0].name.lower():
            await member.add_roles(role)

除了上面答案中的片段。

编辑:显然你没有听懂我上面的 ^ 句子说它是要与其他答案结合的,所以我编辑了我的答案并自己结合了它。 应该是您问题的正确答案。