Ejemplo n.º 1
0
        public async Task ReceiveAsync(IChatOptions chatOptions)
        {
            _chatOptions = chatOptions;
            var ws = _ws;

            if (ws != null)
            {
                throw new InvalidOperationException("_ws is not null");
            }
            var heartbeatTimer = new System.Timers.Timer
            {
                Interval  = 1000,
                AutoReset = true,
            };

            heartbeatTimer.Elapsed += HeartbeatTimer_Elapsed;
            ws = new Websocket
            {
                //AutoSendPingInterval = 1000,
                //EnableAutoSendPing = true,
                NoDelay     = true,
                SubProtocol = "msg.nicovideo.jp#json",
                Origin      = "https://live2.nicovideo.jp",
                UserAgent   = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
            };
            _ws          = ws;
            ws.Received += Ws_Received;
            ws.Opened   += (s, e) =>
            {
                OnWebsocketOpened();
                heartbeatTimer.Enabled = true;
            };
            var url = "wss://msgd.live2.nicovideo.jp/websocket";

            try
            {
                Debug.WriteLine("ChatProvider::ReceiveAsync() ws.ReceiveAsync() start");
                await ws.ReceiveAsync(url);

                Debug.WriteLine("ChatProvider::ReceiveAsync() ws.ReceiveAsync() finished");
            }
            finally
            {
                heartbeatTimer.Elapsed -= HeartbeatTimer_Elapsed;
                heartbeatTimer.Enabled  = false;
                ws.Received            -= Ws_Received;
                ws.Opened -= Ws_Opened;
                _ws        = null;
            }
        }
Ejemplo n.º 2
0
 public async Task ReceiveAsync(string websocketUrl)
 {
     if (_ws != null)
     {
         return;
     }
     _ws           = new Websocket();
     _ws.Received += Ws_Received;
     _ws.Opened   += Ws_Opened;
     try
     {
         await _ws.ReceiveAsync(websocketUrl);
     }
     finally
     {
         _ws.Received -= Ws_Received;
         _ws           = null;
     }
 }
Ejemplo n.º 3
0
        private void BeginProcessMessage()
        {
            new Thread(async() =>
            {
                while (Running)
                {
                    try
                    {
                        var buffer = new byte[1024 * 1024]; //1mb
                        var result = await Websocket.ReceiveAsync(buffer, CancellationToken.None);
                        var json   = JToken.Parse(Encoding.UTF8.GetString(buffer.Take(result.Count).ToArray()));
                        if (json["id"] != null && Callbacks.ContainsKey(json["id"].ToString()))
                        {
                            Callbacks[json["id"].ToString()].Invoke(json);
                            Callbacks.Remove(json["id"].ToString());
                            continue;
                        }

                        if (json["event"] != null)
                        {
                            switch (json["event"].ToString())
                            {
                            case "message":
                                var type = json["params"]["type"].ToObject <LightMessageType>();
                                if (type == LightMessageType.Group || type == LightMessageType.Friend)
                                {
                                    var message = new AcceptedMessage()
                                    {
                                        IsGroupMessage = type == LightMessageType.Group,
                                        Content        = json["params"]["content"].ToString(),
                                        FromGroup      = type == LightMessageType.Group
                                                ? json["params"]["group"].ToObject <long>()
                                                : 0,
                                        FromUser = json["params"]["qq"].ToObject <long>()
                                    };
                                    ReceivedMessageEvent?.Invoke(this, message);
                                }
                                break;

                            default:
                                break;
                            }
                        }
                    }
                    catch (Exception)
                    {
                        if (Running && Websocket.State != WebSocketState.Open)
                        {
                            try
                            {
                                Websocket = new ClientWebSocket();
                                await Websocket.ConnectAsync(new Uri(ListenUrl), CancellationToken.None);
                            }
                            catch
                            {
                                LogHelper.Error("Cannot reconnect websocket.");
                            }
                        }
                    }
                }
            }).Start();
            Task.Factory.StartNew(async() =>
            {
                while (Running)
                {
                    await Task.Delay(500);
                    if (SendingMessageQueue.Any())
                    {
                        var message = SendingMessageQueue.Dequeue();
                        if (message.Contents.All(v => v.Type != MessageType.Image))
                        {
                            await SendMessageAsync("sendMessage", new
                            {
                                type    = LightMessageType.Group,
                                group   = message.TargetGroupId.ToString(),
                                content = message.ToString()
                            });
                        }
                    }
                }
            }, TaskCreationOptions.LongRunning);
        }
Ejemplo n.º 4
0
        private void BeginProcessMessage()
        {
            new Thread(async() =>
            {
                while (Running)
                {
                    try
                    {
                        var buffer = new byte[1024 * 1024]; //1mb
                        var result = await Websocket.ReceiveAsync(buffer, CancellationToken.None);
                        var bytes  = new byte[result.Count];
                        Array.Copy(buffer, bytes, result.Count);
                        var json     = JToken.Parse(Encoding.UTF8.GetString(bytes));
                        var typeCode = json["TypeCode"].ToString();
                        if (typeCode.EqualsIgnoreCase("Event"))
                        {
                            var type = (MahuaMessageType)json["EventType"].ToObject <int>();
                            if (type == MahuaMessageType.Friend || type == MahuaMessageType.Group)
                            {
                                var message = new AcceptedMessage()
                                {
                                    FromGroup      = json["FromNum"].ToObject <long>(),
                                    FromUser       = json["EventOperator"].ToObject <long>(),
                                    Content        = json["Message"].ToString(),
                                    IsGroupMessage = type == MahuaMessageType.Group
                                };
                                ReceivedMessageEvent?.Invoke(this, message);
                            }
                            continue;
                        }

                        if (typeCode.EqualsIgnoreCase("Api_GetQQListApiOut"))
                        {
                            QQ = json["Result"].ToObject <long>();
                            continue;
                        }
                        //WDNM为什么HTTP API请求过去的返回值会跑到Websocket返回
                        if (Callbacks.ContainsKey(typeCode.ToLower()))
                        {
                            Callbacks[typeCode.ToLower()]?.Invoke(json);
                            Callbacks.Remove(typeCode.ToLower());
                            continue;
                        }
                    }
                    catch
                    {
                        if (Running && Websocket.State != WebSocketState.Open)
                        {
                            try
                            {
                                Websocket = new ClientWebSocket();
                                await Websocket.ConnectAsync(new Uri(WebsocketUrl), CancellationToken.None);
                            }
                            catch
                            {
                                LogHelper.Error("Cannot reconnect websocket.");
                            }
                        }
                    }
                }
            }).Start();
        }