Add config option for max shard concurrency

This commit is contained in:
Ske 2021-03-18 09:47:58 +01:00
parent 2039a34c16
commit 13e3289c26
4 changed files with 27 additions and 11 deletions

View File

@ -2,7 +2,6 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Myriad.Types;
@ -69,9 +68,10 @@ namespace Myriad.Gateway
await StartShards(concurrency);
}
private async Task StartShards(int concurrency)
{
concurrency = GetActualShardConcurrency(concurrency);
var lastTime = DateTimeOffset.UtcNow;
var identifyCalls = 0;
@ -112,5 +112,13 @@ namespace Myriad.Gateway
if (EventReceived != null)
await EventReceived(shard, evt);
}
private int GetActualShardConcurrency(int recommendedConcurrency)
{
if (_gatewaySettings.MaxShardConcurrency == null)
return recommendedConcurrency;
return Math.Min(_gatewaySettings.MaxShardConcurrency.Value, recommendedConcurrency);
}
}
}

View File

@ -4,5 +4,6 @@
{
public string Token { get; init; }
public GatewayIntent Intents { get; init; }
public int? MaxShardConcurrency { get; init; }
}
}

View File

@ -11,5 +11,7 @@ namespace PluralKit.Bot
// and fall back to the separate default array at the use site :)
// This does bind [] as null (therefore default) instead of an empty array, but I can live w/ that.
public string[] Prefixes { get; set; }
public int? MaxShardConcurrency { get; set; }
}
}

View File

@ -21,16 +21,21 @@ namespace PluralKit.Bot
protected override void Load(ContainerBuilder builder)
{
// Clients
builder.Register(c => new GatewaySettings
builder.Register(c =>
{
Token = c.Resolve<BotConfig>().Token,
Intents = GatewayIntent.Guilds |
GatewayIntent.DirectMessages |
GatewayIntent.DirectMessageReactions |
GatewayIntent.GuildEmojis |
GatewayIntent.GuildMessages |
GatewayIntent.GuildWebhooks |
GatewayIntent.GuildMessageReactions
var botConfig = c.Resolve<BotConfig>();
return new GatewaySettings
{
Token = botConfig.Token,
MaxShardConcurrency = botConfig.MaxShardConcurrency,
Intents = GatewayIntent.Guilds |
GatewayIntent.DirectMessages |
GatewayIntent.DirectMessageReactions |
GatewayIntent.GuildEmojis |
GatewayIntent.GuildMessages |
GatewayIntent.GuildWebhooks |
GatewayIntent.GuildMessageReactions
};
}).AsSelf().SingleInstance();
builder.RegisterType<Cluster>().AsSelf().SingleInstance();
builder.Register(c => new Myriad.Rest.DiscordApiClient(c.Resolve<BotConfig>().Token, c.Resolve<ILogger>()))