This repository has been archived on 2025-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
Cassette/Cassette/Commands/InfoCommandGroup.cs
mctaylors 090d3e426d
Add /shuffle command
Signed-off-by: mctaylors <cantsendmails@mctaylors.ru>
2023-12-21 17:07:49 +03:00

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);
}
}