Files

343 lines
18 KiB
C#
Raw Permalink Normal View History

2020-04-13 15:16:46 +01:00
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);
}
}
}
}