Как остановить проигрывание музыки в музыкальном боте discord.py, если используется аргумент after?

Рейтинг: 1Ответов: 0Опубликовано: 06.08.2023

Делаю музыкального бота на Python с помощью discord.py. Сам бот уже формирует какую-никакую очередь, проигрывает музыку. Однако столкнулся с такой проблемой:

async def playSong(ctx, voice, path):
    print("начинаю играть")
    if not voice.is_playing():
        # Если ничего не играет, играем первую песню из очереди
        queue = sl.getQueue(path)
        if len(queue) == 0:
            return
        
        print("ничего не играет")
        print(queue)

        # Если мы дошли до сюда, то список не пуст, значит нужно проиграть
        # первую песню списка, после чего удалить её из него
        song = discord.FFmpegPCMAudio(path + queue[0] + ".mp3")
        if not os.path.exists(path + queue[0] + ".mp3"):
            # Эта проверка нужна на случай, если трек ещё не успел скачаться
            print("    *[Dimebag] Система не может найти файл " + queue[0] + ".mp3" + " и пытается снова")
            await asyncio.sleep(3)
            await playSong(ctx, voice, path)
            return
        
        # Если мы здесь, то значит композиция найдена, начинаем проигрывание
        try:
            voice.play(song, after = lambda e: run(playSong(ctx, voice, path)))
        except:
            print("*[Dimebag] Произошла незначительная ошибка при использовании функции playnow")

        print("     Удалили 1 элемент списка")
        # Обновляем список треков, исключая проигрываемый
        new_queue = queue[1:]
        sl.updateQueue(path, new_queue)

Чтобы играть песни по очереди у меня есть вот такая закольцованная функция. Она работает, однако у меня есть команда /stop, которая должна остановить всё воспроизведение. Проблема как раз-таки в аргументе after.

Например, в очереди у нас 3 песни. Причём первая из них уже играет, а остальные 2 хранятся в очереди. Если я пропишу команду /stop, то остановится проигрывание первой из них, но так как при начале её проигрывания ввелась функция в параметр after, то после своего завершения, она незамедлительно начинает воспроизводить вторую песню.

Мне же нужно, чтобы они все перестали играть. Можно ли как-то этого добиться? Честно, уже голову сломал, пока ничего дельного не приходит. Буду очень благодарен за подсказку.

Ответы

Ответов пока нет.