This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -52,7 +52,7 @@ namespace PluginManager.Commands
|
|||||||
DMCommands += cmd.Command + " ";
|
DMCommands += cmd.Command + " ";
|
||||||
if (cmd.requireAdmin)
|
if (cmd.requireAdmin)
|
||||||
adminCommands += cmd.Command + " ";
|
adminCommands += cmd.Command + " ";
|
||||||
else normalCommands += cmd.Command + " ";
|
else if (cmd.canUseServer) normalCommands += cmd.Command + " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
embedBuilder.AddField("Admin Commands", adminCommands);
|
embedBuilder.AddField("Admin Commands", adminCommands);
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
using Discord;
|
using Discord;
|
||||||
using Discord.Audio;
|
using Discord.Audio;
|
||||||
|
|
||||||
|
using MusicCommands;
|
||||||
|
|
||||||
namespace CMD_Utils.Music
|
namespace CMD_Utils.Music
|
||||||
{
|
{
|
||||||
internal static class Data
|
internal static class Data
|
||||||
{
|
{
|
||||||
internal static IAudioClient audioClient = null;
|
internal static IAudioClient audioClient = null;
|
||||||
internal static IVoiceChannel voiceChannel = null;
|
internal static IVoiceChannel voiceChannel = null;
|
||||||
|
|
||||||
|
internal static MusicPlayer CurrentlyRunning = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ namespace CMD_Utils.Music
|
|||||||
{
|
{
|
||||||
if (Data.audioClient is not null && Data.voiceChannel is not null)
|
if (Data.audioClient is not null && Data.voiceChannel is not null)
|
||||||
{
|
{
|
||||||
|
Data.CurrentlyRunning.Stop();
|
||||||
|
Data.CurrentlyRunning = null;
|
||||||
await Data.audioClient.StopAsync();
|
await Data.audioClient.StopAsync();
|
||||||
await Data.voiceChannel.DisconnectAsync();
|
await Data.voiceChannel.DisconnectAsync();
|
||||||
}
|
}
|
||||||
|
|||||||
26
MusicCommands/LinkMusic.cs
Normal file
26
MusicCommands/LinkMusic.cs
Normal file
@@ -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<Stream> GetMusicStreamAsync()
|
||||||
|
{
|
||||||
|
WebClient client = new WebClient();
|
||||||
|
return await client.OpenReadTaskAsync(this.URL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
57
MusicCommands/MusicPlayer.cs
Normal file
57
MusicCommands/MusicPlayer.cs
Normal file
@@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,12 +3,6 @@ using Discord.WebSocket;
|
|||||||
|
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CMD_Utils.Music
|
namespace CMD_Utils.Music
|
||||||
{
|
{
|
||||||
class Pause : DBCommand
|
class Pause : DBCommand
|
||||||
@@ -25,9 +19,9 @@ namespace CMD_Utils.Music
|
|||||||
|
|
||||||
public bool requireAdmin => false;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ using Discord.Audio;
|
|||||||
using Discord.Commands;
|
using Discord.Commands;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
|
using MusicCommands;
|
||||||
|
|
||||||
using PluginManager.Interfaces;
|
using PluginManager.Interfaces;
|
||||||
using PluginManager.Others;
|
using PluginManager.Others;
|
||||||
|
|
||||||
@@ -37,22 +39,20 @@ namespace CMD_Utils.Music
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the audio channel
|
|
||||||
|
|
||||||
Data.voiceChannel = (context.User as IGuildUser)?.VoiceChannel;
|
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; }
|
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();
|
Data.audioClient = await Data.voiceChannel.ConnectAsync();
|
||||||
|
|
||||||
|
|
||||||
// Create FFmpeg using the previous example
|
|
||||||
using (var ffmpeg = CreateStream(path))
|
using (var ffmpeg = CreateStream(path))
|
||||||
using (var output = ffmpeg.StandardOutput.BaseStream)
|
using (var output = ffmpeg.StandardOutput.BaseStream)
|
||||||
using (var discord = Data.audioClient.CreatePCMStream(AudioApplication.Mixed))
|
using (var discord = Data.audioClient.CreatePCMStream(AudioApplication.Mixed))
|
||||||
{
|
{
|
||||||
try { await output.CopyToAsync(discord); }
|
if (Data.CurrentlyRunning != null)
|
||||||
finally { await discord.FlushAsync(); }
|
Data.CurrentlyRunning.Stop();
|
||||||
|
Data.CurrentlyRunning = new MusicPlayer(output, discord);
|
||||||
|
await Data.CurrentlyRunning.StartSendAudio();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
35
MusicCommands/Unpause.cs
Normal file
35
MusicCommands/Unpause.cs
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
53
MusicCommands/lplay.cs
Normal file
53
MusicCommands/lplay.cs
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user