using System; using System.IO; using System.Threading.Tasks; using Discord; using Discord.Commands; using Geekbot.net.Lib; namespace Geekbot.net.Commands { public class Voice : ModuleBase { private readonly IAudioUtils _audioUtils; private readonly IErrorHandler _errorHandler; public Voice(IErrorHandler errorHandler, IAudioUtils audioUtils) { _errorHandler = errorHandler; _audioUtils = audioUtils; } [Command("join")] public async Task JoinChannel() { try { // Get the audio channel var channel = (Context.User as IGuildUser)?.VoiceChannel; if (channel == null) { await Context.Channel.SendMessageAsync( "User must be in a voice channel, or a voice channel must be passed as an argument."); return; } // For the next step with transmitting audio, you would want to pass this Audio Client in to a service. var audioClient = await channel.ConnectAsync(); _audioUtils.StoreAudioClient(Context.Guild.Id, audioClient); await ReplyAsync($"Connected to {channel.Name}"); } catch (Exception e) { _errorHandler.HandleCommandException(e, Context); } } [Command("disconnect")] public async Task DisconnectChannel() { try { var audioClient = _audioUtils.GetAudioClient(Context.Guild.Id); if (audioClient == null) { await Context.Channel.SendMessageAsync("I'm not in a voice channel at the moment"); return; } await audioClient.StopAsync(); await ReplyAsync("Disconnected from channel!"); } catch (Exception e) { _errorHandler.HandleCommandException(e, Context); } } [Command("ytplay")] public async Task ytplay(string url) { try { if (!url.Contains("youtube")) { await ReplyAsync("I can only play youtube videos"); return; } var audioClient = _audioUtils.GetAudioClient(Context.Guild.Id); if (audioClient == null) { await ReplyAsync("I'm not in a voice channel at the moment"); return; } var ffmpeg = _audioUtils.CreateStreamFromYoutube(url, Context.Guild.Id); var output = ffmpeg.StandardOutput.BaseStream; var discord = audioClient.CreatePCMStream(Discord.Audio.AudioApplication.Mixed); await output.CopyToAsync(discord); await discord.FlushAsync(); } catch (Exception e) { _errorHandler.HandleCommandException(e, Context); } } } }