From 351067a5203307fc0c1a14ae2be84eae71246af9 Mon Sep 17 00:00:00 2001 From: TrueDoctor Date: Wed, 11 Apr 2018 14:19:57 +0200 Subject: Added possibillity for service based soundplaying --- DiscoBot/Audio/AudioService.cs | 101 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 DiscoBot/Audio/AudioService.cs (limited to 'DiscoBot/Audio/AudioService.cs') diff --git a/DiscoBot/Audio/AudioService.cs b/DiscoBot/Audio/AudioService.cs new file mode 100644 index 0000000..25beed0 --- /dev/null +++ b/DiscoBot/Audio/AudioService.cs @@ -0,0 +1,101 @@ +namespace DiscoBot.Audio +{ + using System.Collections.Concurrent; + using System.Diagnostics; + using System.IO; + using System.Threading.Tasks; + + using Discord; + using Discord.Audio; + + public class AudioService + { + private readonly ConcurrentDictionary connectedChannels = new ConcurrentDictionary(); + + public async Task JoinAudio(IGuild guild, IVoiceChannel target) + { + IAudioClient client; + if (this.connectedChannels.TryGetValue(guild.Id, out client)) + { + return; + } + + if (target.Guild.Id != guild.Id) + { + return; + } + + var audioClient = await target.ConnectAsync(); + + if (this.connectedChannels.TryAdd(guild.Id, audioClient)) + { + // If you add a method to log happenings from this service, + // you can uncomment these commented lines to make use of that. + //await Log(LogSeverity.Info, $"Connected to voice on {guild.Name}."); + } + } + + public async Task LeaveAudio(IGuild guild) + { + IAudioClient client; + if (this.connectedChannels.TryRemove(guild.Id, out client)) + { + await client.StopAsync(); + //await Log(LogSeverity.Info, $"Disconnected from voice on {guild.Name}."); + } + } + + public async Task SendAudioAsync(IGuild guild, IMessageChannel channel, string path) + { + // Your task: Get a full path to the file if the value of 'path' is only a filename. + if (!File.Exists(path) && false) + { + await channel.SendMessageAsync("File does not exist."); + return; + } + IAudioClient client; + if (this.connectedChannels.TryGetValue(guild.Id, out client)) + { + //await Log(LogSeverity.Debug, $"Starting playback of {path} in {guild.Name}"); + using (var ffmpeg = this.CreateStream(path)) + using (var stream = client.CreatePCMStream(AudioApplication.Music)) + { + try { await ffmpeg.StandardOutput.BaseStream.CopyToAsync(stream); } + finally { await stream.FlushAsync(); } + } + } + } + + public async Task SendAudioAsync(string path, int Volume) + { + // Your task: Get a full path to the file if the value of 'path' is only a filename. + if (!File.Exists(path) && false) + { + //await channel.SendMessageAsync("File does not exist."); + return; + } + + if (this.connectedChannels.TryGetValue(Dsa.GeneralContext.Guild.Id, out var client)) + { + //await Log(LogSeverity.Debug, $"Starting playback of {path} in {guild.Name}"); + using (var ffmpeg = this.CreateStream(path)) + using (var stream = client.CreatePCMStream(AudioApplication.Voice)) + { + try { await ffmpeg.StandardOutput.BaseStream.CopyToAsync(stream); } + finally { await stream.FlushAsync(); } + } + } + } + + private Process CreateStream(string path) + { + return Process.Start(new ProcessStartInfo + { + FileName = "ffmpeg.exe", + Arguments = $"-hide_banner -loglevel panic -i \"{path}\" -ac 2 -f s16le -ar 48000 pipe:1", + UseShellExecute = false, + RedirectStandardOutput = true + }); + } + } +} -- cgit v1.2.3-54-g00ecf