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; } }
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; } }
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); }
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(); }