Example #1
0
        /**
         * History
         *
         * Load history from a channel.
         *
         * @param Dictionary<string, string> args
         * args is channel name and int limit history count response.
         * @return List<object> of history.
         */
        public List <object> History(Dictionary <string, string> args)
        {
            string        channel = args["channel"];
            int           limit   = Convert.ToInt32(args["limit"]);
            List <string> url     = new List <string>();

            url.Add("history");
            url.Add(this.SUBSCRIBE_KEY);
            url.Add(channel);
            url.Add("0");
            url.Add(limit.ToString());
            if (this.CIPHER_KEY.Length > 0)
            {
                clsPubnubCrypto pc = new clsPubnubCrypto(this.CIPHER_KEY);
                return(pc.decrypt(_request(url)));
            }
            else
            {
                return(_request(url));
            }
        }
Example #2
0
        /**
          * _subscribe - Private Interface
          *
          * @param Dictionary<string, object> args
          *  args is channel name and Procedure function callback and timetoken
          *
          */
        private void _subscribe(Dictionary<string, object> args)
        {
            clsPubnubCrypto pc = new clsPubnubCrypto(this.CIPHER_KEY);

            string channel = args["channel"].ToString();
            Procedure callback = (Procedure)args["callback"];
            object timetoken = args["timestamp"];
            //  Begin Recursive Subscribe
            try
            {
                // Build URL
                List<string> url = new List<string>();
                url.Add("subscribe");
                url.Add(this.SUBSCRIBE_KEY);
                url.Add(channel);
                url.Add("0");
                url.Add(timetoken.ToString());

                // Wait for Message
                List<object> response = _request(url);

                // Update TimeToken
                if (response[1].ToString().Length > 0)
                    timetoken = (object)response[1];

                // Run user Callback and Reconnect if user permits.
                object message = "";
                JArray val = (JArray)response[0];
                for (int i = 0; i < val.Count; i++)
                {
                    if (this.CIPHER_KEY.Length > 0)
                    {
                        if (val[i].Type == JTokenType.String)
                        {
                            message = pc.decrypt((string)val[i]);
                        }
                        else if (val[i].Type == JTokenType.Object)
                        {
                            message = pc.decrypt((JObject)val[i]);
                        }
                        else if (val[i].Type == JTokenType.Array)
                        {
                            message = pc.decrypt((JArray)val[i]);
                        }
                    }
                    else
                    {
                        message = val[i];
                    }

                    if (!callback(message)) return;
                }

                // Keep listening if Okay.
                args["channel"] = channel;
                args["callback"] = callback;
                args["timestamp"] = timetoken;
                this._subscribe(args);
            }
            catch
            {
                System.Threading.Thread.Sleep(1000);
                this._subscribe(args);
            }
        }
Example #3
0
        /**
         * Publish
         *
         * Send a message to a channel.
         *
         * @param Dictionary<string, object> args
         * args is string channel name and object message
         * @return List<object> info.
         */
        public List<object> Publish(Dictionary<string, object> args)
        {
            string channel = args["channel"].ToString();
            object message = args["message"];
            clsPubnubCrypto pc = new clsPubnubCrypto(this.CIPHER_KEY);

            if (this.CIPHER_KEY.Length > 0)
            {
                if (message.GetType() == typeof(string))
                {
                    message = pc.encrypt(message.ToString());
                    message = "\"" + message.ToString() + "\"";
                }
                else if (message.GetType() == typeof(JArray))
                {
                    message = pc.encrypt((JArray)message);
                }
                else if (message.GetType() == typeof(JObject))
                {
                    message = pc.encrypt((JObject)message);
                }
            }
            else
            {
                message = JsonConvert.SerializeObject(message);
            }

            // Generate String to Sign
            string signature = "0";
            if (this.SECRET_KEY.Length > 0)
            {
                StringBuilder string_to_sign = new StringBuilder();
                string_to_sign
                    .Append(this.PUBLISH_KEY)
                    .Append('/')
                    .Append(this.SUBSCRIBE_KEY)
                    .Append('/')
                    .Append(this.SECRET_KEY)
                    .Append('/')
                    .Append(channel)
                    .Append('/')
                    .Append(message);

                // Sign Message
                signature = getHMACSHA256(string_to_sign.ToString());
            }

            // Build URL
            List<string> url = new List<string>();
            url.Add("publish");
            url.Add(this.PUBLISH_KEY);
            url.Add(this.SUBSCRIBE_KEY);
            url.Add(signature);
            url.Add(channel);
            url.Add("0");
            url.Add(message.ToString());

            // Return JSONArray
            return _request(url);
        }
Example #4
0
        /**
        * History
        *
        * Load history from a channel.
        *
        * @param Dictionary<string, string> args
        * args is channel name and int limit history count response.
        * @return List<object> of history.
        */
        public List<object> History(Dictionary<string, string> args)
        {
            string channel = args["channel"];
            int limit = Convert.ToInt32(args["limit"]);
            List<string> url = new List<string>();

            url.Add("history");
            url.Add(this.SUBSCRIBE_KEY);
            url.Add(channel);
            url.Add("0");
            url.Add(limit.ToString());
            if (this.CIPHER_KEY.Length > 0)
            {
                clsPubnubCrypto pc = new clsPubnubCrypto(this.CIPHER_KEY);
                return pc.decrypt(_request(url));
            }
            else
            {
                return _request(url);
            }
        }
Example #5
0
        /**
         * _subscribe - Private Interface
         *
         * @param Dictionary<string, object> args
         *  args is channel name and Procedure function callback and timetoken
         *
         */
        private void _subscribe(Dictionary <string, object> args)
        {
            clsPubnubCrypto pc = new clsPubnubCrypto(this.CIPHER_KEY);

            string    channel   = args["channel"].ToString();
            Procedure callback  = (Procedure)args["callback"];
            object    timetoken = args["timestamp"];

            //  Begin Recursive Subscribe
            try
            {
                // Build URL
                List <string> url = new List <string>();
                url.Add("subscribe");
                url.Add(this.SUBSCRIBE_KEY);
                url.Add(channel);
                url.Add("0");
                url.Add(timetoken.ToString());

                // Wait for Message
                List <object> response = _request(url);

                // Update TimeToken
                if (response[1].ToString().Length > 0)
                {
                    timetoken = (object)response[1];
                }

                // Run user Callback and Reconnect if user permits.
                object message = "";
                JArray val     = (JArray)response[0];
                for (int i = 0; i < val.Count; i++)
                {
                    if (this.CIPHER_KEY.Length > 0)
                    {
                        if (val[i].Type == JTokenType.String)
                        {
                            message = pc.decrypt((string)val[i]);
                        }
                        else if (val[i].Type == JTokenType.Object)
                        {
                            message = pc.decrypt((JObject)val[i]);
                        }
                        else if (val[i].Type == JTokenType.Array)
                        {
                            message = pc.decrypt((JArray)val[i]);
                        }
                    }
                    else
                    {
                        message = val[i];
                    }

                    if (!callback(message))
                    {
                        return;
                    }
                }

                // Keep listening if Okay.
                args["channel"]   = channel;
                args["callback"]  = callback;
                args["timestamp"] = timetoken;
                this._subscribe(args);
            }
            catch
            {
                System.Threading.Thread.Sleep(1000);
                this._subscribe(args);
            }
        }
Example #6
0
        /**
         * Publish
         *
         * Send a message to a channel.
         *
         * @param Dictionary<string, object> args
         * args is string channel name and object message
         * @return List<object> info.
         */
        public List <object> Publish(Dictionary <string, object> args)
        {
            string          channel = args["channel"].ToString();
            object          message = args["message"];
            clsPubnubCrypto pc      = new clsPubnubCrypto(this.CIPHER_KEY);

            if (this.CIPHER_KEY.Length > 0)
            {
                if (message.GetType() == typeof(string))
                {
                    message = pc.encrypt(message.ToString());
                    message = "\"" + message.ToString() + "\"";
                }
                else if (message.GetType() == typeof(JArray))
                {
                    message = pc.encrypt((JArray)message);
                }
                else if (message.GetType() == typeof(JObject))
                {
                    message = pc.encrypt((JObject)message);
                }
            }
            else
            {
                message = JsonConvert.SerializeObject(message);
            }

            // Generate String to Sign
            string signature = "0";

            if (this.SECRET_KEY.Length > 0)
            {
                StringBuilder string_to_sign = new StringBuilder();
                string_to_sign
                .Append(this.PUBLISH_KEY)
                .Append('/')
                .Append(this.SUBSCRIBE_KEY)
                .Append('/')
                .Append(this.SECRET_KEY)
                .Append('/')
                .Append(channel)
                .Append('/')
                .Append(message);

                // Sign Message
                signature = getHMACSHA256(string_to_sign.ToString());
            }

            // Build URL
            List <string> url = new List <string>();

            url.Add("publish");
            url.Add(this.PUBLISH_KEY);
            url.Add(this.SUBSCRIBE_KEY);
            url.Add(signature);
            url.Add(channel);
            url.Add("0");
            url.Add(message.ToString());

            // Return JSONArray
            return(_request(url));
        }
Example #7
0
        /**
          * _subscribe - Private Interface
          *
          * @param Dictionary<string, object> args
          *  args is channel name and Procedure function callback and timetoken
          *
          */
        private void _subscribe(Dictionary<string, object> args)
        {
            Procedure callback = null, connect_cb, disconnect_cb, reconnect_cb, error_cb;
            clsPubnubCrypto pc = new clsPubnubCrypto(this.CIPHER_KEY);

            object timetoken = args["timestamp"];
            string channel = args["channel"].ToString();
            // Validate Arguments
            if (args["callback"] != null)
            {
                callback = (Procedure)args["callback"];
            }
            else
            {
                Console.WriteLine("Invalid Callback.");
            }
            if(args.ContainsKey("connect_cb") && args["connect_cb"] != null)
                connect_cb = (Procedure)args["connect_cb"];
            else
                connect_cb = new Procedure(doNothing);
            if (args.ContainsKey("disconnect_cb") && args["disconnect_cb"] != null)
                disconnect_cb = (Procedure)args["disconnect_cb"];
            else
                disconnect_cb = new Procedure(doNothing);
            if (args.ContainsKey("reconnect_cb") && args["reconnect_cb"] != null)
                reconnect_cb = (Procedure)args["reconnect_cb"];
            else
                reconnect_cb = new Procedure(doNothing);
            if (args.ContainsKey("error_cb") && args["error_cb"] != null)
                error_cb = (Procedure)args["error_cb"];
            else
                error_cb = (Procedure)args["callback"];
            if (channel == null || channel =="")
            {
                error_cb("Invalid Channel.");
                return;
            }
            // Ensure Single Connection
            if (subscriptions != null && subscriptions.Count > 0)
            {
                bool channel_exist = false;
                foreach (Channel_status cs in subscriptions)
                {
                    if (cs.channel == channel)
                    {
                        channel_exist = true;
                        break;
                    }
                }
                if (!channel_exist)
                {
                    Channel_status cs = new Channel_status();
                    cs.channel = channel;
                    cs.connected = true;
                    subscriptions.Add(cs);
                }
                else
                {
                    error_cb("Already Connected");
                    return;
                }
            }
            else
            {
                // New Channel
                Channel_status cs = new Channel_status();
                cs.channel = channel;
                cs.connected = true;
                subscriptions = new List<Channel_status>();
                subscriptions.Add(cs);
            }

            bool is_reconnected = false;
            //  Begin Recusive Subscribe
            while (true)
            {

                //  Begin Recursive Subscribe
                try
                {
                    // Build URL
                    List<string> url = new List<string>();
                    url.Add("subscribe");
                    url.Add(this.SUBSCRIBE_KEY);
                    url.Add(channel);
                    url.Add("0");
                    url.Add(timetoken.ToString());

                    // Stop Connection?
                    bool is_disconnect = false;
                    foreach (Channel_status cs in subscriptions)
                    {
                        if (cs.channel == channel)
                        {
                            if (!cs.connected)
                            {
                                disconnect_cb("Disconnected to channel : " + channel);
                                is_disconnect = true;
                                break;
                            }
                        }
                    }
                    if (is_disconnect)
                        return;

                    // Wait for Message
                    List<object> response = _request(url);

                    // Stop Connection?
                    foreach (Channel_status cs in subscriptions)
                    {
                        if (cs.channel == channel)
                        {
                            if (!cs.connected)
                            {
                                disconnect_cb("Disconnected to channel : " + channel);
                                is_disconnect = true;
                                break;
                            }
                        }
                    }
                    if (is_disconnect)
                        return;
                    // Problem?
                    if (response == null || response[1].ToString() == "0")
                    {

                        for (int i = 0; i < subscriptions.Count(); i++)
                        {
                            Channel_status cs = subscriptions[i];
                            if (cs.channel == channel)
                            {
                                subscriptions.RemoveAt(i);
                                disconnect_cb("Disconnected to channel : " + channel);
                            }
                        }

                        // Ensure Connected (Call Time Function)
                        while (true)
                        {
                            string time_token = Time().ToString();
                            if (time_token == "0")
                            {
                                // Reconnect Callback
                                reconnect_cb("Reconnecting to channel : " + channel);
                                Thread.Sleep(5000);
                            }
                            else
                            {
                                is_reconnected = true;
                                break;
                            }
                        }
                        if (is_reconnected)
                        {
                            break;
                        }
                    }
                    else
                    {
                        foreach (Channel_status cs in subscriptions)
                        {
                            if (cs.channel == channel)
                            {
                                // Connect Callback
                                if (!cs.first)
                                {
                                    cs.first = true;
                                    connect_cb("Connected to channel : " + channel);
                                    break;
                                }
                            }
                        }
                    }

                    // Update TimeToken
                    if (response[1].ToString().Length > 0)
                        timetoken = (object)response[1];

                    // Run user Callback and Reconnect if user permits.
                    object message = "";
                    JArray val = (JArray)response[0];
                    for (int i = 0; i < val.Count; i++)
                    {
                        if (this.CIPHER_KEY.Length > 0)
                        {
                            if (val[i].Type == JTokenType.String)
                            {
                                message = pc.decrypt((string)val[i]);
                            }
                            else if (val[i].Type == JTokenType.Object)
                            {
                                message = pc.decrypt((JObject)val[i]);
                            }
                            else if (val[i].Type == JTokenType.Array)
                            {
                                message = pc.decrypt((JArray)val[i]);
                            }
                        }
                        else
                        {
                            message = val[i];
                        }

                        if (!callback(message)) return;
                    }
                }
                catch
                {
                    System.Threading.Thread.Sleep(1000);
                }
            }
            if (is_reconnected)
            {
                // Reconnect Callback
                args["channel"] = channel;
                args["callback"] = callback;
                args["timestamp"] = timetoken;
                this._subscribe(args);
            }
        }
Example #8
0
        /**
         * _subscribe - Private Interface
         *
         * @param Dictionary<string, object> args
         *  args is channel name and Procedure function callback and timetoken
         *
         */
        private void _subscribe(Dictionary <string, object> args)
        {
            bool is_disconnect     = false;
            bool is_alreadyConnect = false;

            Procedure       callback = null, connect_cb, disconnect_cb, reconnect_cb, error_cb;
            clsPubnubCrypto pc = new clsPubnubCrypto(this.CIPHER_KEY);

            object timetoken = args["timestamp"];
            string channel   = args["channel"].ToString();

            // Validate Arguments
            if (args["callback"] != null)
            {
                callback = (Procedure)args["callback"];
            }
            else
            {
                Console.WriteLine("Invalid Callback.");
            }
            if (args.ContainsKey("connect_cb") && args["connect_cb"] != null)
            {
                connect_cb = (Procedure)args["connect_cb"];
            }
            else
            {
                connect_cb = new Procedure(doNothing);
            }
            if (args.ContainsKey("disconnect_cb") && args["disconnect_cb"] != null)
            {
                disconnect_cb = (Procedure)args["disconnect_cb"];
            }
            else
            {
                disconnect_cb = new Procedure(doNothing);
            }
            if (args.ContainsKey("reconnect_cb") && args["reconnect_cb"] != null)
            {
                reconnect_cb = (Procedure)args["reconnect_cb"];
            }
            else
            {
                reconnect_cb = new Procedure(doNothing);
            }
            if (args.ContainsKey("error_cb") && args["error_cb"] != null)
            {
                error_cb = (Procedure)args["error_cb"];
            }
            else
            {
                error_cb = (Procedure)args["callback"];
            }
            if (channel == null || channel == "")
            {
                error_cb("Invalid Channel.");
                return;
            }
            // Ensure Single Connection
            if (subscriptions != null && subscriptions.Count > 0)
            {
                bool channel_exist = false;
                foreach (Channel_status cs in subscriptions)
                {
                    if (cs.channel == channel)
                    {
                        channel_exist = true;
                        if (!cs.connected)
                        {
                            cs.connected = true;
                        }
                        else
                        {
                            is_alreadyConnect = true;
                        }
                        break;
                    }
                }
                if (!channel_exist)
                {
                    Channel_status cs = new Channel_status();
                    cs.channel   = channel;
                    cs.connected = true;
                    subscriptions.Add(cs);
                }
                else if (is_alreadyConnect)
                {
                    error_cb("Already Connected");
                    return;
                }
            }
            else
            {
                // New Channel
                Channel_status cs = new Channel_status();
                cs.channel    = channel;
                cs.connected  = true;
                subscriptions = new List <Channel_status>();
                subscriptions.Add(cs);
            }

            bool is_reconnected = false;

            //  Begin Recusive Subscribe
            while (true)
            {
                //  Begin Recursive Subscribe
                try
                {
                    // Build URL
                    List <string> url = new List <string>();
                    url.Add("subscribe");
                    url.Add(this.SUBSCRIBE_KEY);
                    url.Add(channel);
                    url.Add("0");
                    url.Add(timetoken.ToString());

                    // Stop Connection?
                    is_disconnect = false;
                    foreach (Channel_status cs in subscriptions)
                    {
                        if (cs.channel == channel)
                        {
                            if (!cs.connected)
                            {
                                disconnect_cb("Disconnected to channel : " + channel);
                                is_disconnect = true;
                                break;
                            }
                        }
                    }
                    if (is_disconnect)
                    {
                        return;
                    }

                    // Wait for Message
                    List <object> response = _request(url);

                    // Stop Connection?
                    foreach (Channel_status cs in subscriptions)
                    {
                        if (cs.channel == channel)
                        {
                            if (!cs.connected)
                            {
                                disconnect_cb("Disconnected to channel : " + channel);
                                is_disconnect = true;
                                break;
                            }
                        }
                    }
                    if (is_disconnect)
                    {
                        return;
                    }
                    // Problem?
                    if (response == null || response[1].ToString() == "0")
                    {
                        for (int i = 0; i < subscriptions.Count(); i++)
                        {
                            Channel_status cs = subscriptions[i];
                            if (cs.channel == channel)
                            {
                                subscriptions.RemoveAt(i);
                                disconnect_cb("Disconnected to channel : " + channel);
                            }
                        }

                        // Ensure Connected (Call Time Function)
                        while (true)
                        {
                            string time_token = Time().ToString();
                            if (time_token == "0")
                            {
                                // Reconnect Callback
                                reconnect_cb("Reconnecting to channel : " + channel);
                                Thread.Sleep(5000);
                            }
                            else
                            {
                                is_reconnected = true;
                                break;
                            }
                        }
                        if (is_reconnected)
                        {
                            break;
                        }
                    }
                    else
                    {
                        foreach (Channel_status cs in subscriptions)
                        {
                            if (cs.channel == channel)
                            {
                                // Connect Callback
                                if (!cs.first)
                                {
                                    cs.first = true;
                                    connect_cb("Connected to channel : " + channel);
                                    break;
                                }
                            }
                        }
                    }

                    // Update TimeToken
                    if (response[1].ToString().Length > 0)
                    {
                        timetoken = (object)response[1];
                    }

                    // Run user Callback and Reconnect if user permits.
                    object message = "";
                    JArray val     = (JArray)response[0];
                    for (int i = 0; i < val.Count; i++)
                    {
                        if (this.CIPHER_KEY.Length > 0)
                        {
                            if (val[i].Type == JTokenType.String)
                            {
                                message = pc.decrypt((string)val[i]);
                            }
                            else if (val[i].Type == JTokenType.Object)
                            {
                                message = pc.decrypt((JObject)val[i]);
                            }
                            else if (val[i].Type == JTokenType.Array)
                            {
                                message = pc.decrypt((JArray)val[i]);
                            }
                        }
                        else
                        {
                            message = val[i];
                        }

                        if (!callback(message))
                        {
                            return;
                        }
                    }
                }
                catch
                {
                    System.Threading.Thread.Sleep(1000);
                }
            }
            if (is_reconnected)
            {
                // Reconnect Callback
                args["channel"]   = channel;
                args["callback"]  = callback;
                args["timestamp"] = timetoken;
                this._subscribe(args);
            }
        }