Как получить список участников определенной роли с помощью команды !getuser в канале Discord.
@bot.command(pass_context=True)
async def getuser(ctx):
бот отвечает своим ID
1. @user1#123
2. @user2#123






Надеюсь, это более быстрое и удобочитаемое решение, чем предыдущее.
@bot.command(pass_context=True)
async def getuser(ctx,*args):
server = ctx.message.server
role_name = (' '.join(args))
role_id = server.roles[0]
for role in server.roles:
if role_name == role.name:
role_id = role
break
else:
await bot.say("Role doesn't exist")
return
for member in server.members:
if role_id in member.roles:
await bot.say(f"{role_name} - {member.name}")
Ветвь перезаписи предоставляет атрибут Role.members.
В ветке async вам придется перебрать всех членов сервера и проверить их роли.
@bot.command(pass_context=True)
async def getuser(ctx, role: discord.Role):
role = discord.utils.get(ctx.message.server.roles, name = "mod")
if role is None:
await bot.say('There is no "mod" role on this server!')
return
empty = True
for member in ctx.message.server.members:
if role in member.roles:
await bot.say("{0.name}: {0.id}".format(member))
empty = False
if empty:
await bot.say("Nobody has the role {}".format(role.mention))
Вы должны удалить аргумент role, а затем разрешить role в теле сопрограммы, role = discord.utils.get(ctx.message.roles, "mod"). Вы также можете установить empty = True в начале сопрограммы, а затем установить его на False в блоке if. Затем просто проверьте его значение после цикла for.
@ Демотри вверху, перед циклом.
ctx.message.server.roles. В конце концов, я перестану совершать эту ошибку ...
Тогда попробуйте с name = "mod".
IIRC @PatrickHaugh, использующий str(member), также возвращает тег Discord участника.
Ответ Патрика вообще не работает, ответ Тристо лучше, но я настроил несколько вещей, чтобы он работал с перезаписью:
@bot.command(pass_context=True)
@commands.has_permissions(manage_messages=True)
async def members(ctx,*args):
server = ctx.message.guild
role_name = (' '.join(args))
role_id = server.roles[0]
for role in server.roles:
if role_name == role.name:
role_id = role
break
else:
await ctx.send("Role doesn't exist")
return
for member in server.members:
if role_id in member.roles:
await ctx.send(f"{member.display_name} - {member.id}")
Все эти решения слишком неэффективны, когда вы можете просто сделать
@bot.command()
async def getuser(ctx, role: discord.Role):
await ctx.send("\n".join(str(role) for role in role.members)
У членов сервера есть имя, дискриминатор, идентификатор и необязательный псевдоним для конкретного сервера. Похоже, вы ищете
"{0.name}#{0.discriminator}".format(member)