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; } } }
public async Task <NbaGameEvent> GetGameEvent() { Uri nbaGameEventUri = GetGameEventUri(); NbaGameEvent nbaGameEvent = await GetGameEvent <NbaGameEvent>(nbaGameEventUri); return(nbaGameEvent); }
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; } } }
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); } }
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); } }