Случайное сопряжение людей с переписанными каналами - PullRequest
0 голосов
/ 06 сентября 2018

В настоящее время я пытаюсь создать команду для бота, которая позволит мне составить список пользователей в Discord, случайным образом объединить их в пары, а затем назначить каждой паре свой собственный канал, к которому у них есть доступ.

Пока у меня есть код, способный принимать список пользователей, но всякий раз, когда я запускаю его, передавая идентификаторы пользователей, он выдает ошибку "Nonetype не имеет атрибута" add_roles "".

Вот эта функция:

async def startDraft(context, *users):
#Take a list of users of an even number, and assign them randomly in pairs
#Give each of these pairs a private #, then use that to assign them roles, and thereby rooms.
if not users or len(users)%2 is not 0:
    context.say("Malformed command. Please see the help for this command. (Type !help startDraft)")
    pass
userList = []
for user in users:
    userList.append(client.get_user(user))
random.shuffle(userList)
pairList = []
guild = context.guild
for i in range(int(len(users)/2)):
    pairList.append((userList[i*2], userList[i*2+1]))
for i in range(len(pairList)):
    pairRole = await guild.create_role(name="draft"+str(i))
    pairList[i][0].add_roles(pairRole)
    pairList[i][1].add_roles(pairRole)
    overwrites = {guild.default_role: discord.PermissionOverwrite(read_messages=False),
    pairRole: discord.PermissionOverwrite(read_messages=True)}
    await guild.create_text_channel(name="draft"+str(i),overwrites=overwrites)

1 Ответ

0 голосов
/ 06 сентября 2018

Мы можем использовать идиому кластеризации zip (zip(*[iter(users)]*2)) для генерации пар. Мы также можем использовать конвертер , чтобы получить Member объекты непосредственно из команды

import discord
from dicord.ext import commands

bot = commands.Bot(command_prefix="!")

@bot.command()
async def startDraft(ctx, *users: discord.Member):
    if not users or len(users)%2:
        await ctx.send("Malformed command. Please see the help for this command. "
                       "(Type !help startDraft)")  # send not say
        return  # return to end execution
    guild = ctx.guild
    users = random.sample(users, k=len(users))  # users is a tuple so can't be shuffled
    pairs = zip(*[iter(users)]*2)  # Could also be it = iter(users); zip(it, it)
    for i, (user1, user2) in enumerate(pairs):
        name = "draft{}".format(i)
        pairRole = await guild.create_role(name=name)
        await user1.add_roles(pairRole)  # add_roles is a coroutine, so you must use await
        await user2.add_roles(pairRole)
        overwrites = {guild.default_role: discord.PermissionOverwrite(read_messages=False),
                      pairRole: discord.PermissionOverwrite(read_messages=True)}
        await guild.create_text_channel(name=name, overwrites=overwrites)

bot.run("Token")
...