@EcoTry

Проблема с произведением музыки в discord.py?

@slash.slash(guild_ids=guild_ids, name="play", description="Включить музыку", options=[create_option(name="url", description="Ссылка на песню", option_type=3, required=True)])
async def play(ctx, url):
    if not ctx.author.voice:
        emb = discord.Embed(title='Ошибка', color=0xff0000)
        emb.add_field(name='Ты не подключен к каналу', value='Подключись к любому каналу', inline=False)
        emb.set_thumbnail(url='https://cdn.discordapp.com/avatars/843118472892645377/e3dbb8f2b78f00b072ada3399c652b79.webp?size=128')
        await ctx.send(embed=emb)
        return

    else:
        channel = ctx.author.voice.channel

    try:
      await channel.connect()
    except:
      pass

    server = ctx.guild
    voice_channel = server.voice_client

    emb = discord.Embed(title='Загружаем песню', color=0x90EE90)
    msg = await ctx.send(embed=emb)

    player = await YTDLSource.from_url(url, loop=bot.loop, stream=True)
    voice_channel.play(player, after=lambda e: print('Player error: %s' % e) if e else None)

    emb.title = "Сейчас играет"
    emb.add_field(name="Композиция:", value=player.title, inline=True)
    emb.set_thumbnail(url='https://cdn.discordapp.com/avatars/843118472892645377/e3dbb8f2b78f00b072ada3399c652b79.webp?size=128')
    await msg.edit(embed=emb)
    return


Все установлено ffprobe, ffplay, ffmpeg
  • Вопрос задан
  • 159 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ну подумай головой.
> 'NoneType' object has no attribute 'play'
> voice_channel.play(
Значит, voice_channel - None.
Смотрим откуда он взялся, читаем доки по Guild.voice_client:
"voice_client - Returns the VoiceProtocol associated with this guild, if any.
Type: Optional[VoiceProtocol]"
Т.е. он вполне может быть None, и это надо проверять перед использованием.

А вот более интересный вопрос, почему он None.
Ты выше обращаешься к channel = ctx.author.voice.channel - а ведь не только voice может быть None, но и channel в нём. voice проверяешь, channel нет. А чуть ниже у тебя удивительная конструкция:
try:
      await channel.connect()
    except:
      pass

Дай угадаю, channel.connect() кидал 'NoneType' object has no attribute 'connect'?
Никогда на надо глотать исключения таким образом - всё без разбора и без реакции.
channel.connect() кидает ровно три возможных исключения, и их нужно обрабатывать по-нормальному!
asyncio.TimeoutError – серверу икнулось, мы ничего сделать не можем, только попросить пользователя повторить по-позже.
ClientException – мы уже к войс-чату подключены, нужно либо переключаться, либо просить подождать, пока закончим с первым запросом.
OpusNotLoaded – библиотеку opus не загрузил, она нужна для работы с голосом.
Ещё раз, except: pass - это очень, очень хороший способ выстрелить себе в ногу.

И самое-то смешное, что в документации на connect() написано что оно возвращает готовый к работе voice_channel. Тогда вроде как не нужно было ctx.guild.voice_client трогать, connect() отдаст нужный объект.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы