예제 #1
0
        /// <summary>
        /// Загрузить порцию элементов.
        /// </summary>
        /// <param name="count">Количество элементов для загрузки.</param>
        public IAsyncOperation <LoadMoreItemsResult> LoadMoreItemsAsync(uint count)
        {
            return(Task.Run <LoadMoreItemsResult>(async() =>
            {
                State = ContentState.Loading;

                uint resultCount = 0;
                _canLoad = false;

                if (count < 20)
                {
                    count = 20;
                }
                else if (count > 60)
                {
                    count = 60;
                }

                var request = new ExecuteGetDialogsRequest()
                {
                    Count = count, Offset = (uint)Count, PreviewLength = 100
                };
                var result = await request.ExecuteAsync();

                await CoreHelper.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    if (result.Error.ErrorType == VKErrors.None)
                    {
                        _totalCount = (ulong)result.Response.Dialogs.Count;

                        for (int i = 0; i < result.Response.Dialogs.Items.Count; i++)
                        {
                            var dialog = result.Response.Dialogs.Items[i];
                            if (dialog.IsChat)
                            {
                                this.Add(dialog);
                                continue;
                            }

                            var user = result.Response.Users.First(p => p.ID == dialog.Message.UserID);
                            dialog.Message.Title = user.FullName;
                            this.Add(dialog);
                        }

                        State = Count == 0 ? ContentState.NoData : ContentState.Normal;
                        UpdateCanLoad();
                    }
                    else
                    {
                        State = ContentState.Error;
                        _canLoad = false;
                    }
                });

                await ServiceHelper.MessagesCacheService.CacheDialogs(this.Take(30).ToList());
#if DEBUG
                Debug.WriteLine("Total dialogs count: " + this.Count);
#endif
                return new LoadMoreItemsResult {
                    Count = resultCount
                };
            }).AsAsyncOperation <LoadMoreItemsResult>());
        }
예제 #2
0
        /// <summary>
        /// Возвращает коллекцию диалогов по указанным параметрам.
        /// </summary>
        /// <param name="offset">Смещение списка.</param>
        /// <param name="count">Количество элементов.</param>
        /// <param name="unread">Вернуть только непрочитанные.</param>
        private async Task <List <VKDialog> > GetDialogsWithParameters(uint offset, uint count, bool unread = false)
        {
            var dialogsRequest = new ExecuteGetDialogsRequest
            {
                Offset        = offset,
                Count         = count,
                PreviewLength = 60,
                Unread        = unread ? VKBoolean.True : VKBoolean.False
            };

            var dialogsResponse = await dialogsRequest.ExecuteAsync();

            if (dialogsResponse.Error.ErrorType != VKErrors.None)
            {
                return(null);
            }

            if (unread)
            {
                totalUnreadCount = dialogsResponse.Response.Dialogs.Count;
            }
            else
            {
                totalCount = dialogsResponse.Response.Dialogs.Count;
            }

            foreach (var user in dialogsResponse.Response.Users)
            {
                Service.CachedUsers[user.ID] = user;
            }

            List <VKDialog> result       = new List <VKDialog>();
            var             unknownChats = new List <VKDialog>();

            foreach (var dialog in dialogsResponse.Response.Dialogs.Items)
            {
                dialog.Message.Sender = dialogsResponse.Response.Users.FirstOrDefault(u => u.ID == dialog.Message.UserID);

                if (dialog.IsChat)
                {
                    unknownChats.Add(dialog);
                }
                else if (dialog.Message.Sender != null)
                {
                    dialog.Message.Title = dialog.Message.Sender.FullName;
                    dialog.Photos        = new ObservableCollection <string> {
                        dialog.Message.Sender.Photo50
                    };
                }

                result.Add(dialog);
            }

            if (result.Count == 0)
            {
                return(result);
            }

            var usersRequest = new GetChatsUsersRequest {
                ChatIDs = unknownChats.Select(d => d.Message.ChatID).ToList()
            };
            var usersResponse = await usersRequest.ExecuteAsync();

            if (usersResponse.Error.ErrorType != VKErrors.None)
            {
                return(null);
            }

            foreach (uint chatID in usersResponse.Response.Keys)
            {
                var users  = usersResponse.Response[chatID];
                var dialog = unknownChats.FirstOrDefault(d => d.Message.ChatID == chatID);
                dialog.Photos = new ObservableCollection <string>();

                if (!String.IsNullOrEmpty(dialog.Message.Photo50))
                {
                    dialog.Photos.Add(dialog.Message.Photo50);
                    continue;
                }

                foreach (var user in users)
                {
                    dialog.Photos.Add(user.Photo50);
                    Service.CachedUsers[user.ID] = user;
                }
            }

            return(result);
        }