Esempio n. 1
0
        /// <summary>
        /// HTMLを解析します。
        /// </summary>
        /// <param name="html">解析したいHTMLを指定します。</param>
        /// <param name="tempo">店舗情報</param>
        /// <param name="slotModels">解析したい機種を指定します。</param>
        /// <returns></returns>
        public async Task <SlotPlayData> AnalyseAsync(Stream html, DbSet <SlotModel> dbSlotModel, Tempo tempo, List <string> slotModels)
        {
            if (html == null)
            {
                return(null);
            }

            // HTMLをAngleSharp.Parser.Html.HtmlParserオブジェクトパースさせる
            var doc = await _htmlParser.ParseAsync(html);

            //Bodyを取得
            var body = doc.QuerySelector("#Main-Contents");

            //台名を取得
            var id_pachinkoTi    = body.QuerySelector("#pachinkoTi");
            var slotMachineTitle = id_pachinkoTi.QuerySelector("strong").TextContent;

            //指定した機種でなければ終了
            if (slotModels != null &&
                !slotModels.Contains(slotMachineTitle))
            {
                return(null);
            }

            //以下のように取得される
            //(20円スロット                            | 1番台)
            var coinPriceAndMachineNO       = id_pachinkoTi.QuerySelector("span").TextContent;
            var coinPriceAndMachineNOFormat = coinPriceAndMachineNO.Substring(1, coinPriceAndMachineNO.Length - 2).Split('|');

            for (var i = 0; i < coinPriceAndMachineNOFormat.Length; ++i)
            {
                coinPriceAndMachineNOFormat[i] = coinPriceAndMachineNOFormat.ElementAt(i).Trim();
            }

            //コイン単価を取得する
            var coinPricePosition = coinPriceAndMachineNOFormat.First().IndexOf('円');
            var coinPrice         = coinPriceAndMachineNOFormat.First().Substring(0, coinPricePosition);

            //台番号を取得する
            var machineNOPosition = coinPriceAndMachineNOFormat.ElementAt(1).IndexOf('番');
            var machineNO         = coinPriceAndMachineNOFormat.ElementAt(1).Substring(0, machineNOPosition);

            //最新更新日時を取得する
            var latestClass = body.QuerySelector(".latest");
            var latest      = (latestClass == null) ? body.QuerySelector(".older").TextContent : latestClass.TextContent;

            //各回数を取得する
            var class_TextBig25 = body.QuerySelector(".Text-Big25");

            if (class_TextBig25 == null)
            {
                return(null);
            }
            var bbCount          = class_TextBig25.TextContent;
            var textBig19classes = body.QuerySelectorAll(".Text-Big19");
            var rbCount          = textBig19classes?.First().TextContent;
            var artCount         = textBig19classes.ElementAt(1).TextContent;
            var startCount       = textBig19classes.ElementAt(2).TextContent;

            //取得した機種がスルー回数を狙える機種ならばスルー回数を取得する
            var status        = string.Empty;
            var winingHistory = new List <WiningType>();
            var db            = new SlotAddictionDBContext();
            var slotModelInfo = db.SlotModels.SingleOrDefault(x => x.SlotModelName.Contains(slotMachineTitle));

            if (slotModelInfo != null &&
                slotModelInfo.ThroughType == "Basilisk_Kizuna")
            {
                //大当たり履歴が格納されているnumericValueTableクラスを取得
                var class_numericValueTable = doc.QuerySelector(".numericValueTable");

                var trTagChildTdTags = class_numericValueTable.QuerySelectorAll("tr td");
                for (var i = 3; i < trTagChildTdTags.Length; i += 5)
                {
                    var winingType = (WiningType)Enum.Parse(typeof(WiningType), trTagChildTdTags[i].TextContent);
                    winingHistory.Add(winingType);
                }
            }

            if (winingHistory.Any())
            {
                if (winingHistory.First() == WiningType.ART ||
                    winingHistory.First() == WiningType.RB)
                {
                    var throughCount = winingHistory.Skip(1).TakeWhile(x => x == WiningType.BB).Count();
                    if (throughCount == 11)
                    {
                        status = "ART + BB11回スルー";
                    }
                    else if (throughCount == 10)
                    {
                        status = "ART + BB10回スルー";
                    }
                }

                else
                {
                    var throughCount = winingHistory.TakeWhile(x => x == WiningType.BB).Count();
                    if (throughCount == 10)
                    {
                        status = "BB10回スルー";
                    }
                    else if (throughCount == 9)
                    {
                        status = "BB9回スルー";
                    }
                }
            }

            return(new SlotPlayData
            {
                StoreName = tempo.StoreName,
                Title = slotMachineTitle,
                CoinPrice = Convert.ToDecimal(coinPrice),
                MachineNO = Convert.ToInt32(machineNO),
                LatestUpdateDatetime = latest,
                BigBonusCount = Convert.ToInt32(bbCount),
                RegulerBonusCount = Convert.ToInt32(rbCount),
                ARTCount = Convert.ToInt32(artCount),
                StartCount = Convert.ToInt32(startCount),
                Status = status,
                //WiningHistory = winingHistory,
            });
        }