feat: dispatch new bot status to clusters via Redis
This commit is contained in:
parent
973d6d883c
commit
6a213fa694
@ -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());
|
||||||
|
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user