Compare commits

..

4 Commits

Author SHA1 Message Date
e01746a343 Update README.md 2024-10-25 21:54:44 +02:00
e847c1579a Update readme.md 2024-10-25 21:51:44 +02:00
1ccc31d3d2 Update readme.md 2024-10-25 21:50:41 +02:00
7c4d8c246d Update README.md 2024-10-25 21:49:24 +02:00
2 changed files with 84 additions and 132 deletions

View File

@@ -9,72 +9,26 @@ flowchart TD
``` ```
```mermaid ```mermaid
classDiagram sequenceDiagram
class PlayHandler { participant User
-MusicEmbed _musicEmbed participant Bot
-DiscordSocketClient _client participant DiscordSocketClient
-IAudioService _audioService participant IAudioService
-SocketSlashCommand _context participant SocketSlashCommand
-const int MaxTrackDuration participant LavalinkPlayer
-LavalinkTrack? _previousTrack
-static HashSet~ulong~ SubscribedGuilds
+PlayHandler(DiscordSocketClient client, MusicEmbed musicEmbed, IAudioService audioService)
+Task Handle(PlayCommand command, CancellationToken cancellationToken)
-void PlayMusic()
-Task OnTrackEnded(object sender, TrackEndedEventArgs eventargs)
-Task OnTrackStarted(object sender, TrackStartedEventArgs eventargs)
-void RegisterTrackStartedEventListerner(PlayCommand command)
-static Task ApplyFilters(CancellationToken cancellationToken, QueuedLavalinkPlayer player)
-static Task ConfigureSponsorBlock(CancellationToken cancellationToken, QueuedLavalinkPlayer player)
}
class PlayCommand { User->>Bot: /play [song]
+SocketSlashCommand Message Bot->>DiscordSocketClient: Get user voice channel
} DiscordSocketClient-->>Bot: Voice channel info
Bot->>IAudioService: Get or create player
class TrackEndedEventArgs { IAudioService-->>Bot: Player instance
} Bot->>SocketSlashCommand: Get search query
SocketSlashCommand-->>Bot: Search query
class TrackStartedEventArgs { Bot->>IAudioService: Load tracks
} IAudioService-->>Bot: Track collection
Bot->>LavalinkPlayer: Play track
class QueuedLavalinkPlayer { LavalinkPlayer-->>Bot: Track started
+LavalinkTrack? CurrentTrack Bot->>User: Now playing embed
+Task PlayAsync(LavalinkTrack track, CancellationToken cancellationToken)
+Task Queue.AddRangeAsync(List~TrackQueueItem~ queueTracks, CancellationToken cancellationToken)
+Task Filters.SetFilter(NormalizationFilter normalizationFilter)
+Task Filters.CommitAsync(CancellationToken cancellationToken)
+Task UpdateSponsorBlockCategoriesAsync(ImmutableArray~SegmentCategory~ categories, CancellationToken cancellationToken)
}
class LavalinkTrack {
+string Identifier
}
class NormalizationFilter {
+NormalizationFilter(double gain, bool enabled)
}
class SegmentCategory {
+static SegmentCategory Intro
+static SegmentCategory Sponsor
+static SegmentCategory SelfPromotion
+static SegmentCategory Outro
+static SegmentCategory Filler
}
class TrackQueueItem {
+TrackQueueItem(LavalinkTrack track)
}
PlayHandler --> PlayCommand
PlayHandler --> TrackEndedEventArgs
PlayHandler --> TrackStartedEventArgs
PlayHandler --> QueuedLavalinkPlayer
PlayHandler --> LavalinkTrack
PlayHandler --> NormalizationFilter
PlayHandler --> SegmentCategory
PlayHandler --> TrackQueueItem
``` ```
## Steps in the code ## Steps in the code

View File

@@ -67,73 +67,23 @@ public class MessageReceivedHandler : INotificationHandler<MessageReceivedNotifi
### Class Diagram ### Class Diagram
```mermaid ```mermaid
classDiagram sequenceDiagram
class ClearQueueHandler { participant User as User
+Task Handle(ClearQueueCommand command, CancellationToken cancellationToken) participant DiscordSocketClient as DiscordSocketClient
} participant MessageReceivedHandler as MessageReceivedHandler
class DisconnectHandler { participant MessageReceivedNotification as MessageReceivedNotification
+Task Handle(DisconnectCommand command, CancellationToken cancellationToken) participant EmbedBuilder as EmbedBuilder
} participant Channel as Channel
class PauseHandler {
+Task Handle(PauseCommand command, CancellationToken cancellationToken)
}
class PlayHandler {
+Task Handle(PlayCommand command, CancellationToken cancellationToken)
}
class ResumeHandler {
+Task Handle(ResumeCommand command, CancellationToken cancellationToken)
}
class SkipHandler {
+Task Handle(SkipCommand command, CancellationToken cancellationToken)
}
class MessageReceivedHandler {
+Task Handle(MessageReceivedNotification notification, CancellationToken cancellationToken)
}
class IAudioService
class DiscordSocketClient
class SocketSlashCommand
class CancellationToken
class Task
class IRequestHandler
class INotificationHandler
ClearQueueHandler ..|> IRequestHandler User->>DiscordSocketClient: Send message "!LunarisStats"
DisconnectHandler ..|> IRequestHandler DiscordSocketClient->>MessageReceivedHandler: MessageReceivedNotification
PauseHandler ..|> IRequestHandler MessageReceivedHandler->>MessageReceivedNotification: Handle(notification, cancellationToken)
PlayHandler ..|> IRequestHandler MessageReceivedNotification->>MessageReceivedHandler: BotMentioned(notification, cancellationToken)
ResumeHandler ..|> IRequestHandler MessageReceivedHandler->>DiscordSocketClient: Get guilds and voice channels
SkipHandler ..|> IRequestHandler DiscordSocketClient-->>MessageReceivedHandler: List of guilds and voice channels
MessageReceivedHandler ..|> INotificationHandler MessageReceivedHandler->>EmbedBuilder: Create embed with statistics
ClearQueueHandler --> IAudioService EmbedBuilder-->>MessageReceivedHandler: Embed
DisconnectHandler --> IAudioService MessageReceivedHandler->>Channel: Send embed message
PauseHandler --> IAudioService
PlayHandler --> IAudioService
ResumeHandler --> IAudioService
SkipHandler --> IAudioService
ClearQueueHandler --> DiscordSocketClient
DisconnectHandler --> DiscordSocketClient
PauseHandler --> DiscordSocketClient
PlayHandler --> DiscordSocketClient
ResumeHandler --> DiscordSocketClient
SkipHandler --> DiscordSocketClient
ClearQueueHandler --> SocketSlashCommand
DisconnectHandler --> SocketSlashCommand
PauseHandler --> SocketSlashCommand
PlayHandler --> SocketSlashCommand
ResumeHandler --> SocketSlashCommand
SkipHandler --> SocketSlashCommand
ClearQueueHandler --> CancellationToken
DisconnectHandler --> CancellationToken
PauseHandler --> CancellationToken
PlayHandler --> CancellationToken
ResumeHandler --> CancellationToken
SkipHandler --> CancellationToken
ClearQueueHandler --> Task
DisconnectHandler --> Task
PauseHandler --> Task
PlayHandler --> Task
ResumeHandler --> Task
SkipHandler --> Task
``` ```
### Sequence Diagram for PlayHandler ### Sequence Diagram for PlayHandler
@@ -186,4 +136,52 @@ sequenceDiagram
end end
``` ```
This README provides an overview of the handlers and their responsibilities, along with class and sequence diagrams to illustrate the interactions and relationships between the components. ## Extensions.cs
#### Namespaces
- **Discord**: Provides classes for interacting with Discord.
- **Discord.WebSocket**: Provides WebSocket-specific classes for Discord.
- **Lavalink4NET**: Provides classes for interacting with Lavalink.
- **Lavalink4NET.Players**: Provides player-related classes for Lavalink.
- **Lavalink4NET.Players.Queued**: Provides queued player-related classes for Lavalink.
- **Microsoft.Extensions.Options**: Provides classes for handling options and configurations.
#### Class: `Extensions`
This static class contains extension methods for various Discord and Lavalink operations.
##### Method: `GetPlayerAsync`
- **Parameters**:
- `IAudioService audioService`: The audio service to retrieve the player from.
- `DiscordSocketClient client`: The Discord client.
- `SocketSlashCommand context`: The context of the slash command.
- `bool connectToVoiceChannel`: Whether to connect to the voice channel (default is true).
- **Returns**: `ValueTask<QueuedLavalinkPlayer?>`
- **Description**: Retrieves a `QueuedLavalinkPlayer` for the given context. If the retrieval fails, it returns null and sends an appropriate error message.
##### Method: `GetGuild`
- **Parameters**:
- `SocketSlashCommand message`: The slash command message.
- `DiscordSocketClient client`: The Discord client.
- **Returns**: `SocketGuild`
- **Description**: Retrieves the guild associated with the given slash command message. Throws an exception if the guild ID is null.
##### Method: `GetVoiceState`
- **Parameters**:
- `SocketSlashCommand message`: The slash command message.
- **Returns**: `IVoiceState`
- **Description**: Retrieves the voice state of the user who issued the slash command. Throws an exception if the user is not connected to a voice channel.
##### Method: `RespondAsync`
- **Parameters**:
- `SocketSlashCommand message`: The slash command message.
- `string content`: The content of the response.
- **Returns**: `Task`
- **Description**: Sends an ephemeral response to the slash command.
##### Method: `GetOptionValueByName`
- **Parameters**:
- `SocketSlashCommand command`: The slash command.
- `string optionName`: The name of the option to retrieve the value for.
- **Returns**: `string`
- **Description**: Retrieves the value of the specified option from the slash command. Returns an empty string if the option is not found.