Esempio n. 1
0
        /// <summary>
        /// Crate PlayerInfo. should only be call/created from Nhl API
        /// </summary>
        /// <param name="playerInfoEntity"></param>
        /// <returns></returns>
        public bool Create(PlayerInfoEntity playerInfoEntity)
        {
            bool created;

            try
            {
                using (var scope = new TransactionScope())
                {
                    playerInfoEntity.C_Code = Guid.NewGuid().ToString();
                    Mapper.CreateMap <PlayerInfoEntity, PlayerInfo>();
                    var playerInfo = Mapper.Map <PlayerInfoEntity, PlayerInfo>(playerInfoEntity);

                    _unitOfWork.PlayerInfoRepository.Insert(playerInfo);
                    _unitOfWork.Save();
                    scope.Complete();
                    created = true;
                }
            }
            catch (TransactionAbortedException ex)
            {
                created = false;
                LogError.Write(ex, $"TransactionAbortedException in PlayerInfoServices.Create(PlayerInfoEntity playerInfoEntity) for id: {playerInfoEntity.C_Name} and code: {playerInfoEntity.C_Code}");
            }
            catch (ApplicationException ex)
            {
                created = false;
                LogError.Write(ex, $"ApplicationException in PlayerInfoServices.Create(PlayerInfoEntity playerInfoEntity) for id: {playerInfoEntity.C_Name} and code: {playerInfoEntity.C_Code}");
            }
            catch (Exception ex)
            {
                created = false;
                LogError.Write(ex, $"Exception in PlayerInfoServices.Create(PlayerInfoEntity playerInfoEntity) for id: {playerInfoEntity.C_Name} and code: {playerInfoEntity.C_Code}");
            }

            return(created);
        }
Esempio n. 2
0
        private static List <PlayerInfoEntity> GetNhlApiTeamPlayersInfo(string team)
        {
            var url = NhlApi.UrlPrefixSeason + team + NhlApi.UrlSuffix;

            var rawJsonData = JsonUtility.GetSerializedJsonData(url);

            if (string.IsNullOrEmpty(rawJsonData))
            {
                LogError.Write(new Exception("Dummy exception"), "NO raw data returned from JsonUtility.GetSerializedJsonData(url)");
                return(null);
            }

            var nhlApiTeamPlayerInfo = JsonUtility.DeserializedJsonData <NhlTeamPlayerInfoApi>(rawJsonData);


            if (!nhlApiTeamPlayerInfo.skaterData.Any())
            {
                //LogError.Write(new Exception("No Data for this team"), "Fail to deserialize - DeserializedJsonData<T>(string jsonData) where T : new()");
                return(new List <PlayerInfoEntity>()); // retrun empty 0 count
            }

            var playerInfoEntities = new List <PlayerInfoEntity>();

            try
            {
                foreach (Skaterdata skaterdata in nhlApiTeamPlayerInfo.skaterData)
                {
                    var id     = skaterdata.id;
                    var tokens = skaterdata.data.Split(',');

                    // API changes - removed name, pos, and jersey #: length 12. Regualr 15
                    if (tokens.Length == 12)
                    {
                        var game12   = int.Parse(tokens[0]);
                        var goal12   = int.Parse(tokens[1]);
                        var assist12 = int.Parse(tokens[2]);
                        var point12  = int.Parse(tokens[3]);
                        var toi12    = tokens[7].Trim();
                        var ppG12    = int.Parse(tokens[8]);
                        var shG12    = int.Parse(tokens[9]);
                        var gwG12    = int.Parse(tokens[10]);
                        var otG12    = int.Parse(tokens[11]);

                        var playerInfo12 = new PlayerInfoEntity(id, team, game12, goal12, assist12, point12, toi12, ppG12, shG12, gwG12, otG12);

                        playerInfoEntities.Add(playerInfo12);

                        continue;
                    }

                    // Regular 15 length api data
                    var pos    = tokens[1].Trim();
                    var name   = (tokens[2]).Trim();
                    var game   = int.Parse(tokens[3]);
                    var goal   = int.Parse(tokens[4]);
                    var assist = int.Parse(tokens[5]);
                    var point  = int.Parse(tokens[6]);
                    var toi    = tokens[10].Trim();
                    var ppG    = int.Parse(tokens[11]);
                    var shG    = int.Parse(tokens[12]);
                    var gwG    = int.Parse(tokens[13]);
                    var otG    = int.Parse(tokens[14]);

                    var playerInfo = new PlayerInfoEntity(id, team, pos, name, game, goal, assist, point, toi, ppG, shG, gwG, otG);

                    playerInfoEntities.Add(playerInfo);
                }
            }
            catch (Exception ex)
            {
                LogError.Write(ex, $"Fail while parsing deserrialize NHl aPi Data for team: {team}");
                return(null);
            }

            return(playerInfoEntities);
        }
        public static List <PlayerInfoEntity> GetTeamPlayerData(int teamNo)
        {
            if (teamNo < 1)
            {
                LogError.Write(new Exception("NhlWebScrapingApiTransactions.GetTeamPlayerData Team # is less than 1"), $"NhlWebScrapingApiTransactions.GetTeamPlayerData Team # is {teamNo}");
            }

            // setup the browser
            var browser = new ScrapingBrowser
            {
                AllowAutoRedirect = true,
                AllowMetaRedirect = true
            };
            // Browser has many settings you can access in setup

            //Get the webste - get data by team
            var pageResult = browser.NavigateToPage(
                new Uri("http://sportsstats.cbc.ca/hockey/nhl-teams.aspx?page=/data/nhl/teams/stats/stats" + teamNo + ".html"));

            // get data table
            var tableTeamPlayerStats = pageResult.Html.CssSelect(".sdi-data-wide").FirstOrDefault();
            var playerInfoEntities   = new List <PlayerInfoEntity>();


            if (tableTeamPlayerStats != null)
            {
                var tRows = tableTeamPlayerStats.SelectNodes("tr").Skip(1); // skip first table header
                foreach (var tRow in tRows)
                {
                    try
                    {
                        var tData = tRow.ChildNodes.Where(x => x.Name.ToString() == "td").ToList();

                        var playerInfoEntity = new PlayerInfoEntity();

                        var name = tData.ElementAt(0).InnerText;
                        name = AdaptNameToApi(CleanString(name));
                        var pos = AdaptPositionToApi(CleanString(tData.ElementAt(1).InnerHtml));

                        var team = "";
                        Constants.Teams.SeasonWebScrappingDict.TryGetValue(teamNo, out team);

                        var game = CleanString(tData.ElementAt(2).InnerHtml);
                        var goal = CleanString(tData.ElementAt(3).InnerHtml);
                        var ass  = CleanString(tData.ElementAt(4).InnerHtml);
                        var pts  = CleanString(tData.ElementAt(5).InnerHtml);
                        var ppg  = CleanString(tData.ElementAt(8).InnerHtml);
                        var shg  = CleanString(tData.ElementAt(9).InnerHtml);
                        var toi  = CleanString(tData.ElementAt(11).InnerHtml);

                        // TODO: Make constructor
                        playerInfoEntity.C_Name   = name;
                        playerInfoEntity.C_Pos    = pos;
                        playerInfoEntity.C_Team   = team;
                        playerInfoEntity.I_Game   = Int32.Parse(game);
                        playerInfoEntity.I_Goal   = Int32.Parse(goal);
                        playerInfoEntity.I_Assist = Int32.Parse(ass);
                        playerInfoEntity.I_Point  = Int32.Parse(pts);
                        playerInfoEntity.I_PpP    = Int32.Parse(ppg);
                        playerInfoEntity.I_ShP    = Int32.Parse(shg);
                        playerInfoEntity.C_Toi    = toi;

                        playerInfoEntities.Add(playerInfoEntity);
                    }
                    catch (Exception e)
                    {
                        LogError.Write(e,
                                       "Exception in NhlWebScrapingApiTransactions.GetTeamPlayerData() at tRow: " + tRow?.InnerHtml);
                    }
                }
            }
            else
            {
                LogError.Write(new Exception("Error"),
                               $"No data for team {teamNo}");
            }

            return(playerInfoEntities);
        }
Esempio n. 4
0
        /// <summary>
        /// get "cumulative_player_stats.json" from MySportsFeeds NHL API and return it parse into entity list
        /// </summary>
        /// <returns></returns>
        public List <PlayerInfoEntity> GetData()
        {
            var playerInfoEntities = new List <PlayerInfoEntity>();

            MySportsFeeds apiResults = null;

            var request = new HttpClient();

            request.BaseAddress = new Uri("https://www.mysportsfeeds.com/api/feed/pull/nhl/2016-2017-regular/");
            request.DefaultRequestHeaders.Accept.Clear();
            request.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                                                                                        "bmlja2dvb2Ryb3c6R29kcm81NQ=="
                                                                                        //Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes($"{user}:{password}"))
                                                                                        );
            request.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            try
            {
                using (
                    var response = request.GetAsync("cumulative_player_stats.json?").ContinueWith((taskWithResponse) =>
                {
                    if (taskWithResponse != null)
                    {
                        if (taskWithResponse.Status != TaskStatus.RanToCompletion)
                        {
                            throw new Exception(
                                $"Server error (HTTP {taskWithResponse.Result?.StatusCode}: {taskWithResponse.Exception?.InnerException} : {taskWithResponse.Exception?.Message}).");
                        }
                        if (taskWithResponse.Result.IsSuccessStatusCode)
                        {
                            var jsonString = taskWithResponse.Result.Content.ReadAsStringAsync();
                            jsonString.Wait();
                            var data = JsonConvert.DeserializeObject <MySportsFeeds>(jsonString.Result);
                            apiResults = data;
                        }
                        else
                        {
                            var e = new Exception($"{taskWithResponse.Result.StatusCode} : {taskWithResponse.Result.ReasonPhrase}");
                            LogError.Write(e,
                                           "issue while retriving data from MySportsFeed -> GetData()");
                            throw e;
                        }
                    }
                }))
                {
                    response.Wait();

                    var resultCompleted = apiResults;

                    var listTeam = resultCompleted.cumulativeplayerstats.playerstatsentry;

                    if (listTeam.Length <= 0)
                    {
                        throw new ApiException("No data return from API");
                    }

                    var id = 0;
                    try
                    {
                        foreach (var playerstatsentry in listTeam)
                        {
                            id = Int32.Parse(playerstatsentry.player.ID);
                            var team     = playerstatsentry.team.Abbreviation;
                            var pos      = playerstatsentry.player.Position[0].ToString(); // only 1st char of string, e.g. LW => L
                            var name     = playerstatsentry.player.FirstName + " " + playerstatsentry.player.LastName;
                            var game     = Int32.Parse(playerstatsentry.stats.GamesPlayed.text);
                            var goal     = Int32.Parse(playerstatsentry.stats.stats.Goals.text);
                            var assist   = Int32.Parse(playerstatsentry.stats.stats.Assists.text);
                            var pts      = Int32.Parse(playerstatsentry.stats.stats.Points.text);
                            var ppp      = Int32.Parse(playerstatsentry.stats.stats.PowerplayPoints.text);
                            var shp      = Int32.Parse(playerstatsentry.stats.stats.ShorthandedPoints.text);
                            var gwg      = Int32.Parse(playerstatsentry.stats.stats.GameWinningGoals.text);
                            var isRookie = Boolean.Parse(playerstatsentry.player.IsRookie);

                            var playerInfo = new PlayerInfoEntity(id, team, pos, name, game, goal, assist, pts, ppp, shp, gwg, isRookie);

                            playerInfoEntities.Add(playerInfo);
                        }

                        return(playerInfoEntities.OrderBy(x => x.C_Team).ToList());
                    }
                    catch (Exception e)
                    {
                        LogError.Write(e, $"Issue at this player id (if id is 0 means it happened on the 1st item.): ID :  {id}");
                    }
                }
            }
            catch (Exception ex)
            {
                LogError.Write(ex, "issue while retriving data from MySportsFeed -> GetData()");
            }
            return(playerInfoEntities);
        }
Esempio n. 5
0
        public bool Exist(PlayerInfoEntity playerInfoEntity)
        {
            var playerExist = _unitOfWork.PlayerInfoRepository.Get(x => x.C_Name == playerInfoEntity.C_Name && x.C_Team == playerInfoEntity.C_Team && x.C_Pos == playerInfoEntity.C_Pos);

            return(playerExist != null);
        }