Example #1
0
        public PushHub(ILogProvider logProvider, MqClientProvider mqClientProvider)
        {
            ServiceName = "Keylol.PushHub";

            _logger    = logProvider.Logger;
            _mqChannel = mqClientProvider.CreateModel();
        }
        /// <summary>
        ///     创建 <see cref="SteamBotCoordinator" />
        /// </summary>
        public SteamBotCoordinator(RetryPolicy retryPolicy, MqClientProvider mqClient, OneTimeTokenProvider oneTimeToken)
        {
            _retryPolicy  = retryPolicy;
            _mqChannel    = mqClient.CreateModel();
            _oneTimeToken = oneTimeToken;

            Sessions[SessionId] = this;
            OperationContext.Current.InstanceContext.Closing += OnSessionEnd;
            OnSessionBegin();
        }
        public ImageGarage(ILogProvider logProvider, MqClientProvider mqClientProvider,
                           IServiceConsumer <IImageGarageCoordinator> coordinator)
        {
            ServiceName = "Keylol.ImageGarage";

            _logger            = logProvider.Logger;
            _mqChannel         = mqClientProvider.CreateModel();
            _coordinator       = coordinator;
            Config.HtmlEncoder = new HtmlEncoderNone();

            _heartbeatTimer.Elapsed += (sender, args) =>
            {
                try
                {
                    _coordinator.Operations.Ping();
                }
                catch (Exception e)
                {
                    _logger.Warn("Ping failed.", e);
                    _coordinator.Close();
                }
                _heartbeatTimer.Start();
            };
        }
Example #4
0
        /// <summary>
        ///     启动机器人实例
        /// </summary>
        /// <param name="startWait">是否等待三秒后再启动,默认 <c>false</c></param>
        public void Start(bool startWait = false)
        {
            lock (_startStopLock)
            {
                if (_disposed)
                {
                    _logger.Fatal($"#{SequenceNumber} Try to restart disposed bot.");
                    // throw new InvalidOperationException("Try to restart disposed bot.");
                }

                if (!_callbackPumpStarted)
                {
                    _callbackPumpStarted = true;
                    Task.Run(() =>
                    {
                        _logger.Info($"#{SequenceNumber} Listening callbacks...");
                        while (!_disposed)
                        {
                            _callbackManager.RunWaitAllCallbacks(TimeSpan.FromMilliseconds(10));
                        }
                        _logger.Info($"#{SequenceNumber} Stopped listening callbacks.");
                    });
                }

                try
                {
                    _coordinator.Consume(coordinator => coordinator.UpdateBot(Id, null, false, null));
                }
                catch (Exception e)
                {
                    _logger.Fatal($"#{SequenceNumber} Cannot clear online state before start : {e.Message}");
                    Restart();
                    return;
                }
                if (startWait)
                {
                    _logger.Info($"#{SequenceNumber} Starting in 3 seconds...");
                    Thread.Sleep(TimeSpan.FromSeconds(3));
                }

                var sfhPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "data", $"{LogOnDetails.Username}.sfh");
                if (File.Exists(sfhPath))
                {
                    LogOnDetails.SentryFileHash = File.ReadAllBytes(sfhPath);
                    _logger.Info($"#{SequenceNumber} Use sentry file hash from {LogOnDetails.Username}.sfh.");
                }

                if (!_loginPending)
                {
                    LoginSemaphore.WaitOne();
                    _loginPending = true;
                }
                SteamClient.Connect();

                _mqChannel = _mqClientProvider.CreateModel();
                _mqChannel.BasicQos(0, 5, false);
                var queueName = MqClientProvider.SteamBotDelayedActionQueue(Id);
                _mqChannel.QueueDeclare(queueName, true, false, false, null);
                _mqChannel.QueueBind(queueName, MqClientProvider.DelayedMessageExchange, queueName);
                var consumer = new EventingBasicConsumer(_mqChannel);
                consumer.Received += OnDelayedActionReceived;
                _mqChannel.BasicConsume(queueName, false, consumer);
            }
        }
Example #5
0
 /// <summary>
 /// 创建 <see cref="NotificationProvider"/>
 /// </summary>
 /// <param name="mqClientProvider"></param>
 public NotificationProvider(MqClientProvider mqClientProvider)
 {
     _mqChannel = mqClientProvider.CreateModel();
 }