Пример #1
0
        public async IAsyncEnumerable <WeissSchwarzCard> Parse(string urlOrFile)
        {
            if (encoreDecksSiteSetMatcher.IsMatch(urlOrFile))
            {
                urlOrFile = TransformIntoAPIFormat(urlOrFile);
            }

            IList <dynamic> setCards = null;

            do
            {
                try
                {
                    setCards = await urlOrFile.WithRESTHeaders().GetJsonListAsync();
                }
                catch (FlurlHttpException)
                {
                    // Do nothing
                }
            } while (setCards == null);
            foreach (var setCard in setCards)
            {
                WeissSchwarzCard result = new WeissSchwarzCard();
                result.Name = new MultiLanguageString();
                var enOptional = DynamicExtensions.AsOptional(setCard.locale.EN);
                var jpOptional = DynamicExtensions.AsOptional(setCard.locale.NP);
                result.Name.EN = enOptional.name;
                result.Name.JP = jpOptional.name;
                (List <object>, List <object>)attributes = (enOptional.attributes, jpOptional.attributes);
                result.Traits   = TranslateTraits(attributes).ToList();
                result.Effect   = ((List <object>)enOptional.ability)?.Cast <string>().ToArray();
                result.Rarity   = setCard.rarity;
                result.Side     = TranslateSide(setCard.side);
                result.Level    = (int?)setCard.level;
                result.Cost     = (int?)setCard.cost;
                result.Power    = (int?)setCard.power;
                result.Soul     = (int?)setCard.soul;
                result.Triggers = TranslateTriggers(setCard.trigger);

                result.Serial = WeissSchwarzCard.GetSerial(setCard.set.ToString(), setCard.side.ToString(), setCard.lang.ToString(), setCard.release.ToString(), setCard.sid.ToString());

                result.Type    = TranslateType(setCard.cardtype);
                result.Color   = TranslateColor(setCard.colour);
                result.Remarks = $"Parsed: {this.GetType().Name}";
                yield return(result);
            }
            // Get
            yield break;
        }
Пример #2
0
    public async IAsyncEnumerable <WeissSchwarzCard> Parse(string urlOrLocalFile, IProgress <SetParserProgressReport> progress, [EnumeratorCancellation] CancellationToken cancellationToken)
    {
        if (encoreDecksSiteSetMatcher.IsMatch(urlOrLocalFile))
        {
            urlOrLocalFile = TransformIntoAPIFormat(urlOrLocalFile);
        }

        IList <dynamic> setCards       = null;
        var             progressReport = new SetParserProgressReport();

        do
        {
            try
            {
                progressReport = progressReport with
                {
                    ReportMessage = new MultiLanguageString
                    {
                        EN = "Obtaining list of cards..."
                    },
                    Percentage = 1
                };
                progress.Report(progressReport);
                setCards = await urlOrLocalFile.WithRESTHeaders().GetJsonListAsync(cancellationToken);
            }
            catch (FlurlHttpException)
            {
                // Do nothing
            }
        } while (setCards == null);

        progressReport = progressReport with {
            ReportMessage = new MultiLanguageString {
                EN = $"Obtained [{setCards.Count}] cards."
            },
            Percentage = 10
        };
        progress.Report(progressReport);

        foreach (var setCard in setCards)
        {
            cancellationToken.ThrowIfCancellationRequested();
            WeissSchwarzCard result = new WeissSchwarzCard();
            result.Name = new MultiLanguageString();
            var enOptional = DynamicExtensions.AsOptional(setCard.locale.EN);
            var jpOptional = DynamicExtensions.AsOptional(setCard.locale.NP);
            if (((string)enOptional.source)?.ToLower() != "akiba")
            {
                result.Name.EN = enOptional.name;
            }
            result.Name.JP = jpOptional.name;
            (List <object>, List <object>)attributes = (enOptional.attributes, jpOptional.attributes);
            result.Traits   = TranslateTraits(attributes).ToList();
            result.Effect   = ((List <object>)enOptional.ability)?.Cast <string>().ToArray();
            result.Rarity   = setCard.rarity;
            result.Side     = TranslateSide(setCard.side);
            result.Level    = (int?)setCard.level;
            result.Cost     = (int?)setCard.cost;
            result.Power    = (int?)setCard.power;
            result.Soul     = (int?)setCard.soul;
            result.Triggers = TranslateTriggers(setCard.trigger);

            //result.Serial = setCard.cardcode;
            if (!String.IsNullOrEmpty(setCard.imagepath))
            {
                result.Images.Add(new Uri($"https://www.encoredecks.com/images/{setCard.imagepath}"));
            }

            // TODO: Delete all methods related with generating serial.
            // TODO: Switch once LLDX checkbox is checked properly. See: https://trello.com/c/WCT94Sk0/2-card-code-needs-to-be-stored-seperatly-from-side-release
            result.Serial = WeissSchwarzCard.GetSerial(setCard.set.ToString(), setCard.side.ToString(), setCard.lang.ToString(), setCard.release.ToString(), setCard.sid.ToString());

            result.Type    = TranslateType(setCard.cardtype);
            result.Color   = TranslateColor(setCard.colour);
            result.Remarks = $"Parsed: {this.GetType().Name}";

            progressReport = progressReport with
            {
                ReportMessage = new MultiLanguageString {
                    EN = $"Parsed [{result.Serial}]."
                },
                Percentage  = 10 + (int)((progressReport.CardsParsed + 1f) * 90 / setCards.Count),
                CardsParsed = progressReport.CardsParsed + 1
            };
            progress.Report(progressReport);

            yield return(result);
        }
        yield break;
    }