Как в коде функции discord бота реализовать стек?

Я пишу discord бота (discord.py) и мне нужна функция, которая будет добавлять участнику роли сразу (пользователь может выбрать роль сам) или в при прохождении теста (который отправляется участнику в ЛС). Вот то, что я написал:

@bot.command()
async def select_faculty(ctx):
    """Функция select_faculty позволяет выбрать сразу или пройти тест для
    определения факультета.
    """
    member = ctx.message.author
    dq = collections.deque([])
    channel_roles = [
        "gryffindor - ученик",
        "slytherin - ученик",
        "hufflepuff - ученик",
        "ravenclaw - ученик",
        "death eaters - ученик",
        "gryffindor - наставник",
        "slytherin - наставник",
        "hufflepuff - наставник",
        "ravenclaw - наставник",
        "death eaters - наставник",
        "ждущие зачисления",
        "ученик",
        "наставник",
    ]
    names_faculties = {
        "gryff": "Гриффиндор",
        "slyth": "Слизерин",
        "huff": "Пуффендуй",
        "raven": "Когтевран",
        "death": "Пожиратели Смерти"
    }
    start_emb = discord.Embed(title="Приветствую тебя, маг!", colour=discord.Colour.orange(),
                              description="Выбери вариант распределения:")
    who_emb = discord.Embed(title="Для начала выбери кто ты:", colour=discord.Colour.purple())
    select_fac_emb = discord.Embed(title="Выбери факультет:", colour=discord.Colour.red(),
                                   description="Выбери понравившийся тебе факультет.")
    send_fac_menu = ctx.send(embed=select_fac_emb, components=[
        [Button(style=ButtonStyle.green, label="Гриффиндор", emoji="?"),
         Button(style=ButtonStyle.blue, label="Слизерин", emoji="?")],
        [Button(style=ButtonStyle.red, label="Когтевран", emoji="?"),
         Button(style=ButtonStyle.gray, label="Пуффендуй", emoji="?")],
        [Button(style=ButtonStyle.blue, label="Пожиратели Смерти", emoji="?")]
    ])
    answer = await ctx.channel.send(embed=start_emb, components=[[
        Button(style=ButtonStyle.green, label="Выбрать сразу"),
        Button(style=ButtonStyle.blue, label="Пройти тест")]])
    response = await bot.wait_for("button_click")
    await response.edit_origin()
    if response.component.label == "Выбрать сразу":
        for role in [role.name for role in ctx.author.roles]:
            if role != "@everyone" and role.lower() in channel_roles:
                user_role = discord.utils.get(ctx.message.author.roles, name=role)
                await member.remove_roles(user_role)
        await ctx.message.delete()
        await answer.delete()
        faculty = ""
        answer = await ctx.send(embed=who_emb, components=[
            [Button(style=ButtonStyle.green, label="Ученик с жаждой знаний", emoji="?‍?")],
            [Button(style=ButtonStyle.blue, label="Мудрый наставник", emoji="?")]
        ])
        response = await bot.wait_for("button_click")
        await response.edit_origin()
        if response.component.label == "Ученик с жаждой знаний":
            await answer.delete()
            answer = await send_fac_menu
            response = await bot.wait_for("button_click")
            await response.edit_origin()
            if response.component.label == "Гриффиндор":
                faculty = "gryff"
                await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["apprentice"]["gryff"]))
            elif response.component.label == "Слизерин":
                faculty = "slyth"
                await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["apprentice"]["slyth"]))
            elif response.component.label == "Когтевран":
                faculty = "raven"
                await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["apprentice"]["raven"]))
            elif response.component.label == "Пуффендуй":
                faculty = "huff"
                await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["apprentice"]["huff"]))
            elif response.component.label == "Пожиратели Смерти":
                faculty = "death"
                await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["apprentice"]["death"]))
            await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["apprentice"]["apprentice"]))
            await answer.delete()
        elif response.component.label == "Мудрый наставник":
            await answer.delete()
            answer = await send_fac_menu
            response = await bot.wait_for("button_click")
            await response.edit_origin()
            if response.component.label == "Гриффиндор":
                faculty = "gryff"
                await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["mentor"]["gryff"]))
            elif response.component.label == "Слизерин":
                faculty = "slyth"
                await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["mentor"]["slyth"]))
            elif response.component.label == "Когтевран":
                faculty = "raven"
                await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["mentor"]["raven"]))
            elif response.component.label == "Пуффендуй":
                faculty = "huff"
                await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["mentor"]["huff"]))
            elif response.component.label == "Пожиратели Смерти":
                faculty = "death"
                await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["mentor"]["death"]))
            await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles["mentor"]["mentor"]))
            await answer.delete()
        emb = discord.Embed(title=f"Пользователь {member} зачислен в {names_faculties[faculty]}!",
                            colour=discord.Colour.green())
        await ctx.send(embed=emb)
    elif response.component.label == "Пройти тест":
        faculties = {
            "gryff": 0,
            "slyth": 0,
            "huff": 0,
            "raven": 0,
            "death": 0
        }
        who = ""
        faculty = ""
        question1_emb = discord.Embed(title="Давай пройдём небольшой тест.", colour=discord.Colour.green(),
                                      description="Первый вопрос - какой ты?:")
        question2_emb = discord.Embed(title="Второй вопрос:", colour=discord.Colour.orange(),
                                      description="Какое животное тебе нравится больше всего?")
        question3_emb = discord.Embed(title="Третий вопрос:", colour=discord.Colour.purple(),
                                      description="Какая стихия нравится тебе больше всего?")
        question4_emb = discord.Embed(title="Четвёртый вопрос:", colour=discord.Colour.blue(),
                                      description="Какие комбинации цветов нравятся тебе больше всего?")
        question5_emb = discord.Embed(title="Пятый вопрос:", colour=discord.Colour.red(),
                                      description="Какое привидение из Хогвартса нравится тебе больше всего?")
        await ctx.message.delete()
        await answer.delete()
        answer = await member.send(embed=who_emb, components=[
            [Button(style=ButtonStyle.green, label="Ученик с жаждой знаний", emoji="?‍?")],
            [Button(style=ButtonStyle.blue, label="Мудрый наставник", emoji="?")]
        ])
        response = await bot.wait_for("button_click")
        await response.edit_origin()
        if response.component.label == "Ученик с жаждой знаний":
            who = "apprentice"
        elif response.component.label == "Мудрый наставник":
            who = "mentor"
        await answer.delete()
        answer = await member.send(embed=question1_emb, components=[
            [Button(style=ButtonStyle.red, label="Храбрый"),
             Button(style=ButtonStyle.green, label="Хитрый"),
             Button(style=ButtonStyle.gray, label="Упорный")],
            [Button(style=ButtonStyle.blue, label="Мудрый"),
             Button(style=ButtonStyle.gray, label="Злорадный")]
        ])
        response = await bot.wait_for("button_click")
        await response.edit_origin()
        if response.component.label == "Храбрый":
            faculties["gryff"] += 1
        elif response.component.label == "Хитрый":
            faculties["slyth"] += 1
        elif response.component.label == "Упорный":
            faculties["huff"] += 1
        elif response.component.label == "Мудрый":
            faculties["raven"] += 1
        elif response.component.label == "Злорадный":
            faculties["death"] += 1
        await answer.delete()
        answer = await member.send(embed=question2_emb, components=[
            [Button(style=ButtonStyle.red, label="Лев"),
             Button(style=ButtonStyle.green, label="Змея"),
             Button(style=ButtonStyle.gray, label="Барсук"),
             Button(style=ButtonStyle.blue, label="Орёл")],
            [Button(style=ButtonStyle.gray, label="Летучая мышь")]
        ])
        response = await bot.wait_for("button_click")
        await response.edit_origin()
        if response.component.label == "Лев":
            faculties["gryff"] += 1
        elif response.component.label == "Змея":
            faculties["slyth"] += 1
        elif response.component.label == "Барсук":
            faculties["huff"] += 1
        elif response.component.label == "Орёл":
            faculties["raven"] += 1
        elif response.component.label == "Летучая мышь":
            faculties["death"] += 1
        await answer.delete()
        answer = await member.send(embed=question3_emb, components=[
            [Button(style=ButtonStyle.red, label="Огонь"),
             Button(style=ButtonStyle.green, label="Вода"),
             Button(style=ButtonStyle.gray, label="Земля"),
             Button(style=ButtonStyle.blue, label="Воздух")],
            [Button(style=ButtonStyle.gray, label="Хаос")]
        ])
        response = await bot.wait_for("button_click")
        await response.edit_origin()
        if response.component.label == "Огонь":
            faculties["gryff"] += 1
        elif response.component.label == "Вода":
            faculties["slyth"] += 1
        elif response.component.label == "Земля":
            faculties["huff"] += 1
        elif response.component.label == "Воздух":
            faculties["raven"] += 1
        elif response.component.label == "Хаос":
            faculties["death"] += 1
        await answer.delete()
        answer = await member.send(embed=question4_emb, components=[
            [Button(style=ButtonStyle.red, label="Красный и жёлтый"),
             Button(style=ButtonStyle.green, label="Зелёный и серебрянный")],
            [Button(style=ButtonStyle.gray, label="Жёлтый и чёрный"),
             Button(style=ButtonStyle.blue, label="Синий и бронзовый")],
            [Button(style=ButtonStyle.green, label="Зелёный и чёрный")]
        ])
        response = await bot.wait_for("button_click")
        await response.edit_origin()
        if response.component.label == "Красный и жёлтый":
            faculties["gryff"] += 1
        elif response.component.label == "Зелёный и серебрянный":
            faculties["slyth"] += 1
        elif response.component.label == "Жёлтый и чёрный":
            faculties["huff"] += 1
        elif response.component.label == "Синий и бронзовый":
            faculties["raven"] += 1
        elif response.component.label == "Зелёный и чёрный":
            faculties["death"] += 1
        await answer.delete()
        answer = await member.send(embed=question5_emb, components=[
            [Button(style=ButtonStyle.red, label="Почти Безголовый Ник"),
             Button(style=ButtonStyle.green, label="Кровавый Барон")],
            [Button(style=ButtonStyle.gray, label="Толстый Монах"),
             Button(style=ButtonStyle.blue, label="Серая Дама")],
            [Button(style=ButtonStyle.green, label="Не люблю призраков")]
        ])
        response = await bot.wait_for("button_click")
        await response.edit_origin()
        if response.component.label == "Почти Безголовый Ник":
            faculties["gryff"] += 1
        elif response.component.label == "Кровавый Барон":
            faculties["slyth"] += 1
        elif response.component.label == "Толстый Монах":
            faculties["huff"] += 1
        elif response.component.label == "Серая Дама":
            faculties["raven"] += 1
        elif response.component.label == "Не люблю призраков":
            faculties["death"] += 1
        await answer.delete()
        for k, v in faculties.items():
            if v == max(faculties.values()):
                faculty = k
        for role in [role.name for role in ctx.author.roles]:
            if role != "@everyone" and role.lower() in channel_roles:
                user_role = discord.utils.get(ctx.message.author.roles, name=role)
                await member.remove_roles(user_role)
        emb = discord.Embed(title=f"Вы зачислены в {names_faculties[faculty]}!", colour=discord.Colour.green())
        await member.send(embed=emb)
        await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles[who][faculty]))
        await member.add_roles(discord.utils.get(ctx.channel.guild.roles, id=roles[who][who]))

Но возникает одна проблема - если роль выбирают сразу несколько участников, то бот начинает неадекватно работать: в тесте использует ответы других пользователей, чтобы добавить тебе роль, когда участник нажимает на кнопку, он получает ошибку взаимодействия. Когда я задавал схожий вопрос, мне посоветовали реализовать стек в этом коде. Но со стеком я раньше не работал, а после прочтения гайда не понимаю как внедрить стек в мой код.


Ответы (0 шт):