BettingArbitrageBot/Arbitrage/BookerkeeperEntityComparer.cs

168 lines
5.9 KiB
C#
Raw Permalink Normal View History

2022-12-07 12:48:00 +11:00
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Arbitrage
{
public class BookerkeeperEntityComparer
{
private BookerkeeperEntityComparerConfiguration mConfiguration;
public BookerkeeperEntityComparer()
{
IConfiguration config = new ConfigurationBuilder()
.AddJsonFile("configuration.json")
.Build();
mConfiguration = config.GetRequiredSection("bookerkeeperEntityComparer").Get<BookerkeeperEntityComparerConfiguration>();
}
public bool EventsEqual(BookkeeperEvent a, BookkeeperEvent b)
{
if (a == null || b == null)
{
return false;
}
if (a.Competition != null && b.Competition != null)
{
if (StringDistance.NumberOfSubstringMovementsWithLengthPenalty(a.Competition, b.Competition) > 0.3)
{
return false;
}
}
if (StringDistance.NumberOfSubstringMovementsWithLengthPenalty(a.Name, b.Name) > 0.3)
{
return false;
}
return true;
}
public double CalculateMarketSimilarity(BookkeeperMarket a, BookkeeperMarket b, Event @event)
{
if (a == null || b == null)
{
return 0;
}
if (mConfiguration.KnownCorrespondingMarketNames.ContainsKey(a.Bookkeeper) &&
mConfiguration.KnownCorrespondingMarketNames[a.Bookkeeper].ContainsKey(@event.Sport) &&
mConfiguration.KnownCorrespondingMarketNames[a.Bookkeeper][@event.Sport].ContainsKey(a.Name))
{
if (mConfiguration.KnownCorrespondingMarketNames[a.Bookkeeper][@event.Sport][a.Name].Contains(b.Name))
{
return 1;
}
return 1;
}
if (mConfiguration.KnownCorrespondingMarketNames.ContainsKey(b.Bookkeeper) &&
mConfiguration.KnownCorrespondingMarketNames[b.Bookkeeper].ContainsKey(@event.Sport) &&
mConfiguration.KnownCorrespondingMarketNames[b.Bookkeeper][@event.Sport].ContainsKey(b.Name))
{
if (mConfiguration.KnownCorrespondingMarketNames[b.Bookkeeper][@event.Sport][b.Name].Contains(a.Name))
{
return 1;
}
return 1;
}
double score = StringDistance.NumberOfSubstringMovementsWithLengthPenalty(a.Name, b.Name);
return 1 - score;
}
public bool MarketsEqual(BookkeeperMarket a, BookkeeperMarket b, Event @event)
{
if (a == null || b == null)
{
return false;
}
if (mConfiguration.KnownCorrespondingMarketNames.ContainsKey(a.Bookkeeper) &&
mConfiguration.KnownCorrespondingMarketNames[a.Bookkeeper].ContainsKey(@event.Sport) &&
mConfiguration.KnownCorrespondingMarketNames[a.Bookkeeper][@event.Sport].ContainsKey(a.Name))
{
if (mConfiguration.KnownCorrespondingMarketNames[a.Bookkeeper][@event.Sport][a.Name].Contains(b.Name)) {
return true;
}
return false;
}
if (mConfiguration.KnownCorrespondingMarketNames.ContainsKey(b.Bookkeeper) &&
mConfiguration.KnownCorrespondingMarketNames[b.Bookkeeper].ContainsKey(@event.Sport) &&
mConfiguration.KnownCorrespondingMarketNames[b.Bookkeeper][@event.Sport].ContainsKey(b.Name))
{
if (mConfiguration.KnownCorrespondingMarketNames[b.Bookkeeper][@event.Sport][b.Name].Contains(a.Name))
{
return true;
}
return false;
}
if (StringDistance.NumberOfSubstringMovementsWithLengthPenalty(a.Name, b.Name) > 0.3)
{
return false;
}
return true;
}
public bool OddsEqual(BookkeeperOdds a, BookkeeperOdds b, Event @event)
{
if (a == null || b == null)
{
return false;
}
if (mConfiguration.KnownCorrespondingOddsNames.ContainsKey(a.Bookkeeper) &&
mConfiguration.KnownCorrespondingOddsNames[a.Bookkeeper].ContainsKey(@event.Sport) &&
mConfiguration.KnownCorrespondingOddsNames[a.Bookkeeper][@event.Sport].ContainsKey(a.Outcome))
{
if (mConfiguration.KnownCorrespondingOddsNames[a.Bookkeeper][@event.Sport][a.Outcome].Contains(b.Outcome))
{
return true;
}
return false;
}
if (mConfiguration.KnownCorrespondingOddsNames.ContainsKey(b.Bookkeeper) &&
mConfiguration.KnownCorrespondingOddsNames[b.Bookkeeper].ContainsKey(@event.Sport) &&
mConfiguration.KnownCorrespondingOddsNames[b.Bookkeeper][@event.Sport].ContainsKey(b.Outcome))
{
if (mConfiguration.KnownCorrespondingOddsNames[b.Bookkeeper][@event.Sport][b.Outcome].Contains(a.Outcome))
{
return true;
}
return false;
}
if (a.Description != null && b.Description != null)
{
if (StringDistance.NumberOfSubstringMovementsWithLengthPenalty(a.Description, b.Description) > 0.3)
{
return false;
}
}
if (StringDistance.NumberOfSubstringMovementsWithLengthPenalty(a.Outcome, b.Outcome) > 0.3)
{
return false;
}
return true;
}
}
}