Задать вопрос
@Akmal009

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

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

lZvnR.png

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

PTv8y.png

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

Если нужны еще подробности, напишите. Использую библиотеку 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()
  • Вопрос задан
  • 49 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Для этого используется декоратор autocomplete
async def fruit_autocomplete(
    interaction: discord.Interaction,
    current: str,
) -> List[app_commands.Choice[str]]:
    fruits = ...  # Список данных полученный из БД
    ... # Фильтрация списка 
    return [
        app_commands.Choice(name=fruit, value=fruit)
        for fruit in fruits if current.lower() in fruit.lower()
    ]

@app_commands.command()
@app_commands.autocomplete(fruit=fruit_autocomplete)
async def fruits(interaction: discord.Interaction, fruit: str):
    await interaction.response.send_message(f'Your favourite fruit seems to be {fruit}')


В данном примере функция fruit_autocomplete будет вызываться при наборе каждой буквы. Делаете вместо статичного списка чтение из БД (только убедитесь, что делаете один раз, а не при наборе каждой буквы!) и фильтруете результат на основе текущего ввода, который лежит в current.

В простейшем виде сравниваете начальные буквы, но можно делать и более интересные вещи, вроде нечеткого поиска, например через расстояние Дамерау-Левенштейна.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы