Пример #1
0
        /// <summary>
        /// 启动客户端并自动连接服务器
        /// </summary>
        public async ValueTask StartClient()
        {
            if (!clientReady)
            {
                return;
            }
            //检查是否已有服务器被启动
            if (NetUtils.serviceExitis)
            {
                throw new SoraClientIsRuningException();
            }
            //消息接收订阅
            Client.MessageReceived.Subscribe(msg => Task.Run(() =>
            {
                this.Event
                .Adapter(JObject.Parse(msg.Text), clientId);
            }));
            Client.DisconnectionHappened.Subscribe(info => Task.Run(() =>
            {
                ConnectionManager.GetLoginUid(clientId,
                                              out var uid);
                //移除原连接信息
                if (ConnectionManager.ConnectionExitis(clientId)
                    )
                {
                    ConnManager.CloseConnection("Universal",
                                                uid, clientId);
                }

                if (info.Exception != null)
                {
                    Log.Error("Sora",
                              $"监听服务器时发生错误{Log.ErrorLogBuilder(info.Exception)}");
                }
                else
                {
                    Log.Info("Sora", "服务器连接被关闭");
                }
            }));
            Client.ReconnectionHappened.Subscribe(info => Task.Run(() =>
            {
                if (info.Type == ReconnectionType.Initial)
                {
                    return;
                }
                Log.Info("Sora", "服务器已自动重连");
                ConnManager.OpenConnection("Universal", "0",
                                           Client, clientId);
            }));
            await Client.Start();

            if (!Client.IsRunning || !Client.IsStarted)
            {
                throw new WebSocketClientException("WebSocket client is not running");
            }

            ConnManager.OpenConnection("Universal", "0", Client, clientId);
            Log.Info("Sora", "Sora WebSocket客户端正在运行并已连接至onebot服务器");
            //启动心跳包超时检查计时器
            this.HeartBeatTimer = new Timer(ConnManager.HeartBeatCheck, null,
                                            Config.HeartBeatTimeOut, Config.HeartBeatTimeOut);
            NetUtils.serviceExitis = true;
            await Task.Delay(-1);
        }