private Task _comServer_OnDataReceived(ShardComMessage msg) { Statuses[msg.ShardId] = msg; if (msg.ConnectionState == Discord.ConnectionState.Disconnected || msg.ConnectionState == Discord.ConnectionState.Disconnecting) { _log.Error("!!! SHARD {0} IS IN {1} STATE", msg.ShardId, msg.ConnectionState.ToString()); } return(Task.CompletedTask); }
public ShardsCoordinator(int port) { LogSetup.SetupLogger(); _creds = new BotCredentials(); _shardProcesses = new Process[_creds.TotalShards]; Statuses = new ShardComMessage[_creds.TotalShards]; _log = LogManager.GetCurrentClassLogger(); _port = port; _comServer = new ShardComServer(port); _comServer.Start(); _comServer.OnDataReceived += _comServer_OnDataReceived; _curProcessId = Process.GetCurrentProcess().Id; }
public ShardsCoordinator() { //load main stuff LogSetup.SetupLogger(); _log = LogManager.GetCurrentClassLogger(); _creds = new BotCredentials(); _log.Info("Starting NadekoBot v" + StatsService.BotVersion); _key = _creds.RedisKey(); _redis = ConnectionMultiplexer.Connect("127.0.0.1"); //setup initial shard statuses _defaultShardState = new ShardComMessage() { ConnectionState = Discord.ConnectionState.Disconnected, Guilds = 0, Time = DateTime.Now - TimeSpan.FromMinutes(1) }; var db = _redis.GetDatabase(); _shardProcesses = new Process[_creds.TotalShards]; for (int i = 0; i < _creds.TotalShards; i++) { _defaultShardState.ShardId = i; db.ListRightPush(_key + "_shardstats", JsonConvert.SerializeObject(_defaultShardState), flags: CommandFlags.FireAndForget); } _curProcessId = Process.GetCurrentProcess().Id; _redis = ConnectionMultiplexer.Connect("127.0.0.1"); var sub = _redis.GetSubscriber(); sub.Subscribe(_key + "_shardcoord_send", OnDataReceived, CommandFlags.FireAndForget); sub.Subscribe(_key + "_shardcoord_restart", OnRestart, CommandFlags.FireAndForget); sub.Subscribe(_key + "_shardcoord_stop", OnStop, CommandFlags.FireAndForget); }
private void StartSendingData() { Task.Run(async() => { while (true) { var data = new ShardComMessage() { ConnectionState = Client.ConnectionState, Guilds = Client.ConnectionState == ConnectionState.Connected ? Client.Guilds.Count : 0, ShardId = Client.ShardId, Time = DateTime.UtcNow, }; var sub = Cache.Redis.GetSubscriber(); var msg = JsonConvert.SerializeObject(data); await sub.PublishAsync(Credentials.RedisKey() + "_shardcoord_send", msg).ConfigureAwait(false); await Task.Delay(7500); } }); }
public ShardsCoordinator() { //load main stuff LogSetup.SetupLogger(-1); _log = LogManager.GetCurrentClassLogger(); _creds = new BotCredentials(); _log.Info("Starting NadekoBot v" + StatsService.BotVersion); _key = _creds.RedisKey(); _redis = ConnectionMultiplexer.Connect("127.0.0.1"); new RedisImagesCache(_redis, _creds).Reload(); //reload images into redis //setup initial shard statuses _defaultShardState = new ShardComMessage() { ConnectionState = Discord.ConnectionState.Disconnected, Guilds = 0, Time = DateTime.UtcNow }; var db = _redis.GetDatabase(); //clear previous statuses db.KeyDelete(_key + "_shardstats"); _shardProcesses = new Process[_creds.TotalShards]; for (int i = 0; i < _creds.TotalShards; i++) { //add it to the list of shards which should be started #if DEBUG if (i > 0) { _shardStartQueue.Enqueue(i); } else { _shardProcesses[i] = Process.GetCurrentProcess(); } #else _shardStartQueue.Enqueue(i); #endif //set the shard's initial state in redis cache var msg = _defaultShardState.Clone(); msg.ShardId = i; //this is to avoid the shard coordinator thinking that //the shard is unresponsive while starting up var delay = 45; #if GLOBAL_NADEKO delay = 180; #endif msg.Time = DateTime.UtcNow + TimeSpan.FromSeconds(delay * (i + 1)); db.ListRightPush(_key + "_shardstats", JsonConvert.SerializeObject(msg), flags: CommandFlags.FireAndForget); } _curProcessId = Process.GetCurrentProcess().Id; //subscribe to shardcoord events var sub = _redis.GetSubscriber(); //send is called when shard status is updated. Every 7.5 seconds atm sub.Subscribe(_key + "_shardcoord_send", OnDataReceived, CommandFlags.FireAndForget); //called to stop the shard, although the shard will start again when it finds out it's dead sub.Subscribe(_key + "_shardcoord_stop", OnStop, CommandFlags.FireAndForget); //called kill the bot sub.Subscribe(_key + "_die", (ch, x) => Environment.Exit(0), CommandFlags.FireAndForget); }
public ShardsCoordinator() { //load main stuff LogSetup.SetupLogger(-1); _log = LogManager.GetCurrentClassLogger(); _creds = new BotCredentials(); _log.Info("Starting NadekoBot v" + StatsService.BotVersion); _key = _creds.RedisKey(); _log.Info("Redis options: " + _creds.RedisOptions); var conf = ConfigurationOptions.Parse(_creds.RedisOptions); _redis = ConnectionMultiplexer.Connect(conf); var imgCache = new RedisImagesCache(_redis, _creds); //reload images into redis if (!imgCache.AllKeysExist().GetAwaiter().GetResult()) // but only if the keys don't exist. If images exist, you have to reload them manually { imgCache.Reload().GetAwaiter().GetResult(); } else { _log.Info("Images are already present in redis. Use .imagesreload to force update if needed."); } //setup initial shard statuses _defaultShardState = new ShardComMessage() { ConnectionState = Discord.ConnectionState.Disconnected, Guilds = 0, Time = DateTime.UtcNow }; var db = _redis.GetDatabase(); //clear previous statuses db.KeyDelete(_key + "_shardstats"); _shardProcesses = new Process[_creds.TotalShards]; var shardIds = Enumerable.Range(1, _creds.TotalShards - 1) .Shuffle() .Prepend(0) .ToArray(); for (var i = 0; i < shardIds.Length; i++) { var id = shardIds[i]; //add it to the list of shards which should be started #if DEBUG if (id > 0) { _shardStartQueue.Enqueue(id); } else { _shardProcesses[id] = Process.GetCurrentProcess(); } #else _shardStartQueue.Enqueue(id); #endif //set the shard's initial state in redis cache var msg = _defaultShardState.Clone(); msg.ShardId = id; //this is to avoid the shard coordinator thinking that //the shard is unresponsive while starting up var delay = 45; #if GLOBAL_NADEKO delay = 180; #endif msg.Time = DateTime.UtcNow + TimeSpan.FromSeconds(delay * (id + 1)); db.ListRightPush(_key + "_shardstats", JsonConvert.SerializeObject(msg), flags: CommandFlags.FireAndForget); } _curProcessId = Process.GetCurrentProcess().Id; //subscribe to shardcoord events var sub = _redis.GetSubscriber(); //send is called when shard status is updated. Every 7.5 seconds atm sub.Subscribe(_key + "_shardcoord_send", OnDataReceived, CommandFlags.FireAndForget); //called to stop the shard, although the shard will start again when it finds out it's dead sub.Subscribe(_key + "_shardcoord_stop", OnStop, CommandFlags.FireAndForget); //called kill the bot sub.Subscribe(_key + "_die", (ch, x) => Environment.Exit(0), CommandFlags.FireAndForget); }