using AutoBet.DataRecorded.MessageControllers; using SwiftyMessageHub.Core; using System; using System.Linq; using System.Threading; using System.Threading.Tasks; using AutoBet.DataRecorded.RaceResultsDataCollector; using BritishHorseRacingApi; using System.Collections.Generic; using BritishHorseRacingApi.Models; using Microsoft.EntityFrameworkCore; using AutoBet.Db; using ApiModels = BritishHorseRacingApi.Models; namespace AutoBet.DataRecorded { class Program { public static async Task Main(string[] args) { //StartResultsCollection().GetAwaiter().GetResult(); //var dayToCollectRunners = GetDayToCollect(); await CollectPastResults(); //await CollectCurrent(); //await GetFixtureIds(); } private static async Task GetFixtureIds() { Db.Fixture[] fixturesToProcces; using (var db = new Db.HorseRacingDataContext()) { var ids = db.Races.Where(e => e.FixtureId != 0).Select(e => e.FixtureId).ToArray(); fixturesToProcces = db.Fixtures.Where(e => !ids.Contains(e.FixtureId)).ToArray(); var client = new ApiClient(TimeSpan.FromSeconds(0), "D_SID=188.172.158.138:JT/OEx87nl5ScspTQk38UsDfuIz94DbCf5CYsIC7WpU; __utmz=36595059.1583064856.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); D_ZID=52A68C14-B4B6-3844-8896-9B0E426FEABA; D_ZUID=2E7A90D0-30B7-31B4-BB43-CB2B0DACBDF8; D_HID=0316E576-4AF0-35A5-BEB9-CECB592B4EC2; bha-ie-test=true; __utmc=36595059; __utma=36595059.34208775.1583064856.1583966446.1584046318.17; bha_token=%7B%22token%22%3A%22MjE3Y2I1NDBhYWViZWQ0YmM4YjZmYjg2NDRlOTA2NzU%3D%22%2C%22timestamp%22%3A1584046320723%7D; D_IID=A18DB74E-9ABD-33E1-BF94-96209AF6178E; D_UID=9CDC96FD-4EFE-308E-BC28-2F105AC0B01B; __utmt=1; __utmb=36595059.6.10.1584046318"); foreach (var fixture in fixturesToProcces) { var races = await client.GetRaces(fixture.FixtureYear, fixture.FixtureId); foreach (var race in races.Data) { var dbRace = db.Races.FirstOrDefault(e => e.RaceId == race.RaceId); if (dbRace == null) { AddRace(db, fixture.FixtureId, race); await LoadRunners(fixture.FixtureDate.Date, client, db, race); continue; } dbRace.FixtureId = fixture.FixtureId; } db.SaveChanges(); } } } private static async Task CollectPastResults() { var dayToCollectRunners = new DateTime(2019, 11, 23);// GetDayToCollect(); var client = new ApiClient(TimeSpan.FromSeconds(0), "D_SID=188.172.158.138:JT/OEx87nl5ScspTQk38UsDfuIz94DbCf5CYsIC7WpU; __utmz=36595059.1583064856.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); D_IID=A18DB74E-9ABD-33E1-BF94-96209AF6178E; D_UID=9CDC96FD-4EFE-308E-BC28-2F105AC0B01B; __utmc=36595059; bha-ie-test=true; D_ZID=3F37C446-48FB-3F85-B8D2-66FC90A17473; D_ZUID=27B27203-7708-3F5E-8C01-86A8BF3A21DD; D_HID=BC00CAA4-06EE-39E0-8579-A00DCFA20171; bha_token=%7B%22token%22%3A%22ZjYxM2UwMWEwZmZjNjdhYmM5NzRmMDhmMGVmOTYxNGY%3D%22%2C%22timestamp%22%3A1586699412252%7D; __utma=36595059.34208775.1583064856.1586685187.1586702516.21; __utmt=1; __utmb=36595059.2.10.1586702516"); while (true) { try { var dayToCollectResults = dayToCollectRunners; await LoadPreRaceData(dayToCollectRunners, client); await LoadResults(dayToCollectResults, client); dayToCollectRunners = dayToCollectRunners.AddDays(-1); } catch(Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine("Enter new cookie:"); var cookie = Console.ReadLine(); if (!String.IsNullOrWhiteSpace(cookie)) client = new ApiClient(TimeSpan.FromSeconds(0), cookie); } } } private static async Task CollectCurrent() { var dayToCollectRunners = DateTime.Now.Date; var dayToCollectResults = dayToCollectRunners.AddDays(-1); var client = new ApiClient(TimeSpan.FromSeconds(0), "D_SID=188.172.158.138:JT/OEx87nl5ScspTQk38UsDfuIz94DbCf5CYsIC7WpU; __utmz=36595059.1583064856.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); D_ZID=52A68C14-B4B6-3844-8896-9B0E426FEABA; D_ZUID=2E7A90D0-30B7-31B4-BB43-CB2B0DACBDF8; D_HID=0316E576-4AF0-35A5-BEB9-CECB592B4EC2; bha-ie-test=true; __utmc=36595059; D_IID=A18DB74E-9ABD-33E1-BF94-96209AF6178E; D_UID=9CDC96FD-4EFE-308E-BC28-2F105AC0B01B; __utma=36595059.34208775.1583064856.1584046318.1584135333.18; __utmt=1; __utmb=36595059.1.10.1584135333; bha_token=%7B%22token%22%3A%22NTc0OTdjNTRiMjg2ZGYyYzEyYThmMjRlZDZmYmIyMzM%3D%22%2C%22timestamp%22%3A1584135334879%7D"); await LoadPreRaceData(dayToCollectRunners, client); await LoadResults(dayToCollectResults, client); } private static async Task LoadPreRaceData(DateTime date, ApiClient client) { Console.WriteLine($"Loading fixtures for {date}"); var fixtures = await client.GetAllFixturesForDay(date.Year, date.Month, date.Day); using (var db = new Db.HorseRacingDataContext()) { foreach (var fixture in fixtures) { Console.WriteLine($"Processing fixture {fixture.FixtureName}"); var dbFixture = ApiFixtureToDbFixture(fixture); db.Fixtures.Add(dbFixture); await db.SaveChangesAsync(); await LoadRaces(date, client, db, fixture.FixtureYear, fixture.FixtureId); } } } private static async Task LoadRaces(DateTime date, ApiClient client, HorseRacingDataContext db, int year, int fixtureId) { Console.WriteLine($"Loading races for {date}"); var races = await client.GetRaces(year, fixtureId); foreach (var race in races.Data) { AddRace(db, fixtureId, race); await db.SaveChangesAsync(); await LoadRunners(date, client, db, race); await db.SaveChangesAsync(); } } private static async Task LoadRunners(DateTime date, ApiClient client, HorseRacingDataContext db, ApiModels.Race race) { Console.WriteLine($"Loading runners for race id {race.RaceId}"); var runners = await client.GetRaceRunners(date.Year, race.RaceId, race.DivisionSequence); foreach (var runner in runners.Data) { Console.WriteLine($"Loaded runner {runner.RacehorseName} for race {race.RaceId})"); db.Runners.Add(new Db.Runner() { HeadGearWearingCode = runner.HeadGearWearingCode, HeadGearWearingSheepSkin = runner.HeadGearWearingSheepSkin, HeadGearDescription = runner.HeadGearDescription, HeadGearAbbreviation = runner.HeadGearAbbreviation, JockeyProfile = runner.JockeyProfile, CourseWinner = runner.CourseWinner, DistanceWinner = runner.DistanceWinner, WindSurgeryFirstRun = runner.WindSurgeryFirstRun, TrainerId = runner.TrainerId, TrainerName = runner.TrainerName, OwnerId = runner.OwnerId, OwnerName = runner.OwnerName, WbSilkCode = runner.WbSilkCode, WbSilkDescription = runner.WbSilkDescription, SilkImage = runner.SilkImage, Plus10 = runner.Plus10, ForecastPriceNumerator = runner.ForecastPriceNumerator, ForecastPriceDenominator = runner.ForecastPriceDenominator, WeightText = runner.WeightText, WeightsJockeyClaiming = runner.WeightsJockeyClaiming, Odds = runner.Odds, DecimalOdds = runner.DecimalOdds(), JockeyName = runner.JockeyName, Status = (Db.Status)runner.Status, RaceId = runner.RaceId, YearOfRace = runner.YearOfRace, DivisionSequence = runner.DivisionSequence, AnimalId = runner.AnimalId, RacehorseName = runner.RacehorseName, AgeYears = runner.AgeYears, Bred = runner.Bred, ClothNumber = runner.ClothNumber, DrawnStall = runner.DrawnStall, ReserveNumber = runner.ReserveNumber, BhaRating = runner.BhaRating, FormFigures = runner.FormFigures, WeightValue = runner.WeightValue, PenaltyValue = runner.PenaltyValue, SexType = (Db.SexType)runner.SexType, NonRunnerDeclaredReason = runner.NonRunnerDeclaredReason, NonRunnerDeclaredDate = runner.NonRunnerDeclaredDate, NonRunnerDeclaredTime = runner.NonRunnerDeclaredTime, RunnerNumber = runner.RunnerNumber, JockeyId = runner.JockeyId, RaceHorseNameWithoutCountry = runner.RacehorseNameWithoutCountry, WeightInGrams = runner.WeightInGrams, LastRuns = runner.LastRuns?.Select(e => new Db.LastRun() { Days = e.Days, RaceType = e.RaceType }).ToList() }); } } private static void AddRace(HorseRacingDataContext db, int fixtureId, ApiModels.Race race) { Console.WriteLine($"Saving {race.RaceName}"); var dbRace = ApiRaceToDbRace(race, fixtureId); db.Races.Add(dbRace); } private static Db.Fixture ApiFixtureToDbFixture(ApiModels.Fixture fixture) { return new Db.Fixture() { GoingUpdatedTime = fixture.GoingUpdatedTime, GoingUpdatedDate = fixture.GoingUpdatedDate, FixtureSession = (Db.FixtureSession)fixture.FixtureSession, AbandonedReasonCode = fixture.AbandonedReasonCode, Rail = fixture.Rail, Stalls = fixture.Stalls, Other = fixture.Other, Weather = fixture.Weather, Going = fixture.Going, MajorEvent = fixture.MajorEvent, TicketsLink = fixture.TicketsLink, CourseId = fixture.CourseId, RacePlanningCode = (Db.RacePlanningCode)fixture.RacePlanningCode, RacingTrackType = (Db.RacingTrackType)fixture.RacingTrackType, MeetingId = fixture.MeetingId, FixtureType = (Db.FixtureType)fixture.FixtureType, FixtureName = fixture.FixtureName, NumberOfRaces = fixture.NumberOfRaces, BcsEvent = fixture.BcsEvent, BlackTypeRaces = fixture.BlackTypeRaces, EntriesAvailable = fixture.EntriesAvailable, RacecardAvailable = fixture.RacecardAvailable, ResultsAvailable = fixture.ResultsAvailable, FirstRace = fixture.FirstRace, CourseName = fixture.CourseName, Distance = fixture.Distance, FixtureDate = fixture.FixtureDate, FixtureYear = fixture.FixtureYear, FixtureId = fixture.FixtureId }; } private static Db.Race ApiRaceToDbRace(ApiModels.Race race, int fixtureId) { return new Db.Race() { DistanceChangeText = race.DistanceChangeText, BlackTypeRace = race.BlackTypeRace, AbandonedReasonCode = race.AbandonedReasonCode, RaceCriteriaRaceType = race.RaceCriteriaRaceType, DistanceChange = race.DistanceChange, DistanceText = race.DistanceText, DistanceValue = race.DistanceValue, DistanceUnits = race.DistanceUnits, RawDistanceText = race.RawDistanceText, RatingBand = race.RatingBand, RaceClass = race.RaceClass, PrizeCurrency = race.PrizeCurrency, PrizeAmount = race.PrizeAmount, AgeLimit = race.AgeLimit, RaceName = race.RaceName, RaceTime = race.RaceTime, RaceDate = race.RaceDate, DivisionSequence = race.DivisionSequence, YearOfRace = race.YearOfRace, RaceId = race.RaceId, Plus10 = race.Plus10, FixtureId = fixtureId }; } private static async Task LoadResults(DateTime date, ApiClient client) { using (var db = new Db.HorseRacingDataContext()) { var races = await db.Races.Where(e => e.RaceDate == date.Date).ToListAsync(); foreach(var race in races) { if (race.RaceId != 1684) continue; var results = await client.GetRaceResults(race.YearOfRace, race.RaceId, race.DivisionSequence); foreach (var runnerResult in results.Data) { var dbRunnerResult = new Db.RunnerResult() { RaceId = runnerResult.RaceId, YearOfRace = runnerResult.YearOfRace, DivisionSequence = runnerResult.DivisionSequence, HorseId = runnerResult.HorseId, AnimalId = runnerResult.AnimalId, ResultFinishPos = runnerResult.ResultFinishPos, Status = runnerResult.Status, Ran = runnerResult.Ran, NonRunnerDeclaredReason = runnerResult.NonRunnerDeclaredReason, NonRunnerDeclaredDate = runnerResult.NonRunnerDeclaredDate, NonRunnerDeclaredTime = runnerResult.NonRunnerDeclaredTime, RacehorseName = runnerResult.RacehorseName, RacehorseNameWithoutConuntry = runnerResult.RacehorseNameWithoutCountry, AgeYear = runnerResult.AgeYear, Bred = runnerResult.Bred, ClothNumber = runnerResult.ClothNumber, DrawnStall = runnerResult.DrawnStall, WeightValue = runnerResult.WeightValue, SexType = runnerResult.SexType, JockeyId = runnerResult.JockeyId, JockeyName = runnerResult.JockeyName, JockeyProfile = runnerResult.JockeyProfile, TrainerId = runnerResult.TrainerId, TrainerName = runnerResult.TrainerName, OwnerId = runnerResult.OwnerId, OwnerName = runnerResult.OwnerName, WbSilkCode = runnerResult.WbSilkCode, WbSilkDescription = runnerResult.WbSilkDescription, SilkImage = runnerResult.SilkImage, Plus10 = runnerResult.Plus10, ResultBtnDistance = runnerResult.ResultBtnDistance, PositionFinishTime = runnerResult.PositionFinishTime, BettingRatio = runnerResult.BettingRatio, PerformanceFigure = runnerResult.PerformanceFigure, RatingFlat = runnerResult.RatingFlat, RatingAwt = runnerResult.RatingAwt, RatingChase = runnerResult.RatingChase, RatingHurdle = runnerResult.RatingHurdle, RaceCriteriaRaceType = runnerResult.RaceCriteriaRaceType, Hro = runnerResult.Hro, FinishTime = runnerResult.FinishTime, ResultFinishDNF = runnerResult.ResultFinishDNF, FinishTimeInMilliseconds = String.IsNullOrWhiteSpace(runnerResult.ResultFinishDNF) ? runnerResult.FinishTimeInMilliseconds() : null, LossMilliseconds = runnerResult.LossMilliseconds(), }; db.RunnerResults.Add(dbRunnerResult); await db.SaveChangesAsync(); } } } } public static DateTime _dateToCollectRunners = GetDayToCollect(); public static DateTime GetDayToCollect() { using(var db = new Db.HorseRacingDataContext()) { var date = db.Races.OrderBy(e => e.RaceDate) .Select(e => e.RaceDate) .First() .Date; return date.AddDays(-1); } } } }