Программа аварийно завершает работу, когда я пытаюсь получить IAudioClient для канала

Я использую Discord.Net Api, чтобы бот подключался к серверу разногласий, и я хочу, чтобы бот воспроизводил музыку и аудио. Я могу заставить бота присоединиться к каналу, и он отлично работает, но когда я пытаюсь получить IAudioClient для канала (из IAudioClient я могу получить выходной аудиопоток, чтобы я мог писать на него музыку, и это то, что передает музыку) , я получаю исключение. Это мой код для присоединения к каналу и последующего получения IAudioClient для канала:

    [Command("join")]
    public async Task JoinChannel(IVoiceChannel channel = null)
    {
        channel = channel ?? (callingUser as IGuildUser)?.VoiceChannel;
        if(channel == null)
        {
            await callingMsg.Channel.SendMessageAsync("You must be in a voice channel.");
            return;
        }

        Console.WriteLine("Channel: " + channel.Name + " - " + channel.Id);
        try
        {
            audioClient = await channel.ConnectAsync(); //crashes here
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

Не знаю, проблема ли здесь, но я установил только "ffmpeg" для передачи звука, но пока не вижу проблем с этим, только с получением аудиоканала. Я использовал это руководство: https://discord.foxbot.me/docs/guides/voice/sending-voice.html, но в верхней части руководства вы можете увидеть заголовок, в котором говорится, что руководство устарело..

исключение, которое я получаю, это The operation has timed out.

21:39:18 Discord Discord.Net v1.0.1 (API v6) 21:39:19 Подключение шлюза 21:39:20 Подключение шлюза 21:39:20 Канал готовности шлюза: 29 Шлюз Обработчик MessageReceived блокирует задачу шлюза. в Discord.WebSocket.SocketGuild.d__160.MoveNext() --- Конец трассировки стека из предыдущего места, где было выдано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в Discord.WebSocket.SocketGuild.d__160. MoveNext() --- Конец трассировки стека из предыдущего места, где возникло исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи) в Discord .WebSocket.SocketVoiceChannel.d__14.MoveNext() --- Конец трассировки стека из предыдущего места, где было выдано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) в System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() в Ruin_counter.Program.d__9.MoveNext()


person Eldar Azulay    schedule 21.07.2017    source источник
comment
Сообщите нам, какое исключение вы получили, и, если возможно, включите трассировку стека.   -  person hoodaticus    schedule 21.07.2017
comment
@hoodaticus Отредактировано. Проверьте это.   -  person Eldar Azulay    schedule 21.07.2017
comment
Не думаю, что я здесь сильно помогу. Я бы попробовал выполнить неасинхронное соединение на неисправной линии, чтобы посмотреть, работает ли оно. Тайм-аут создает впечатление, что вас по какой-то причине игнорируют на стороне сервера.   -  person hoodaticus    schedule 21.07.2017
comment
@hoodaticus нет синхронного способа сделать это с помощью этого API, только асинхронно.   -  person Eldar Azulay    schedule 21.07.2017


Ответы (2)


Если время ожидания вашей команды истекло, это потому, что «асинхронный» не совсем асинхронный. Вам нужно установить RunMode вашей команды на Async

[Command("name",RunMode = RunMode.Async)]

person Flamanis    schedule 24.07.2017
comment
это не помогло, но я нашел способ исправить этот сбой. - person Eldar Azulay; 31.07.2017

Метод await channel.ConnectAsync() может занять некоторое время, пока он не вернет значение, поэтому я только что заметил, что могу написать другой метод внутри скобок и этот другой метод с получением необходимого IAudioClient вот так: audioClient = await channel.ConnectAsync(SendAsync);

        private void SendAsync(IAudioClient audioClient)
    {
        var ffmpeg = CreateStream("tune.mp3");
        var output = ffmpeg.StandardOutput.BaseStream;
        var discord = audioClient.CreatePCMStream(AudioApplication.Mixed);
        output.CopyToAsync(discord);
        discord.FlushAsync();        
    }
person Eldar Azulay    schedule 31.07.2017