Как взять данные с базы данных, в 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 шт):
Если вы хотите реализовать поиск, похожий из второго скриншота, используйте автозаполняющийся список.
@a.autocomplete("название")
async def search(
self,
interaction: disnake.ApplicationCommandInteraction,
user_input: str
) -> list:
... # реализовываете так, как вам угодно
Обратите внимание, что если вы хотите сделать так, чтобы бот возвращал нужное вам значение, оборачивайте все ваши значения таким образом:
disnake.OptionChoice(
name="Название", # видимая часть для пользователей, то есть данный текст им будет отображаться
value="Значение" # пользователи не видят данное значение, оно передаётся и обрабатывается ботом
)
Ещё один важный момент, заключается в том, что автозаполнение должно возвращать лишь список из OptionChoice или строчки (в последствии чего конвертируется в OptionChoice с одинаковым названием и значением)