/play: Add playlist support
Signed-off-by: mctaylors <cantsendmails@mctaylors.ru>
This commit is contained in:
parent
090d3e426d
commit
a70760db93
2 changed files with 37 additions and 3 deletions
|
@ -5,6 +5,7 @@ using JetBrains.Annotations;
|
||||||
using Lavalink4NET;
|
using Lavalink4NET;
|
||||||
using Lavalink4NET.Players.Queued;
|
using Lavalink4NET.Players.Queued;
|
||||||
using Lavalink4NET.Rest.Entities.Tracks;
|
using Lavalink4NET.Rest.Entities.Tracks;
|
||||||
|
using Lavalink4NET.Tracks;
|
||||||
using Remora.Commands.Attributes;
|
using Remora.Commands.Attributes;
|
||||||
using Remora.Commands.Groups;
|
using Remora.Commands.Groups;
|
||||||
using Remora.Discord.API.Abstractions.Objects;
|
using Remora.Discord.API.Abstractions.Objects;
|
||||||
|
@ -26,7 +27,7 @@ public sealed class ControlsCommandGroup(
|
||||||
FeedbackService feedbackService) : CommandGroup
|
FeedbackService feedbackService) : CommandGroup
|
||||||
{
|
{
|
||||||
[Command("play")]
|
[Command("play")]
|
||||||
[Description("Plays or adds the requested track to the queue")]
|
[Description("Plays or adds the requested track/playlist to the queue")]
|
||||||
[RequireBotDiscordPermissions(DiscordPermission.Connect)]
|
[RequireBotDiscordPermissions(DiscordPermission.Connect)]
|
||||||
[DiscordDefaultDMPermission(false)]
|
[DiscordDefaultDMPermission(false)]
|
||||||
[UsedImplicitly]
|
[UsedImplicitly]
|
||||||
|
@ -39,7 +40,23 @@ public sealed class ControlsCommandGroup(
|
||||||
return Result.FromSuccess();
|
return Result.FromSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
var track = await audioService.Tracks.LoadTrackAsync(query, TrackSearchMode.YouTube);
|
var loadResult = await audioService.Tracks.LoadTracksAsync(query, TrackSearchMode.YouTube);
|
||||||
|
if (!loadResult.IsSuccess)
|
||||||
|
{
|
||||||
|
return await feedbackService.SendContextualMessageResult(
|
||||||
|
"Track loading error, try again later.", feedbackService.Theme.FaultOrDanger);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loadResult.IsPlaylist)
|
||||||
|
{
|
||||||
|
return await PlayListResultAsync(player, loadResult);
|
||||||
|
}
|
||||||
|
|
||||||
|
return await PlayTrackResultAsync(player, loadResult.Track);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<Result> PlayTrackResultAsync(IQueuedLavalinkPlayer player, LavalinkTrack? track)
|
||||||
|
{
|
||||||
if (track is null)
|
if (track is null)
|
||||||
{
|
{
|
||||||
return await feedbackService.SendContextualMessageResult(
|
return await feedbackService.SendContextualMessageResult(
|
||||||
|
@ -64,6 +81,23 @@ public sealed class ControlsCommandGroup(
|
||||||
message.ToString(), feedbackService.Theme.Success);
|
message.ToString(), feedbackService.Theme.Success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<Result> PlayListResultAsync(IQueuedLavalinkPlayer player, TrackLoadResult loadResult)
|
||||||
|
{
|
||||||
|
var playlistInfo = loadResult.Playlist;
|
||||||
|
if (playlistInfo is null)
|
||||||
|
{
|
||||||
|
return Result.FromSuccess();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var track in loadResult.Tracks)
|
||||||
|
{
|
||||||
|
await player.PlayAsync(track);
|
||||||
|
}
|
||||||
|
|
||||||
|
return await feedbackService.SendContextualMessageResult(
|
||||||
|
$"Added {Markdown.Bold(playlistInfo.Name)} playlist to the queue", feedbackService.Theme.Success);
|
||||||
|
}
|
||||||
|
|
||||||
[Command("pause")]
|
[Command("pause")]
|
||||||
[Description("Pauses the current track")]
|
[Description("Pauses the current track")]
|
||||||
[DiscordDefaultDMPermission(false)]
|
[DiscordDefaultDMPermission(false)]
|
||||||
|
|
|
@ -7,7 +7,7 @@ namespace Cassette.Extensions;
|
||||||
|
|
||||||
public static class LavalinkTrackExtensions
|
public static class LavalinkTrackExtensions
|
||||||
{
|
{
|
||||||
public static string Display(this LavalinkTrack track, bool detailed = false)
|
public static string Display(this LavalinkTrack? track, bool detailed = false)
|
||||||
{
|
{
|
||||||
var builder = new StringBuilder();
|
var builder = new StringBuilder();
|
||||||
|
|
||||||
|
|
Reference in a new issue