Esempio n. 1
0
        private async Task Connect(string key, string server, string ts, Action <List <VkLongPollMessage> > onMessage = null)
        {
            var parametres = new Dictionary <string, string>();

            parametres.Add("act", "a_check");
            parametres.Add("key", key);
            parametres.Add("ts", ts);
            parametres.Add("wait", "25");
            parametres.Add("mode", "2");

            var response = await new VkRequest(new Uri("http://" + server), parametres).Execute();

            VkErrorProcessor.ProcessError(response);

            if (response != null)
            {
                Debug.WriteLine("Long poll service response: " + response);

                ts = (string)response["ts"];

                var result = new List <VkLongPollMessage>();

                foreach (JArray update in response["updates"])
                {
                    var m = VkLongPollMessage.FromJson(update);
                    if (m != null)
                    {
                        result.Add(m);
                    }
                }

                if (onMessage != null)
                {
                    onMessage(result);
                }

                if (!_stop)
                {
                    await Connect(key, server, ts, onMessage);
                }
            }
        }
Esempio n. 2
0
        private async Task Connect(string key, string server, string ts, CancellationToken cancellationToken, Action <List <VkLongPollMessage> > onMessage = null)
        {
            var parametres = new Dictionary <string, string>();

            parametres.Add("act", "a_check");
            parametres.Add("key", key);
            parametres.Add("ts", ts);
            parametres.Add("wait", "25");
            parametres.Add("mode", "2");

            var response = await VkRequest.GetAsync("https://" + server, parametres);

            if (cancellationToken.IsCancellationRequested)
            {
                return;
            }

            if (response != null)
            {
                Debug.WriteLine("Long poll service response: " + response);

                ts = (string)response["ts"];

                var result = new List <VkLongPollMessage>();

                foreach (JArray update in response["updates"])
                {
                    var m = VkLongPollMessage.FromJson(update);
                    if (m != null)
                    {
                        result.Add(m);
                    }
                }

                onMessage?.Invoke(result);

                if (!_stop)
                {
                    await Connect(key, server, ts, cancellationToken, onMessage);
                }
            }
        }
Esempio n. 3
0
        public static VkLongPollMessage FromJson(JArray json)
        {
            var result = new VkLongPollMessage();
            result.Parameters = new Dictionary<string, object>();

            var messageType = json[0].Value<string>();

            switch (messageType)
            {
                //удаление сообщения с указанным local_id
                case "0":
                    result.Type = VkLongPollMessageType.MessageDelete;
                    result.Parameters.Add("message_id", json[1].Value<string>());
                    break;

                //замена флагов сообщения
                case "1":
                    result.Type = VkLongPollMessageType.MessageUpdate;
                    result.Parameters.Add("message_id", json[1].Value<string>());
                    result.Parameters.Add("flags", json[2].Value<int>());
                    break;

                //установка флагов сообщения
                case "2":
                    result.Type = VkLongPollMessageType.MessageFlagSet;
                    result.Parameters.Add("message_id", json[1].Value<string>());
                    result.Parameters.Add("flags", json[2].Value<int>());
                    if (json.Count > 2)
                        result.Parameters.Add("user_id", json[3].Value<string>());
                    break;

                //сброс флагов сообщения
                case "3":
                    result.Type = VkLongPollMessageType.MessageFlagReset;
                    result.Parameters.Add("message_id", json[1].Value<string>());
                    result.Parameters.Add("flags", json[2].Value<int>());
                    if (json.Count > 2)
                        result.Parameters.Add("user_id", json[3].Value<string>());
                    break;

                //добавление нового сообщения
                case "4":
                    result.Type = VkLongPollMessageType.MessageAdd;
                    var m = new VkMessage();
                    m.Id = json[1].Value<long>();
                    var flags = json[2].Value<int>();
                    var uid = json[3].Value<long>();
                    if (uid >= ChatIdMask)
                    {
                        //беседа
                        result.Parameters.Add("conversation", "1");
                        m.ChatId = (uid - ChatIdMask);
                    }
                    else
                    {
                        m.UserId = uid;
                    }

                    m.Date = DateTimeExtensions.UnixTimeStampToDateTime(json[4].Value<double>()).ToLocalTime();
                    m.Title = json[5].Value<string>();
                    m.Body = json[6].Value<string>();
                    result.Parameters.Add("message", m);
                    result.Parameters.Add("flags", flags);

                    //TODO forwards & attachments
                    break;

                //друг стал онлайн
                case "8":
                    result.Type = VkLongPollMessageType.FriendOnline;
                    result.Parameters.Add("user_id", json[1].Value<string>().Substring(1));
                    break;

                //друг стал оффлайн
                case "9":
                    result.Type = VkLongPollMessageType.FriendOffline;
                    result.Parameters.Add("user_id", json[1].Value<string>().Substring(1));
                    break;

                //один из параметров (состав, тема) беседы был изменен
                case "51":
                    result.Type = VkLongPollMessageType.ConversationChange;
                    result.Parameters.Add("chat_id", json[1].Value<string>());
                    result.Parameters.Add("self", json[2].Value<string>() == "1");
                    break;

                //пользователь начал набирать текст в диалоге
                case "61":
                    result.Type = VkLongPollMessageType.DialogUserTyping;
                    result.Parameters.Add("user_id", json[1].Value<string>());
                    break;
                //пользователь начал набирать текст в беседе
                case "62":
                    result.Type = VkLongPollMessageType.ConsersationUserTyping;
                    result.Parameters.Add("user_id", json[1].Value<string>());
                    result.Parameters.Add("chat_id", json[2].Value<string>());
                    break;

                default:
                    result.Type = VkLongPollMessageType.Unknown;
                    break;
            }

            return result;
        }
Esempio n. 4
0
        public static VkLongPollMessage FromJson(JArray json)
        {
            var result = new VkLongPollMessage();

            result.Parameters = new Dictionary <string, object>();

            var messageType = json[0].Value <string>();

            switch (messageType)
            {
            //удаление сообщения с указанным local_id
            case "0":
                result.Type = VkLongPollMessageType.MessageDelete;
                result.Parameters.Add("message_id", json[1].Value <string>());
                break;

            //замена флагов сообщения
            case "1":
                result.Type = VkLongPollMessageType.MessageFlagUpdate;
                result.Parameters.Add("message_id", json[1].Value <string>());
                result.Parameters.Add("flags", json[2].Value <VkLongPollMessageFlags>());
                break;

            //установка флагов сообщения
            case "2":
                result.Type = VkLongPollMessageType.MessageFlagSet;
                result.Parameters.Add("message_id", json[1].Value <string>());
                result.Parameters.Add("flags", json[2].Value <int>());
                if (json.Count > 2)
                {
                    result.Parameters.Add("user_id", json[3].Value <long>());
                }
                break;

            //сброс флагов сообщения
            case "3":
                result.Type = VkLongPollMessageType.MessageFlagReset;
                result.Parameters.Add("message_id", json[1].Value <string>());
                result.Parameters.Add("flags", json[2].Value <int>());
                if (json.Count > 2)
                {
                    result.Parameters.Add("user_id", json[3].Value <long>());
                }
                break;

            //добавление нового сообщения
            case "4":
                result.Type = VkLongPollMessageType.MessageAdd;
                var m = new VkMessage();
                m.Id = json[1].Value <long>();
                var flags = json[2].Value <int>();
                var uid   = json[3].Value <long>();
                if (uid >= ChatIdMask)
                {
                    //беседа
                    result.Parameters.Add("conversation", "1");
                    m.ChatId = (uid - ChatIdMask);
                }
                else
                {
                    m.UserId = uid;
                }

                m.Date  = DateTimeExtensions.UnixTimeStampToDateTime(json[4].Value <double>()).ToLocalTime();
                m.Title = json[5].Value <string>();
                m.Body  = json[6].Value <string>();
                result.Parameters.Add("message", m);
                result.Parameters.Add("flags", flags);

                if (json[7] != null)
                {
                    //attachments

                    try
                    {
                        var longPollAttachments = new List <VkLongPollAttachment>();

                        var dict = json[7].Value <JObject>().Properties().ToDictionary(p => p.Name, p => p.Value.Value <string>());

                        foreach (var o in dict)
                        {
                            var id = o.Key.Replace("_type", string.Empty);

                            VkLongPollAttachment longPollAttachment = longPollAttachments.FirstOrDefault(a => a.Id == id);
                            if (longPollAttachment == null)
                            {
                                longPollAttachment = new VkLongPollAttachment()
                                {
                                    Id = id
                                };
                                longPollAttachments.Add(longPollAttachment);
                            }

                            if (o.Key.EndsWith("_type"))
                            {
                                longPollAttachment.Type = o.Value;
                            }
                            else
                            {
                                if (o.Key == "geo")     //special attachment
                                {
                                    longPollAttachment.Type = "geo";
                                }
                                else if (o.Key == "fwd")
                                {
                                    longPollAttachment.Type = "fwd";
                                }
                                else if (o.Key == "from")
                                {
                                    m.UserId = long.Parse(o.Value);
                                }


                                longPollAttachment.Data = o.Value;
                            }
                        }

                        if (longPollAttachments.Count > 0)
                        {
                            m.Attachments = new List <VkAttachment>(longPollAttachments.Count);

                            foreach (var longPollAttachment in longPollAttachments)
                            {
                                if (longPollAttachment.Type == "geo")
                                {
                                    //not an attachment for message
                                    //requires reverse geocoding
                                    m.Geo = new VkGeo();
                                }
                                else if (longPollAttachment.Id == "fwd_msg_count")
                                {
                                    //adding placeholder messages, client app will reload message to get it
                                    int count = int.Parse(longPollAttachment.Data);
                                    m.ForwardMessages = new List <VkMessage>();
                                    for (int i = 0; i < count; i++)
                                    {
                                        m.ForwardMessages.Add(new VkMessage());
                                    }
                                }
                                else if (longPollAttachment.Type == "sticker")
                                {
                                    var sticker = new VkStickerAttachment();

                                    sticker.ProductId = long.Parse(longPollAttachment.Data);
                                    sticker.Photo256  = "http://vk.com/images/stickers/" + sticker.ProductId + "/256.png";
                                    m.Attachments.Add(sticker);
                                }
                                else
                                {
                                    var a = longPollAttachment.ToAttachment();
                                    if (a != null)
                                    {
                                        m.Attachments.Add(a);
                                    }
                                    else
                                    {
                                        Debug.WriteLine("Unable to parse attachment " + a);
                                    }
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine("Unable to parse attachments of LongPollMessage. " + ex);
                    }
                }
                break;

            //друг стал онлайн
            case "8":
                result.Type = VkLongPollMessageType.FriendOnline;
                result.Parameters.Add("user_id", json[1].Value <string>().Substring(1));
                break;

            //друг стал оффлайн
            case "9":
                result.Type = VkLongPollMessageType.FriendOffline;
                result.Parameters.Add("user_id", json[1].Value <string>().Substring(1));
                break;

            //один из параметров (состав, тема) беседы был изменен
            case "51":
                result.Type = VkLongPollMessageType.ConversationChange;
                result.Parameters.Add("chat_id", json[1].Value <string>());
                result.Parameters.Add("self", json[2].Value <string>() == "1");
                break;

            //пользователь начал набирать текст в диалоге
            case "61":
                result.Type = VkLongPollMessageType.DialogUserTyping;
                result.Parameters.Add("user_id", json[1].Value <long>());
                break;

            //пользователь начал набирать текст в беседе
            case "62":
                result.Type = VkLongPollMessageType.ConsersationUserTyping;
                result.Parameters.Add("user_id", json[1].Value <long>());
                result.Parameters.Add("chat_id", json[2].Value <long>());
                break;

            default:
                result.Type = VkLongPollMessageType.Unknown;
                break;
            }

            return(result);
        }
        public static VkLongPollMessage FromJson(JArray json)
        {
            var result = new VkLongPollMessage();

            result.Parameters = new Dictionary <string, object>();

            var messageType = json[0].Value <string>();

            switch (messageType)
            {
            //удаление сообщения с указанным local_id
            case "0":
                result.Type = VkLongPollMessageType.MessageDelete;
                result.Parameters.Add("message_id", json[1].Value <string>());
                break;

            //замена флагов сообщения
            case "1":
                result.Type = VkLongPollMessageType.MessageUpdate;
                result.Parameters.Add("message_id", json[1].Value <string>());
                result.Parameters.Add("flags", json[2].Value <int>());
                break;

            //установка флагов сообщения
            case "2":
                result.Type = VkLongPollMessageType.MessageFlagSet;
                result.Parameters.Add("message_id", json[1].Value <string>());
                result.Parameters.Add("flags", json[2].Value <int>());
                if (json.Count > 2)
                {
                    result.Parameters.Add("user_id", json[3].Value <string>());
                }
                break;

            //сброс флагов сообщения
            case "3":
                result.Type = VkLongPollMessageType.MessageFlagReset;
                result.Parameters.Add("message_id", json[1].Value <string>());
                result.Parameters.Add("flags", json[2].Value <int>());
                if (json.Count > 2)
                {
                    result.Parameters.Add("user_id", json[3].Value <string>());
                }
                break;

            //добавление нового сообщения
            case "4":
                result.Type = VkLongPollMessageType.MessageAdd;
                var m = new VkMessage();
                m.Id = json[1].Value <long>();
                var flags = json[2].Value <int>();
                var uid   = json[3].Value <long>();
                if (uid >= ChatIdMask)
                {
                    //беседа
                    result.Parameters.Add("conversation", "1");
                    m.ChatId = (uid - ChatIdMask);
                }
                else
                {
                    m.UserId = uid;
                }

                m.Date  = DateTimeExtensions.UnixTimeStampToDateTime(json[4].Value <double>()).ToLocalTime();
                m.Title = json[5].Value <string>();
                m.Body  = json[6].Value <string>();
                result.Parameters.Add("message", m);
                result.Parameters.Add("flags", flags);

                //TODO forwards & attachments
                break;

            //друг стал онлайн
            case "8":
                result.Type = VkLongPollMessageType.FriendOnline;
                result.Parameters.Add("user_id", json[1].Value <string>().Substring(1));
                break;

            //друг стал оффлайн
            case "9":
                result.Type = VkLongPollMessageType.FriendOffline;
                result.Parameters.Add("user_id", json[1].Value <string>().Substring(1));
                break;

            //один из параметров (состав, тема) беседы был изменен
            case "51":
                result.Type = VkLongPollMessageType.ConversationChange;
                result.Parameters.Add("chat_id", json[1].Value <string>());
                result.Parameters.Add("self", json[2].Value <string>() == "1");
                break;

            //пользователь начал набирать текст в диалоге
            case "61":
                result.Type = VkLongPollMessageType.DialogUserTyping;
                result.Parameters.Add("user_id", json[1].Value <string>());
                break;

            //пользователь начал набирать текст в беседе
            case "62":
                result.Type = VkLongPollMessageType.ConsersationUserTyping;
                result.Parameters.Add("user_id", json[1].Value <string>());
                result.Parameters.Add("chat_id", json[2].Value <string>());
                break;

            default:
                result.Type = VkLongPollMessageType.Unknown;
                break;
            }

            return(result);
        }