コード例 #1
0
        private void HandleGameEvent(object sender, NbaGameEventEventArgs nbaGameEventEventArgs)
        {
            NbaGameEvent nbaGameEvent = nbaGameEventEventArgs.GameEvent;
            Guid         gameId       = nbaGameEvent.Payload.Game.Id;

            if (gameId == GameId)
            {
                string eventType = nbaGameEvent.Payload.Event.EventType;
                string operation = nbaGameEvent.Metadata.Operation;
                //string message = $"Handling Radar game event: GameId = {gameId}, EventType = {eventType}";
                //Logger.Info(message);

                switch (operation)
                {
                case "delete":
                    return;
                }

                switch (eventType)
                {
                // todo add specific event
                default:
                    ProcessRadarGameEvent(nbaGameEvent);
                    ModelUpdateRequired = true;
                    break;
                }
            }
        }
コード例 #2
0
        public async Task <NbaGameEvent> GetGameEvent()
        {
            Uri          nbaGameEventUri = GetGameEventUri();
            NbaGameEvent nbaGameEvent    = await GetGameEvent <NbaGameEvent>(nbaGameEventUri);

            return(nbaGameEvent);
        }
コード例 #3
0
        private void PushGameEventOnQueue(string jsonString, Queues <NbaGameEvent, PubMessage> queues, Dictionary <Guid, int> gameDictionary)
        {
            NbaGameEvent nbaGameEvent = null;
            Heartbeat    heartbeat    = null;
            bool         isGameEvent;
            bool         isHeartbeat;

            try
            {
                nbaGameEvent = NbaGameEvent.FromJson(jsonString);
                isGameEvent  = true;
            }
            catch (NullReferenceException)
            {
                isGameEvent = false;
            }

            try
            {
                heartbeat   = Heartbeat.FromJson(jsonString);
                isHeartbeat = true;
            }
            catch (Exception)
            {
                isHeartbeat = false;
            }

            if (!isGameEvent && !isHeartbeat)
            {
                throw new Exception("Failed to deserialize both GameEvent and Heartbeat");
            }

            if (isGameEvent && nbaGameEvent?.Payload != null)
            {
                Guid gameId    = nbaGameEvent.Payload.Game.Id;
                int  gameIndex = gameDictionary[gameId];

                queues.ScoreQueueList[gameIndex].Push(nbaGameEvent);
            }

            if (isHeartbeat && heartbeat != null)
            {
                _heartBeatNumber++;

                if (_heartBeatNumber > 2)
                {
                    _pusherUtil.SendHeartBeat();
                    _heartBeatNumber = 0;
                }
            }
        }
コード例 #4
0
ファイル: RadarNba.cs プロジェクト: reashore/ConcurrentGames
        private void RaiseGameEvent(string jsonString)
        {
            try
            {
                TimeOfLastRadarGameEventOrHeartbeat = DateTime.Now;
                bool         isHeartbeat  = jsonString.Contains("heartbeat");
                NbaGameEvent mlbGameEvent = null;

                if (isHeartbeat)
                {
#if DEBUG
                    Logger.Info("Radar heartbeat");
#endif
                }

                if (!isHeartbeat)
                {
                    Logger.Info(jsonString);
                    mlbGameEvent = NbaGameEvent.FromJson(jsonString);
                }

                bool isGameEvent = mlbGameEvent != null;

                if (isGameEvent)
                {
                    NbaGameEventEventArgs nbaGameEventEventArgs = new NbaGameEventEventArgs
                    {
                        GameEvent = mlbGameEvent
                    };
                    OnRadarGameEvent(nbaGameEventEventArgs);
                }
            }
            catch (Exception e)
            {
                Logger.Info(e);
            }
        }
コード例 #5
0
        private void ProcessRadarGameEvent(NbaGameEvent nbaGameEvent)
        {
            try
            {
                if (nbaGameEvent.Metadata == null)
                {
                    return;
                }

                Dictionary <string, double> evsDictionary = ModelData[NbaModelDataKeys.Evs];

                // todo are these if statements necessary since we are writing and not reading?
                if (!evsDictionary.ContainsKey("H,Q1"))
                {
                    evsDictionary["V,Q1"] = 0;
                    evsDictionary["H,Q1"] = 0;
                }

                if (!evsDictionary.ContainsKey("H,H1"))
                {
                    evsDictionary["V,H1"] = 0;
                    evsDictionary["H,H1"] = 0;
                }

                if (!evsDictionary.ContainsKey("H,Q2"))
                {
                    evsDictionary["V,Q2"] = 0;
                    evsDictionary["H,Q2"] = 0;
                }

                if (!evsDictionary.ContainsKey("H,H2"))
                {
                    evsDictionary["V,H2"] = 0;
                    evsDictionary["H,H2"] = 0;
                }

                if (!evsDictionary.ContainsKey("H,Q3"))
                {
                    evsDictionary["V,Q3"] = 0;
                    evsDictionary["H,Q3"] = 0;
                }

                if (!evsDictionary.ContainsKey("H,Q4"))
                {
                    evsDictionary["V,Q4"] = 0;
                    evsDictionary["H,Q4"] = 0;
                }

                NbaGameState.Status = nbaGameEvent.Metadata.Status;
                Event payloadEvent = nbaGameEvent.Payload.Event;
                Game  payloadGame  = nbaGameEvent.Payload.Game;
                long  sequence     = payloadEvent.Sequence;

                if (sequence <= NbaGameState.Sequence)
                {
                    return;
                }

                NbaGameState.Sequence     = sequence;
                NbaGameState.Period       = $"Q{payloadEvent.Period.Sequence}";
                NbaGameState.PeriodNumber = payloadEvent.Period.Sequence;
                NbaGameState.Seconds      =
                    Utils.ConvertPeriodToGameString(payloadEvent.Period.Sequence, payloadEvent.Clock, GameTimeSeconds);
                NbaGameState.Clock     = payloadEvent.Clock;
                NbaGameState.AwayScore = payloadGame.Away.Points;
                NbaGameState.HomeScore = payloadGame.Home.Points;

                Dictionary <string, double> egtDictionary = ModelData[NbaModelDataKeys.Egt];
                egtDictionary["S"] = NbaGameState.Seconds;
                egtDictionary["F"] = NbaGameState.Foul;
                //egtDictionary["P"] = NbaGameState.Possession;

                int homeScore = NbaGameState.HomeScore;
                int awayScore = NbaGameState.AwayScore;
                evsDictionary["H,CG"] = homeScore;
                evsDictionary["V,CG"] = awayScore;

                switch (NbaGameState.PeriodNumber)
                {
                case 1:
                    evsDictionary["V,Q1"] = awayScore;
                    evsDictionary["H,Q1"] = homeScore;
                    break;

                case 2:
                    evsDictionary["V,Q2"] = awayScore - evsDictionary["V,Q1"];
                    evsDictionary["H,Q2"] = homeScore - evsDictionary["H,Q1"];
                    break;

                case 3:
                    evsDictionary["V,Q3"] = awayScore - (evsDictionary["V,Q1"] + evsDictionary["V,Q2"]);
                    evsDictionary["H,Q3"] = homeScore - (evsDictionary["H,Q1"] + evsDictionary["H,Q2"]);
                    break;

                case 4:
                    evsDictionary["V,Q4"] =
                        awayScore - (evsDictionary["V,Q1"] + evsDictionary["V,Q2"] + evsDictionary["V,Q3"]);
                    evsDictionary["H,Q4"] =
                        homeScore - (evsDictionary["H,Q1"] + evsDictionary["H,Q2"] + evsDictionary["H,Q3"]);
                    break;
                }

                evsDictionary["V,H1"] = evsDictionary["V,Q1"] + evsDictionary["V,Q2"];
                evsDictionary["H,H1"] = evsDictionary["H,Q1"] + evsDictionary["H,Q2"];

                evsDictionary["V,H2"] = evsDictionary["V,Q3"] + evsDictionary["V,Q4"];
                evsDictionary["H,H2"] = evsDictionary["H,Q3"] + evsDictionary["H,Q4"];

                string messageJson = $@"{{
                                        ""game"":           ""{GameId}"",
                                        ""away_score"":     {awayScore},
                                        ""home_score"":     {homeScore},
                                        ""period"":         ""{NbaGameState.Period}"",
                                        ""clock"":          ""{NbaGameState.Clock}"",
                                        ""possession"":     ""{NbaGameState.Possession}"",
                                        ""foul"":           {NbaGameState.Foul},
                                        ""pause"":           false
                                    }}";

                if (!Utils.IsValidJson(messageJson))
                {
                    throw new Exception("JSON is invalid: {jsonString}");
                }

                string       messageKey = GameId + "score";
                const string eventName  = "NBATEAM";
                _pusherUtil.SendScoreMessage(messageJson, eventName, messageKey);
            }
            catch (Exception exception)
            {
                Logger.Error(exception);
            }
        }