Skip to content

Commit

Permalink
Update DiscordService lifecycle (#36)
Browse files Browse the repository at this point in the history
* Refactor DiscordService to implement IHostedService

* Refactor DiscordService registration in Program.cs
  • Loading branch information
Smalls1652 authored Jan 3, 2024
1 parent 3bc4f99 commit 2bb78fb
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,15 @@ public partial class ShareMusicCommandModule : InteractionModuleBase, IDisposabl
{
private bool _isDisposed;
private readonly ActivitySource _activitySource = new("MuzakBot.App.Modules.ShareMusicCommandModule");
private readonly IDiscordService _discordService;
private readonly IOdesliService _odesliService;
private readonly IItunesApiService _itunesApiService;
private readonly IMusicBrainzService _musicBrainzService;
private readonly IHttpClientFactory _httpClientFactory;
private readonly ILogger<ShareMusicCommandModule> _logger;
private readonly CommandMetrics _commandMetrics;

public ShareMusicCommandModule(IDiscordService discordService, IOdesliService odesliService, IItunesApiService itunesApiService, IMusicBrainzService musicBrainzService, IHttpClientFactory httpClientFactory, ILogger<ShareMusicCommandModule> logger, CommandMetrics commandMetrics)
public ShareMusicCommandModule(IOdesliService odesliService, IItunesApiService itunesApiService, IMusicBrainzService musicBrainzService, IHttpClientFactory httpClientFactory, ILogger<ShareMusicCommandModule> logger, CommandMetrics commandMetrics)
{
_discordService = discordService;
_odesliService = odesliService;
_itunesApiService = itunesApiService;
_musicBrainzService = musicBrainzService;
Expand Down
8 changes: 3 additions & 5 deletions src/App/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -172,14 +172,12 @@
implementationInstance: new(discordSocketConfig)
);

builder.Services.AddSingleton<IDiscordService, DiscordService>();
builder.Services.AddHostedService<DiscordService>();

builder.Services.AddSingleton<IOdesliService, OdesliService>();
builder.Services.AddSingleton<IItunesApiService, ItunesApiService>();
builder.Services.AddSingleton<IMusicBrainzService, MusicBrainzService>();

using var host = builder.Build();

var discordService = host.Services.GetRequiredService<IDiscordService>();
await discordService.ConnectAsync();

await host.RunAsync();
await host.RunAsync();
28 changes: 25 additions & 3 deletions src/App/Services/DiscordService/DiscordService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Discord.Net;
using Discord.WebSocket;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using MuzakBot.App.Modules;

Expand All @@ -13,7 +14,7 @@ namespace MuzakBot.App.Services;
/// <summary>
/// The service for interacting with Discord.
/// </summary>
public class DiscordService : IDiscordService, IAsyncDisposable
public class DiscordService : IDiscordService, IHostedService
{
private bool _isDisposed;
private readonly ActivitySource _activitySource = new("MuzakBot.App.Services.DiscordService");
Expand All @@ -35,7 +36,7 @@ public DiscordService(DiscordSocketClient discordSocketClient, ILogger<DiscordSe
/// <inheritdoc cref="IDiscordService.ConnectAsync"/>
public async Task ConnectAsync()
{
using var activity = _activitySource.StartActivity(
var activity = _activitySource.StartActivity(
name: "ConnectAsync",
kind: ActivityKind.Internal
);
Expand Down Expand Up @@ -72,6 +73,8 @@ await _discordSocketClient.LoginAsync(

// Add ready handler
_discordSocketClient.Ready += OnClientReadyAsync;

activity?.Dispose();
}

/// <summary>
Expand Down Expand Up @@ -155,6 +158,20 @@ private Task HandleLog(LogMessage logMessage)
return Task.CompletedTask;
}

public async Task StartAsync(CancellationToken cancellationToken)
{
await ConnectAsync();
}

public async Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Disconnecting from Discord...");

await _discordSocketClient.LogoutAsync();

_logger.LogInformation("Disconnected.");
}

public async ValueTask DisposeAsync()
{
ObjectDisposedException.ThrowIf(_isDisposed, nameof(DiscordService));
Expand All @@ -163,7 +180,12 @@ public async ValueTask DisposeAsync()
_discordSocketClient.InteractionCreated -= HandleSlashCommand;
_discordSocketClient.Ready -= OnClientReadyAsync;

await _discordSocketClient.LogoutAsync();
if (_interactionService is not null)
{
_interactionService.Dispose();
}

await _discordSocketClient.DisposeAsync();

_activitySource.Dispose();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace MuzakBot.App.Services;
/// <summary>
/// Interface for the Discord service.
/// </summary>
public interface IDiscordService
public interface IDiscordService : IAsyncDisposable
{
/// <summary>
/// Connects the bot to Discord.
Expand Down

0 comments on commit 2bb78fb

Please sign in to comment.