示例#1
0
        /// <summary>
        /// Parses a PubSub message from json
        /// </summary>
        /// <param name="json">the received unaltered json text</param>
        /// <param name="message">the resulting argument instance</param>
        /// <returns>the type of the returned argument instance</returns>
        public PubSubMessageType Parse(string json, out PubSubMessageEventArgs message)
        {
            var type = JObject.Parse(json).SelectToken("type")?.ToString();

            switch (type?.ToLowerInvariant())
            {
            case "response":
                return(ParseResponseType(json, out message));

            case "message":
                return(ParseMessageType(json, out message));

            case "pong":
                message = null;
                return(PubSubMessageType.Pong);

            case "reconnect":
                message = null;
                return(PubSubMessageType.Reconnect);

            default:
                message = new UnknownMessageEventArgs(PubSubMessageType.UnknownType, json, string.Empty);
                return(PubSubMessageType.UnknownType);
            }
        }
示例#2
0
        private PubSubMessageType ParseVideoPlayback(string json, string topic, out PubSubMessageEventArgs message)
        {
            var jt = JObject.Parse(json);

            var serverTime = jt.SelectToken("server_time")?.ToString() ?? string.Empty;

            switch (jt.SelectToken("type").ToString())
            {
            case "stream-up":
                var delay = jt.SelectToken("play_delay").ToObject <int>();
                message = new StreamStartMessageEventArgs(delay, serverTime, topic);
                return(PubSubMessageType.StreamStart);

            case "stream-down":
                delay   = jt.SelectToken("play_delay").ToObject <int>();
                message = new StreamStopMessageEventArgs(delay, serverTime, topic);
                return(PubSubMessageType.StreamStop);

            case "viewcount":
                var count = jt.SelectToken("viewers").ToObject <int>();
                message = new ViewerCountMessageEventArgs(count, serverTime, topic);
                return(PubSubMessageType.ViewerCount);

            default:
                message = new UnknownMessageEventArgs(PubSubMessageType.UnknownVideoPlayback, json, topic);
                return(PubSubMessageType.UnknownVideoPlayback);
            }
        }
示例#3
0
        /// <summary>
        /// Parses pubsub messages of type <code>response</code>
        /// </summary>
        /// <param name="json">the full json text</param>
        /// <param name="message">the parsed message</param>
        /// <returns>the message type</returns>
        private PubSubMessageType ParseResponseType(string json, out PubSubMessageEventArgs message)
        {
            var jobj = JObject.Parse(json);

            message = new ResponseMessageEventArgs(
                jobj.SelectToken("error")?.ToString() ?? string.Empty,
                ResolveNonce(jobj.SelectToken("nonce")?.ToString() ?? string.Empty)
                );

            return(PubSubMessageType.Response);
        }
示例#4
0
        private PubSubMessageType ParseBits(string json, string topic, out PubSubMessageEventArgs message)
        {
            var jt = JObject.Parse(json);

            message = new BitsMessageEventArgs(
                userName: jt.SelectToken("user_name")?.ToString() ?? string.Empty,
                userId: int.Parse(jt.SelectToken("user_id")?.ToString() ?? "-1"),
                channelName: jt.SelectToken("channel_name")?.ToString() ?? string.Empty,
                channelId: long.Parse(jt.SelectToken("channel_id")?.ToString() ?? "-1"),
                time: Convert.ToDateTime(jt.SelectToken("time")?.ToString() ?? string.Empty),
                chatMessage: jt.SelectToken("chat_message")?.ToString() ?? string.Empty,
                bitsUsed: (jt.SelectToken("bits_used")?.ToObject <int>()).GetValueOrDefault(-1),
                totalBitsUsed: (jt.SelectToken("total_bits_used")?.ToObject <int>()).GetValueOrDefault(-1),
                context: jt.SelectToken("context")?.ToString() ?? string.Empty,
                topic: topic
                );
            return(PubSubMessageType.Bits);
        }
示例#5
0
        private PubSubMessageType ParseModeratorAction(string json, string topic, out PubSubMessageEventArgs message)
        {
            var jt = JObject.Parse(json).SelectToken("data");

            var action = jt.SelectToken("moderation_action")?.ToString() ?? string.Empty;
            var issuer = jt.SelectToken("created_by").ToString();

            var args = jt.SelectToken("args").Select(token => token.ToString()).ToArray();

            switch (action.ToLowerInvariant())
            {
            case "timeout":
                var timeoutReason = args.Length > 2 ? args[2] : string.Empty;
                var duration      = int.Parse(args[1]);
                message = new TimeoutMessageEventArgs(issuer, args[0], duration, timeoutReason, topic);
                return(PubSubMessageType.Timeout);

            case "ban":
                var banReason = args.Length > 1 ? args[1] : string.Empty;
                message = new BanMessageEventArgs(issuer, args[0], banReason, topic);
                return(PubSubMessageType.Ban);

            case "unban":
            case "untimeout":
                message = new UnbanMessageEventArgs(issuer, args[0], topic);
                return(PubSubMessageType.Unban);

            case "host":
                message = new HostMessageEventArgs(args[0], issuer, topic);
                return(PubSubMessageType.Host);

            case "unhost":
                message = new UnhostMessageEventArgs(issuer, topic);
                return(PubSubMessageType.Unhost);

            default:
                message = new UnknownMessageEventArgs(PubSubMessageType.UnknownModeratorAction, json, topic);
                return(PubSubMessageType.UnknownModeratorAction);
            }
        }
示例#6
0
        /// <summary>
        /// Parses pubsub messages of type <code>message</code>
        /// </summary>
        /// <param name="json">the full json</param>
        /// <param name="message">the parsed message</param>
        /// <returns>the message type</returns>
        private PubSubMessageType ParseMessageType(string json, out PubSubMessageEventArgs message)
        {
            var jt = JObject.Parse(json).SelectToken("data");

            var topic = jt.SelectToken("topic")?.ToString() ?? string.Empty;
            var encodedJsonMessage = jt.SelectToken("message").ToString();

            //topic and info are delimited by a .
            var delim = topic.IndexOf(".", StringComparison.Ordinal);

            switch (delim < 0 ? topic : topic.Substring(0, delim))
            {
            case "chat_moderator_actions": return(ParseModeratorAction(encodedJsonMessage, topic, out message));

            case "channel-bitsevents": return(ParseBits(encodedJsonMessage, topic, out message));

            case "video-playback":
                return(ParseVideoPlayback(encodedJsonMessage, topic, out message));

            default:
                message = new UnknownMessageEventArgs(PubSubMessageType.UnknownMessage, json, topic);
                return(PubSubMessageType.UnknownMessage);
            }
        }