discord.py, как сделать выпадающее choice menu для выбора 1 из 3 параметров
@bot.hybrid_command(name="top", description="Просмотр лидеров")
async def top(ctx: commands.Context):
embed = discord.Embed(
colour=0x90ee90
)
coordinate = 90
font = ImageFont.truetype('Arimo.ttf', 15)
error_offset = 0
top_users = cursor.execute("SELECT nickname, elo FROM users ORDER BY elo DESC LIMIT 10").fetchall()
im = Image.open('leaderboard.png')
draw = ImageDraw.Draw(im)
for index, (lbuser, lbelo) in enumerate(top_users, start=1):
if index == 10:
coordinate = 595
y_position = coordinate + 50 * (index % 10) + error_offset
draw.text((80, y_position), f"{lbuser}", fill=(247, 247, 247), font=font)
draw.text((210, y_position), f"{lbelo}", fill=(247, 247, 247), font=font)
else:
y_position = coordinate + 50 * (index % 10) + error_offset
draw.text((80, y_position), f"{lbuser}", fill=(247, 247, 247), font=font)
draw.text((210, y_position), f"{lbelo}", fill=(247, 247, 247), font=font)
if index >= 2: # Начиная со второго человека увеличиваем погрешность
error_offset -= 4
im = im.resize((378, 604), Image.LANCZOS)
file = io.BytesIO()
im.save(file, 'PNG')
file.seek(0)
file = discord.File(file, filename="leaderboard.png")
embed.set_image(url="attachment://leaderboard.png")
await ctx.send(file=file, embed=embed)
в данном коде я создаю slash команду, мне надо чтобы когда пользователь пытался её написать, он должен был обязательно выбрать один из 3 пармертров Default, Qualification, Divison, далее то что выбрал пользователь необходимо занести в переменную, далее я уже сам напишу остальной код. Заранее благодарю!
Ответы (2 шт):
Автор решения: Cat met
→ Ссылка
Вот работающий код:
import discord
from discord.ext import commands
bot = commands.Bot(command_prefix="!", intents=discord.Intents.all())
class Select(discord.ui.Select):
def __init__(self):
self.choise = None
options=[
discord.SelectOption(label="Default",emoji="?",description="This is option 1!"),
discord.SelectOption(label="Qualification",emoji="✨",description="This is option 2!"),
discord.SelectOption(label="Divison",emoji="?",description="This is option 3!")
]
super().__init__(placeholder="Select an option",max_values=1,min_values=1,options=options)
async def callback(self, interaction: discord.Interaction):
self.choise = self.values[0]
await main_code(interaction, self.choise)
class SelectView(discord.ui.View):
def __init__(self, *, timeout = 180):
super().__init__(timeout=timeout)
self.add_item(Select())
@bot.hybrid_command(name="top", description="Просмотр лидеров")
async def top(ctx: commands.Context):
embed = discord.Embed(
color=discord.Color.green(),
title="Embed title",
description="Embed description"
)
await ctx.send(embed=embed, view=SelectView())
async def main_code(interaction, choise):
# Тут делаешь то что тебе надо с переменной choise
await interaction.channel.send(f"Choise: {choise}")
""" coordinate = 90
font = ImageFont.truetype('Arimo.ttf', 15)
error_offset = 0
top_users = cursor.execute("SELECT nickname, elo FROM users ORDER BY elo DESC LIMIT 10").fetchall()
im = Image.open('leaderboard.png')
draw = ImageDraw.Draw(im)
for index, (lbuser, lbelo) in enumerate(top_users, start=1):
if index == 10:
coordinate = 595
y_position = coordinate + 50 * (index % 10) + error_offset
draw.text((80, y_position), f"{lbuser}", fill=(247, 247, 247), font=font)
draw.text((210, y_position), f"{lbelo}", fill=(247, 247, 247), font=font)
else:
y_position = coordinate + 50 * (index % 10) + error_offset
draw.text((80, y_position), f"{lbuser}", fill=(247, 247, 247), font=font)
draw.text((210, y_position), f"{lbelo}", fill=(247, 247, 247), font=font)
if index >= 2: # Начиная со второго человека увеличиваем погрешность
error_offset -= 4
im = im.resize((378, 604), Image.LANCZOS)
file = io.BytesIO()
im.save(file, 'PNG')
file.seek(0)
file = discord.File(file, filename="leaderboard.png")
embed.set_image(url="attachment://leaderboard.png")
await ctx.send(file=file, embed=embed) """
bot.run("Твой токен")
Автор решения: Unclear
→ Ссылка
Если я правильно понимаю, при вводе команды должен всплывать список доступных значений для переменной. В таком случае такой код можете подстроить под своего бота:
@bot.tree.command(name="poll", description="Создание опроса", guild=discord.Object(id=id))
@app_commands.choices(color = [
app_commands.Choice(name="Рандомный", value=1),
app_commands.Choice(name="Бирюзовый", value=2),
app_commands.Choice(name="Салатовый", value=3)
]
@app_commands.describe(title = "Заголовок опроса", color="Цвет")
async def poll(interaction:discord.Interaction, color:app_commands.Choice[int]):
await interaction.responce.send_message(f"Значение цвета: {color.value}")
не забудьте объявить app_commands:
from discord import app_commands