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); }
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 => m.Groups[2].Value == context.SetData["prefix"]) .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; 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; }