131 lines
4.1 KiB
C#
131 lines
4.1 KiB
C#
using System.ComponentModel;
|
|
using System.Text;
|
|
using Cassette.Extensions;
|
|
using JetBrains.Annotations;
|
|
using Lavalink4NET;
|
|
using Lavalink4NET.Players.Queued;
|
|
using Remora.Discord.Commands.Contexts;
|
|
using Remora.Commands.Attributes;
|
|
using Remora.Commands.Groups;
|
|
using Remora.Discord.Commands.Attributes;
|
|
using Remora.Discord.Commands.Feedback.Services;
|
|
using Remora.Discord.Extensions.Formatting;
|
|
using Remora.Results;
|
|
|
|
namespace Cassette.Commands;
|
|
|
|
/// <summary>
|
|
/// A <see cref="CommandGroup"/> that shows information about the music player.
|
|
/// </summary>
|
|
public sealed class InfoCommandGroup(
|
|
ICommandContext commandContext,
|
|
IAudioService audioService,
|
|
FeedbackService feedbackService) : CommandGroup
|
|
{
|
|
[Command("nowplaying")]
|
|
[Description("Shows the currently playing track")]
|
|
[DiscordDefaultDMPermission(false)]
|
|
[UsedImplicitly]
|
|
public async Task<Result> NowPlayingCommandAsync()
|
|
{
|
|
var player = await LavalinkPlayer.GetPlayerAsync(
|
|
commandContext, audioService, feedbackService);
|
|
if (player is null)
|
|
{
|
|
return Result.FromSuccess();
|
|
}
|
|
|
|
var currentTrack = player.CurrentTrack;
|
|
if (currentTrack is null)
|
|
{
|
|
return await feedbackService.SendContextualMessageResult(
|
|
"There's nothing playing right now.",
|
|
feedbackService.Theme.FaultOrDanger);
|
|
}
|
|
|
|
return await feedbackService.SendContextualMessageResult(
|
|
$"You're listening to {currentTrack.Display(true)}", feedbackService.Theme.Text);
|
|
}
|
|
|
|
[Command("queue")]
|
|
[Description("Shows the current track queue")]
|
|
[DiscordDefaultDMPermission(false)]
|
|
[UsedImplicitly]
|
|
public async Task<Result> QueueCommandAsync()
|
|
{
|
|
var player = await LavalinkPlayer.GetPlayerAsync(
|
|
commandContext, audioService, feedbackService);
|
|
if (player is null)
|
|
{
|
|
return Result.FromSuccess();
|
|
}
|
|
|
|
var builder = new StringBuilder();
|
|
|
|
var getResult = await GetQueueAsync(player, builder);
|
|
if (!getResult.IsSuccess)
|
|
{
|
|
return Result.FromError(getResult.Error);
|
|
}
|
|
|
|
return await feedbackService.SendContextualMessageResult(builder.ToString());
|
|
}
|
|
|
|
private async Task<Result> GetQueueAsync(IQueuedLavalinkPlayer player, StringBuilder builder)
|
|
{
|
|
var queue = player.Queue;
|
|
if (queue.IsEmpty)
|
|
{
|
|
return await feedbackService.SendContextualMessageResult(
|
|
"There's nothing in queue right now.",
|
|
feedbackService.Theme.FaultOrDanger);
|
|
}
|
|
|
|
var repeatMode = player.RepeatMode;
|
|
if (repeatMode is not TrackRepeatMode.None)
|
|
{
|
|
builder.AppendLine($"> Repeat mode was set to {Markdown.Bold(repeatMode.ToString())}");
|
|
}
|
|
|
|
if (repeatMode is TrackRepeatMode.Track)
|
|
{
|
|
builder.AppendLine($"Use {Markdown.Bold("/nowplaying")} to show current playing track");
|
|
return Result.FromSuccess();
|
|
}
|
|
|
|
if (player.Shuffle)
|
|
{
|
|
builder.AppendLine($"> Shuffle mode was {Markdown.Bold("enabled")}");
|
|
}
|
|
|
|
for (var i = 0; i < queue.Count; i++)
|
|
{
|
|
var track = queue[i].Track;
|
|
if (track is null)
|
|
{
|
|
return Result.FromSuccess(); // dunno
|
|
}
|
|
|
|
builder.Append($"{i + 1}. ").AppendLine(track.Display(true));
|
|
}
|
|
|
|
return Result.FromSuccess();
|
|
}
|
|
|
|
[Command("volume")]
|
|
[Description("Shows the current volume of the music player")]
|
|
[DiscordDefaultDMPermission(false)]
|
|
[UsedImplicitly]
|
|
public async Task<Result> VolumeCommandAsync()
|
|
{
|
|
var player = await LavalinkPlayer.GetPlayerAsync(
|
|
commandContext, audioService, feedbackService);
|
|
if (player is null)
|
|
{
|
|
return Result.FromSuccess();
|
|
}
|
|
|
|
return await feedbackService.SendContextualMessageResult(
|
|
$"Current volume is {Markdown.Bold($"{player.Volume * 100}%")}", feedbackService.Theme.Text);
|
|
}
|
|
}
|