Exemplo n.º 1
0
        public async IAsyncEnumerable <R4UCard> Parse(string urlOrLocalFile)
        {
            Log.Information("Starting...");
            var document  = await new Uri(urlOrLocalFile).DownloadHTML(("Referer", "rebirth-for-you.fandom.com")).WithRetries(10);
            var table     = document.QuerySelector <IHtmlTableElement>(".set-table");
            var isPRPage  = document.QuerySelectorAll(".portable-infobox").Count() < 1;
            var setData   = (!isPRPage) ? CreateInfoBoxDataTable(document.QuerySelector(".portable-infobox")) : null;
            var prSetData = (isPRPage) ? CreatePRSets(table) : null;

            Log.Verbose("Set Data: @{data}", setData);
            Log.Verbose("PR Set Data: @{prSetData}", prSetData);

            var context = new WikiSetContext {
                SetData = setData, URL = urlOrLocalFile, Set = ParseSet(setData), Sets = prSetData
            };

            if (table?.Rows != null)
            {
                foreach (var row in table.Rows)
                {
                    if (IsRowCompatible(row))
                    {
                        await foreach (var card in ParseCards(row, context))
                        {
                            yield return(card);
                        }
                    }
                }
            }
            Log.Information("Ending...");
            //throw new NotImplementedException();
            yield break;
        }
Exemplo n.º 2
0
        private async Task <R4UCard> ParseOriginalCard(WikiCardContext context, WikiSetContext setContext)
        {
            var card         = new R4UCard();
            var mainInfoBox  = context.MainInfoBox;
            var extraInfoBox = context.ExtraInfoBox;

            card.Name    = new MultiLanguageString();
            card.Name.JP = mainInfoBox.GetValueOrDefault("kanji", mainInfoBox["name"]);
            card.Name.EN = mainInfoBox["name"];
            card.Type    = TranslateType(mainInfoBox["card type"]);
            card.Set     = setContext.Set;
            if (card.Type == CardType.Character)
            {
                card.Cost   = int.Parse(mainInfoBox["cost"]);
                card.ATK    = int.Parse(mainInfoBox["atk"]);
                card.DEF    = int.Parse(mainInfoBox["def"]);
                card.Traits = await ParseTraits(context.RawMainInfoBox["trait"], setContext);
            }
            if (extraInfoBox.TryGetValue("card flavor(s)", out var flavor))
            {
                card.Flavor    = new MultiLanguageString();
                card.Flavor.EN = flavor;
            }
            if (extraInfoBox.TryGetValue("card abilities", out var abilities))
            {
                card.Effect = TranslateEffect(abilities);
                card.Color  = InferFromEffect(card.Effect);
            }
            else
            {
                // Assumed. All Partner cards do not have effects, and vanilla cards have [Relaxing]
                card.Color = CardColor.Red;
            }
            return(card);
        }
Exemplo n.º 3
0
        private async IAsyncEnumerable <R4UCard> ParseCards(IHtmlTableRowElement row, WikiSetContext context)
        {
            var cardLink = row.Cells[1].ChildNodes[0] as IHtmlAnchorElement;

            Log.Information("Following link: {link}", cardLink.Href);
            var cardDocument = await new Uri(cardLink.Href).DownloadHTML(("Referer", context.URL)).WithRetries(10);

            var rawMainInfoBox = cardDocument.QuerySelector <IHtmlTableElement>(".info-main > table") //
                                 .Rows
                                 .Select(x => (x.Cells[0].TextContent, x.Cells[1]))
                                 .ToDictionary(p => p.Item1.Trim().ToLower(), p => p.Item2)
            ;
            var mainInfoBox = rawMainInfoBox.ToDictionary(p => p.Key, p => p.Value.TextContent.Trim());

            var extraInfoBox = cardDocument.QuerySelector(".info-extra")                                         //
                               .ChildNodes                                                                       //
                               .Where(x => x is IHtmlTableElement)                                               //
                               .Select(x => x as IHtmlTableElement)                                              //
                               .Select(t => (t.Rows[0].Cells[0].TextContent, t.Rows[1].Cells[0].GetInnerText())) //
                               .ToDictionary(p => p.Item1.Trim().ToLower(), p => p.Item2.Trim());

            var cardContext = new WikiCardContext {
                ExtraInfoBox = extraInfoBox, MainInfoBox = mainInfoBox, RawMainInfoBox = rawMainInfoBox
            };

            Log.Debug("Main Info Box: @{mainInfoBox}", mainInfoBox);
            Log.Debug("Extra Info Box: @{extraInfoBox}", extraInfoBox);

            var originalCard = await ParseOriginalCard(cardContext, context);

            var serialRarityPairs = serialMatcher.Matches(extraInfoBox["card set(s)"])
                                    .Where(m => (context.SetData != null) ? m.Groups[2].Value == context.SetData["prefix"] : true)
                                    .Select(m => (Serial: m.Groups[1].Value, Rarity: m.Groups[3].Value))
                                    .ToList();

            var originalSerialRarity = serialRarityPairs.First(p => nonFoilRarities.Contains(p.Rarity));

            serialRarityPairs.Remove(originalSerialRarity);
            originalCard.Serial = originalSerialRarity.Serial;
            originalCard.Rarity = originalSerialRarity.Rarity;

            if (originalCard.Set == null)
            {
                Log.Debug("Card was obtained from a Promo Set. trying to obtain the actual set from the serial.");
                if (context.Sets.TryGetValue(releaseIDMatcher.Match(originalCard.Serial).Groups[1].Value, out var set))
                {
                    originalCard.Set = set;
                }
//                else
//                    originalCard.Set = CreatePromoSet(cardContext);

                /*
                 * using (var db = _database()) {
                 *  originalCard.Set = await db.R4UReleaseSets.AsQueryable().Where(set => set.ReleaseCode == releaseIDMatcher.Match(originalCard.Serial).Groups[1].Value).FirstAsync();
                 * }
                 */
            }
            yield return(originalCard);

            foreach (var foilSRP in serialRarityPairs)
            {
                var foilCard = originalCard.Clone();
                foilCard.Rarity  = foilSRP.Rarity;
                foilCard.Serial  = foilSRP.Serial;
                foilCard.NonFoil = originalCard;
                yield return(foilCard);
            }

            Log.Debug($"Original Card: {JsonSerializer.Serialize(originalCard)}");
            //await Task.Delay(60000);
            yield break;
        }