private void WsOnDecode(string message)
        {
            Debug.WriteLine(message);
            JObject obj = DouyuSedes.Deserialize(message) as JObject;

            if (obj.ContainsKey("type"))
            {
                string type = obj["type"].Value <string>();
                switch (type)
                {
                case "chatmsg":
                {
                    ChatMessage chatMessage = new ChatMessage
                    {
                        Time     = DateTimeOffset.FromUnixTimeMilliseconds(obj["cst"].Value <long>()).LocalDateTime,
                        Username = obj["nn"].Value <string>(),
                        Content  = obj["txt"].Value <string>(),
                        Color    = obj.ContainsKey("col") ? (ChatMessageColor)obj["col"].Value <int>() : ChatMessageColor.White,
                        Level    = obj["level"].Value <int>()
                    };
                    OnChatMessage.Invoke(chatMessage);
                    break;
                }
                }
                if (callbacks.ContainsKey(type))
                {
                    callbacks[type](obj);
                }
            }
        }
 private void Send(JObject obj)
 {
     ws.Send(codec.Encode(DouyuSedes.Serialize(obj)));
 }