示例#1
0
        private List <Post> LoadWallPosts(CancellationToken cancellationToken, WallLoadParametrs @params, bool customLoad, bool?informImmediately = true)
        {
            List <Post>   posts = new List <Post>();
            WallGetObject tmp;

            uint offset = @params.Offset.HasValue ? @params.Offset.Value : 0;
            uint count  = _maxPostsPerLoad; //TODO: Дописать чтобы находило оптимальное количество загружаемых постов

            long lastId = long.MaxValue;    // Последний из загруженных (верхняя граница след. итерации)

            do
            {
                try
                {
                    tmp = getWall(cancellationToken, offset, count);
                }
                catch (Exception Ex)
                { throw new NotImplementedException(Ex.Message); }

                if (tmp.WallPosts.Count > 0)
                {
                    var tposts = FilterPosts(tmp, @params, lastId);

                    if (informImmediately == true)
                    {
                        if (customLoad)
                        {
                            if (CustomLoad != null)
                            {
                                CustomLoad(tposts.ToList());
                            }
                        }
                        else
                        {
                            if (NewPosts != null)
                            {
                                NewPosts(tposts.ToList());
                            }
                        }
                    }

                    posts.AddRange(tposts);
                    lastId  = tmp.WallPosts[tmp.WallPosts.Count - 1].Id.Value;
                    offset += count;
                }
            }while (tmp.WallPosts.Count == count &&                                              /* Не дошло до конца и загружает все запрашиваемые записи */
                    (@params.LastPostToLoad == null || lastId > @params.LastPostToLoad.Value) && /* Не дошли до поста, который нужно загрузить (по идентификатору)*/
                    (@params.Count == null || posts.Count < @params.Count.Value) &&              /* Не дошли до поста, который нужно загрузить (по количеству) */
                    tmp.WallPosts.LastOrDefault()?.Date > @params.LastDateToLoad                 /* Не дошли до поста, который нужно загрузить (по дате) */
                    );
            return(posts);
        }
示例#2
0
        /// <summary>
        /// Выделить из полученных записей те, что удовлетворяют условиям
        /// </summary>
        /// <param name="wall">Стена с записями</param>
        /// <param name="thresholdId">Верхняя граница, до которой записи уже были загружены</param>
        /// <param name="lastDateToLoad">Дата и время, до которого нужно выбрать посты</param>
        /// <param name="lastPostToLoad">Последний пост, который нужно выбрать</param>
        /// <returns></returns>
        public static List <Post> FilterPosts(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue)
        {
            var posts = wall.WallPosts;

            if (posts.Count > 0)
            {
                int startIndex = 0;
                int endIndex   = posts.Count - 1;

                if (posts[0].IsPinned.Value)
                {
                    startIndex++;
                }

                while (startIndex <= endIndex && posts[startIndex].Id >= thresholdId)
                {
                    startIndex++;
                }

                if (p.LastDateToLoad.HasValue)
                {
                    while (endIndex >= startIndex && posts[endIndex].Date < p.LastDateToLoad.Value)
                    {
                        endIndex--;
                    }
                }
                if (p.LastPostToLoad > 0)
                {
                    while (endIndex >= startIndex && posts[endIndex].Id < p.LastPostToLoad)
                    {
                        endIndex--;
                    }
                }

                if (startIndex <= endIndex)
                {
                    return(posts.Skip(startIndex).Take(endIndex - startIndex + 1).ToList());
                }
            }
            return(new List <Post>());
        }
 public static Task<List<Post>> FilterPostsAsync(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue)
 {
     return Task.Run(() => { return FilterPosts(wall, p, thresholdId); });
 }
        /// <summary>
        /// Выделить из полученных записей те, что удовлетворяют условиям
        /// </summary>
        /// <param name="wall">Стена с записями</param>
        /// <param name="thresholdId">Верхняя граница, до которой записи уже были загружены</param>
        /// <param name="lastDateToLoad">Дата и время, до которого нужно выбрать посты</param>
        /// <param name="lastPostToLoad">Последний пост, который нужно выбрать</param>
        /// <returns></returns>
        public static List<Post> FilterPosts(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue)
        {
            var posts = wall.WallPosts;
            if (posts.Count > 0)
            {
                int startIndex = 0;
                int endIndex = posts.Count - 1;

                if (posts[0].IsPinned.Value)
                    startIndex++;

                while (startIndex <= endIndex && posts[startIndex].Id >= thresholdId)
                    startIndex++;

                if (p.LastDateToLoad.HasValue)
                    while (endIndex >= startIndex && posts[endIndex].Date < p.LastDateToLoad.Value)
                        endIndex--;
                if (p.LastPostToLoad > 0)
                    while (endIndex >= startIndex && posts[endIndex].Id < p.LastPostToLoad)
                        endIndex--;

                if (startIndex <= endIndex)
                    return posts.Skip(startIndex).Take(endIndex - startIndex + 1).ToList();
            }
            return new List<Post>();
        }
 /// <summary>
 /// Загружает список постов со стены сообщества с первого и до указанного и\или указанной даты
 /// </summary>
 /// <param name="cancellationToken">Токен отмены загрузки</param>
 /// <param name="params">Параметры загрузки записей</param>
 /// <param name="informImmediately">Оповещать о полученых постах через <see cref="CustomLoad"/> как только они загрузяться (null и false выключат оповещение)</param>
 public Task<List<Post>> LoadWallPostsAsync(CancellationToken cancellationToken, WallLoadParametrs @params, bool? informImmediately = true)
 {
     return LoadWallPostsAsync(cancellationToken, @params, true, informImmediately);
 }
 private Task<List<Post>> LoadWallPostsAsync(CancellationToken cancellationToken, WallLoadParametrs @params, bool customLoad, bool? informImmediately = true)
 {
     return Task.Run(() => { return LoadWallPosts(cancellationToken, @params, customLoad, informImmediately); }, cancellationToken);
 }
        private List<Post> LoadWallPosts(CancellationToken cancellationToken, WallLoadParametrs @params, bool customLoad, bool? informImmediately = true)
        {
            List<Post> posts = new List<Post>();
            WallGetObject tmp;

            uint offset = @params.Offset.HasValue ? @params.Offset.Value : 0;
            uint count = _maxPostsPerLoad;  //TODO: Дописать чтобы находило оптимальное количество загружаемых постов

            long lastId = long.MaxValue;    // Последний из загруженных (верхняя граница след. итерации)

            do
            {
                try
                {
                    tmp = getWall(cancellationToken, offset, count);
                }
                catch (Exception Ex)
                { throw new NotImplementedException(Ex.Message); }

                if (tmp.WallPosts.Count > 0)
                {
                    var tposts = FilterPosts(tmp, @params, lastId);

                    if (informImmediately == true)
                    {
                        if (customLoad)
                        {
                            if (CustomLoad != null)
                                CustomLoad(tposts.ToList());
                        }
                        else
                        {
                            if (NewPosts != null)
                                NewPosts(tposts.ToList());
                        }
                    }

                    posts.AddRange(tposts);
                    lastId = tmp.WallPosts[tmp.WallPosts.Count - 1].Id.Value;
                    offset += count;
                }
            }
            while (tmp.WallPosts.Count == count && /* Не дошло до конца и загружает все запрашиваемые записи */
                (@params.LastPostToLoad == null || lastId > @params.LastPostToLoad.Value) && /* Не дошли до поста, который нужно загрузить (по идентификатору)*/
                (@params.Count == null || posts.Count < @params.Count.Value) && /* Не дошли до поста, который нужно загрузить (по количеству) */
                tmp.WallPosts.LastOrDefault()?.Date > @params.LastDateToLoad /* Не дошли до поста, который нужно загрузить (по дате) */
            );
            return posts;
        }
示例#8
0
 public static Task <List <Post> > FilterPostsAsync(WallGetObject wall, WallLoadParametrs p, long thresholdId = long.MaxValue)
 {
     return(Task.Run(() => { return FilterPosts(wall, p, thresholdId); }));
 }
示例#9
0
 /// <summary>
 /// Загружает список постов со стены сообщества с первого и до указанного и\или указанной даты
 /// </summary>
 /// <param name="cancellationToken">Токен отмены загрузки</param>
 /// <param name="params">Параметры загрузки записей</param>
 /// <param name="informImmediately">Оповещать о полученых постах через <see cref="CustomLoad"/> как только они загрузяться (null и false выключат оповещение)</param>
 public Task <List <Post> > LoadWallPostsAsync(CancellationToken cancellationToken, WallLoadParametrs @params, bool?informImmediately = true)
 {
     return(LoadWallPostsAsync(cancellationToken, @params, true, informImmediately));
 }
示例#10
0
 private Task <List <Post> > LoadWallPostsAsync(CancellationToken cancellationToken, WallLoadParametrs @params, bool customLoad, bool?informImmediately = true)
 {
     return(Task.Run(() => { return LoadWallPosts(cancellationToken, @params, customLoad, informImmediately); }, cancellationToken));
 }