public IMarketRuleResultIntent Apply(Fixture fixture, IMarketStateCollection oldState, IMarketStateCollection newState) { var result = new MarketRuleResultIntent(); if (oldState == null) { return(result); } var deletedMarkets = newState.Markets.Select(marketId => newState[marketId]) .Where(marketState => marketState.IsDeleted && oldState.HasMarket(marketState.Id) && !oldState[marketState.Id].IsDeleted) .ToList(); var newDeletedMarketState = deletedMarkets.Select(CreateSuspendedMarket).ToList(); if (deletedMarkets.Any()) { newDeletedMarketState.ForEach(m => { _logger.DebugFormat("market rule={0} => {1} of fixtureId={2} was deleted from UDAPI - it will be suspended", Name, m, fixture.Id); result.AddMarket(m, new MarketRuleAddIntent(MarketRuleAddIntent.OperationType.CHANGE_SELECTIONS)); }); } return(result); }
public IMarketRuleResultIntent Apply(Fixture fixture, IMarketStateCollection oldState, IMarketStateCollection newState) { var result = new MarketRuleResultIntent(); if (!fixture.IsMatchOver || oldState == null) { return(result); } var markets = fixture.Markets.ToDictionary(m => m.Id); // get list of markets which are either no longer in snapshot or are in the snapshot and are not resulted // markets which were already priced (activated) should be ignored var marketsNotPresentInTheSnapshot = new List <IMarketState>(); foreach (var mkt in newState.Markets) { IMarketState mkt_state = newState[mkt]; if (!mkt_state.IsResulted && (!markets.ContainsKey(mkt_state.Id) || !markets[mkt_state.Id].IsResulted)) { marketsNotPresentInTheSnapshot.Add(mkt_state); } } foreach (var mkt_state in marketsNotPresentInTheSnapshot) { if (mkt_state.HasBeenActive) { _logger.DebugFormat("market rule={0} => marketId={1} of {2} was priced during the fixture lifetime but has NOT been settled on match over.", Name, mkt_state.Id, fixture); continue; } if (!mkt_state.HasBeenProcessed) { _logger.DebugFormat("market rule={0} => marketId={1} of {2} was never passed to the plugin.", Name, mkt_state.Id, fixture); continue; } var market = fixture.Markets.FirstOrDefault(m => m.Id == mkt_state.Id); if (market == null) { _logger.DebugFormat("market rule={0} => marketId={1} of {2} is marked to be voided", Name, mkt_state.Id, fixture); result.AddMarket(CreateSettledMarket(mkt_state), new MarketRuleAddIntent(MarketRuleAddIntent.OperationType.SETTLE_SELECTIONS)); } else { _logger.DebugFormat("market rule={0} => marketId={1} of {2} that was in the snapshot but wasn't resulted is marked to be voided", Name, market.Id, fixture); Action <Market> action = x => x.Selections.ForEach(s => s.Status = SelectionStatus.Void); MarketRuleEditIntent edit = new MarketRuleEditIntent(action, MarketRuleEditIntent.OperationType.CHANGE_SELECTIONS); result.EditMarket(market, edit); } } return(result); }