我正在处理一个循环,该循环每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)
答案 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)
除了上面答案中的片段。
编辑:显然,您没有得到我上面的^句子,它表示它是与其他答案组合的,所以我编辑了我的答案并将其自己组合。 应该是您问题的正确答案。