Exemplo n.º 1
0
        /// <summary>
        /// Возвращает коллекцию сообщений по их идентификаторам.
        /// </summary>
        /// <param name="ids">Коллекция идентификаторов.</param>
        /// <exception cref="AuthorizationRequiredException"/>
        /// <exception cref="InvalidOperationException"/>
        private async Task <List <VKMessage> > GetMessagesForIDs(IEnumerable <ulong> ids)
        {
            var request = new GetByIDRequest
            {
                MessageIDs = ids.ToList()
            };

            for (int i = 0; i < MAX_ATTEMPTS_NUMBER; i++)
            {
                var response = await request.ExecuteAsync();

                if (response.Error.ErrorType == VKErrors.AccessDenied || response.Error.ErrorType == VKErrors.AuthorizationFailed)
                {
                    throw new AuthorizationRequiredException("Запрос провалился из-за необходимости выполнить авторизацию.");
                }
                if (response.Error.ErrorType == VKErrors.None)
                {
                    return(response.Response.Items);
                }

                if (i + 1 < MAX_ATTEMPTS_NUMBER)
                {
                    await Task.Delay(1000);
                }
                continue;
            }

            throw new InvalidOperationException("Не удалось получить коллекцию сообщений по их идентификаторам.");
        }
Exemplo n.º 2
0
        /// <summary>
        /// Вызывается при получении новых сообщений через LongPoll.
        /// </summary>
        private async void VKLongPollService_MessagesReceived(object sender, MessagesReceivedEventArgs e)
        {
            var ids = new ulong[e.Messages.Count];

            for (int i = 0; i < e.Messages.Count; i++)
            {
                ids[i] = e.Messages[i].MessageID;
            }

            List <VKMessage> resultMessages = null;

            bool success      = false;
            byte numOfRetries = 0;

            while (!success && numOfRetries <= 3)
            {
                var request = new GetByIDRequest {
                    MessageIDs = ids.ToList()
                };
                var response = await request.ExecuteAsync();

                if (response.Error.ErrorType == VKErrors.None)
                {
                    success        = true;
                    resultMessages = response.Response.Items;
                }
                else
                {
                    numOfRetries++;
                    CoreHelper.SendInAppPush(
                        "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд",
                        null, PopupMessageType.Warning);
                    await Task.Delay(3000 *numOfRetries);
                }
            }

            if (!success)
            {
                CoreHelper.SendInAppPush(
                    "Не удалось получить подробные сообщения",
                    "LongPoll", PopupMessageType.Error);
                return;
            }

            var unknownUsers = new Dictionary <ulong, List <VKMessage> >();

            var conversations = new Dictionary <long, List <VKMessage> >();

            foreach (var msg in resultMessages)
            {
                long key = msg.IsChatMessage ? -msg.ChatID : (long)msg.UserID;
                if (conversations.ContainsKey(key))
                {
                    conversations[key].Add(msg);
                }
                else
                {
                    var list = new List <VKMessage>();
                    list.Add(msg);
                    conversations[key] = list;
                }

                if (CachedUsers.ContainsKey(msg.UserID))
                {
                    msg.Sender = CachedUsers[msg.UserID];
                }
                else
                {
                    if (unknownUsers.ContainsKey(msg.UserID))
                    {
                        unknownUsers[msg.UserID].Add(msg);
                    }
                    else
                    {
                        var list = new List <VKMessage>();
                        list.Add(msg);
                        unknownUsers[msg.UserID] = list;
                    }
                }
            }

            success      = unknownUsers.Count == 0;
            numOfRetries = 0;
            while (!success && numOfRetries <= 3)
            {
                var usersRequest = new GetUsersRequest()
                {
                    UserIDs = unknownUsers.Keys.ToList()
                };
                var usersResponse = await usersRequest.ExecuteAsync();

                if (usersResponse.Error.ErrorType == VKErrors.None)
                {
                    success = true;
                    foreach (var user in usersResponse.Response)
                    {
                        var sUser = new VKProfileChat()
                        {
                            ID        = user.ID,
                            FirstName = user.FirstName,
                            LastName  = user.LastName,
                            Online    = user.Online,
                            Photo50   = user.Photo50
                        };

                        var list = unknownUsers[user.ID];
                        for (int i = 0; i < list.Count; i++)
                        {
                            list[i].Sender = sUser;
                        }

                        CachedUsers[sUser.ID] = sUser;
                    }
                }
                else
                {
                    numOfRetries++;
                    CoreHelper.SendInAppPush(
                        "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд",
                        null, PopupMessageType.Warning);
                    await Task.Delay(3000 *numOfRetries);
                }
            }

            if (!success)
            {
                CoreHelper.SendInAppPush(
                    "Не удалось получить информацию о пользователях сообщений",
                    null, PopupMessageType.Error);
            }

            foreach (long convID in conversations.Keys)
            {
                var msgsList   = conversations[convID];
                var cachedConv = Conversations.Keys.FirstOrDefault(c => c.ID == convID);

                if (cachedConv != null)
                {
                    var list = Conversations[cachedConv];
                    foreach (var msg in msgsList)
                    {
                        list.Insert(0, msg);
                    }
                }
                else
                {
                    MessagesCollection list = null;
                    if (convID < 0)
                    {
                        list = new MessagesCollection((uint)-convID);
                    }
                    else
                    {
                        list = new MessagesCollection((ulong)convID);
                    }

                    cachedConv = await ServiceHelper.MessagesCacheService.GetConversationFromCache(convID);

                    if (cachedConv != null)
                    {
                        foreach (var msg in cachedConv.CachedMessages)
                        {
                            list.Add(msg);
                        }
                    }
                    else
                    {
                        if (convID < 0)
                        {
                            success      = false;
                            numOfRetries = 0;
                            while (!success && numOfRetries <= 3)
                            {
                                var request = new GetChatRequest()
                                {
                                    ChatID   = -convID,
                                    IsSingle = true,
                                    Fields   = new List <VKUserFields> {
                                        VKUserFields.photo_50, VKUserFields.online, VKUserFields.sex
                                    }
                                };
                                var response = await request.ExecuteAsync();

                                if (response.Error.ErrorType == VKErrors.None)
                                {
                                    success    = true;
                                    cachedConv = new CachedConversationOld
                                    {
                                        ID             = convID,
                                        Title          = response.Response.Title,
                                        Users          = new ObservableCollection <VKProfileChat>(response.Response.Users),
                                        CachedMessages = msgsList,
                                        AdminID        = response.Response.AdminID
                                    };
                                    Conversations[cachedConv] = list;

                                    foreach (var user in cachedConv.Users)
                                    {
                                        CachedUsers[user.ID] = user;
                                    }
                                }
                                else
                                {
                                    numOfRetries++;
                                    CoreHelper.SendInAppPush(
                                        "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд",
                                        null, PopupMessageType.Warning);
                                    await Task.Delay(3000 *numOfRetries);
                                }
                            }
                        }
                        else
                        {
                            success      = false;
                            numOfRetries = 0;
                            while (!success && numOfRetries <= 3)
                            {
                                var request = new GetUsersRequest {
                                    UserID = (ulong)convID
                                };
                                var response = await request.ExecuteAsync();

                                if (response.Error.ErrorType == VKErrors.None)
                                {
                                    success = true;
                                    var user = response.Response[0];
                                    cachedConv = new CachedConversationOld
                                    {
                                        ID    = convID,
                                        Title = user.FullName,
                                        Users = new ObservableCollection <VKProfileChat>
                                        {
                                            new VKProfileChat
                                            {
                                                ID        = user.ID,
                                                LastName  = user.LastName,
                                                FirstName = user.FirstName,
                                                Photo50   = user.Photo50,
                                                Online    = user.Online
                                            }
                                        }
                                    };
                                    CachedUsers[user.ID] = cachedConv.Users[0];
                                }
                                else
                                {
                                    numOfRetries++;
                                    CoreHelper.SendInAppPush(
                                        "Ошибка соединения.\nПовтор через " + 3 * numOfRetries + " секунд",
                                        null, PopupMessageType.Warning);
                                    await Task.Delay(3000 *numOfRetries);
                                }
                            }
                        }
                    }

                    foreach (var msg in msgsList)
                    {
                        list.Insert(0, msg);
                    }

                    //list.UpdateSimilar();
                    Conversations[cachedConv] = list;
                }

                await CacheConversation(cachedConv.ID);

                WorkOnDialog(msgsList.Last());

                var lastMsg = msgsList.LastOrDefault(m => m.Type == VKMessageType.Received);
                if (lastMsg == null)
                {
                    continue;
                }

                var navParameter = new NavigateToPageMessage
                {
                    Page      = AppViews.ConversationView,
                    Parameter = convID
                };

                CoreHelper.SendInAppPush(lastMsg.Body,
                                         cachedConv.Title, PopupMessageType.Default,
                                         lastMsg.Sender.Photo50, parameter: navParameter);
            }

            await ServiceHelper.MessagesCacheService.CacheDialogs(Dialogs.Take(20).ToList());
        }