summaryrefslogtreecommitdiff
path: root/DiscoBot/Audio/Voice.cs
diff options
context:
space:
mode:
Diffstat (limited to 'DiscoBot/Audio/Voice.cs')
-rw-r--r--DiscoBot/Audio/Voice.cs112
1 files changed, 112 insertions, 0 deletions
diff --git a/DiscoBot/Audio/Voice.cs b/DiscoBot/Audio/Voice.cs
new file mode 100644
index 0000000..d1f7915
--- /dev/null
+++ b/DiscoBot/Audio/Voice.cs
@@ -0,0 +1,112 @@
+namespace DiscoBot.Audio
+{
+ using System;
+ using System.Collections.Generic;
+ using System.ComponentModel;
+ using System.Diagnostics;
+ using System.Linq;
+ using System.Threading.Tasks;
+
+ using DiscoBot.Auxiliary;
+
+ using Discord;
+ using Discord.Audio;
+ using Discord.Commands;
+
+ public class Voice : ModuleBase
+ {
+ public static IAudioClient Client { get; set; }
+
+ public static async Task SendAsync(string path, int volume = 256)
+ {
+ if (Client == null)
+ {
+ throw new NullReferenceException("Bot befindet sich nicht in einem Sprachchannel");
+ }
+
+ // Create FFmpeg using the previous example
+ var ffmpeg = CreateStream(path, volume);
+ var output = ffmpeg.StandardOutput.BaseStream;
+ var barInvoker = new BackgroundWorker();
+ barInvoker.DoWork += delegate
+ {
+ var discord = Client.CreatePCMStream(AudioApplication.Music);
+ output.CopyToAsync(discord);
+
+ discord.FlushAsync();
+ };
+
+ barInvoker.RunWorkerAsync();
+ }
+
+ [Command("join", RunMode = RunMode.Async)]
+ public async Task JoinChannelAsync(IVoiceChannel channel = null)
+ {
+ var msg = this.Context.Message;
+
+ // Get the audio channel
+ channel = channel ?? (msg.Author as IGuildUser)?.VoiceChannel;
+ if (channel == null)
+ {
+ await msg.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();
+ Client = audioClient;
+ }
+
+ [Command("leave", RunMode = RunMode.Async)]
+ public async Task LeaveChannelAsync(IVoiceChannel channel = null)
+ {
+ if (Client != null)
+ {
+ var wait = SoundEffects.Play(Sound.Nooo);
+ await Client.StopAsync();
+ Client = null;
+ wait.Wait();
+ }
+ }
+
+ [Command("play", RunMode = RunMode.Async)]
+ public async Task PlayAudioAsync(string path)
+ {
+ if (Client == null)
+ {
+ await this.Context.Channel.SendMessageAsync("Erst Joinen!");
+ }
+
+ var sounds = Enum.GetValues(typeof(Sound));
+ var soundList = new List<Sound>();
+ foreach (var sound in sounds)
+ {
+ soundList.Add((Sound)sound);
+ }
+
+ var sc = new SpellCorrect();
+
+ var tSound = soundList.OrderBy(x => sc.Compare(path, x.ToString())).First();
+
+ if (sc.Compare(path, tSound.ToString()) > SpellCorrect.ErrorThreshold)
+ {
+ await Task.Run(() => Voice.SendAsync(path));
+ }
+
+ await Task.Run(() => SoundEffects.Play(tSound));
+ }
+
+ private static Process CreateStream(string path, int vol = 256)
+ {
+ var ffmpeg = new ProcessStartInfo
+ {
+ FileName = "ffmpeg",
+ Arguments = $"-i {path} -ac 2 -f s16le -ar 48000 -ab 620000 -vol {vol} pipe:1",
+ UseShellExecute = false,
+ RedirectStandardOutput = true,
+ };
+ return Process.Start(ffmpeg);
+ }
+ }
+}