Python получает список всех участников из определенной роли

Как получить список участников определенной роли с помощью команды !getuser в канале Discord.

@bot.command(pass_context=True)  
async def getuser(ctx):

бот отвечает своим ID

 1. @user1#123
 2. @user2#123
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
9 800
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Надеюсь, это более быстрое и удобочитаемое решение, чем предыдущее.

@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))

У членов сервера есть имя, дискриминатор, идентификатор и необязательный псевдоним для конкретного сервера. Похоже, вы ищете "{0.name}#{0.discriminator}".format(member)

Patrick Haugh 26.08.2018 15:39

Вы должны удалить аргумент role, а затем разрешить role в теле сопрограммы, role = discord.utils.get(ctx.message.roles, "mod"). Вы также можете установить empty = True в начале сопрограммы, а затем установить его на False в блоке if. Затем просто проверьте его значение после цикла for.

Patrick Haugh 27.08.2018 15:23

@ Демотри вверху, перед циклом.

Patrick Haugh 27.08.2018 15:38
ctx.message.server.roles. В конце концов, я перестану совершать эту ошибку ...
Patrick Haugh 27.08.2018 15:45

Тогда попробуйте с name = "mod".

Patrick Haugh 27.08.2018 15:52

IIRC @PatrickHaugh, использующий str(member), также возвращает тег Discord участника.

Sam Rockett 27.08.2018 17:13

@Demotry Я бы использовал Client.get_server вместо создания серверного объекта вручную.

Patrick Haugh 30.08.2018 15:10

Ответ Патрика вообще не работает, ответ Тристо лучше, но я настроил несколько вещей, чтобы он работал с перезаписью:

@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)

Другие вопросы по теме