public static List <Post> GetPosts(this IWallCategory wall, ILogger logger, DownloadingPostsOptions downloadingPostsOptions) { List <Post> res = new List <Post>(); ulong offset = 0; int loadCount = downloadingPostsOptions.CountInFirstLoad; while (true) { WallGetObject wallPosts = LoadPosts(wall, logger, downloadingPostsOptions, loadCount, offset); foreach (var post in wallPosts.WallPosts) { res.Add(post); } if (wallPosts.WallPosts.Count < loadCount) { break; } offset += (ulong)loadCount; loadCount = MaxLoadCount; } return(res); }
public void SetUp() { _api = Mock.Of <IVkApi>(); _wall = Mock.Of <IWallCategory>(); Mock.Get(_api) .Setup(x => x.Wall) .Returns(() => _wall); Mock.Get(_wall) .Setup(x => x.Post(It.IsAny <WallPostParams>())) .Returns(() => PostId); var posts = new List <Post> { CreateSomePost(), CreateSomePost(), CreateSomePost(), CreateSomePost(), CreateSomePost() }; Mock.Get(_wall) .Setup(x => x.Get(It.IsAny <WallGetParams>(), It.IsAny <bool>())) .Returns(() => new WallGetObject { WallPosts = new ReadOnlyCollection <Post>(posts) }); CreateSomePost(); _log = Mock.Of <ILog>(); _sut = new LetterStatsReporter(_api, _log); }
private static WallGetObject LoadPosts(IWallCategory wall, ILogger logger, DownloadingPostsOptions downloadingPostsOptions, int count, ulong offset) { byte countOfLoadingAttempts = 1; DateTime?firstDisconnectionTime = null; while (countOfLoadingAttempts <= 5) { try { // получаем следующую сотню записей со стены var wallPosts = wall.Get(new VkNet.Model.RequestParams.WallGetParams() { OwnerId = downloadingPostsOptions.WallId, Offset = offset, Count = Convert.ToUInt64(count), Extended = false, Filter = downloadingPostsOptions.WallFilter, }); return(wallPosts); } catch (FlurlHttpException ex) { logger.LogInformation($"There's no connection to the Internet. Waiting for a reconnection.... Bz-z-z"); if (firstDisconnectionTime == null) { firstDisconnectionTime = DateTime.UtcNow; } if (DateTime.UtcNow - firstDisconnectionTime > downloadingPostsOptions.TimeForReconnection) { logger.LogInformation($"No Internet connection. Try to pray to God or just resolve connection problem.{NewLine}{ex}"); throw; } } catch (CaptchaNeededException ex) { logger.LogInformation($"Captcha problem. Apply to poor indian children.{NewLine}{ex}"); throw; } catch (VkApiException vkApiEx) { if (countOfLoadingAttempts == 5) { logger.LogInformation($"VkApiException has occured.{NewLine}{vkApiEx.Message}"); throw; } countOfLoadingAttempts++; } catch (System.Exception ex) { logger.LogInformation($"Unpredictable exception happened. Say \"Vladik Spasi\".{NewLine}{ex}"); throw ex; } } return(null); }
/// <summary> /// Загрузка постов по лимитам установленным в модели (Все посты за период ИЛИ заданное кол-во постов) /// </summary> /// <param name="wall"></param> /// <param name="downloadingPostsOptions"></param> /// <param name="monitoringLimits"></param> /// <param name="logger"></param> /// <returns></returns> public static List <Post> GetPosts(this IWallCategory wall, ILogger logger, DownloadingPostsOptions downloadingPostsOptions, MonitoringLimits monitoringLimits) { List <Post> res = new List <Post>(); int loadCount = downloadingPostsOptions.CountInFirstLoad; bool allPostsReceived = true; ulong offset = 0; long? monitoringNumBorder = null; DateTime? monitoringTimeBorder = null; if (monitoringLimits.MonitoringLimit != null) { monitoringNumBorder = 0; } if (monitoringLimits.MonitoringPeriod != null) { monitoringTimeBorder = DateTime.UtcNow - monitoringLimits.MonitoringPeriod; } while (allPostsReceived) { WallGetObject wallPosts = LoadPosts(wall, logger, downloadingPostsOptions, loadCount, offset); if (wallPosts.WallPosts.Count != 0) { if (monitoringNumBorder == null) { res.AddRange(SelectionLoadedPosts(wallPosts, ref allPostsReceived, monitoringTimeBorder.Value)); } else if (monitoringTimeBorder == null) { res.AddRange(SelectionLoadedPosts(wallPosts, ref allPostsReceived, ref monitoringNumBorder, monitoringLimits.MonitoringLimit.Value)); } else { res.AddRange(SelectionLoadedPosts(wallPosts, ref allPostsReceived, monitoringTimeBorder.Value, ref monitoringNumBorder, monitoringLimits.MonitoringLimit.Value)); } if (wallPosts.WallPosts.Count < loadCount) { allPostsReceived = false; } offset += (ulong)loadCount; loadCount = MaxLoadCount; } } return(res); }
public void SetUp() { _api = Mock.Of <IVkApi>(); _wall = Mock.Of <IWallCategory>(); _utilsCategory = Mock.Of <IUtilsCategory>(); Mock.Get(_api) .Setup(x => x.Wall) .Returns(() => _wall); Mock.Get(_api) .Setup(x => x.Utils) .Returns(() => _utilsCategory); Mock.Get(_wall) .Setup(x => x.Get(It.IsAny <WallGetParams>(), It.IsAny <bool>())) .Returns(() => new WallGetObject { WallPosts = new ReadOnlyCollection <Post>(new List <Post>()) }); Mock.Get(_utilsCategory) .Setup(x => x.ResolveScreenName(It.IsAny <string>())) .Returns(() => new VkObject { Id = 12345 }); }
public static List <Post> GetPosts(this IWallCategory wall, ILogger logger, DownloadingPostsOptions downloadingPostsOptions, long border) { List <Post> res = new List <Post>(); bool allPostsReceived = true; ulong offset = 0; int loadCount = downloadingPostsOptions.CountInFirstLoad; while (allPostsReceived) { WallGetObject wallPosts = LoadPosts(wall, logger, downloadingPostsOptions, loadCount, offset); res.AddRange(SelectionLoadedPosts(wallPosts, ref allPostsReceived, border)); if (wallPosts.WallPosts.Count < downloadingPostsOptions.CountInFirstLoad) { allPostsReceived = false; } offset += (ulong)downloadingPostsOptions.CountInFirstLoad; loadCount = MaxLoadCount; } return(res); }