From f0a81e530515fa3629db6b0b360cda4f7f49a4d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Henrique=20Ivanchechen?= Date: Sun, 24 Dec 2023 14:33:52 -0300 Subject: [PATCH] adding shuffle --- Kasbot.APP/Extensions/IListExtensions.cs | 21 +++++++++++++++++++++ Kasbot.APP/Modules/CommandModule.cs | 7 +++++++ Kasbot.APP/Services/PlayerService.cs | 20 ++++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 Kasbot.APP/Extensions/IListExtensions.cs diff --git a/Kasbot.APP/Extensions/IListExtensions.cs b/Kasbot.APP/Extensions/IListExtensions.cs new file mode 100644 index 0000000..f7b9136 --- /dev/null +++ b/Kasbot.APP/Extensions/IListExtensions.cs @@ -0,0 +1,21 @@ +using Discord.WebSocket; + +namespace Kasbot.Extensions +{ + public static class IListExtensions + { + public static IEnumerable Shuffle(this IEnumerable source) + { + var rng = new Random(); + + var buffer = source.ToList(); + for (int i = 0; i < buffer.Count; i++) + { + int j = rng.Next(i, buffer.Count); + yield return buffer[j]; + + buffer[j] = buffer[i]; + } + } + } +} diff --git a/Kasbot.APP/Modules/CommandModule.cs b/Kasbot.APP/Modules/CommandModule.cs index 9d2b346..85089b0 100644 --- a/Kasbot.APP/Modules/CommandModule.cs +++ b/Kasbot.APP/Modules/CommandModule.cs @@ -56,6 +56,7 @@ namespace Kasbot.Modules await PlayerService.Stop(Context.Guild.Id); } + [Alias("s", "next", "n")] [Command("skip", RunMode = RunMode.Async)] public async Task SkipAsync() { @@ -74,5 +75,11 @@ namespace Kasbot.Modules { await PlayerService.Repeat(Context.Guild.Id); } + + [Command("shuffle", RunMode = RunMode.Async)] + public async Task Shuffle() + { + await PlayerService.Shuffle(Context.Guild.Id); + } } } diff --git a/Kasbot.APP/Services/PlayerService.cs b/Kasbot.APP/Services/PlayerService.cs index 056ae65..0c282b9 100644 --- a/Kasbot.APP/Services/PlayerService.cs +++ b/Kasbot.APP/Services/PlayerService.cs @@ -260,5 +260,25 @@ namespace Kasbot.Services await CreateConnection(guildId, (Context.User as IVoiceState).VoiceChannel); } + + public async Task Shuffle(ulong guildId) + { + if (!Clients.ContainsKey(guildId)) + throw new Exception("Bot is not connected!"); + + var media = Clients[guildId]; + + if (media.Queue.Count == 0) + throw new Exception("The queue is empty!"); + + var shuffled = media.Queue.Shuffle(); + var newQueue = new Queue(); + + shuffled.ToList().ForEach(m => newQueue.Enqueue(m)); + + media.Queue = newQueue; + + await media.Queue.First().Channel.SendTemporaryMessageAsync(":call_me: Queue shuffled!"); + } } }