public async Task <string> AddBetMatchAsync(int matchId, string userId, int homeTeamGoals, int guestTeamGoals) { var bet = new BetMatch() { FirstTeamGoals = homeTeamGoals, SecondTeamGoals = guestTeamGoals, MatchId = matchId, UserId = userId }; await this.DbContext.BetsForMatch.AddAsync(bet); await this.DbContext.SaveChangesAsync(); return(null); }
public async Task IsBeggined_ForFutureMatch_ShoudReturnFalse() { var bet = new BetMatch() { Match = new Match() { Date = DateTime.Now.AddDays(1) } }; this.dbContext.BetsForMatch.Add(bet); this.dbContext.SaveChanges(); var service = new BetService(this.dbContext, null); var result = await service.IsBeggined(false, bet.Id); Assert.IsFalse(result); }
private int CalculatePoints(BetMatch bet, Match match) { if (match.FirstTeamGoals == null || match.SecondTeamGoals == null) { return(0); } else if (match.FirstTeamGoals == bet.FirstTeamGoals && match.SecondTeamGoals == bet.SecondTeamGoals) { return(Constants.POINTS_MATCH_BIG_SCORE); } else if ((match.FirstTeamGoals == match.SecondTeamGoals && bet.FirstTeamGoals == bet.SecondTeamGoals) || (match.FirstTeamGoals > match.SecondTeamGoals && bet.FirstTeamGoals > bet.SecondTeamGoals) || (match.FirstTeamGoals < match.SecondTeamGoals && bet.FirstTeamGoals < bet.SecondTeamGoals)) { return(Constants.POINTS_MATCH_SMALL_SCORE); } else { return(0); } }
public static void newAnalyse() { var NormalisedSelections = new List <NormalisedSelection>(); var TwoWayCompares = new List <TwoWayCompare>(); var ProfitableReturns = new List <TwoOddsReturn>(); if (System.IO.File.Exists(BetConstants.folder + "NormalisedSelection.xml")) { NormalisedSelections = FileUtility.LoadFromXML <NormalisedSelection>(BetConstants.folder + "NormalisedSelection.xml"); } if (System.IO.File.Exists(BetConstants.folder + "TwoWayComparism.xml")) { TwoWayCompares = FileUtility.LoadFromXML <TwoWayCompare>(BetConstants.folder + "TwoWayComparism.xml"); } var bet9jaMatches = FileUtility.LoadFromXML <BetMatch>(BetConstants.bet9jaFilePath); var sportyBetMatches = FileUtility.LoadFromXML <BetMatch>(BetConstants.sportyBetFilePath); var betPawaMatches = FileUtility.LoadFromXML <BetMatch>(BetConstants.betPawaFilePath); var merryBetMatches = FileUtility.LoadFromXML <BetMatch>(BetConstants.merryBetFilePath); //loops through all bet9ja matches for (int i = 0; i < bet9jaMatches.Count; i++) { var b9match = bet9jaMatches[i]; #region Get all Matches that match the league and time of current match var sbLeagueNTimeTrimmed = sportyBetMatches.Where(m => (b9match.League.ToLower().Contains(m.League.ToLower()) || m.League.ToLower().Contains(b9match.League.ToLower())) && m.DateTimeOfMatch.ToUniversalTime().Equals(b9match.DateTimeOfMatch.ToUniversalTime())).ToList(); var bpLeagueNTimeTrimmed = betPawaMatches.Where(m => (b9match.League.ToLower().Contains(m.League.ToLower()) || m.League.ToLower().Contains(b9match.League.ToLower())) && m.DateTimeOfMatch.ToUniversalTime().Equals(b9match.DateTimeOfMatch.ToUniversalTime())).ToList(); var mbLeagueNTimeTrimmed = merryBetMatches.Where(m => (b9match.League.ToLower().Contains(m.League.ToLower()) || m.League.ToLower().Contains(b9match.League.ToLower())) && m.DateTimeOfMatch.ToUniversalTime().Equals(b9match.DateTimeOfMatch.ToUniversalTime())).ToList(); #endregion var bpMatch = new BetMatch(); var mbMatch = new BetMatch(); var sbMatch = new BetMatch(); if (bpLeagueNTimeTrimmed.Count() < 1) { bpMatch = null; } else { bpMatch = Jobs.SameMatch(b9match, bpLeagueNTimeTrimmed); } if (mbLeagueNTimeTrimmed.Count() < 1) { mbMatch = null; } else { mbMatch = Jobs.SameMatch(b9match, mbLeagueNTimeTrimmed); } if (sbLeagueNTimeTrimmed.Count() < 1) { sbMatch = null; } else { sbMatch = Jobs.SameMatch(b9match, sbLeagueNTimeTrimmed); } Console.WriteLine("\n\nBet9ja Match : " + b9match.TeamNames + " ---sportybets found : " + (sbMatch != null ? sbMatch.TeamNames : "null") + " ---Betpawas found : " + (bpMatch != null ? bpMatch.TeamNames : "null") + " ---Merrybets found : " + (mbMatch != null ? mbMatch.TeamNames : "null") ); //calculates the percentage return on the set of matches ProfitableReturns.AddRange(TwoWayCompare(b9match, bpMatch, mbMatch, sbMatch)); } int profitable = 0; foreach (var item in ProfitableReturns) { if (item.PercentageReturns > 100) { profitable++; Console.WriteLine(item.Team + "__" + item.Site1 + "__" + item.Game1 + "__" + item.Odd1 + "__" + item.Site2 + "__" + item.Game2 + "__" + item.Odd2 + "__ (" + item.PercentageReturns + ")"); } } Console.WriteLine("Profitable = " + profitable); }
public static List <TwoOddsReturn> TwoWayCompare(BetMatch b9Match, BetMatch bpMatch, BetMatch mbMatch, BetMatch sbMatch) { var NormalisedSelections = new List <NormalisedSelection>(); var TwoWayCompares = new List <TwoWayCompare>(); var ProfitableReturns = new List <TwoOddsReturn>(); if (System.IO.File.Exists(BetConstants.folder + "NormalisedSelection.xml")) { NormalisedSelections = FileUtility.LoadFromXML <NormalisedSelection>(BetConstants.folder + "NormalisedSelection.xml"); } if (System.IO.File.Exists(BetConstants.folder + "TwoWayComparism.xml")) { TwoWayCompares = FileUtility.LoadFromXML <TwoWayCompare>(BetConstants.folder + "TwoWayComparism.xml"); } foreach (var item in TwoWayCompares) { var match = new Match(); match.Teams = b9Match.TeamNames; match.Odd1Name = item.Selection1; match.Odd2Name = item.Selection2; match.MatchOdds1 = new List <MatchOdds>(); match.MatchOdds2 = new List <MatchOdds>(); var ItemNS1 = NormalisedSelections.First(m => m.Normal == item.Selection1); if (!string.IsNullOrWhiteSpace(ItemNS1.Bet9ja)) { if (b9Match != null) { var bet9jaMatchOdd = b9Match.Odds.FirstOrDefault(m => m.SelectionFull.Replace(" ", "") == ItemNS1.Bet9ja.Replace(" ", "")); if (bet9jaMatchOdd != null) { double odd = 0f; if (double.TryParse(bet9jaMatchOdd.Value, out odd)) { match.MatchOdds1.Add(new MatchOdds() { Odd = odd, Site = "bet9ja" }); } } } } if (!string.IsNullOrWhiteSpace(ItemNS1.BetPawa)) { if (bpMatch != null) { var betPawaMatchOdd = bpMatch.Odds.FirstOrDefault(m => m.SelectionFull.Replace(" ", "") == ItemNS1.BetPawa.Replace(" ", "")); if (betPawaMatchOdd != null) { double odd = 0f; if (double.TryParse(betPawaMatchOdd.Value, out odd)) { match.MatchOdds1.Add(new MatchOdds() { Odd = odd, Site = "betpawa" }); } } } } if (!string.IsNullOrWhiteSpace(ItemNS1.MerryBet)) { if (mbMatch != null) { var merrybetMatchOdd = mbMatch.Odds.FirstOrDefault(m => m.SelectionFull.Replace(" ", "") == ItemNS1.MerryBet.Replace(" ", "")); if (merrybetMatchOdd != null) { double odd = 0f; if (double.TryParse(merrybetMatchOdd.Value, out odd)) { match.MatchOdds1.Add(new MatchOdds() { Odd = odd, Site = "merrybet" }); } } } } if (!string.IsNullOrWhiteSpace(ItemNS1.SportyBet)) { if (sbMatch != null) { var sportybetMatchOdd = sbMatch.Odds.FirstOrDefault(m => m.SelectionFull.Replace(" ", "") == ItemNS1.SportyBet.Replace(" ", "")); if (sportybetMatchOdd != null) { double odd = 0f; if (double.TryParse(sportybetMatchOdd.Value, out odd)) { match.MatchOdds1.Add(new Classes.CalcClasses.MatchOdds() { Odd = odd, Site = "sportybet" }); } } } } var ItemNS2 = NormalisedSelections.First(m => m.Normal == item.Selection2); if (!string.IsNullOrWhiteSpace(ItemNS2.Bet9ja)) { if (b9Match != null) { var bet9jaMatchOdd = b9Match.Odds.FirstOrDefault(m => m.SelectionFull.Replace(" ", "") == ItemNS2.Bet9ja.Replace(" ", "")); if (bet9jaMatchOdd != null) { double odd = 0f; if (double.TryParse(bet9jaMatchOdd.Value, out odd)) { match.MatchOdds2.Add(new Classes.CalcClasses.MatchOdds() { Odd = odd, Site = "bet9ja" }); } } } } if (!string.IsNullOrWhiteSpace(ItemNS2.BetPawa)) { if (bpMatch != null) { var betPawaMatchOdd = bpMatch.Odds.FirstOrDefault(m => m.SelectionFull.Replace(" ", "") == ItemNS2.BetPawa.Replace(" ", "")); if (betPawaMatchOdd != null) { double odd = 0f; if (double.TryParse(betPawaMatchOdd.Value, out odd)) { match.MatchOdds2.Add(new MatchOdds() { Odd = odd, Site = "betpawa" }); } } } } if (!string.IsNullOrWhiteSpace(ItemNS2.MerryBet)) { if (mbMatch != null) { var merrybetMatchOdd = mbMatch.Odds.FirstOrDefault(m => m.SelectionFull.Replace(" ", "") == ItemNS2.MerryBet.Replace(" ", "")); if (merrybetMatchOdd != null) { double odd = 0f; if (double.TryParse(merrybetMatchOdd.Value, out odd)) { match.MatchOdds2.Add(new MatchOdds() { Odd = odd, Site = "merrybet" }); } } } } if (!string.IsNullOrWhiteSpace(ItemNS2.SportyBet)) { if (sbMatch != null) { var sportybetMatchOdd = sbMatch.Odds.FirstOrDefault(m => m.SelectionFull.Replace(" ", "") == ItemNS2.SportyBet.Replace(" ", "")); if (sportybetMatchOdd != null) { double odd = 0f; if (double.TryParse(sportybetMatchOdd.Value, out odd)) { match.MatchOdds2.Add(new Classes.CalcClasses.MatchOdds() { Odd = odd, Site = "sportybet" }); } } } } foreach (var odd1 in match.MatchOdds1) { if (odd1.Odd == 0) { continue; } for (int j = 0; j < match.MatchOdds2.Count; j++) { var odd2 = match.MatchOdds2[j]; if (odd2.Odd == 0) { continue; } var rtn = Jobs.calculateForTwoOdds(odd1.Odd, odd2.Odd); rtn.Site1 = odd1.Site; rtn.Site2 = odd2.Site; rtn.Game1 = match.Odd1Name; rtn.Game2 = match.Odd2Name; rtn.Team = match.Teams; ProfitableReturns.Add(rtn); } } } return(ProfitableReturns); }
public async Task <List <BetMatch> > ScrapeSportyBetDailyAsync(HttpClient client) { var currdate = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); try { //get todays data string FirstresponseBody = await client.GetStringAsync("https://www.sportybet.com/api/ng/factsCenter/pcUpcomingEvents?sportId=sr%3Asport%3A1&marketId=1%2C18%2C10%2C29%2C11%2C26%2C36%2C14&pageSize=100&pageNum=1&timeline=24&_t=" + currdate); //serialize data var t = JsonConvert.DeserializeObject <SearchData>(FirstresponseBody); var eventsId = t.data.tournaments.SelectMany(x => x.events).Select(m => m.eventId); currdate = DateTimeOffset.UtcNow.ToUnixTimeSeconds(); var tasks = new List <Task <string> >(); tasks = eventsId.Select(ids => client.GetStringAsync("https://www.sportybet.com/api/ng/factsCenter/event?eventId=" + ids + "&productId=3&_t=" + currdate)).ToList(); await Task.WhenAll(tasks); var responses = tasks.Select(task => JsonConvert.DeserializeObject <ReceievedData.SportyBetData>(task.Result)); var returnData = new List <BetMatch>(); //loop through each match foreach (var item in responses.ToList()) { var matchStart = DateTimeOffset.FromUnixTimeMilliseconds(item.data.estimateStartTime).DateTime.AddHours(1); foreach (var market in item.data.markets) { var Odds = market.outcomes.Select(l => new BetOdds { Selection = l.desc, MainType = market.desc, Type = l.desc, Value = l.odds }).ToList(); returnData.Add(new BetMatch { League = item.data.sport.category.tournament.name, DateTimeOfMatch = matchStart, TeamNames = item.data.homeTeamName + " - " + item.data.awayTeamName, Odds = Odds, Country = item.data.sport.category.name, }); } } var leagues = new List <string>(); foreach (var item in returnData) { if (!leagues.Any(m => m == item.League)) { leagues.Add(item.League); } } var matchGrouped = new List <BetMatch>(); foreach (var item in leagues) { var sbg = returnData.Where(m => m.League == item); var matchgroup = sbg.GroupBy(m => m.TeamNames); foreach (var i in matchgroup) { var sb = new BetMatch() { Country = i.First().Country, TeamNames = i.First().TeamNames, DateTimeOfMatch = i.First().DateTimeOfMatch, Odds = i.SelectMany(n => n.Odds).ToList(), League = i.First().League, Site = "sportyBet", }; matchGrouped.Add(sb); } } Console.WriteLine("--Sportybet Done."); return(matchGrouped); } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
public static async Task <List <BetMatch> > Scrape(HttpClient client) { //url to get all football markets var url = "https://1xbet.ng/LineFeed/GetChampsZip?sport=1&lng=en&tf=2200000&tz=1&country=132&partner=159&virtualSports=true"; var betMatches = new List <BetMatch>(); try { Console.WriteLine("Started scraping 1xBet"); //get todays data var response = await client.GetStringAsync(url); //get structure of odds var ddt = await GetBetModelJsonAsync(client); var betsName = GetBetsName(ddt); var betsNameModelGroup = GetBetsNameModel(ddt); //var response = responseTask.Result; var todayData = JsonConvert.DeserializeObject <FootBallTypes>(response); if (todayData == null) { return(null); } //loop through leagues/countries foreach (var market in todayData.Value) { //removes unneccesary leagues if (market.L.ToLower().Trim().Contains("statistics round") || market.L.ToLower().Trim().Contains("special")) { continue; } //get country and league var arr = market.L.Split('.'); string country = ""; string league = ""; league = GetLeagueAndOrCountryNames(market, arr, ref country); //get matches in league var mUrl = $"https://1xbet.ng/LineFeed/Get1x2_VZip?champs={market.Id}&count=10&lng=en&mode=4&top=true&partner=159"; var marketResponse = await client.GetAsync(mUrl); if (!marketResponse.IsSuccessStatusCode) { continue; } var dt = await marketResponse.Content.ReadAsStringAsync(); var matchData = JsonConvert.DeserializeObject <SecondData>(dt); //create list of match tasks var allMatchTasks = matchData.Value.Select(x => client.GetAsync($"https://1xbet.ng/LineFeed/GetGameZip?id={x.Ci}&lng=en&cfview=0&isSubGames=true&GroupEvents=true&allEventsGroupSubGames=true&countevents=250&partner=159")); //get list of matche and thier data var allMatches = await Task.WhenAll(allMatchTasks); foreach (var item in allMatches) { if (!item.IsSuccessStatusCode) { continue; } var singleMatchdata = await item.Content.ReadAsStringAsync(); var singleMatch = JsonConvert.DeserializeObject <_1xBetMatchData>(singleMatchdata); //compare dates to get matches for today only. var date1 = DateTimeOffset.FromUnixTimeSeconds(singleMatch.Value.S).DateTime.AddHours(1); var date2 = DateTime.Now; //to get matches for only today if (DateTime.Compare(date1, date2) <= 0) { continue; } var betMatch = new BetMatch { Country = country, League = league, DateTimeOfMatch = date1, Site = "1xBet", TeamNames = $"{singleMatch.Value.O1} - {singleMatch.Value.O2}" }; var betList = new List <BetOdds>(); foreach (var e in singleMatch.Value.Ge) { var bG = e.G; var betGroup = betsNameModelGroup[bG.ToString()].N; foreach (var eee in e.E.SelectMany(ee => ee.Select(eee => eee))) { var betType = eee.T.ToString(); var value = eee.C.ToString(); var selection = betsName[betType].N; betList.Add(new BetOdds { MainType = betGroup, Selection = selection, Type = betGroup, Value = value }); } } betMatch.Odds = betList; betMatches.Add(betMatch); } return(betMatches); } return(null); } catch (Exception e) { Console.WriteLine(e.Message); throw; } }
public List <BetMatch> ScrapeDaily(HttpClient client) { var currdate = DateTime.Now.ToString("yyyy'-'MM'-'dd"); var tomodate = DateTime.Now.AddDays(1).ToString("yyyy'-'MM'-'dd"); var listEvents = new List <BetMatch>(); var jsonSettings = new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }; try { //get todays data string FirstresponseBody = client.GetStringAsync("https://merrybet.com/rest/search/events/search-by-date/" + currdate).Result; //get next day data //string SecondresponseBody = client.GetStringAsync("https://merrybet.com/rest/search/events/search-by-date/" + tomodate).Result; //get first day list of events id var t = JsonConvert.DeserializeObject <SearchData>(FirstresponseBody).data.Where(m => m.category1Name == "Soccer" && !m.category3Name.ToLower().Contains("special") && m.eventType == 1).Select(x => x.eventId).ToList(); //get second day list of events id and add to previous list //t.AddRange(JsonConvert.DeserializeObject<SearchData>(SecondresponseBody).data.Where(m => m.category1Name == "Soccer" && !m.category3Name.ToLower().Contains("special") && m.eventType == 1).Select(x => x.eventId).ToList()); Parallel.ForEach(t, (eventId) => { //get data for event var singleresponse = client.GetStringAsync("https://merrybet.com/rest/market/events/" + eventId).Result; var singleEventData = JsonConvert.DeserializeObject <MBData.ReceivedDataMerryBet>(singleresponse); if (singleEventData.data != null) { var mbOdds = singleEventData.data.eventGames. SelectMany(x => x.outcomes. Select(m => new BetOdds() { Type = x.gameName, Selection = m.outcomeName, Value = m.outcomeOdds.ToString() })) .ToList(); var teamNames = singleEventData.data.eventName.Split('-'); try { mbOdds.ForEach( m => m.Selection = m.Selection.Replace(teamNames[0].Trim(), "1").Replace(teamNames[1].Trim(), "2")); } catch (Exception e) { Console.WriteLine(mbOdds.Count + e.Message); return; } var mbOddsnGames = new BetMatch(); if (singleEventData.data.category3Name.ToLower() == "group stage") { mbOddsnGames = new BetMatch() { DateTimeOfMatch = DateTimeOffset.FromUnixTimeMilliseconds(singleEventData.data.eventStart).DateTime.AddHours(1), League = singleEventData.data.category2Name, TeamNames = singleEventData.data.eventName, Odds = mbOdds, Country = singleEventData.data.category3Name, Site = "merryBet" }; } else { mbOddsnGames = new BetMatch() { DateTimeOfMatch = DateTimeOffset.FromUnixTimeMilliseconds(singleEventData.data.eventStart).DateTime.AddHours(1), League = singleEventData.data.category3Name, TeamNames = singleEventData.data.eventName, Odds = mbOdds, Country = singleEventData.data.category2Name, Site = "merryBet" }; } listEvents.Add(mbOddsnGames); } else { Console.WriteLine("No data returned"); } }); Console.WriteLine("--Merrybet Done"); return(listEvents); } catch (HttpRequestException e) { Console.WriteLine("\n Http Exception Caught!"); Console.WriteLine("Message :{0} ", e.Message); } catch (Exception e) { Console.WriteLine("\nException Caught!"); Console.WriteLine("Message :{0} ", e.Message); } return(null); }