module Integrations module Betfair class OpportunityHunter < Base def events_in_timeframe(from:, to:) raise "Timeframe not set " unless from.present? && to.present? timeframe = { from: from.iso8601, to: to.iso8601 } filter = { marketStartTime: timeframe } body = { filter: filter } r = self.class.post("#{API_BETTING_ENDPOINT}/listEvents/", { headers: @connection.api_headers, body: body.to_json }) events = [] r.each do |e| ev = e['event'] events << BetfairEvent.new(event_id: ev['id'], event_name: ev['name'], event_start: DateTime.parse(ev['openDate'])) end import_result = BetfairEvent.import(events, on_duplicate_key_ignore: true) puts "#{import_result.ids.size} events added" end def event_markets_and_selections batches = [] batch = 0 limit = 10 BetfairEvent.open.order(created_at: :desc).pluck(:event_id).each do |eid| batches[batch] ||= [] if batches[batch].size < limit batches[batch] << eid else batch += 1 end end batches.each { |b| batch_event_runners b } end def runner_odds(runner) body = { marketId: runner.market_id, selectionId: runner.selection_id } body[:priceProjection] = { priceData: ['EX_BEST_OFFERS'], virtualise: true } r = self.class.post("#{API_BETTING_ENDPOINT}/listRunnerBook/", { headers: @connection.api_headers, body: body.to_json }) runners = r[0]['runners'] raise '[Odds] - cannot identify prices' unless runners rs = runners.first raise '[Odds] - cannot identify prices' unless rs && rs['ex'] && rs['ex']['availableToBack'] imports = [] rs['ex']['availableToBack'].each do |ex| imports << BetfairRunnerOdd.new(betfair_event_runner_id: runner.id, odds: ex['price'], total_matched: 0, total_available: ex['size'], bet_type: 'back') end rs['ex']['availableToLay'].each do |ex| imports << BetfairRunnerOdd.new(betfair_event_runner_id: runner.id, odds: ex['price'], total_matched: 0, total_available: ex['size'], bet_type: 'lay') end BetfairRunnerOdd.import(imports, on_duplicate_key_ignore: true) end private def batch_event_runners(batch) body = { maxResults: 1000 - (10 * (batch.size - 1)), filter: { eventIds: batch }, marketProjection: ['EVENT', 'RUNNER_DESCRIPTION'] } markets = self.class.post("#{API_BETTING_ENDPOINT}/listMarketCatalogue/", { headers: @connection.api_headers, body: body.to_json }) import = [] markets.each do |market| market_fragment = { event_id: market['event']['id'], market_id: market['marketId'], market_name: market['marketName'] } runners = market['runners'] runners&.each do |runner| rec = { selection_id: runner['selectionId'] || runner['runnerName'], selection_name: runner['runnerName'] }.merge(market_fragment) import << BetfairEventRunner.new(rec) end end import_result = BetfairEventRunner.import(import, on_duplicate_key_ignore: true) puts "#{import_result.ids.size} runners added" end end end end