/// <param name="version"></param> /// <inheritdoc /> public virtual IEnumerable <KeyValuePair <string, object> > EnumParameters(MediaWikiVersion version) { var propBuilder = new StringBuilder(); var p = new OrderedKeyValuePairs <string, object> { { "action", "query" }, { "redirects", ResolveRedirects }, { "maxlag", 5 }, }; if (_Properties != null) { foreach (var prop in _Properties) { if (prop.PropertyName != null) { if (propBuilder.Length > 0) { propBuilder.Append('|'); } propBuilder.Append(prop.PropertyName); } p.AddRange(prop.EnumParameters(version)); } } p.Add("prop", propBuilder.ToString()); return(p); }
/// <inheritdoc /> public override IEnumerable <KeyValuePair <string, object> > EnumParameters() { var p = new OrderedKeyValuePairs <string, object>(); if (QueryOriginalImage && ThumbnailSize > 0) { p.Add("piprop", "original|thumbnail|name"); } else if (QueryOriginalImage) { p.Add("piprop", "original|name"); } else if (ThumbnailSize > 0) { p.Add("piprop", "thumbnail|name"); } else { p.Add("piprop", "name"); } if (ThumbnailSize >= 0) { p.Add("pithumbsize", ThumbnailSize); } return(p); }
public void TestOrderedKeyValuePairsMergeOnDuplicate() { var x = new[] { new KeyValuePair <int, int>(1, 1) }; var y = new[] { new KeyValuePair <int, int>(1, 2), new KeyValuePair <int, int>(2, 2) }; IEnumerator <KeyValuePair <int, int> > e = OrderedKeyValuePairs <int, int> .Merge(Comparer <int> .Default, DuplicateHandling.FirstValueWins, x, y) .GetEnumerator(); Assert.IsTrue(e.MoveNext()); Assert.AreEqual(1, e.Current.Key); Assert.AreEqual(1, e.Current.Value); Assert.IsTrue(e.MoveNext()); Assert.AreEqual(2, e.Current.Key); Assert.AreEqual(2, e.Current.Value); Assert.IsFalse(e.MoveNext()); e = OrderedKeyValuePairs <int, int> .Merge(Comparer <int> .Default, DuplicateHandling.LastValueWins, x, y) .GetEnumerator(); Assert.IsTrue(e.MoveNext()); Assert.AreEqual(1, e.Current.Key); Assert.AreEqual(2, e.Current.Value); Assert.IsTrue(e.MoveNext()); Assert.AreEqual(2, e.Current.Key); Assert.AreEqual(2, e.Current.Value); Assert.IsFalse(e.MoveNext()); }
/// <inheritdoc /> public override IEnumerable <KeyValuePair <string, object> > EnumParameters(MediaWikiVersion version) { var p = new OrderedKeyValuePairs <string, object> { { "clprop", "sortkey|timestamp|hidden" }, { "clshow", HiddenCategoryFilter.ToString("hidden", "!hidden", null) } }; if (CategorySelection != null) { p.Add("clcategories", MediaWikiHelper.JoinValues(CategorySelection)); } return(p); }
/// <inheritdoc /> public override IEnumerable <KeyValuePair <string, object> > EnumParameters(MediaWikiVersion version) { var p = new OrderedKeyValuePairs <string, object> { { "lhprop", "pageid|title|redirect" }, { "lhshow", RedirectFilter.ToString("redirect", "!redirect", null) } }; if (NamespaceSelection != null) { p.Add("lhnamespace", MediaWikiHelper.JoinValues(NamespaceSelection)); } return(p); }
public void TestOrderedKeyValuePairsOverloads() { IEnumerable <KeyValuePair <int, int> > e = new KeyValuePair <int, int> [0]; OrderedKeyValuePairs <int, int> ordered; ordered = new OrderedKeyValuePairs <int, int>(e); Assert.IsTrue(ordered.Comparer is KeyValueComparer <int, int>); Assert.IsTrue(ReferenceEquals(Comparer <int> .Default, ((KeyValueComparer <int, int>)ordered.Comparer).Comparer)); Assert.AreEqual(DuplicateHandling.None, ordered.DuplicateHandling); Assert.AreEqual(0x10000, ordered.InMemoryLimit); Assert.AreEqual(null, ordered.Serializer); ordered = new OrderedKeyValuePairs <int, int>(new ReverseOrder <int>(Comparer <int> .Default), e); Assert.IsTrue(ordered.Comparer is KeyValueComparer <int, int>); Assert.IsTrue(((KeyValueComparer <int, int>)ordered.Comparer).Comparer is ReverseOrder <int>); Assert.AreEqual(DuplicateHandling.None, ordered.DuplicateHandling); Assert.AreEqual(0x10000, ordered.InMemoryLimit); Assert.AreEqual(null, ordered.Serializer); KeyValueSerializer <int, int> ser = new KeyValueSerializer <int, int>(PrimitiveSerializer.Int32, PrimitiveSerializer.Int32); ordered = new OrderedKeyValuePairs <int, int>(new ReverseOrder <int>(Comparer <int> .Default), e, ser); Assert.IsTrue(ordered.Comparer is KeyValueComparer <int, int>); Assert.IsTrue(((KeyValueComparer <int, int>)ordered.Comparer).Comparer is ReverseOrder <int>); Assert.AreEqual(DuplicateHandling.None, ordered.DuplicateHandling); Assert.AreEqual(0x10000, ordered.InMemoryLimit); Assert.AreEqual(ser, ordered.Serializer); ordered = new OrderedKeyValuePairs <int, int>(new ReverseOrder <int>(Comparer <int> .Default), e, ser, 42); Assert.IsTrue(ordered.Comparer is KeyValueComparer <int, int>); Assert.IsTrue(((KeyValueComparer <int, int>)ordered.Comparer).Comparer is ReverseOrder <int>); Assert.AreEqual(DuplicateHandling.None, ordered.DuplicateHandling); Assert.AreEqual(42, ordered.InMemoryLimit); Assert.AreEqual(ser, ordered.Serializer); ordered = new OrderedKeyValuePairs <int, int>(new ReverseOrder <int>(Comparer <int> .Default), e, PrimitiveSerializer.Int32, PrimitiveSerializer.Int32); Assert.IsTrue(ordered.Comparer is KeyValueComparer <int, int>); Assert.IsTrue(((KeyValueComparer <int, int>)ordered.Comparer).Comparer is ReverseOrder <int>); Assert.AreEqual(DuplicateHandling.None, ordered.DuplicateHandling); Assert.AreEqual(0x10000, ordered.InMemoryLimit); Assert.IsNotNull(ordered.Serializer); ordered = new OrderedKeyValuePairs <int, int>(new ReverseOrder <int>(Comparer <int> .Default), e, PrimitiveSerializer.Int32, PrimitiveSerializer.Int32, 42); Assert.IsTrue(ordered.Comparer is KeyValueComparer <int, int>); Assert.IsTrue(((KeyValueComparer <int, int>)ordered.Comparer).Comparer is ReverseOrder <int>); Assert.AreEqual(DuplicateHandling.None, ordered.DuplicateHandling); Assert.AreEqual(42, ordered.InMemoryLimit); Assert.IsNotNull(ordered.Serializer); }
public void TestOrderedKeyValuePairsMerge() { var x = new[] { new KeyValuePair <int, int>(1, 1) }; var y = new[] { new KeyValuePair <int, int>(2, 2) }; IEnumerator <KeyValuePair <int, int> > e = OrderedKeyValuePairs <int, int> .Merge(new ReverseOrder <int>(Comparer <int> .Default), x, y) .GetEnumerator(); Assert.IsTrue(e.MoveNext()); Assert.AreEqual(2, e.Current.Key); Assert.IsTrue(e.MoveNext()); Assert.AreEqual(1, e.Current.Key); Assert.IsFalse(e.MoveNext()); }
public void TestMergeSortedEnumerations() { Dictionary <int, string> test = new Dictionary <int, string>(); List <IEnumerable <KeyValuePair <int, string> > > sets = new List <IEnumerable <KeyValuePair <int, string> > >(CreateSets(2, 100, test)); foreach (KeyValuePair <int, string> pair in OrderedKeyValuePairs <int, string> .Merge(Options.KeyComparer, DuplicateHandling.LastValueWins, sets.ToArray())) { string val; Assert.IsTrue(test.TryGetValue(pair.Key, out val)); Assert.AreEqual(pair.Value, val); Assert.IsTrue(test.Remove(pair.Key)); } Assert.AreEqual(0, test.Count); }
/// <inheritdoc /> public override IEnumerable <KeyValuePair <string, object> > EnumListParameters() { var p = new OrderedKeyValuePairs <string, object> { { "rvlimit", PaginationSize }, { "rvdir", TimeAscending ? "newer" : "older" }, { "rvstart", StartTime }, { "rvend", EndTime }, { "rvstartid", StartRevisionId }, { "rvendid", EndRevisionId }, { "rvuser", UserName }, { "rvexcludeuser", ExcludedUserName }, }; p.AddRange(_PropertyProvider.EnumParameters(Site.SiteInfo.Version)); return(p); }
public override IEnumerable <KeyValuePair <string, object> > EnumParameters(MediaWikiVersion version) { // Limit is 500 for user, and 5000 for bots. We take 300 in a batch. var p = new OrderedKeyValuePairs <string, object> { { "lllimit", 300 } }; if (LanguageLinkProperties != LanguageLinkProperties.None) { if (version >= new MediaWikiVersion(1, 23)) { var llprop = ""; if ((LanguageLinkProperties & LanguageLinkProperties.Url) == LanguageLinkProperties.Url) { llprop = "url"; } if ((LanguageLinkProperties & LanguageLinkProperties.LanguageName) == LanguageLinkProperties.LanguageName) { llprop = llprop.Length == 0 ? "langname" : (llprop + "|langname"); } if ((LanguageLinkProperties & LanguageLinkProperties.Autonym) == LanguageLinkProperties.Autonym) { llprop = llprop.Length == 0 ? "autonym" : (llprop + "|autonym"); } p.Add("llprop", llprop); } else if (LanguageLinkProperties == LanguageLinkProperties.Url) { p.Add("llurl", true); } else { throw new NotSupportedException("MediaWiki 1.22- only supports LanguageLinkProperties.Url."); } } if (LanguageName != null) { p.Add("lllang", LanguageName); } if (LanguageNameLanguage != null) { p.Add("llinlanguagecode", LanguageNameLanguage); } return(p); }
/// <inheritdoc /> public override IEnumerable <KeyValuePair <string, object> > EnumParameters(MediaWikiVersion version) { var p = new OrderedKeyValuePairs <string, object> { { "rvprop", FetchContent ? "ids|timestamp|flags|comment|user|userid|contentmodel|sha1|tags|size|content" : "ids|timestamp|flags|comment|user|userid|contentmodel|sha1|tags|size" } }; if (Slots != null || version >= new MediaWikiVersion(1, 32)) { // If user specified Slots explicitly, then we will respect it regardless of MW version. p.Add("rvslots", Slots == null ? RevisionSlot.MainSlotName : MediaWikiHelper.JoinValues(Slots)); } return(p); }
public static IAsyncEnumerable <string> EntityIdsFromSiteLinksAsync(WikiSite site, string siteName, IEnumerable <string> siteLinks) { Debug.Assert(siteName != null); Debug.Assert(siteLinks != null); var titleLimit = site.AccountInfo.HasRight(UserRights.ApiHighLimits) ? 500 : 50; return(AsyncEnumerableFactory.FromAsyncGenerator <string>(async(sink, ct) => { var req = new OrderedKeyValuePairs <string, string> { { "action", "wbgetentities" }, { "props", "sitelinks" }, { "sites", siteName }, { "sitefilter", siteName }, }; using (site.BeginActionScope(siteLinks)) { foreach (var partition in siteLinks.Partition(titleLimit).Select(partition => partition.ToList())) { //site.Logger.LogDebug("Fetching {Count} pages from {Site}.", partition.Count, site); for (int i = 0; i < partition.Count; i++) { if (partition[i] == null) { throw new ArgumentException("Link titles contain null element.", nameof(siteLinks)); } // Do some basic title normalization locally. // Note Wikibase cannot even normalize the first letter case of the title. partition[i] = partition[i].Trim(whitespaceAndUnderscore).Replace('_', ' '); } req["titles"] = MediaWikiHelper.JoinValues(partition); var jresult = await site.InvokeMediaWikiApiAsync(new MediaWikiFormRequestMessage(req), ct); var jentities = (JObject)jresult["entities"]; var nameIdDict = jentities.PropertyValues().Where(e => e["missing"] == null) .ToDictionary(e => (string)e["sitelinks"][siteName]["title"], e => (string)e["id"]); await sink.YieldAndWait(partition.Select(title => nameIdDict.TryGetValue(title, out var id) ? id : null)); } } })); }
/// <inheritdoc /> public override IEnumerable <KeyValuePair <string, object> > EnumParameters(MediaWikiVersion version) { var p = new OrderedKeyValuePairs <string, object> { { "exlimit", "max" }, { "exintro", IntroductionOnly }, { "exsectionformat", "plain" }, { "explaintext", AsPlainText }, }; if (MaxCharacters > 0) { p.Add("exchars", MaxCharacters); } if (MaxSentences > 0) { p.Add("exsentences", MaxSentences); } return(p); }
/// <inheritdoc /> public override IEnumerable <KeyValuePair <string, object> > EnumParameters(MediaWikiVersion version) { var p = new OrderedKeyValuePairs <string, object> { { "coprop", "globe|dim" }, }; if (QueryPrimaryCoordinate && QuerySecondaryCoordinate) { p.Add("coprimary", "all"); } else if (QueryPrimaryCoordinate) { p.Add("coprimary", "primary"); } else if (QuerySecondaryCoordinate) { p.Add("coprimary", "secondary"); } else { throw new ArgumentException(string.Format(Prompts.ExceptionArgumentExpectEitherBothTrue2, nameof(QueryPrimaryCoordinate), nameof(QuerySecondaryCoordinate))); } if (!QueryDistanceFromPoint.IsEmpty && QueryDistanceFromPage == null) { throw new ArgumentException(string.Format(Prompts.ExceptionArgumentExpectEitherDefault2, nameof(QueryDistanceFromPoint), nameof(QueryDistanceFromPage))); } if (!QueryDistanceFromPoint.IsEmpty) { p.Add("codistancefrompoint", QueryDistanceFromPoint.Latitude + "|" + QueryDistanceFromPoint.Longitude); } if (QueryDistanceFromPage != null) { p.Add("codistancefrompage", QueryDistanceFromPage); } return(p); }
/// <inheritdoc /> public override IEnumerable <KeyValuePair <string, object> > EnumParameters() { var p = new OrderedKeyValuePairs <string, object> { { "coprop", "globe|dim" }, }; if (QueryPrimaryCoordinate && QuerySecondaryCoordinate) { p.Add("coprimary", "all"); } else if (QueryPrimaryCoordinate) { p.Add("coprimary", "primary"); } else if (QuerySecondaryCoordinate) { p.Add("coprimary", "secondary"); } else { throw new ArgumentException("Either QueryPrimaryCoordinate or QuerySecondaryCoordinate should be true."); } if (!QueryDistanceFromPoint.IsEmpty && QueryDistanceFromPage == null) { throw new ArgumentException("Either QueryDistanceFromPoint or QueryDistanceFromPage should be non-set."); } if (!QueryDistanceFromPoint.IsEmpty) { p.Add("codistancefrompoint", QueryDistanceFromPoint.Latitude + "|" + QueryDistanceFromPoint.Longitude); } if (QueryDistanceFromPage != null) { p.Add("codistancefrompage", QueryDistanceFromPage); } return(p); }
public static async Task <Post> PostWallMessageAsync(WikiaSite site, object scopeInst, WikiPageStub owner, string messageTitle, string messageBody, IEnumerable <string> relatedPages, CancellationToken cancellationToken) { Debug.Assert(site != null); Debug.Assert(owner.HasTitle); using (site.BeginActionScope(scopeInst, owner)) { var tokenPurged = false; var pageTitle = owner.Title; var pageNamespaceId = owner.NamespaceId; if (pageTitle.StartsWith("Message Wall:", StringComparison.OrdinalIgnoreCase)) { pageTitle = pageTitle.Substring(13); if (!owner.HasNamespaceId) { pageNamespaceId = WikiaNamespaces.MessageWall; } } else if (pageTitle.StartsWith("Board:", StringComparison.OrdinalIgnoreCase)) { pageTitle = pageTitle.Substring(6); if (!owner.HasNamespaceId) { pageNamespaceId = WikiaNamespaces.Thread; } } else { var link = WikiLink.Parse(site, owner.Title); pageTitle = link.Title; pageNamespaceId = link.Namespace.Id; } var queryParams = new OrderedKeyValuePairs <string, object> { { "token", null }, { "controller", "WallExternal" }, { "method", "postNewMessage" }, { "format", "json" }, { "pagenamespace", pageNamespaceId }, { "pagetitle", pageTitle }, { "messagetitle", messageTitle }, { "body", messageBody }, { "notifyeveryone", 0 }, { "convertToFormat", "" }, }; if (relatedPages != null) { foreach (var title in relatedPages) { queryParams.Add("relatedTopics[]", title); } } BEGIN: queryParams["token"] = await site.GetTokenAsync("edit", cancellationToken); var jresult = await site.InvokeNirvanaAsync(new WikiaQueryRequestMessage(queryParams, true), WikiaJsonResonseParser.Default, cancellationToken); if (!string.Equals((string)jresult["status"], "True", StringComparison.OrdinalIgnoreCase)) { var errorMessage = (string)jresult["errormsg"]; if (errorMessage != null) { if (!tokenPurged) { if (errorMessage.IndexOf("There seems to be a problem with your login session", StringComparison.OrdinalIgnoreCase) >= 0) { await site.GetTokenAsync("edit", true, cancellationToken); tokenPurged = true; goto BEGIN; } } } errorMessage = "Status code indicates a failure: " + (string)jresult["status"]; throw new OperationFailedException(errorMessage); } var text = (string)jresult["message"]; var doc = new HtmlDocument(); doc.LoadHtml(text); var node = doc.DocumentNode.SelectSingleNode("li"); if (node == null) { throw new UnexpectedDataException("Cannot locate the comment text node in the Wikia API response."); } return(Post.FromHtmlNode(site, owner, node)); } }