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

时间:2020-10-23 09:17:35

标签: discord discord.py discord.py-rewrite

我正在处理一个循环,该循环每5秒钟检查一次,如果User Status包含“ 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)

3 个答案:

答案 0 :(得分:0)

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

此外,您不能使用ctx.message.author。您需要遍历公会中的成员以检查其每一项活动。

所以您可以简单地做:

@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

如果成员没有状态,它将返回一个空的元组,这就是为什么您获得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()]

答案 1 :(得分:0)

仍然是相同的错误

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

答案 2 :(得分:0)

看着您的新错误,您得到一个IndexError,因为其中一个成员没有设置活动,因此activities[0]不存在。使用if-statement进行检查。要查看tuple是否为空,您可以执行if tuple(因为空列表/元组为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)

除了上面答案中的片段。

编辑:显然,您没有得到我上面的^句子,它表示它是与其他答案组合的,所以我编辑了我的答案并将其自己组合。 应该是您问题的正确答案。