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); } } }
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); } } }
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; }
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); }