135 lines
4.5 KiB
C#
135 lines
4.5 KiB
C#
using System.ComponentModel;
|
|
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.API.Abstractions.Objects;
|
|
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 controls the music player and requires higher permissions.
|
|
/// <remarks>Trusted role support is not implemented yet.</remarks>
|
|
/// </summary>
|
|
public sealed class TrustedCommandGroup(
|
|
ICommandContext commandContext,
|
|
IAudioService audioService,
|
|
FeedbackService feedbackService) : CommandGroup
|
|
{
|
|
private const DiscordPermission RequiredPermission = DiscordPermission.MuteMembers;
|
|
|
|
[Command("repeat")]
|
|
[Description("Changes player repeat mode")]
|
|
[DiscordDefaultMemberPermissions(RequiredPermission)]
|
|
[DiscordDefaultDMPermission(false)]
|
|
[UsedImplicitly]
|
|
public async Task<Result> RepeatCommandAsync(
|
|
TrackRepeatMode mode)
|
|
{
|
|
var player = await LavalinkPlayer.GetPlayerAsync(
|
|
commandContext, audioService, feedbackService);
|
|
if (player is null)
|
|
{
|
|
return Result.FromSuccess();
|
|
}
|
|
|
|
if (player.RepeatMode is TrackRepeatMode.Queue
|
|
&& mode is not TrackRepeatMode.Queue)
|
|
{
|
|
var queue = player.Queue;
|
|
await queue.RemoveAsync(queue[^1]);
|
|
}
|
|
|
|
if (player.RepeatMode is not TrackRepeatMode.Queue
|
|
&& mode is TrackRepeatMode.Queue
|
|
&& player.CurrentTrack is not null)
|
|
{
|
|
await player.PlayAsync(player.CurrentTrack);
|
|
}
|
|
|
|
player.RepeatMode = mode;
|
|
|
|
return await feedbackService.SendContextualMessageResult(
|
|
$"Repeat mode is now set to {Markdown.Bold(mode.ToString())}",
|
|
feedbackService.Theme.Success);
|
|
}
|
|
|
|
[Command("setvolume")]
|
|
[Description("Adjusts the volume of the music player")]
|
|
[DiscordDefaultMemberPermissions(RequiredPermission)]
|
|
[DiscordDefaultDMPermission(false)]
|
|
[UsedImplicitly]
|
|
public async Task<Result> SetVolumeCommandAsync(
|
|
[MinValue(1)] [MaxValue(200)] float percentage)
|
|
{
|
|
var player = await LavalinkPlayer.GetPlayerAsync(
|
|
commandContext, audioService, feedbackService);
|
|
if (player is null)
|
|
{
|
|
return Result.FromSuccess();
|
|
}
|
|
|
|
var previousVolume = player.Volume / 100;
|
|
await player.SetVolumeAsync(percentage / 100);
|
|
|
|
return await feedbackService.SendContextualMessageResult(
|
|
$"Volume changed {Markdown.Bold($"{previousVolume}%")} to {Markdown.Bold($"{percentage}%")}",
|
|
feedbackService.Theme.Success);
|
|
}
|
|
|
|
[Command("stop")]
|
|
[Description("Stops the current track and clears the queue")]
|
|
[DiscordDefaultMemberPermissions(RequiredPermission)]
|
|
[DiscordDefaultDMPermission(false)]
|
|
[UsedImplicitly]
|
|
public async Task<Result> StopCommandAsync()
|
|
{
|
|
var player = await LavalinkPlayer.GetPlayerAsync(
|
|
commandContext, audioService, feedbackService);
|
|
if (player is null)
|
|
{
|
|
return Result.FromSuccess();
|
|
}
|
|
|
|
if (player.CurrentTrack is null)
|
|
{
|
|
return await feedbackService.SendContextualMessageResult(
|
|
"There's nothing playing right now.",
|
|
feedbackService.Theme.FaultOrDanger);
|
|
}
|
|
|
|
var track = player.CurrentTrack;
|
|
|
|
await player.StopAsync();
|
|
|
|
return await feedbackService.SendContextualMessageResult(
|
|
$"Stopped {track.Display()} and cleared the queue.", feedbackService.Theme.Success);
|
|
}
|
|
|
|
[Command("disconnect")]
|
|
[Description("Disconnects the bot and clears the queue")]
|
|
[DiscordDefaultMemberPermissions(RequiredPermission)]
|
|
[DiscordDefaultDMPermission(false)]
|
|
[UsedImplicitly]
|
|
public async Task<Result> DisconnectCommandAsync()
|
|
{
|
|
var player = await LavalinkPlayer.GetPlayerAsync(
|
|
commandContext, audioService, feedbackService);
|
|
if (player is null)
|
|
{
|
|
return Result.FromSuccess();
|
|
}
|
|
|
|
await player.DisconnectAsync();
|
|
|
|
return await feedbackService.SendContextualMessageResult(
|
|
"Disconnected.", feedbackService.Theme.Success);
|
|
}
|
|
}
|