Как взять данные с базы данных, в app_commands.Choice?

Я хочу сделать чтобы когда вводил /a то там отображался список, который он будет получать с базы данных music.db. На данный момент он такой

Текущая команда

Мне нужно, чтобы сверну был список названий, который будет получать с базы данных music.db Пример как это выглядит

Пример

А так же когда будет большой список названий, то нужно сделать поиск, как показано в примере, чтобы не искать в большом списке нужное название.

Если нужны еще подробности, напишите. Использую библиотеку pycord"voice" а так же disnake

Создание базы данных

conn = sqlite3.connect('music.db')
cursor = conn.cursor()

cursor.execute('''CREATE TABLE IF NOT EXISTS music
                (name TEXT PRIMARY KEY, path TEXT)''')
conn.commit()

conn.close()

Код команды

@commands.slash_command(name="a", description="Добавить звук")
    async def a(self, ctx, название = discord.Option(str)):
        conn = sqlite3.connect('music.db')
        cursor = conn.cursor()
        cursor.execute("SELECT path FROM music WHERE name = ?", (название,))
        result = cursor.fetchone()
        if result:
            path = result[0]
            if ctx.author.voice:
                channel = ctx.author.voice.channel
                voice_client = await channel.connect()
                voice_client.play(discord.FFmpegPCMAudio(path), after=lambda e: print(f'Звук воспроизведен {название}'))
                emb = discord.Embed(title = 'Звук', colour = discord.Color.green() )
                await ctx.channel.purge(limit=1)
                emb.set_footer(text = f'Вы запустили звук')
                await ctx.respond(embed=emb)  
                await ctx.delete(delay=10)

                while voice_client.is_playing():
                    await asyncio.sleep(1)

                await voice_client.disconnect()
            else:
                emb = discord.Embed(title = 'Звук', colour = discord.Color.red() )
                await ctx.channel.purge(limit=1)
                emb.set_footer(text = f'Вы не подключены к голосовому каналу. ')
                await ctx.respond(embed=emb)  
                await ctx.delete(delay=10)
        else:
            emb = discord.Embed(title = 'Звук', colour = discord.Color.red() )
            await ctx.channel.purge(limit=1)
            emb.set_footer(text = f'Аудиофайл с таким названием не найден.')
            await ctx.respond(embed=emb)  
            await ctx.delete(delay=10)

        conn.close()

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

Автор решения: RTXAuSIDE

Если вы хотите реализовать поиск, похожий из второго скриншота, используйте автозаполняющийся список.

   @a.autocomplete("название")
    async def search(
        self,
        interaction: disnake.ApplicationCommandInteraction,
        user_input: str
    ) -> list:
        ... # реализовываете так, как вам угодно

Обратите внимание, что если вы хотите сделать так, чтобы бот возвращал нужное вам значение, оборачивайте все ваши значения таким образом:

disnake.OptionChoice(
    name="Название", # видимая часть для пользователей, то есть данный текст им будет отображаться
    value="Значение" # пользователи не видят данное значение, оно передаётся и обрабатывается ботом
)

Ещё один важный момент, заключается в том, что автозаполнение должно возвращать лишь список из OptionChoice или строчки (в последствии чего конвертируется в OptionChoice с одинаковым названием и значением)

→ Ссылка