public static async Task RefreshPostsAsync(IEnumerable <Post> posts, PostQueryOptions options, CancellationToken cancellationToken) { Debug.Assert(posts != null); // Fetch comment content. // You can even fetch posts from different sites. foreach (var sitePosts in posts.GroupBy(p => p.Site)) { var site = sitePosts.Key; var titleLimit = site.AccountInfo.HasRight(UserRights.ApiHighLimits) ? 500 : 50; foreach (var partition in sitePosts.Partition(titleLimit)) { using (site.BeginActionScope(partition, options)) { var postsNeedFetchingId = partition.Where(p => p.Id == 0).ToList(); if (postsNeedFetchingId.Count > 0) { site.Logger.LogDebug("Fetching page ID for {Count} comments.", postsNeedFetchingId.Count); } // Fetch last revisions to determine content and last editor var pages = partition.Select(p => new WikiPage(site, p.Id)).ToList(); var lastRevisionTask = pages.RefreshAsync(postLastRevisionQueryProvider, cancellationToken); // Fetch the first revisions, when needed, to determine author. Dictionary <int, Revision> firstRevisionDict = null; if (partition.Count == 1 || (options & PostQueryOptions.ExactAuthoringInformation) == PostQueryOptions.ExactAuthoringInformation) { // We can only fetch for 1 page at a time, with rvdir = "newer" firstRevisionDict = new Dictionary <int, Revision>(); foreach (var post in partition) { var generator = new RevisionsGenerator(site, post.Id) { TimeAscending = true, PaginationSize = 1, PropertyProvider = postRevisionWithContentProvider }; var rev = await generator.EnumItemsAsync().FirstAsync(cancellationToken); firstRevisionDict[post.Id] = rev; } } await lastRevisionTask; var lastRevisions = pages.ToDictionary(p => p.Id, p => p.LastRevision); foreach (var post in partition) { var lastRev = lastRevisions[post.Id]; Revision firstRev = null; firstRevisionDict?.TryGetValue(post.Id, out firstRev); post.SetRevisions(firstRev, lastRev); } } } } }
private async Task RevertArticleAsync(string article) { Console.Write($"Reverting recent ArtificerBot edits to {article}..."); try { var generator = new RevisionsGenerator(Site) { PageTitle = article, TimeAscending = false, UserName = ArtificerUser }; var revs = await generator.EnumItemsAsync().ToList(); if (revs.Count == 0) { return; } var revision = revs.First(); //https://www.mediawiki.org/wiki/API:Rollback var tokenQuery = new { action = "query", meta = "tokens", titles = article }; var tokenResult = await Site.InvokeMediaWikiApiAsync(new MediaWikiFormRequestMessage(tokenQuery), CancellationToken.None); string token = (string)tokenResult["query"]["tokens"]["csrftoken"]; //action = rollback & title = Main % 20Page & user = Username & markbot & token = 094a45ddbbd5e90d55d79d2a23a8c921 % 2B\ var editQuery = new { action = "edit", title = article, bot = true, undo = revision.Id, undoafter = true, summary = "ArtificerBot reverting last mass edit on page due to user request.", token }; var result = await Site.InvokeMediaWikiApiAsync(new MediaWikiFormRequestMessage(editQuery), CancellationToken.None); Console.WriteLine("Done."); } catch (Exception ex) { Console.WriteLine("Error while reverting!"); Console.WriteLine(ex.ToString()); } }
public void tool_should_generate_controller_revisions_if_attribute_on_controller() { #if DEBUG var assemblyPath = "../../../../openapi-to-terraform.Tests.TestAPIControllerRevisions/bin/Debug/net5.0/openapi-to-terraform.Tests.TestAPIControllerRevisions.dll"; #else var assemblyPath = "../../../../openapi-to-terraform.Tests.TestAPIControllerRevisions/bin/Release/net5.0/openapi-to-terraform.Tests.TestAPIControllerRevisions.dll"; #endif var convertedAssemblyPath = Path.Combine(Directory.GetCurrentDirectory(), assemblyPath); var openApiPath = "samples/controllerRevs.v1.json"; var openApiText = File.ReadAllText(openApiPath); var docTree = new OpenApiParser(openApiText).Read(); Assembly startupAssembly = Assembly.LoadFrom(convertedAssemblyPath); var revisions = RevisionsGenerator.Generate(startupAssembly, docTree); IDictionary <string, JToken> revisionsFileParsed = JObject.Parse(revisions); revisionsFileParsed.Keys.Count.Should().Be(1); // Only one controller with one action in openapi file, so should be one key var revisionsCount = revisionsFileParsed.First().Value.Count(); revisionsCount.Should().Be(2); // The controller has two revisions defined, so there should be two here }
public void tool_should_generate_no_revisions_if_no_attributes() { #if DEBUG var assemblyPath = "../../../../openapi-to-terraform.Tests.TestAPINoRevs/bin/Debug/net5.0/openapi-to-terraform.Tests.TestAPINoRevs.dll"; #else var assemblyPath = "../../../../openapi-to-terraform.Tests.TestAPINoRevs/bin/Release/net5.0/openapi-to-terraform.Tests.TestAPINoRevs.dll"; #endif var convertedAssemblyPath = Path.Combine(Directory.GetCurrentDirectory(), assemblyPath); var openApiPath = "samples/noRevs.v1.json"; var openApiText = File.ReadAllText(openApiPath); var docTree = new OpenApiParser(openApiText).Read(); Assembly startupAssembly = Assembly.LoadFrom(convertedAssemblyPath); var revisions = RevisionsGenerator.Generate(startupAssembly, docTree); IDictionary <string, JToken> revisionsFileParsed = JObject.Parse(revisions); revisionsFileParsed.Keys.Count.Should().Be(1); var revisionsFirstCount = revisionsFileParsed.First().Value.Count(); revisionsFirstCount.Should().Be(1); }
public async Task WpTestEnumRevisionsTest3() { var site = await WpTest2SiteAsync; // 5,100 revisions in total var page = new WikiPage(site, "Page:Edit_page_for_chrome"); var t1 = new DateTime(2014, 10, 20, 10, 0, 0, DateTimeKind.Utc); var t2 = new DateTime(2014, 10, 22, 10, 0, 0, DateTimeKind.Utc); var gen = new RevisionsGenerator(page.Site, page.Title) { TimeAscending = true, StartTime = t1, EndTime = t2, PaginationSize = 30, }; var revisions = await gen.EnumItemsAsync().Take(50).ToListAsync(); Assert.True(revisions.SequenceEqual(revisions.OrderBy(r => r.TimeStamp))); Assert.True(revisions.First().TimeStamp >= t1); Assert.True(revisions.Last().TimeStamp <= t2); // This holds on 2016-12-09 Assert.Equal(32, revisions.Count); ShallowTrace(revisions); }