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
2 changed files with 37 additions and 4 deletions

View File

@@ -30,12 +30,13 @@ public class Bot
private readonly ILogger _logger;
private readonly IMetrics _metrics;
private readonly DiscordApiClient _rest;
private readonly RedisService _redis;
private readonly ILifetimeScope _services;
private Timer _periodicTask; // Never read, just kept here for GC reasons
public Bot(ILifetimeScope services, ILogger logger, PeriodicStatCollector collector, IMetrics metrics,
BotConfig config,
BotConfig config, RedisService redis,
ErrorMessageService errorMessageService, CommandMessageService commandMessageService,
Cluster cluster, DiscordApiClient rest, IDiscordCache cache)
{
@@ -48,10 +49,13 @@ public class Bot
_commandMessageService = commandMessageService;
_cluster = cluster;
_rest = rest;
_redis = redis;
_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()
{
@@ -238,6 +242,31 @@ public class Bot
{
_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
await _collector.CollectStats();
await Task.WhenAll(((IMetricsRoot)_metrics).ReportRunner.RunAllAsync());