Как в коде функции 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]))
Но возникает одна проблема - если роль выбирают сразу несколько участников, то бот начинает неадекватно работать: в тесте использует ответы других пользователей, чтобы добавить тебе роль, когда участник нажимает на кнопку, он получает ошибку взаимодействия. Когда я задавал схожий вопрос, мне посоветовали реализовать стек в этом коде. Но со стеком я раньше не работал, а после прочтения гайда не понимаю как внедрить стек в мой код.