From 1e7387cfa7b8bd5f7c75123141e9793787ad18aa Mon Sep 17 00:00:00 2001 From: Wizzy69 Date: Sat, 9 Apr 2022 10:18:39 +0300 Subject: [PATCH] --- BUILDS/net5.0/MusicCommands.dll | Bin 10752 -> 15872 bytes BUILDS/net5.0/ref/MusicCommands.dll | Bin 6656 -> 8192 bytes DiscordBot/Discord/Commands/Help.cs | 2 +- MusicCommands/Data.cs | 4 ++ MusicCommands/Leave.cs | 2 + MusicCommands/LinkMusic.cs | 26 +++++++++++++ MusicCommands/MusicPlayer.cs | 57 ++++++++++++++++++++++++++++ MusicCommands/Pause.cs | 10 +---- MusicCommands/Play.cs | 12 +++--- MusicCommands/Unpause.cs | 35 +++++++++++++++++ MusicCommands/lplay.cs | 53 ++++++++++++++++++++++++++ 11 files changed, 186 insertions(+), 15 deletions(-) create mode 100644 MusicCommands/LinkMusic.cs create mode 100644 MusicCommands/MusicPlayer.cs create mode 100644 MusicCommands/Unpause.cs create mode 100644 MusicCommands/lplay.cs diff --git a/BUILDS/net5.0/MusicCommands.dll b/BUILDS/net5.0/MusicCommands.dll index 5bd04258d7388de1f800d11880ce68985f53f473..58fc01a2af5f93aa7a201677fe00e336c8220e85 100644 GIT binary patch literal 15872 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 H=YjtO?azk* literal 10752 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 diff --git a/BUILDS/net5.0/ref/MusicCommands.dll b/BUILDS/net5.0/ref/MusicCommands.dll index bde4210fd2fc36b4cf2c68615331df2079e6afc0..becb33cc49ce47c5e7069538b6ca5c5fcf5dbf18 100644 GIT binary patch literal 8192 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 diff --git a/DiscordBot/Discord/Commands/Help.cs b/DiscordBot/Discord/Commands/Help.cs index 09cfc06..24388db 100644 --- a/DiscordBot/Discord/Commands/Help.cs +++ b/DiscordBot/Discord/Commands/Help.cs @@ -52,7 +52,7 @@ namespace PluginManager.Commands DMCommands += cmd.Command + " "; if (cmd.requireAdmin) adminCommands += cmd.Command + " "; - else normalCommands += cmd.Command + " "; + else if (cmd.canUseServer) normalCommands += cmd.Command + " "; } embedBuilder.AddField("Admin Commands", adminCommands); diff --git a/MusicCommands/Data.cs b/MusicCommands/Data.cs index 0d81d53..f2cc1de 100644 --- a/MusicCommands/Data.cs +++ b/MusicCommands/Data.cs @@ -1,11 +1,15 @@ using Discord; using Discord.Audio; +using MusicCommands; + namespace CMD_Utils.Music { internal static class Data { internal static IAudioClient audioClient = null; internal static IVoiceChannel voiceChannel = null; + + internal static MusicPlayer CurrentlyRunning = null; } } diff --git a/MusicCommands/Leave.cs b/MusicCommands/Leave.cs index ecff457..1b8d221 100644 --- a/MusicCommands/Leave.cs +++ b/MusicCommands/Leave.cs @@ -29,6 +29,8 @@ namespace CMD_Utils.Music { if (Data.audioClient is not null && Data.voiceChannel is not null) { + Data.CurrentlyRunning.Stop(); + Data.CurrentlyRunning = null; await Data.audioClient.StopAsync(); await Data.voiceChannel.DisconnectAsync(); } diff --git a/MusicCommands/LinkMusic.cs b/MusicCommands/LinkMusic.cs new file mode 100644 index 0000000..8247ac8 --- /dev/null +++ b/MusicCommands/LinkMusic.cs @@ -0,0 +1,26 @@ +using Discord.Net; + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading.Tasks; + +namespace MusicCommands +{ + public class LinkMusic + { + private string URL; + public LinkMusic(string URL) + { + this.URL = URL; + } + public async Task GetMusicStreamAsync() + { + WebClient client = new WebClient(); + return await client.OpenReadTaskAsync(this.URL); + } + } +} diff --git a/MusicCommands/MusicPlayer.cs b/MusicCommands/MusicPlayer.cs new file mode 100644 index 0000000..293feac --- /dev/null +++ b/MusicCommands/MusicPlayer.cs @@ -0,0 +1,57 @@ +using CMD_Utils.Music; + +using PluginManager.Others; + +using System; +using System.IO; +using System.Threading.Tasks; + +namespace MusicCommands +{ + class MusicPlayer + { + public Stream inputStream { get; private set; } // from FFMPEG + public Stream outputStream { get; private set; } // to Voice Channel + public MusicPlayer(Stream input, Stream output) + { + inputStream = input; + outputStream = output; + } + + public bool Paused { get; set; } + private bool _stop { get; set; } + public void Stop() + { + _stop = true; + } + + public async Task StartSendAudio() + { + Paused = false; + _stop = false; + while (!_stop) + { + if (Paused) continue; + int bsize = 512; + byte[] buffer = new byte[bsize]; + var bcount = await inputStream.ReadAsync(buffer, 0, bsize); + if (bcount <= 0) + { + Stop(); + Data.CurrentlyRunning = null; + break; + } + try + { + await outputStream.WriteAsync(buffer, 0, bcount); + } + catch (Exception ex) + { + await outputStream.FlushAsync(); + Functions.WriteLogFile(ex.ToString()); + } + + } + } + } +} diff --git a/MusicCommands/Pause.cs b/MusicCommands/Pause.cs index 16d9872..457b8b8 100644 --- a/MusicCommands/Pause.cs +++ b/MusicCommands/Pause.cs @@ -3,12 +3,6 @@ using Discord.WebSocket; using PluginManager.Interfaces; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace CMD_Utils.Music { class Pause : DBCommand @@ -25,9 +19,9 @@ namespace CMD_Utils.Music public bool requireAdmin => false; - public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) + public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) { - // to be implemented + Data.CurrentlyRunning.Paused = true; } } } diff --git a/MusicCommands/Play.cs b/MusicCommands/Play.cs index c70e2b0..eb666c6 100644 --- a/MusicCommands/Play.cs +++ b/MusicCommands/Play.cs @@ -3,6 +3,8 @@ using Discord.Audio; using Discord.Commands; using Discord.WebSocket; +using MusicCommands; + using PluginManager.Interfaces; using PluginManager.Others; @@ -37,22 +39,20 @@ namespace CMD_Utils.Music return; } - // Get the audio channel Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel; if (Data.voiceChannel == 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. Data.audioClient = await Data.voiceChannel.ConnectAsync(); - - // Create FFmpeg using the previous example using (var ffmpeg = CreateStream(path)) using (var output = ffmpeg.StandardOutput.BaseStream) using (var discord = Data.audioClient.CreatePCMStream(AudioApplication.Mixed)) { - try { await output.CopyToAsync(discord); } - finally { await discord.FlushAsync(); } + if (Data.CurrentlyRunning != null) + Data.CurrentlyRunning.Stop(); + Data.CurrentlyRunning = new MusicPlayer(output, discord); + await Data.CurrentlyRunning.StartSendAudio(); } } diff --git a/MusicCommands/Unpause.cs b/MusicCommands/Unpause.cs new file mode 100644 index 0000000..e585dee --- /dev/null +++ b/MusicCommands/Unpause.cs @@ -0,0 +1,35 @@ +using CMD_Utils.Music; + +using Discord.Commands; +using Discord.WebSocket; + +using PluginManager.Interfaces; + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MusicCommands +{ + class Unpause : DBCommand + { + public string Command => "unpause"; + + public string Description => "Unpause the music"; + + public string Usage => "unpause"; + + public bool canUseDM => false; + + public bool canUseServer => true; + + public bool requireAdmin => false; + + public void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) + { + Data.CurrentlyRunning.Paused = false; + } + } +} diff --git a/MusicCommands/lplay.cs b/MusicCommands/lplay.cs new file mode 100644 index 0000000..43e33f3 --- /dev/null +++ b/MusicCommands/lplay.cs @@ -0,0 +1,53 @@ +using CMD_Utils.Music; +using Discord.Audio; +using Discord.Commands; +using Discord.WebSocket; +using Discord; + +using PluginManager.Interfaces; +using PluginManager.Others; + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MusicCommands +{ + class lplay : DBCommand + { + public string Command => "lplay"; + + public string Description => "Play music from a link"; + + public string Usage => "lplay [name]"; + + public bool canUseDM => false; + + public bool canUseServer => false; + + public bool requireAdmin => false; + + public async void Execute(SocketCommandContext context, SocketMessage message, DiscordSocketClient client, bool isDM) + { + + + Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel; + if (Data.voiceChannel == null) { await context.Channel.SendMessageAsync("User must be in a voice channel, or a voice channel must be passed as an argument."); return; } + + Data.audioClient = await Data.voiceChannel.ConnectAsync(); + + using (var discord = Data.audioClient.CreatePCMStream(AudioApplication.Mixed)) + { + if (Data.CurrentlyRunning != null) + Data.CurrentlyRunning.Stop(); + LinkMusic music = new LinkMusic(Functions.GetArguments(message)[0]); + Data.CurrentlyRunning = new MusicPlayer(await music.GetMusicStreamAsync(), discord); + await Data.CurrentlyRunning.StartSendAudio(); + } + } + + } +}