[Bug]: It is possible for DiscordService to accidentally try to start the Dispatch service multiple times (despite that it's already running).
AraHaan opened this issue · 1 comments
Description
Currently it looks like DiscordService does not check to see if the Dispatch service is already running before it tries to start it (again).
This happened when I got Foxtrek64/Remora.Plugins#1 and LuzFaltex/LuzFaltex.Extensions.DependencyInjection#1 to work (experimental Rewrite to Remora.Plugins to allow for unloadable plugins that also automatically reloads them when it sees that a plugin assembly was recompiled (updated)).
I suspect it might be because it's trying to initialize DiscordService each time a plugin's ServiceCollection is added to the MutableServiceProvider I made (which allows adding / removing services that are from plugins). It might be worth while to patch DiscordService so things like this would just work:tm:.
Steps to Reproduce
- Clone these 2 pull requests (the ones posted above)
dotnet pack -c Release
and then add their./nuget/
folder's to a nuget.config file to a Discord Bot that uses Remora.Plugins- that add this to your IHostBuilder config to your bot (Extensions.Hosting):
.UseServiceProviderFactory(new MutableServiceProviderFactory())
(Addusing LuzFaltex.Extensions.DependencyInjection;
to top of file first).
- try to run the bot in debug (or in a way that allows you to see the logs).
Expected Behavior
For everything to just work:tm:.
Current Behavior
DiscordService errors, which then kills the bot.
Library / Runtime Information
Version of Remora.Discord: 2022.47.0
Version of .NET Runtime: 6.0.8 (servicing)
Logs
2022-09-01 09:01:55.571 -04:00 [INF] [Remora.Discord.Gateway.DiscordGatewayClient] Starting dispatch service...
2022-09-01 09:01:55.583 -04:00 [INF] [Remora.Discord.Gateway.DiscordGatewayClient] Retrieving gateway endpoint...
2022-09-01 09:01:55.595 -04:00 [INF] [Remora.Discord.Gateway.DiscordGatewayClient] Starting dispatch service...
2022-09-01 09:01:55.603 -04:00 [ERR] [Remora.Discord.Hosting.Services.DiscordService] Exception during gateway connection: The dispatch service is already running.
System.InvalidOperationException: The dispatch service is already running.
at Remora.Discord.Gateway.Services.ResponderDispatchService.Start()
at Remora.Discord.Gateway.DiscordGatewayClient.RunAsync(CancellationToken stopRequested)
2022-09-01 09:01:55.712 -04:00 [INF] [Remora.Discord.Gateway.DiscordGatewayClient] Starting a new session (999 session starts remaining of 1000; limits reset in "23:30:50.8660000")
2022-09-01 09:01:55.923 -04:00 [INF] [Remora.Discord.Gateway.DiscordGatewayClient] Connecting to the gateway...
2022-09-01 09:01:55.923 -04:00 [INF] [Remora.Discord.Gateway.DiscordGatewayClient] Starting dispatch service...
2022-09-01 09:01:55.924 -04:00 [ERR] [Remora.Discord.Hosting.Services.DiscordService] Exception during gateway connection: The dispatch service is already running.
System.InvalidOperationException: The dispatch service is already running.
at Remora.Discord.Gateway.Services.ResponderDispatchService.Start()
at Remora.Discord.Gateway.DiscordGatewayClient.RunAsync(CancellationToken stopRequested)
2022-09-01 09:01:55.924 -04:00 [INF] [Remora.Discord.Gateway.DiscordGatewayClient] Starting dispatch service...
2022-09-01 09:01:55.924 -04:00 [ERR] [Remora.Discord.Hosting.Services.DiscordService] Exception during gateway connection: The dispatch service is already running.
System.InvalidOperationException: The dispatch service is already running.
at Remora.Discord.Gateway.Services.ResponderDispatchService.Start()
at Remora.Discord.Gateway.DiscordGatewayClient.RunAsync(CancellationToken stopRequested)
2022-09-01 09:01:55.924 -04:00 [INF] [Remora.Discord.Gateway.DiscordGatewayClient] Starting dispatch service...
2022-09-01 09:01:55.925 -04:00 [ERR] [Remora.Discord.Hosting.Services.DiscordService] Exception during gateway connection: The dispatch service is already running.
System.InvalidOperationException: The dispatch service is already running.
at Remora.Discord.Gateway.Services.ResponderDispatchService.Start()
at Remora.Discord.Gateway.DiscordGatewayClient.RunAsync(CancellationToken stopRequested)