feat: dispatch new bot status to clusters via Redis

This commit is contained in:
spiral 2022-03-30 20:42:57 -04:00
parent 973d6d883c
commit 6a213fa694
No known key found for this signature in database
GPG Key ID: 244A11E4B0BCF40E
2 changed files with 37 additions and 4 deletions

View File

@ -30,12 +30,13 @@ public class Bot
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IMetrics _metrics; private readonly IMetrics _metrics;
private readonly DiscordApiClient _rest; private readonly DiscordApiClient _rest;
private readonly RedisService _redis;
private readonly ILifetimeScope _services; private readonly ILifetimeScope _services;
private Timer _periodicTask; // Never read, just kept here for GC reasons private Timer _periodicTask; // Never read, just kept here for GC reasons
public Bot(ILifetimeScope services, ILogger logger, PeriodicStatCollector collector, IMetrics metrics, public Bot(ILifetimeScope services, ILogger logger, PeriodicStatCollector collector, IMetrics metrics,
BotConfig config, BotConfig config, RedisService redis,
ErrorMessageService errorMessageService, CommandMessageService commandMessageService, ErrorMessageService errorMessageService, CommandMessageService commandMessageService,
Cluster cluster, DiscordApiClient rest, IDiscordCache cache) Cluster cluster, DiscordApiClient rest, IDiscordCache cache)
{ {
@ -48,10 +49,13 @@ public class Bot
_commandMessageService = commandMessageService; _commandMessageService = commandMessageService;
_cluster = cluster; _cluster = cluster;
_rest = rest; _rest = rest;
_redis = redis;
_cache = cache; _cache = cache;
} }
private string BotStatus => $"{(_config.Prefixes ?? BotConfig.DefaultPrefixes)[0]}help"; private string BotStatus => $"{(_config.Prefixes ?? BotConfig.DefaultPrefixes)[0]}help"
+ (CustomStatusMessage != null ? $" | {CustomStatusMessage}" : "");
public string CustomStatusMessage = null;
public void Init() public void Init()
{ {
@ -238,6 +242,31 @@ public class Bot
{ {
_logger.Debug("Running once-per-minute scheduled tasks"); _logger.Debug("Running once-per-minute scheduled tasks");
// Check from a new custom status from Redis and update Discord accordingly
if (_redis.Connection != null)
{
var newStatus = await _redis.Connection.GetDatabase().StringGetAsync("pluralkit:botstatus");
if (newStatus != CustomStatusMessage)
{
CustomStatusMessage = newStatus;
_logger.Information("Pushing new bot status message to Discord");
await Task.WhenAll(_cluster.Shards.Values.Select(shard =>
shard.UpdateStatus(new GatewayStatusUpdate
{
Activities = new[]
{
new Activity
{
Name = BotStatus,
Type = ActivityType.Game
}
},
Status = GatewayStatusUpdate.UserStatus.Online
})));
}
}
// Collect some stats, submit them to the metrics backend // Collect some stats, submit them to the metrics backend
await _collector.CollectStats(); await _collector.CollectStats();
await Task.WhenAll(((IMetricsRoot)_metrics).ReportRunner.RunAllAsync()); await Task.WhenAll(((IMetricsRoot)_metrics).ReportRunner.RunAllAsync());

View File

@ -61,11 +61,15 @@ public class Init
await redis.Connection.GetDatabase().KeyDeleteAsync("pluralkit:shardstatus"); await redis.Connection.GetDatabase().KeyDeleteAsync("pluralkit:shardstatus");
} }
// Init the bot instance itself, register handlers and such to the client before beginning to connect
logger.Information("Initializing bot"); logger.Information("Initializing bot");
var bot = services.Resolve<Bot>(); var bot = services.Resolve<Bot>();
bot.Init();
// Get bot status message from Redis
if (redis.Connection != null)
bot.CustomStatusMessage = await redis.Connection.GetDatabase().StringGetAsync("pluralkit:botstatus");
// Init the bot instance itself, register handlers and such to the client before beginning to connect
bot.Init();
// Start the Discord shards themselves (handlers already set up) // Start the Discord shards themselves (handlers already set up)
logger.Information("Connecting to Discord"); logger.Information("Connecting to Discord");