コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        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());
        }
コード例 #4
0
        /// <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);
        }
コード例 #5
0
        /// <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());
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        /// <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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        /// <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);
        }
コード例 #12
0
        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));
                    }
                }
            }));
        }
コード例 #13
0
        /// <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);
        }
コード例 #14
0
        /// <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);
        }
コード例 #15
0
        /// <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);
        }
コード例 #16
0
        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));
            }
        }