【问题标题】:Discord.py Give role if member customstatus contains hiDiscord.py 如果成员 customstatus 包含 hi 则赋予角色
【发布时间】:2020-10-23 22:12:50
【问题描述】:

我正在开发一个循环,每 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)

【问题讨论】:

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


    【解决方案1】:

    查看您的新错误,您会收到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)
    

    除了上面答案中的片段。

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

    【讨论】:

    • 我将代码编辑为``` @tasks.loop(seconds=5) async def status_role(): for member in guild.members: if member.activities and 'hi' in member.activities [0].name.lower(): await member.add_roles(role) ``` 但它仍然不起作用对不起我是 python 新手:D
    • 内部后台任务“status_role”中未处理的异常。 Traceback(最近一次调用):文件“C:\Users\lequi\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\tasks_init_.py ",第 101 行,在 _loop 中等待 self.coro(*args, **kwargs) 文件 "C:\Users\lequi\Desktop\Programs\Clipox\ClipoxMain\main.py",第 134 行,在公会成员的 status_role 中.members: NameError: name 'guild' is not defined
    • 我说“除了上面的代码答案” - 在那个答案中定义了“公会”变量。您应该用我的答案替换列表理解 ([await member.add_roles...])。我现在已经编辑了我的答案以包含整个内容。
    • 我的代码```py @tasks.loop(seconds=1) async def status_role(): guild = bot.get_guild(722571225544785930) role = get(guild.roles, name='susdel' ) 对于 guild.members 中的成员:如果 member.activities 和 member.activities[0].name.lower() 中的“hi”:等待 member.add_roles(role)
    • 内部后台任务“status_role”中未处理的异常。 Traceback(最近一次调用):文件“C:\Users\lequi\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\tasks_init_.py ",第 101 行,在 _loop 中等待 self.coro(*args, **kwargs) 文件 "C:\Users\lequi\Desktop\Programs\Clipox\ClipoxMain\main.py",第 137 行,在 status_role 中 if member.activities和 member.activities[0].name.lower() 中的 'hi': AttributeError: 'NoneType' object has no attribute 'lower'
    【解决方案2】:

    还是一样的错误

    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
    

    【讨论】:

      【解决方案3】:

      您可以使用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()]
      

      【讨论】:

      • 嗯,我试过了,但没有成功,错误是 Bot 已准备就绪:内部后台任务“status_role”中的 Clipoxmain 未处理异常。 Traceback(最近一次调用):文件“C:\Users\lequi\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\tasks_init_.py ",第 101 行,在 _loop 中等待 self.coro(*args, **kwargs) 文件 "C:\Users\lequi\Desktop\Programs\Clipox\ClipoxMain\main.py",第 136 行,在 status_role 角色 = get( guild.roles, name='susdel') AttributeError: 'NoneType' object has no attribute 'roles'
      • 你的 discord.py 版本是多少?
      • 我用的是 1.5 有没有更新的?
      • 代码中仍然有错误无法发送到这里,因为太长了......
      • 您应该将此添加到您的帖子中,而不是将其作为答案发布。
      猜你喜欢
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 2022-01-10
      • 2021-11-02
      • 2021-03-26
      • 2020-12-05
      • 2020-12-19
      • 1970-01-01
      相关资源
      最近更新 更多