public async Task SendAudioAsync(IGuild guild, string path) { // TODO: Add a check to prevent audio from being played concurrently (to the same guild?). var logChannel = await GetLogChannel(guild); if (!File.Exists(path)) { _logger.Log(LogSeverity.Error, $"No file found at {path}", logChannel); throw new FileNotFoundException($"No file found at {path}"); } AudioClientWrapper wrapper = null; if (ConnectedChannels.TryGetValue(guild.Id, out wrapper)) { _logger.Log(LogSeverity.Info, $"Playing audio file: '{path}'.", logChannel); using (var ffmpeg = CreateProcess(path)) using (var stream = wrapper.Client.CreatePCMStream(AudioApplication.Music)) { try { await ffmpeg.StandardOutput.BaseStream.CopyToAsync(stream); } finally { await stream.FlushAsync(); } } } }
public async Task JoinDefaultAudioChannel(IGuild guild) { var logChannel = await GetLogChannel(guild); var channels = await guild.GetVoiceChannelsAsync(); var target = channels .OrderBy(c => c.Position) .First(); _logger.Log(new LogMessage( LogSeverity.Info, this.ToString(), $"No target channel provided, attempting to join channel: {target.Name}"), logChannel); var client = await target.ConnectAsync(); var wrapper = new AudioClientWrapper(target.Id, client); ConnectedChannels.AddOrUpdate(guild.Id, wrapper, (key, oldWrapper) => wrapper); }
public async Task JoinAudioChannel(IGuild guild, IVoiceChannel target) { var logChannel = await GetLogChannel(guild); if (target.Guild.Id != guild.Id) { _logger.Log(LogSeverity.Warning, "Attempted to join a channel from a different guild.", logChannel); return; } _logger.Log(new LogMessage( LogSeverity.Info, this.ToString(), $"Attempting to join channel: {target.Name}"), logChannel); var client = await target.ConnectAsync(); _joinedGuild = guild; var wrapper = new AudioClientWrapper(target.Id, client); client.SpeakingUpdated += Client_SpeakingUpdated; ConnectedChannels.AddOrUpdate(guild.Id, wrapper, (key, oldWrapper) => wrapper); }