/// <summary>
        /// XML參數建構式
        /// <![CDATA[
        /// <條件 Checked="True" Type="DemeritAmountEach" 大過="3" 功過相抵="True" 獎勵換算="1:3,1:3" 懲戒換算="1:3,1:3"/>
        /// ]]>
        /// </summary>
        /// <param name="element"></param>
        public DemeritAmountGraduateEval(XmlElement element)
        {
            _result = new EvaluationResult();
            _amount = decimal.Parse(element.GetAttribute("大過"));
            bool b;

            _balance = bool.TryParse(element.GetAttribute("功過相抵"), out b) ? b : true;

            _meritConverter   = new DisciplineConverter(element.GetAttribute("獎勵換算"));
            _demeritConverter = new DisciplineConverter(element.GetAttribute("懲戒換算"));
            //<條件 Checked="True" Type="DemeritAmountEach"
            //      大過="3" 功過相抵="True" 獎勵換算="1:3,1:3" 懲戒換算="1:3,1:3"/>
        }
예제 #2
0
        public BetsResponse Parse(string html, AgilityRestManager arm, TipsterResponse tipster, ExtendedTime fromDateClientLocal, TimeZoneKind serverTimezone)
        {
            HandleErrors(html);

            var fromDate = fromDateClientLocal?.ToTimezone(serverTimezone); // konwertuj na strefę czasową serwera, nie znamy czasu serwera, prawdopodobnie UTC
            var newBets  = new List <BetResponse>();

            var spanBettingPicks = html.HtmlRoot()
                                   .Descendants()
                                   .Where(n => n.HasClass("bettingpick"))
                                   .ToArray();

            var i = 0;

            var brpLs = LocalizationManager.GetLoaderBetshootResponseParseLocalizedStrings();

            foreach (var spanBp in spanBettingPicks)
            {
                OnInformationSending($"{brpLs[0][0]} ({++i} {brpLs[0][1]} {spanBettingPicks.Length})..."); // ($"Wczytywanie zakładów ({++i} z {spanBettingPicks.Length})...");
                var strDate = spanBp.Descendants()
                              .Single(x => x.HasClass("bettingpickdate"))
                              .InnerText;
                var dateArr            = strDate.Split('-').Swap(0, 2);
                var date               = new ExtendedTime(new DateTime(dateArr[2].ToInt(), dateArr[1].ToInt(), dateArr[0].ToInt()));
                var spanBetResultClass = spanBp.Descendants("span")
                                         .Single(span => span.HasClass("mgreen", "mred", "morange", "munits2"))
                                         .GetOnlyClass(); // fix opisany w konwerterze
                var stake  = spanBp.Descendants("span").Single(span => span.HasClass("pick-stake")).InnerText.Trim().ToInt();
                var profit = spanBp.Descendants("span").Single(span => span.HasClass("munits")).InnerText.Trim().ToDoubleN();

                var pickStr           = spanBp.Descendants("span").Single(span => span.HasClass("predict")).InnerText.RemoveHTMLSymbols();
                var spanPickTeams     = spanBp.Descendants("span").Single(span => span.HasClass("pick-teams"));
                var aPickTeams        = spanPickTeams.Descendants("a").SingleOrDefault();
                var matchStr          = (aPickTeams ?? spanPickTeams).InnerText.RemoveHTMLSymbols();
                var rawMatchResultStr = spanBp.Descendants("span").Single(x => x.HasClass("mresult")).InnerText;
                var odds = spanBp.Descendants("span").Single(x => x.HasClass("pick-odd")).InnerText.ToDouble();

                var    hrefAPickTeams = aPickTeams?.GetAttributeValue("href", "");
                string disciplineStr  = null;
                string leagueName     = null;
                if (hrefAPickTeams != null)
                {
                    var disciplineLeagueStr = arm.GetHtml(hrefAPickTeams).HtmlRoot().Descendants("p")
                                              .Single(p => p.InnerText.Trim().EndsWithAny(tipster.Name)).InnerText.RemoveHTMLSymbols().Split(" - ");
                    disciplineStr = disciplineLeagueStr[0];
                    leagueName    = disciplineLeagueStr[1];
                }

                var newBet = new BetResponse
                {
                    Date        = date,
                    HomeName    = matchStr.BeforeFirst(" - "),
                    AwayName    = matchStr.AfterFirst(" - "),
                    Pick        = PickConverter.ParseToPickResponse(pickStr, matchStr),
                    MatchResult = MatchConverter.ToMatchResultResponse(rawMatchResultStr),
                    BetResult   = BetConverter.ParseBetshootResultStringToBetResult(spanBetResultClass, stake, odds, profit),
                    Odds        = odds,
                    Discipline  = DisciplineConverter.ToDisciplineTypeOrNull(disciplineStr),
                    LeagueName  = leagueName
                };

                if (fromDate != null && date < fromDate)
                {
                    break;
                }

                newBets.Add(newBet);
            }

            OnInformationSending(brpLs[1][0]);

            Tipster = tipster;
            Bets    = newBets;
            return(this);
        }
예제 #3
0
        public BetResponse Parse(AsianoddsSeleniumDriverManager sdm, BetRequest betRequest, TimeZoneKind tz, AsianoddsClient ao)
        {
            OnInformationSending("Wyszukiwanie zakładu...");

            HandleErrors(sdm);

            if (!betRequest.PickChoice?.In(_supportedPickChoices) == true)
            {
                throw new AsianoddsException("Typ zakładu nie jest wspierany przez Asianodds");
            }

            var ddlDisciplineType   = sdm.FindElementByXPath("//*[@id='selAdvSearchSportType']");
            var optionDisciplines   = ddlDisciplineType.FindElements(By.TagName("option")).ToArray();
            var avalDisciplines     = optionDisciplines.Select(o => o.Text.ToEnum <DisciplineType>());
            var disciplinesToSearch = (betRequest.Discipline?.ToEnumerable() ?? avalDisciplines).ToArray();
            var searchTerms         = $"{betRequest.MatchHomeName} {betRequest.MatchAwayName}".Trim().Split(" ")
                                      .Select(w => w.Trim().ToLower()).Where(w => w.Length > 2 && !w.ContainsAny("(", ")")).Distinct().ToArray();
            var          resultsNum         = 0;
            var          candidateBets      = new List <BetRequest>();
            const string xpathDivSearchInfo = ".//div[@id='gamecontainer']//div[@class='divNoEvent']";
            var          txtSearchMatch     = sdm.FindElementByXPath("//*[@id='txtFilterGamesAndLeauges']");

            bool timedOut;

            do
            {
                timedOut = sdm.WaitUntilOrTimeout(d => optionDisciplines.All(o => o.Text.Length > 0)); // Poczekaj na załadowanie ddl dyscyplin
                if (timedOut)
                {
                    ao.EnsureLogin();
                }
            } while (timedOut);

            bool IsSearchInProgress()
            {
                bool?searchInProgress = null;

                sdm.TryUntilElementAttachedToPage(() =>
                                                  searchInProgress = sdm.FindElementsByXPath(xpathDivSearchInfo).SingleOrDefault()?.Text
                                                                     .ContainsAny("searching for") == true, true);
                return(searchInProgress.ToBool());
            }

            bool areNoResultsFound()
            {
                bool?noResultsFound = null;

                sdm.TryUntilElementAttachedToPage(() => noResultsFound = sdm.FindElementsByXPath(xpathDivSearchInfo).SingleOrDefault()?.Text
                                                                         .ContainsAny("too many", "no result") == true, true);
                return(noResultsFound.ToBool());
            }

            IWebElement[] divLeagues = null;
            bool areLeaguesFound()
            {
                divLeagues = null;
                sdm.TryUntilElementAttachedToPage(() =>
                                                  divLeagues = sdm.FindElementsByXPath(".//div[@id='gamecontainer']//div[@class='ileaugegroup']")
                                                               .Where(div => !div.FindElement(By.ClassName("leauge")).GetAttribute("value")
                                                                      .ContainsAny("NO. OF", "FANTASY MATCH", "- TO KICK OF", "SCORED")).ToArray(), true);
                return(divLeagues?.Any() == true);
            }

            foreach (var discipline in disciplinesToSearch)
            {
                var strDisciplineLocalized = DisciplineConverter.DisciplineTypeToLocalizedString(discipline);
                OnInformationSending($"Przeszukiwanie dyscypliny: {strDisciplineLocalized}...");

                var strD = discipline.EnumToString();

                var optionDiscipline = optionDisciplines.Single(o => o.Text.EqIgnoreCase(strD));

                ddlDisciplineType.Click();
                optionDiscipline.Click();

                foreach (var searchTerm in searchTerms)
                {
                    OnInformationSending($"Przeszukiwanie dyscypliny: {strDisciplineLocalized}, słowo kluczowe: \"{searchTerm}\"...");

                    var divTimePeriods = (discipline == DisciplineType.Basketball
                        ? sdm.FindElementsByXPath("//div[@id='lbl_running_basketball' or @id='lbl_today_basketball' or @id='lbl_early_basketball']")
                        : sdm.FindElementsByXPath("//div[@id='lbl_running' or @id='lbl_today' or @id='lbl_early']")).ToArray();
                    if (divTimePeriods.Length != 3)
                    {
                        throw new AsianoddsException("Pobrano niepoprawne menu przedziałów czasowych");
                    }

                    foreach (var divTimePeriod in divTimePeriods)
                    {
                        var divTimePeriodId     = divTimePeriod.GetId();
                        var localizedTimePeriod = divTimePeriodId.ContainsAny("running")
                            ? "na żywo"
                            : divTimePeriodId.ContainsAny("today")
                                ? "dziś"
                                : divTimePeriodId.ContainsAny("early")
                                    ? "późniejsze wydarzenia" : "nieznany przedział czasowy";
                        OnInformationSending($"Przeszukiwanie dyscypliny: {strDisciplineLocalized}, słowo kluczowe: \"{searchTerm}\", przedział czasowy: \"{localizedTimePeriod}\"...");

                        sdm.HideElement(By.XPath("//*[@id='footer']"));
                        divTimePeriod.Click();

                        txtSearchMatch.Clear();
                        txtSearchMatch.SendKeys(searchTerm);

                        OnInformationSending($"Oczekiwanie na rozpoczęcie wyszukiwania: {strDisciplineLocalized}, słowo kluczowe: \"{searchTerm}\", przedział czasowy: \"{localizedTimePeriod}\"...");
                        sdm.Wait.Until(d => IsSearchInProgress());
                        OnInformationSending($"Oczekiwanie na wyniki: {strDisciplineLocalized}, słowo kluczowe: \"{searchTerm}\", przedział czasowy: \"{localizedTimePeriod}\"...");
                        sdm.Wait.Until(d => areNoResultsFound() || areLeaguesFound());
                        var areResultsFound = divLeagues?.Any() == true;

                        if (areResultsFound)
                        {
                            OnInformationSending($"Znaleziono wyniki (ligi: {divLeagues.Length}): {strDisciplineLocalized}, słowo kluczowe: \"{searchTerm}\", przedział czasowy: \"{localizedTimePeriod}\"");

                            foreach (var divLeague in divLeagues)
                            {
                                var tblGameRows = divLeague.FindElements(By.CssSelector("table.game_panel_tmp.igametable")).ToArray();

                                foreach (var tblGameRow in tblGameRows)
                                {
                                    try
                                    {
                                        string league = null;
                                        sdm.TryUntilElementAttachedToPage(() => league = tblGameRow.FindElement(By.XPath(".//td[1]/input[@class='leauge']")).GetAttribute("value").AfterLast("*").Trim());
                                        string strTime = null;
                                        sdm.TryUntilElementAttachedToPage(() => strTime = tblGameRow.FindElement(By.XPath(".//td[1]/input[@class='hidKickofTime']")).GetAttribute("value").Trim());
                                        IWebElement tdTeamNames = null;
                                        sdm.TryUntilElementAttachedToPage(() => tdTeamNames = tblGameRow.FindElement(By.XPath(".//td[2]")));

                                        var    time     = strTime.ToExtendedTime("MM/dd/yyyy hh:mm:ss.fff tt", tz); // 04/28/2018 06:30:00.000 PM
                                        string homeName = null;
                                        sdm.TryUntilElementAttachedToPage(() => homeName = tdTeamNames.FindElement(By.XPath(".//span[contains(@class, 'Home') and contains(@class, 'samehidegroup1')]")).GetAttribute("innerText").Trim());
                                        string awayName = null;
                                        sdm.TryUntilElementAttachedToPage(() => awayName = tdTeamNames.FindElement(By.XPath(".//span[contains(@class, 'Away') and contains(@class, 'samehidegroup1')]")).GetAttribute("innerText").Trim());

                                        bool correctWordCondition(string w) => !w.ContainsAny("(", ")");

                                        var homeSameWords  = homeName.SameWords(betRequest.MatchHomeName, 3, correctWordCondition);
                                        var awaySameWords  = awayName.SameWords(betRequest.MatchHomeName, 3, correctWordCondition);
                                        var timeDifference = (time - betRequest.Date).Abs();

                                        IWebElement[] spanBetItems = null;
                                        sdm.TryUntilElementAttachedToPage(() => spanBetItems = tblGameRow.FindElements(By.XPath(".//span[contains(@class, 'BetItem')]"))
                                                                                               .Where(bi => !string.IsNullOrWhiteSpace(bi.Text)).ToArray());

                                        foreach (var spanBetItem in spanBetItems)
                                        {
                                            OnInformationSending($"Budowa ścieżki dla elementu nr {++resultsNum}: {strDisciplineLocalized}, słowo kluczowe: \"{searchTerm}\", przedział czasowy: \"{localizedTimePeriod}\"...");
                                            var candidateBetReq = new BetRequest
                                            {
                                                Discipline    = discipline,
                                                Date          = time,
                                                MatchHomeName = homeName.Split(" ").Select(w => w.Length > 0 ? w.Take(1).ToUpper() + w.Skip(1).ToLower() : w).JoinAsString(" "),
                                                MatchAwayName = awayName.Split(" ").Select(w => w.Length > 0 ? w.Take(1).ToUpper() + w.Skip(1).ToLower() : w).JoinAsString(" "),
                                                LeagueName    = league,

                                                MatchId = betRequest.MatchId,

                                                Keyword         = searchTerm,
                                                HomeCommonWords = homeSameWords.Length,
                                                AwayCommonWords = awaySameWords.Length,
                                                TimeDifference  = timeDifference,
                                                XPath           = spanBetItem.XPath(),
                                                TimePeriodXPath = $"//div[@id='{divTimePeriodId}']"
                                            };

                                            OnInformationSending($"Aktualizacja elementu nr {++resultsNum}: {strDisciplineLocalized}, słowo kluczowe: \"{searchTerm}\", przedział czasowy: \"{localizedTimePeriod}\"...");

                                            var spanBetItemClasses = spanBetItem.GetClasses();

                                            if (spanBetItemClasses.Contains("FTHomeOdd"))
                                            {
                                                candidateBetReq.PickChoice = PickChoice.Home;
                                                candidateBetReq.PickValue  = null;
                                            }
                                            else if (spanBetItemClasses.Contains("FTAwayOdd"))
                                            {
                                                candidateBetReq.PickChoice = PickChoice.Away;
                                                candidateBetReq.PickValue  = null;
                                            }
                                            else if (spanBetItemClasses.Contains("FTDrawOdd"))
                                            {
                                                candidateBetReq.PickChoice = PickChoice.Draw;
                                                candidateBetReq.PickValue  = null;
                                            }
                                            else if (spanBetItemClasses.ContainsAny("FTHDPHomeOdd", "FTHDPAwayOdd"))
                                            {
                                                double?handicapHome = null;
                                                sdm.TryUntilElementAttachedToPage(() =>
                                                {
                                                    var strFTHDPHome = tblGameRow.FindElement(By.XPath(".//span[contains(@class, 'FTHDPHome') and not(contains(@class, 'BetItem'))]")).Text.Trim();
                                                    if (!string.IsNullOrEmpty(strFTHDPHome))
                                                    {
                                                        handicapHome = StrSplitToDouble(strFTHDPHome.Split("-"));
                                                    }
                                                });
                                                double?handicapAway = null;
                                                sdm.TryUntilElementAttachedToPage(() =>
                                                {
                                                    var strFTHDPAway = tblGameRow.FindElement(By.XPath(".//span[contains(@class, 'FTHDPAway') and not(contains(@class, 'BetItem'))]")).Text.Trim();
                                                    if (!string.IsNullOrEmpty(strFTHDPAway))
                                                    {
                                                        handicapAway = StrSplitToDouble(strFTHDPAway.Split("-"));
                                                    }
                                                });

                                                if (handicapHome == null && handicapAway == null)
                                                {
                                                    throw new AsianoddsException("Nie można pobrac wartości handicapu dla zakładu");
                                                }

                                                if (spanBetItemClasses.ContainsAny("FTHDPHomeOdd"))
                                                {
                                                    if (handicapHome != null)
                                                    {
                                                        candidateBetReq.PickChoice = PickChoice.HomeAsianHandicapSubtract;
                                                        candidateBetReq.PickValue  = handicapHome; // -
                                                    }
                                                    else
                                                    {
                                                        candidateBetReq.PickChoice = PickChoice.HomeAsianHandicapAdd;
                                                        candidateBetReq.PickValue  = handicapAway;
                                                    }
                                                }
                                                else if (spanBetItemClasses.ContainsAny("FTHDPAwayOdd"))
                                                {
                                                    if (handicapAway != null)
                                                    {
                                                        candidateBetReq.PickChoice = PickChoice.AwayAsianHandicapSubtract;
                                                        candidateBetReq.PickValue  = handicapAway; // -
                                                    }
                                                    else
                                                    {
                                                        candidateBetReq.PickChoice = PickChoice.AwayAsianHandicapAdd;
                                                        candidateBetReq.PickValue  = handicapHome;
                                                    }
                                                }
                                            }
                                            else if (spanBetItemClasses.ContainsAny("FTOver", "FTUnder"))
                                            {
                                                string[] goalsThresholdSplit = null;
                                                sdm.TryUntilElementAttachedToPage(() => goalsThresholdSplit = tblGameRow.FindElement(By.XPath(".//span[contains(@class, 'FTGoal') and not(contains(@class, 'BetItem'))]")).Text.Trim()
                                                                                                              .Split("-"));
                                                var goals = StrSplitToDouble(goalsThresholdSplit);

                                                candidateBetReq.PickChoice = spanBetItemClasses.ContainsAny("FTOver") ? PickChoice.Over : PickChoice.Under;
                                                candidateBetReq.PickValue  = goals.Round(2);
                                            }
                                            else
                                            {
                                                continue;
                                            }

                                            candidateBets.Add(candidateBetReq);

                                            OnInformationSending($"Zaaktualizowano element nr {++resultsNum}: {strDisciplineLocalized}, słowo kluczowe: \"{searchTerm}\", przedział czasowy: \"{localizedTimePeriod}\"...");
                                        }
                                    }
                                    catch (StaleElementReferenceException)
                                    {
                                        OnInformationSending($"Błąd elementu nr {++resultsNum} (element przestał być aktualny): {strDisciplineLocalized}, słowo kluczowe: \"{searchTerm}\", przedział czasowy: \"{localizedTimePeriod}\"");
                                        // wiersz został usunięty, bo zakład jest np nieaktualny, dotyczy zwłaszcza LIVE
                                    }
                                }
                            }

                            break;
                        }

                        OnInformationSending($"Brak wyników: {strDisciplineLocalized}, słowo kluczowe: \"{searchTerm}\", przedział czasowy: \"{localizedTimePeriod}\"");
                    }
                }
            }

            if (!candidateBets.Any())
            {
                throw new AsianoddsException("Brak zakładów dla wybranego meczu");
            }

            var candidateBetsDistinct = candidateBets.Distinct().OrderBy(b => b.MatchHomeName)
                                        .ThenBy(b => b.PickChoice.EnumToString()).ThenBy(b => b.PickValue).ToList();

            OnInformationSending($"Filtrowanie potencjalnych zakładów {candidateBetsDistinct.Count}...");

            var candidateBetsWithLowestTimeDifference = candidateBetsDistinct.Where(b => b.TimeDifference < TimeSpan.FromDays(2)).ToList();

            var candidateBetsWithSamePick = candidateBetsWithLowestTimeDifference
                                            .Where(b => b.PickChoice == betRequest.PickChoice && b.PickValue.Eq(betRequest.PickValue)).ToList();

            if (!candidateBetsWithSamePick.Any() && betRequest.PickValue.Eq(0))
            {
                if (betRequest.PickChoice == PickChoice.HomeAsianHandicapAdd)
                {
                    betRequest.PickChoice = PickChoice.HomeAsianHandicapSubtract;
                }
                else if (betRequest.PickChoice == PickChoice.AwayAsianHandicapAdd)
                {
                    betRequest.PickChoice = PickChoice.AwayAsianHandicapSubtract;
                }
            }
            candidateBetsWithSamePick = candidateBetsWithLowestTimeDifference
                                        .Where(b => b.PickChoice == betRequest.PickChoice && b.PickValue.Eq(betRequest.PickValue)).ToList();

            var finalBet = candidateBetsWithSamePick
                           .Where(b => b.HomeCommonWords + b.AwayCommonWords >= 1)
                           .MaxBy(b => b.HomeCommonWords + b.AwayCommonWords);

            OnInformationSending("Znaleziono zakład");

            var stake = (betRequest.Stake / 1).Round(); // TODO: użyć API do konwersji walut

            OnInformationSending("Zawieranie zakładu...");

            var divFinalTimePeriod = sdm.FindElementByXPath(finalBet.TimePeriodXPath);

            divFinalTimePeriod.Click();
            txtSearchMatch.Clear();
            txtSearchMatch.SendKeys(finalBet.Keyword);
            sdm.Wait.Until(d => IsSearchInProgress());
            sdm.Wait.Until(d => areNoResultsFound() || areLeaguesFound());
            var spanBet = sdm.FindElementByXPath(finalBet.XPath);

            spanBet.Click();

            var txtStake    = sdm.FindElementByXPath("//*[@id='betdlg_USR_AMOUNT']");
            var btnPlaceBet = sdm.FindElementByXPath("//*[@id='btnDlgPlaceBetSubmit']");

            txtStake.SendKeys($"{stake:0}");
            sdm.Wait.Until(d => btnPlaceBet.Enabled);
            btnPlaceBet.Click();

            var btnConfirmBet = sdm.FindElementByXPath("//*[@id='dlgPlaceBet']/div/div[6]/button[2]"); // //*[@id='dlgPlaceBet']//button[contains(@class, 'btnYes')]

            sdm.Wait.Until(d => btnConfirmBet.Displayed && btnConfirmBet.Enabled);
            btnConfirmBet.Click();

            OnInformationSending("Wczytywanie informacji o zakładzie...");

            var liMenuOutstandingBets = sdm.FindElementByXPath("//*[@id='liMemuOutsandingBets']");

            try { liMenuOutstandingBets.Click(); }
            catch (InvalidOperationException ex)
            {
                if (ex.Message.ContainsAny("Other element would receive the click"))
                {
                    throw new AsianoddsException("Próba kliknięcia przycisku 'Place Bet' nie udała się, serwer zwrócił błąd");
                }
                throw;
            }

            var tableOutstandingBets = sdm.FindElementByXPath("//*[@id='OutstandingBetsContanier']//table[@class='tableOutsanding']");
            var trOutstandingBets    = tableOutstandingBets.FindElements(By.XPath(".//tbody/tr[@class='trItem']")).Where(tr => tr.Displayed).ToArray();

            IWebElement getTrPlacedBet() => trOutstandingBets.SingleOrDefault(tr => tr
                                                                              .FindElement(By.ClassName("span_homeName_awayName")).Text.AfterLast("]")
                                                                              .Trim().EqIgnoreCase($"{finalBet.MatchHomeName} -vs- {finalBet.MatchAwayName}"));

            IWebElement trPlacedBet = null;

            sdm.Wait.Until(d => (trPlacedBet = getTrPlacedBet()) != null);

            var oddsResp  = trPlacedBet.FindElement(By.ClassName("span_odds")).Text.Trim().ToDouble();
            var stakeResp = trPlacedBet.FindElement(By.ClassName("spanStake_Currency")).Text.BeforeFirst("EUR").Trim().ToDouble();

            Date          = finalBet.Date;
            Discipline    = finalBet.Discipline;
            LeagueName    = finalBet.LeagueName;
            MatchHomeName = finalBet.MatchHomeName;
            MatchAwayName = finalBet.MatchAwayName;
            PickChoice    = (PickChoice)finalBet.PickChoice;
            PickValue     = finalBet.PickValue;
            BetResult     = BetResult.Pending;
            Stake         = stakeResp;
            Odds          = oddsResp;
            MatchId       = finalBet.MatchId;

            OnInformationSending("Zakład został poprawnie zawarty...");

            return(this);
        }
예제 #4
0
 public DisciplineBusiness(IDisciplineRepository disciplineRepository)
 {
     _disciplineRepository = disciplineRepository;
     _disciplineConverter  = new DisciplineConverter();
 }
예제 #5
0
        public BetsResponse Parse(HintwiseSeleniumDriverManager sdm, TipsterResponse tipster, ExtendedTime fromDateClientLocal, TimeZoneKind serverTimezone)
        {
            HandleErrors(sdm);

            OnInformationSending("Zbieranie dodatkowych informacji...");

            const string matchSep        = " vs ";
            var          originalAddress = sdm.Url;
            var          fromDate        = fromDateClientLocal?.ToTimezone(serverTimezone); // konwertuj na strefę czasową serwera
            var          newBets         = new List <BetResponse>();

            IWebElement getDivCurrentPredictions() => sdm.FindElementByXPath(".//div[@id='predictions-grid']");

            var divCurrentPredictions   = getDivCurrentPredictions();
            var currPredLastPageQueries = sdm.PagerLastPageQueries(divCurrentPredictions);
            var currPredPagesCount      = sdm.PagerLastPage(currPredLastPageQueries);

            IWebElement getDivHistoricalPredictions() => sdm.FindElementByXPath(".//div[@id='history-predictions']");

            var divHistoricalPredictions = getDivHistoricalPredictions();
            var histPredLastPageQueries  = sdm.PagerLastPageQueries(divHistoricalPredictions);
            var histPredPagesCount       = sdm.PagerLastPage(histPredLastPageQueries);

            var previousDate = ExtendedTime.UtcNow.ToTimezone(serverTimezone); // w strefie czassowej serwera
            var year         = previousDate.Rfc1123.Year;

            OnInformationSending("Wczytywanie informacji o zakładach...");

            // Obecne Zakłady

            for (var currPage = 1; currPage <= currPredPagesCount; currPage++)
            {
                OnInformationSending($"Wczytywanie nowych zakładów (strona {currPage} z {currPredPagesCount})...");

                if (divCurrentPredictions.FindElement(By.TagName("span")).Text.ToLower().Contains("no results found"))
                {
                    break;
                }

                sdm.PagerNavigateToCurrentPage(currPage, currPredLastPageQueries, originalAddress);
                divCurrentPredictions = getDivCurrentPredictions();
                var trCurrPredRows = divCurrentPredictions.FindElements(By.XPath(".//table[@class='items']/tbody/tr"));

                foreach (var trCurrPredRow in trCurrPredRows)
                {
                    var tdCurrPredRowCells = trCurrPredRow.FindElements(By.TagName("td"));

                    sdm.DisableWaitingForElements();
                    var isFree = tdCurrPredRowCells[3].FindElements(By.XPath("input[@type='button']")).Count == 0;
                    sdm.EnableWaitingForElements();

                    var extDate    = ParseDate(tdCurrPredRowCells[0].Text, previousDate, serverTimezone, ref year);
                    var discipline = DisciplineConverter.ToDisciplineType(tdCurrPredRowCells[1].Text.Trim());
                    var matchStr   = tdCurrPredRowCells[2].FindElement(By.TagName("a")).Text.RemoveHTMLSymbols().Trim();
                    var pickStr    = isFree ? tdCurrPredRowCells[3].Text.BeforeFirst("(").RemoveHTMLSymbols().Trim() : "Ukryty";

                    var newBet = new BetResponse
                    {
                        Date        = extDate, // czas pobierany ma być zawsze w UTC
                        HomeName    = matchStr.BeforeFirst(matchSep),
                        AwayName    = matchStr.AfterFirst(matchSep),
                        Pick        = PickConverter.ParseToPickResponse(pickStr, matchStr),
                        MatchResult = MatchResult.Inconclusive(),
                        BetResult   = BetResult.Pending,
                        Odds        = 0,
                        Discipline  = discipline
                    };
                    newBets.Add(newBet);
                }
            }

            // Historyczne wyniki

            for (var currPage = 1; currPage <= histPredPagesCount; currPage++) //
            {
                OnInformationSending($"Wczytywanie historycznych zakładów (strona {currPage} z {histPredPagesCount})...");

                if (divHistoricalPredictions.FindElement(By.TagName("span")).Text.ToLower().Contains("no results found"))
                {
                    break;
                }

                sdm.PagerNavigateToCurrentPage(currPage, histPredLastPageQueries, originalAddress);
                divHistoricalPredictions = getDivHistoricalPredictions();
                var trHistPredRows = divHistoricalPredictions.FindElements(By.XPath(".//table[@class='items']/tbody/tr"));

                foreach (var trHistPredRow in trHistPredRows)
                {
                    var tdHistPredRowCells = trHistPredRow.FindElements(By.TagName("td"));

                    var extDate           = ParseDate(tdHistPredRowCells[0].Text, previousDate, serverTimezone, ref year);
                    var discipline        = DisciplineConverter.ToDisciplineType(tdHistPredRowCells[1].Text.Trim());
                    var matchStr          = tdHistPredRowCells[2].FindElement(By.TagName("a")).Text.RemoveHTMLSymbols().Trim();
                    var pickStr           = tdHistPredRowCells[3].Text.BeforeFirst("(").RemoveHTMLSymbols().Trim();
                    var rawMatchResultStr = tdHistPredRowCells[4].Text.RemoveHTMLSymbols().Trim();
                    var betResult         = tdHistPredRowCells[5].Text.BeforeFirst("(").RemoveHTMLSymbols().Trim().ToLower() == "win"
                        ? BetResult.Won : BetResult.Lost;
                    var odds = tdHistPredRowCells[3].Text.Between("(", ")").RemoveHTMLSymbols().Trim().ToDouble();

                    var newBet = new BetResponse
                    {
                        Date        = extDate,
                        HomeName    = matchStr.BeforeFirst(matchSep),
                        AwayName    = matchStr.AfterFirst(matchSep),
                        Pick        = PickConverter.ParseToPickResponse(pickStr, matchStr),
                        MatchResult = MatchConverter.ToMatchResultResponse(rawMatchResultStr),
                        BetResult   = betResult,
                        Odds        = odds,
                        Discipline  = discipline
                    };

                    previousDate = extDate;
                    newBets.Add(newBet);

                    if (fromDate != null && extDate < fromDate)
                    {
                        break;
                    }
                }

                if (fromDate != null && newBets.Last().Date < fromDate)
                {
                    newBets.Remove(newBets.Last());
                    break;
                }
            }

            OnInformationSending("Wczytano zakłady");

            Tipster = tipster;
            Bets    = newBets;
            return(this);
        }
예제 #6
0
 public DbDiscipline CopyWithoutNavigationProperties()
 {
     return(DisciplineConverter.CopyWithoutNavigationProperties(this));
 }