예제 #1
0
        // Regarding the async modifier - see https://github.com/Code-Sharp/WampSharp/issues/122
        protected override async void OnMessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            try
            {
                Stream stream = args.GetDataStream().AsStreamForRead();

                MemoryStream memoryStream = new MemoryStream();

                await stream.CopyToAsync(memoryStream);

                stream.Position = 0;

                WampMessage <TMessage> message = mBinaryBinding.Parse(stream);

                RaiseMessageArrived(message);
            }
            catch (Exception ex)
            {
                RaiseConnectionError(ex);

                if (mWebSocket != null)
                {
                    mWebSocket.Dispose();
                }
            }
        }
예제 #2
0
        void ws_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            var log = LogManager.GetLogger(Global.CallerName());

            try
            {
                // Instead of using args.GetDataReader, using args.GetDataStream. and create DataReader ourself.
                // Because if there's no length to read then using GetDataReader would cause exception
                var dataReader = new DataReader(args.GetDataStream());

                if (args.MessageType == SocketMessageType.Utf8)
                {
                    using (dataReader)
                    {
                        // if there's no length to read then do nothing. preventing exception
                        if (dataReader.UnconsumedBufferLength == 0)
                        {
                            return;
                        }

                        // The encoding and byte order need to match the settings of the writer
                        // we previously used.
                        dataReader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                        dataReader.ByteOrder       = Windows.Storage.Streams.ByteOrder.LittleEndian;

                        var data = dataReader.ReadString(dataReader.UnconsumedBufferLength);
                        log.Info("ws_MessageReceived e.Message= " + data);
                        this.OnData(data);
                    }
                }
                else if (args.MessageType == SocketMessageType.Binary)
                {
                    using (dataReader)
                    {
                        // if there's no length to read then do nothing. preventing exception
                        if (dataReader.UnconsumedBufferLength == 0)
                        {
                            return;
                        }

                        dataReader.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian;
                        byte[] bytes = new byte[dataReader.UnconsumedBufferLength];
                        dataReader.ReadBytes(bytes);

                        log.Info("ws_MessageReceived e.Message= " + bytes);
                        this.OnData(bytes);
                    }
                }
                else
                {
                    throw new InvalidDataException("MessageWebSocketMessageReceivedEventArgs wrong MessageType ");
                }
            }
            catch (Exception e)
            {
                this.OnError("ws_MessageReceived", e);
            }
        }
        private async void OnTextMessage(object sender, MessageWebSocketMessageReceivedEventArgs messageEventArgs)
        {
            var result = "";

            using (var reader = messageEventArgs.GetDataStream())
                using (var sr = new StreamReader(reader.AsStreamForRead(), Encoding.GetEncoding("UTF-8")))
                {
                    result = sr.ReadToEnd();
                    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { ResultData.Text = result; });
                }
        }
        private void OnVoiceMessage(object sender, MessageWebSocketMessageReceivedEventArgs messageEventArgs)
        {
            using (var reader = messageEventArgs.GetDataStream())
                using (var stream = reader.AsStreamForRead())
                    using (var mStream = new MemoryStream())
                    {
                        var bufferSize = 32000;
                        var bytes      = new List <byte>();
                        var buf        = new byte[bufferSize];
                        var length     = stream.Read(buf, 0, buf.Length);
                        while (length - bufferSize == 0)
                        {
                            bytes.AddRange(buf);
                            length = stream.Read(buf, 0, buf.Length);
                        }
                        if (length > 0)
                        {
                            bytes.AddRange(buf.Take(length).ToArray());
                        }

                        var fullData = bytes.ToArray();
                        mStream.Write(fullData, 0, fullData.Length);
                        mStream.Position = 0;
                        var bitsPerSampleBytes = fullData.Skip(34).Take(2).ToArray();
                        var channelBytes       = fullData.Skip(22).Take(2).ToArray();
                        var samplingBytes      = fullData.Skip(24).Take(4).ToArray();
                        var bitsPerSample      = BitConverter.ToInt16(bitsPerSampleBytes, 0);
                        var channel            = BitConverter.ToInt16(channelBytes, 0);
                        var samplingRate       = BitConverter.ToInt32(samplingBytes, 0);

                        using (var player = new WasapiOutRT(AudioClientShareMode.Shared, 250))
                        {
                            player.Init(() =>
                            {
                                var waveChannel32 =
                                    new WaveChannel32(new RawSourceWaveStream(mStream,
                                                                              new WaveFormat(samplingRate, bitsPerSample, channel)));
                                var mixer = new MixingSampleProvider(new[] { waveChannel32.ToSampleProvider() });

                                return(mixer.ToWaveProvider16());
                            });

                            player.Play();
                            while (player.PlaybackState == PlaybackState.Playing)
                            {
                            }
                        }
                    }
        }
        /// <summary>
        /// Converts received stream to a parsed message and passes it to the WebSocketMessageReceived handler.
        /// </summary>
        /// <param name="sender">The  <see cref="MessageWebSocket" /> that sent the message.</param>
        /// <param name="args">The message from the web socket.</param>
        private void MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            using (IInputStream inputStream = args.GetDataStream())
            {
                Stream stream = new MemoryStream();

                Task copyTask = inputStream.AsStreamForRead().CopyToAsync(stream);
                copyTask.Wait();

                // Ensure we return with the stream pointed at the origin.
                stream.Position = 0;

                this.ConvertStreamToMessage(stream);
            }
        }
        private async void MessageReceived(IWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            using (var stream = args.GetDataStream())
            {
                //read in info about the frame
                byte[] header = new byte[info.key_bytes + info.len_bytes];
                await stream.ReadAsync(header.AsBuffer(), (uint)header.Length, InputStreamOptions.Partial);

                //this fancy slice stuff is because we may have to reverse the buffer due to endianness
                ulong key = bytes2Long(info.key_bytes, header.Take((int)info.key_bytes).ToArray <byte>());
                ulong N   = bytes2Long(info.len_bytes, header.Skip((int)info.key_bytes).ToArray <byte>());

                //find the index of the key we're setting
                uint i;
                for (i = 0; i < bufferNumber; i++)
                {
                    if (keys[i] == key)
                    {
                        break;
                    }
                }
                if (i == bufferNumber || N == 0)
                {
                    return; //this message must be no longer needed or does not exist
                }
                //lazily make our buffer.
                if (buffers[i] == null)
                {
                    buffers[i] = new byte[info.max_buffer_size];
                }

                sizes[i] = (uint)N;
                await stream.ReadAsync(buffers[i].AsBuffer(), (uint)N, InputStreamOptions.Partial);

                //mark it as loaded
                loaded[i] = true;
                //fire
                if (KeyLoadedEvent != null)
                {
                    KeyLoadedEvent.Invoke(this, key);
                }
            }
        }
예제 #7
0
        private void OnSocketMessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            if (SocketMessageType.Binary != args.MessageType)
            {
                return;
            }

            var packet = ReadPacket(args.GetDataStream().AsStreamForRead());

            switch (packet.PacketType)
            {
            case PacketType.QueryProfileResponse:
            {
                var content = packet.Content;
                QueryProfileResponsePacket response;

                using (var memoryStream = new MemoryStream(content.Array, content.Offset, content.Count))
                {
                    response = LoadPacketContent <QueryProfileResponsePacket>(memoryStream);
                }

                packetReceived.Invoke(this, new PacketReceivedEventArgs(response));

                break;
            }

            case PacketType.DateTime:
            {
                var content = packet.Content;
                DateTimeResponsePacket response;

                using (var memoryStream = new MemoryStream(content.Array, content.Offset, content.Count))
                {
                    response = LoadPacketContent <DateTimeResponsePacket>(memoryStream);
                }

                packetReceived.Invoke(this, new PacketReceivedEventArgs(response));

                break;
            }
            }
        }
예제 #8
0
 private void WebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
 {
     Logger.LogTrace("WebSocket_MessageReceived()");
     try
     {
         using (var data = args.GetDataStream())
             using (var buffer = new MemoryStream())
             {
                 data.AsStreamForRead().CopyTo(buffer);
                 MessageReceived.Invoke(sender, new SignalWebSocketMessageReceivedEventArgs()
                 {
                     Message = buffer.ToArray()
                 });
             }
     }
     catch (Exception e)
     {
         Logger.LogError("WebSocket_MessageReceived failed: {0}\n{1}", e.Message, e.StackTrace);
         Task.Run(ConnectAsync);
     }
 }
예제 #9
0
        private async void Sck_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            //[email protected]("Message received " + args);

            if (args.MessageType == SocketMessageType.Utf8)
            {
                Windows.Storage.Streams.DataReader messageReader = args.GetDataReader();
                messageReader.UnicodeEncoding = UnicodeEncoding.Utf8;
                string messageString = messageReader.ReadString(messageReader.UnconsumedBufferLength);
                com.codename1.io.websocket.WebSocket.messageReceived(id, messageString);
            }
            else
            {
                Windows.Storage.Streams.IInputStream readStream = args.GetDataStream();
                byte[] readBuffer = new byte[4096];
                try
                {
                    while (true)
                    {
                        if (sender != sck)
                        {
                            return;
                        }

                        IBuffer res = await readStream.ReadAsync(readBuffer.AsBuffer(), (uint)readBuffer.Length, 0);

                        if (res.Length == 0)
                        {
                            return;
                        }
                        byte[] resArr = new byte[res.Length];
                        res.CopyTo(resArr);
                        com.codename1.io.websocket.WebSocket.messageReceived(1, resArr);
                    }
                } catch (Exception ex)
                {
                    com.codename1.io.websocket.WebSocket.errorReceived(id, ex.Message, ex.HResult);
                }
            }
        }
예제 #10
0
 private async void WebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
 {
     try
     {
         using (var data = args.GetDataStream())
         {
             MessageReceived.Invoke(sender, new SignalWebSocketMessageReceivedEventArgs()
             {
                 Message = data.AsStreamForRead()
             });
         }
     }
     catch (Exception e)
     {
         Logger.LogError("WebSocket_MessageReceived failed: {0}\n{1}", e.Message, e.StackTrace);
         try
         {
             await ConnectAsync();
         }
         catch (TaskCanceledException) { }
     }
 }
        protected override void OnMessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            try
            {
                Stream stream = args.GetDataStream().AsStreamForRead();

                StreamReader reader = new StreamReader(stream);

                string frame = reader.ReadToEnd();

                WampMessage <TMessage> message = mTextBinding.Parse(frame);

                RaiseMessageArrived(message);
            }
            catch (Exception ex)
            {
                RaiseConnectionError(ex);

                if (mWebSocket != null)
                {
                    mWebSocket.Dispose();
                }
            }
        }
예제 #12
0
        private async void MessageWebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            string recievedText = string.Empty;

            using (var releaser = await _WebSocketLock.LockAsync())
            {
                using (var reader = new StreamReader(args.GetDataStream().AsStreamForRead()))
                {
                    recievedText = reader.ReadToEnd();
                    Debug.WriteLine($"<WebSocket Message> {args.MessageType}: {recievedText}");
                }
            }

            var param = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(recievedText);

            var type = (string)param["type"];

            if (type == "watch")
            {
                var body    = (JObject)param["body"];
                var command = (string)body["command"];
                switch (command)
                {
                case "servertime":

                    var paramItems       = (JArray)body["params"];
                    var serverTimeString = paramItems[0].ToString();
                    var serverTimeTick   = long.Parse(serverTimeString);
                    var serverTime       = DateTime.FromBinary(serverTimeTick);
                    RecieveServerTime?.Invoke(serverTime);
                    break;

                case "permit":
                    var permit = (string)(((JArray)body["params"])[0]);
                    RecievePermit?.Invoke(permit);
                    break;

                case "currentstream":

                    var current_stream    = (JObject)body["currentStream"];
                    var currentStreamArgs = new Live2CurrentStreamEventArgs()
                    {
                        Uri             = (string)current_stream["uri"],
                        Quality         = (string)current_stream["quality"],
                        QualityTypes    = ((JArray)current_stream["qualityTypes"]).Select(x => x.ToString()).ToArray(),
                        MediaServerType = (string)current_stream["mediaServerType"],
                        //MediaServerAuth = (string)current_stream["mediaServerAuth"],
                        StreamingProtocol = (string)current_stream["streamingProtocol"]
                    };
                    if (current_stream.TryGetValue("name", out var name))
                    {
                        currentStreamArgs.Name = (string)name;
                    }
                    RecieveCurrentStream?.Invoke(currentStreamArgs);
                    break;

                case "currentroom":
                    var room            = (JObject)body["room"];
                    var currentRoomArgs = new Live2CurrentRoomEventArgs()
                    {
                        MessageServerUrl  = (string)room["messageServerUri"],
                        MessageServerType = (string)room["messageServerType"],
                        RoomName          = (string)room["roomName"],
                        ThreadId          = (string)room["threadId"],
                        Forks             = ((JArray)room["forks"]).Select(x => (int)x).ToArray(),
                        ImportedForks     = ((JArray)room["importedForks"]).Select(x => (int)x).ToArray()
                    };
                    RecieveCurrentRoom?.Invoke(currentRoomArgs);
                    break;

                case "statistics":
                    var countItems = ((JArray)body["params"])
                                     .Select(x => x.ToString())
                                     .Select(x => long.TryParse(x, out var result) ? result : 0)
                                     .ToArray();
                    var statisticsArgs = new Live2StatisticsEventArgs()
                    {
                        ViewCount    = countItems[0],
                        CommentCount = countItems[1],
                        Count_3      = countItems[2],
                        Count_4      = countItems[3],
                    };
                    RecieveStatistics?.Invoke(statisticsArgs);
                    break;

                case "watchinginterval":
                    var timeString = ((JArray)body["params"]).Select(x => x.ToString()).ToArray()[0];
                    var time       = TimeSpan.FromSeconds(long.Parse(timeString));
                    RecieveWatchInterval?.Invoke(time);

                    WatchingHeartbaetTimer = new Timer((state) =>
                    {
                        SendMessageAsync($"{{\"type\":\"watch\",\"body\":{{\"command\":\"watching\",\"params\":[\"{Props.Program.BroadcastId}\",\"-1\",\"0\"]}}}}").ConfigureAwait(false);
                    }
                                                       , null, time, time
                                                       );
                    break;

                case "schedule":
                    var updateParam  = (JObject)body["update"];
                    var scheduleArgs = new Live2ScheduleEventArgs()
                    {
                        BeginTime = DateTime.FromBinary((long)updateParam["begintime"]),
                        EndTime   = DateTime.FromBinary((long)updateParam["endtime"]),
                    };
                    RecieveSchedule?.Invoke(scheduleArgs);
                    break;

                case "disconnect":
                    var disconnectParams = ((JArray)body["params"]).Select(x => x.ToString()).ToArray();
                    var endtimeString    = disconnectParams[0];
                    var endTime          = DateTime.FromBinary(long.Parse(endtimeString));
                    var endReason        = disconnectParams[1];
                    RecieveDisconnect?.Invoke();
                    break;

                case "postkey":
                    var postkeyParams = ((JArray)body["params"]).Select(x => x.ToString()).ToArray();
                    var postKey       = postkeyParams[0];

                    _Postkey = postKey;
                    break;
                }
            }
            else if (type == "ping")
            {
                await SendMessageAsync("{\"type\":\"pong\",\"body\":{}}");
            }
        }
예제 #13
0
        private async void HandleMessage(object sender, MessageWebSocketMessageReceivedEventArgs e)
        {
            try
            {
                if (UseCompression)
                {
                    using (var datastr = e.GetDataStream()?.AsStreamForRead())
                        using (var ms = new MemoryStream())
                        {
                            datastr.CopyTo(ms);
                            ms.Position = 0;
                            byte[] data = new byte[ms.Length];
                            ms.Read(data, 0, (int)ms.Length);
                            int index = 0;
                            int count = data.Length;
                            using (var decompressed = new MemoryStream())
                            {
                                if (data[0] == 0x78)
                                {
                                    _compressed.Write(data, index + 2, count - 2);
                                    _compressed.SetLength(count - 2);
                                }
                                else
                                {
                                    _compressed.Write(data, index, count);
                                    _compressed.SetLength(count);
                                }

                                _compressed.Position = 0;
                                _decompressor.CopyTo(decompressed);
                                _compressed.Position  = 0;
                                decompressed.Position = 0;

                                using (var reader = new StreamReader(decompressed))
                                {
#if DEBUG
                                    string content = await reader.ReadToEndAsync();

                                    Debug.WriteLine("<<< " + content);
                                    SocketFrame frame = JsonConvert.DeserializeObject <SocketFrame>(content);
                                    if (frame.SequenceNumber.HasValue)
                                    {
                                        lastGatewayEventSeq = frame.SequenceNumber.Value;
                                    }
                                    if (operationHandlers.ContainsKey(frame.Operation.GetValueOrDefault()))
                                    {
                                        operationHandlers[frame.Operation.GetValueOrDefault()](frame);
                                    }

                                    if (frame.Type != null && eventHandlers.ContainsKey(frame.Type))
                                    {
                                        eventHandlers[frame.Type](frame);
                                    }
#else
                                    using (JsonReader jsreader = new JsonTextReader(reader))
                                    {
                                        JsonSerializer serializer = new JsonSerializer();
                                        SocketFrame    frame      = serializer.Deserialize <SocketFrame>(jsreader);
                                        if (frame.SequenceNumber.HasValue)
                                        {
                                            lastGatewayEventSeq = frame.SequenceNumber.Value;
                                        }
                                        if (operationHandlers.ContainsKey(frame.Operation.GetValueOrDefault()))
                                        {
                                            operationHandlers[frame.Operation.GetValueOrDefault()](frame);
                                        }

                                        if (frame.Type != null && eventHandlers.ContainsKey(frame.Type))
                                        {
                                            eventHandlers[frame.Type](frame);
                                        }
                                    }
#endif
                                }
                            }
                        }
                }
                else
                {
                    using (var reader = new StreamReader(e.GetDataStream().AsStreamForRead()))
                        using (JsonReader jsreader = new JsonTextReader(reader))
                        {
                            JsonSerializer serializer = new JsonSerializer();
                            SocketFrame    frame      = serializer.Deserialize <SocketFrame>(jsreader);
                            lastGatewayEventSeq = frame.SequenceNumber ?? 0;
                            if (operationHandlers.ContainsKey(frame.Operation.GetValueOrDefault()))
                            {
                                operationHandlers[frame.Operation.GetValueOrDefault()](frame);
                            }

                            if (frame.Type != null && eventHandlers.ContainsKey(frame.Type))
                            {
                                eventHandlers[frame.Type](frame);
                            }
                        }
                }
            }
            catch (Exception exception)
            {
                ConnectedSocket = false;
                var error = Windows.Networking.Sockets.WebSocketError.GetStatus(exception.HResult);
                if (error == WebErrorStatus.ConnectionAborted)
                {
                    GatewayClosed?.Invoke(null, null);
                }
            }
        }
        private async void _CommentSessionWebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            string recievedText = string.Empty;

            using (var releaser = await _CommentSessionLock.LockAsync())
            {
                using (var reader = new StreamReader(args.GetDataStream().AsStreamForRead()))
                {
                    recievedText = reader.ReadToEnd();
                    Debug.WriteLine($"<CommentSession Message> {args.MessageType}: {recievedText}");
                }

                var jsonObject = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(recievedText);

                if (jsonObject.TryGetValue("chat", out var chatJson))
                {
                    var chat = chatJson.ToObject <Mntone.Nico2.Videos.Comment.NMSG_Chat>();

                    var liveChatData = new LiveChatData()
                    {
                        Thread      = chat.Thread,
                        No          = chat.No,
                        Content     = chat.Content,
                        Date        = chat.Date,
                        DateUsec    = chat.DateUsec,
                        IsAnonymity = chat.Anonymity == 1,
                        __Premium   = chat.Premium,
                        IsYourPost  = chat.Yourpost == 1,
                        Mail        = chat.Mail,
                        Score       = chat.Score,
                        UserId      = chat.UserId,
                        Vpos        = chat.Vpos
                    };

                    CommentRecieved?.Invoke(this, new CommentRecievedEventArgs()
                    {
                        Chat = liveChatData
                    });
                }
                else if (jsonObject.TryGetValue("chat_result", out var chatResultJson))
                {
                    var chatResult = chatResultJson.ToObject <Mntone.Nico2.Videos.Comment.Chat_result>();
                    CommentPosted?.Invoke(this, new CommentPostedEventArgs()
                    {
                        Thread     = chatResult.Thread,
                        ChatResult = chatResult.Status,
                        No         = chatResult.No
                    });
                }
                else if (jsonObject.TryGetValue("thread", out var threadJson))
                {
                    var thread = threadJson.ToObject <Mntone.Nico2.Videos.Comment.NGMS_Thread_Response>();
                    _Thread = thread;

                    //
                    // コメントの受信開始を受け取ってからハートビートを開始する
                    //
                    StartHeartbeatTimer();

                    Connected?.Invoke(this, new CommentServerConnectedEventArgs()
                    {
                        LastRes    = thread.LastRes,
                        Resultcode = thread.Resultcode,
                        Revision   = thread.Revision,
                        ServerTime = thread.ServerTime,
                        Thread     = thread.Thread,
                        Ticket     = thread.Ticket,
                    });
                }
                else if (jsonObject.TryGetValue("ping", out var pingJson))
                {
                    var ping = pingJson.ToObject <Mntone.Nico2.Videos.Comment.Ping>();

                    // {"ping":{"content":"rs:1"}}
                    // { "ping":{ "content":"ps:5"} }
                    // {"chat_result":{...}}
                    // {"chat":{...}}
                    // { "ping":{ "content":"pf:5"} }
                    // { "ping":{ "content":"rf:1"} }

                    if (ping.Content.StartsWith("pf"))
                    {
                        _MessageSendCount += 1;
                    }
                }
                else
                {
                    Debug.WriteLine("Not Support");
                }
            }
        }
예제 #15
0
        private async void MessageWebSocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
            string recievedText = string.Empty;

            using (var releaser = await _WebSocketLock.LockAsync())
            {
                using (var reader = new StreamReader(args.GetDataStream().AsStreamForRead()))
                {
                    recievedText = reader.ReadToEnd();
                    Debug.WriteLine($"{args.MessageType}: {recievedText}");
                }
            }

            var param = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(recievedText);

            var type = (string)param["type"];

            if (type == "watch")
            {
                var body    = (JObject)param["body"];
                var command = (string)body["command"];
                switch (command)
                {
                case "servertime":

                    var paramItems       = (JArray)body["params"];
                    var serverTimeString = paramItems[0].ToString();
                    var serverTimeTick   = long.Parse(serverTimeString);
                    var serverTime       = DateTime.FromBinary(serverTimeTick);
                    RecieveServerTime?.Invoke(serverTime);
                    break;

                case "permit":
                    var permit = (string)(((JArray)body["params"])[0]);
                    RecievePermit?.Invoke(permit);
                    break;

                case "currentstream":

                    var current_stream    = (JObject)body["currentStream"];
                    var currentStreamArgs = new Live2CurrentStreamEventArgs()
                    {
                        Uri               = (string)current_stream["uri"],
                        Name              = (string)current_stream["name"],
                        Quality           = (string)current_stream["quality"],
                        QualityTypes      = ((JArray)current_stream["qualityTypes"]).Select(x => x.ToString()).ToArray(),
                        MediaServerType   = (string)current_stream["mediaServerType"],
                        MediaServerAuth   = (string)current_stream["mediaServerAuth"],
                        StreamingProtocol = (string)current_stream["streamingProtocol"]
                    };
                    RecieveCurrentStream?.Invoke(currentStreamArgs);
                    break;

                case "currentroom":
                    var room            = (JObject)body["room"];
                    var currentRoomArgs = new Live2CurrentRoomEventArgs()
                    {
                        MessageServerUrl  = (string)room["messageServerUri"],
                        MessageServerType = (string)room["messageServerType"],
                        RoomName          = (string)room["roomName"],
                        ThreadId          = (string)room["threadId"],
                        Forks             = ((JArray)room["forks"]).Select(x => (int)x).ToArray(),
                        ImportedForks     = ((JArray)room["importedForks"]).Select(x => (int)x).ToArray()
                    };
                    RecieveCurrentRoom?.Invoke(currentRoomArgs);
                    break;

                case "statistics":
                    var countItems     = ((JArray)body["params"]).Select(x => x.ToString()).ToArray();
                    var statisticsArgs = new Live2StatisticsEventArgs()
                    {
                        ViewCount    = int.Parse(countItems[0]),
                        CommentCount = int.Parse(countItems[1]),
                        Count_3      = int.Parse(countItems[2]),
                        Count_4      = int.Parse(countItems[3]),
                    };
                    RecieveStatistics?.Invoke(statisticsArgs);
                    break;

                case "watchinginterval":
                    var timeString = ((JArray)body["params"]).Select(x => x.ToString()).ToArray()[0];
                    var time       = TimeSpan.FromSeconds(int.Parse(timeString));
                    RecieveWatchInterval?.Invoke(time);
                    break;

                case "schedule":
                    var updateParam  = (JObject)body["update"];
                    var scheduleArgs = new Live2ScheduleEventArgs()
                    {
                        BeginTime = DateTime.FromBinary((long)updateParam["begintime"]),
                        EndTime   = DateTime.FromBinary((long)updateParam["endtime"]),
                    };
                    RecieveSchedule?.Invoke(scheduleArgs);
                    break;

                case "disconnect":
                    var disconnectParams = ((JArray)body["params"]).Select(x => x.ToString()).ToArray();
                    var endtimeString    = disconnectParams[0];
                    var endTime          = TimeSpan.FromSeconds(int.Parse(endtimeString));
                    var endReason        = disconnectParams[1];
                    RecieveDisconnect?.Invoke();
                    break;
                }
            }
            else if (type == "ping")
            {
            }
        }