private static IEnumerable <EmbedBuilder> BettorEmbeds(Bet bet) { if (bet == null || bet.Bettors.Count() == 0) { return(new List <EmbedBuilder>()); } var groups = bet.Bettors .GroupBy(b => b.BetOptionId) .Select(g => { BetOption option = bet.Options.FirstOrDefault(o => o.Id == g.Key); IEnumerable <string> bettors = g .OrderByDescending(b => b.Amount) .Select(b => $"{MentionUtils.MentionUser(b.UserId)} bet {b.Amount} Attarcoins."); return(new EmbedBuilder() .WithColor(Color.Green) .WithTitle($"Option \"{option.Name}\" on bet \"{bet.Name}\"") .WithDescription($"Id: [{option.Id}]\nOdds: ({option.Odds:F})\n\n{string.Join("\n", bettors)}")); }); return(groups); }
public static Embed MineBets(IEnumerable <Bet> bets, ulong userId) { if (!bets.Any()) { return(BetHelp()); } IEnumerable <EmbedFieldBuilder> fields = bets.Select(bet => { List <string> options = bet.Options.Select(option => { int betted = bet.Bettors .Where(b => b.BetOptionId == option.Id) .Aggregate(0, (total, b) => total + b.Amount); return($"[{option.Id}] ({option.Odds:F}) {option.Name} with the weight of {betted} coins."); }).ToList(); Bettor bettor = bet.Bettors.FirstOrDefault(b => b.UserId == userId); BetOption bettorsOption = bet.Options.FirstOrDefault(o => o.Id == bettor.BetOptionId); options.Add($"\nYou placed {bettor.Amount} Attarcoin on option \"{bettorsOption.Name}\". {(bettor.Released ? "(Released)" : "")}"); return(new EmbedFieldBuilder() .WithIsInline(false) .WithName($"{bet.Name} ({(bet.Resolved ? "Inactive" : "Active")})") .WithValue(options.Count == 0 ? "No options added yet." : string.Join("\n", options))); }); return(new EmbedBuilder() .WithTitle("Your bets") .WithColor(Color.Green) .WithFields(fields) .Build()); }
public async Task <BetOption> AddBetOption(string name, float odds, string betName) { Bet bet = await _repository.GetBetByName(betName); if (bet == null) { return(null); } if (bet.Resolved) { return(null); } if (odds <= 1) { return(null); } BetOption newOption = new BetOption { Id = bet.Options.Count() + 1, Name = name, Odds = odds }; bet.Options = bet.Options.Concat(new[] { newOption }); await _repository.UpdateBet(bet); await _repository.SaveAsync(); return(newOption); }
private static EmbedFieldBuilder BettorDescription(Bet bet) { var builder = new EmbedFieldBuilder() .WithName("Bettors") .WithIsInline(false); if (bet == null || bet.Bettors.Count() == 0) { return(builder.WithValue("none")); } var groups = bet.Bettors .GroupBy(b => b.BetOptionId) .Select(g => { BetOption option = bet.Options.FirstOrDefault(o => o.Id == g.Key); IEnumerable <string> bettors = g .OrderByDescending(b => b.Amount) .Select(b => $"{MentionUtils.MentionUser(b.UserId)} bet {b.Amount} Attarcoins."); return($"[{option.Id}] ({option.Odds:F}) {option.Name}\n\n{string.Join("\n", bettors)}"); }); string message = string.Join("\n\n", groups); if (message.Length > EmbedFieldBuilder.MaxFieldValueLength) { return(null); } return(builder.WithValue(message)); }
public void MarkCorrect(BetOption betOption) { var outcome = _context.BetOptions.Find(betOption.Id); outcome.Correct = true; _context.SaveChanges(); }
public void TakeBet(Bettor bettor, BetOption outcome, Brother brother) { if (bettor == null) { throw new ArgumentNullException(nameof(bettor)); } if (bettor.Id == default(int)) { throw new ArgumentException(nameof(bettor)); } if (outcome == null) { throw new ArgumentNullException(nameof(outcome)); } if (outcome.Id == default(int)) { throw new ArgumentException(nameof(outcome)); } if (brother == null) { throw new ArgumentNullException(nameof(brother)); } if (brother.Id == default(int)) { throw new ArgumentException(nameof(brother)); } _betRepository.TakeBet(bettor, outcome, brother); }
public void MarkAsComplete(BetOption betOption, Bettor bettor) { if (betOption == null) { throw new ArgumentNullException(nameof(betOption)); } if (betOption.Id == default(int)) { throw new ArgumentException(nameof(betOption)); } if (bettor == null) { throw new ArgumentNullException(nameof(bettor)); } if (bettor.Id == default(int)) { throw new ArgumentException(nameof(bettor)); } if (betOption.Bet.Complete) { throw new Exception("Bet Already Complete"); } _betRepository.MarkComplete(betOption.Bet, bettor); _betRepository.MarkCorrect(betOption); _betRepository.AddPointsToSuccessfulGuess(betOption, 100); }
public static IEnumerable <Embed> BetOptionCreated(Bet bet, BetOption option, IUser author) { var builder = new EmbedBuilder() .WithAuthor(author) .WithTitle("Bet option added") .WithDescription($"Bet option '{option.Name}' added to bet '{bet.Name}'.") .AddField("Place bet", $"$bet-place \"{bet.Name}\" {option.Id} AMOUNT") .WithColor(Color.Green); return(WithBettors(bet, builder)); }
public void AddPointsToSuccessfulGuess(BetOption betOption, long points) { var successfulGuessers = _context.Predictions .Where(p => p.OutcomePredicted.Id == betOption.Id) .Select(p => p.Bettor); foreach (var bettor in successfulGuessers) { bettor.Points += points; } _context.SaveChanges(); }
public void MarkAsComplete_AlreadyComplete_ThrowsException() { var repo = new Mock <IBetRepository>(); var bookie = new BookMaker(repo.Object); var completedOutcome = new BetOption() { Id = 1, Bet = new Bet() { Id = 1, Complete = true } }; Assert.Throws <Exception>(() => bookie.MarkAsComplete(completedOutcome, ValidBettor)); }
public void TakeBet(Bettor bettor, BetOption outcome, Brother brother) { brother = _context.Brothers.Find(brother.Id); var prediction = new Prediction() { Bettor = _context.Bettors.Find(bettor.Id), OutcomePredicted = _context.BetOptions.Find(outcome.Id), TimeOfPrediction = DateTime.Now }; if (brother.Predictions == null) { brother.Predictions = new List <Prediction>(); } brother.Predictions.Add(prediction); _context.SaveChanges(); }
public void MarkAsComplete_Valid_MarksBetAsComplete_AndAddsPoints() { var repo = new Mock <IBetRepository>(); var bookie = new BookMaker(repo.Object); var outcome = new BetOption() { Id = 1, Bet = new Bet() { Id = 1 } }; bookie.MarkAsComplete(outcome, ValidBettor); repo.Verify(m => m.MarkComplete(It.IsAny <Bet>(), It.IsAny <Bettor>())); repo.Verify(m => m.MarkCorrect(It.IsAny <BetOption>())); repo.Verify(m => m.AddPointsToSuccessfulGuess(It.IsAny <BetOption>(), It.IsAny <long>())); }
public async Task <IEnumerable <BetReward> > Resolve(string betName, int betOptionId) { Bet bet = await _repository.GetBetByName(betName); BetOption option = bet.Options.FirstOrDefault(o => o.Id == betOptionId); if (bet == null || bet.Resolved || option == null) { return(new List <BetReward>()); } bet.Resolved = true; await _repository.UpdateBet(bet); await _repository.SaveAsync(); return(bet.Bettors .Where(bettor => bettor.BetOptionId == betOptionId) .Select(w => new BetReward { UserId = w.UserId, Amount = (int)Math.Round(option.Odds * w.Amount) })); }
private static string BetOptionNameById(Bet bet, int betOptionId) { BetOption option = bet.Options.FirstOrDefault(o => o.Id == betOptionId); return(option?.Name ?? "unknown"); }
public Bet(int mStake, BetOption mBetOption) { stake = mStake; bet = mBetOption; }
void PopulateBetOptions() { //Create the bet options for the individual numbers, with a mulitplier of 36 for (int i = 0; i < 37; i++) { RouletteNumber[] individualNumber = new RouletteNumber[1]; individualNumber[0] = rouletteNumbers[i]; betOptions[i] = new BetOption(individualNumber, 36, i); } List <RouletteNumber> cBlack = new List <RouletteNumber>(); List <RouletteNumber> cRed = new List <RouletteNumber>(); List <RouletteNumber> lOdd = new List <RouletteNumber>(); List <RouletteNumber> lEven = new List <RouletteNumber>(); List <RouletteNumber> lFirstHalf = new List <RouletteNumber>(); List <RouletteNumber> lSecondHalf = new List <RouletteNumber>(); List <RouletteNumber> lFirst12 = new List <RouletteNumber>(); List <RouletteNumber> lSecond12 = new List <RouletteNumber>(); List <RouletteNumber> lThird12 = new List <RouletteNumber>(); for (int i = 0; i < rouletteNumbers.Length; i++) { if (rouletteNumbers[i].color == "Black") { cBlack.Add(rouletteNumbers[i]); } if (rouletteNumbers[i].color == "Red") { cRed.Add(rouletteNumbers[i]); } if (rouletteNumbers[i].number % 2 == 1) { lOdd.Add(rouletteNumbers[i]); } if (rouletteNumbers[i].number % 2 == 0 && rouletteNumbers[i].number != 0) { lEven.Add(rouletteNumbers[i]); } if (rouletteNumbers[i].number > 0 && rouletteNumbers[i].number < 19) { lFirstHalf.Add(rouletteNumbers[i]); } if (rouletteNumbers[i].number > 18) { lSecondHalf.Add(rouletteNumbers[i]); } if (rouletteNumbers[i].number > 0 && rouletteNumbers[i].number < 13) { lFirst12.Add(rouletteNumbers[i]); } if (rouletteNumbers[i].number > 12 && rouletteNumbers[i].number < 25) { lSecond12.Add(rouletteNumbers[i]); } if (rouletteNumbers[i].number > 24) { lThird12.Add(rouletteNumbers[i]); } } RouletteNumber[] colorBlack = cBlack.ToArray(); RouletteNumber[] colorRed = cRed.ToArray(); RouletteNumber[] odd = lOdd.ToArray(); RouletteNumber[] even = lEven.ToArray(); RouletteNumber[] firstHalf = lFirstHalf.ToArray(); RouletteNumber[] secondHalf = lSecondHalf.ToArray(); RouletteNumber[] first12 = lFirst12.ToArray(); RouletteNumber[] second12 = lSecond12.ToArray(); RouletteNumber[] third12 = lThird12.ToArray(); betOptions[37] = new BetOption(colorBlack, 2, 37); betOptions[38] = new BetOption(colorRed, 2, 38); betOptions[39] = new BetOption(odd, 2, 39); betOptions[40] = new BetOption(even, 2, 40); betOptions[41] = new BetOption(firstHalf, 2, 41); betOptions[42] = new BetOption(secondHalf, 2, 42); betOptions[43] = new BetOption(first12, 3, 43); betOptions[44] = new BetOption(second12, 3, 44); betOptions[45] = new BetOption(third12, 3, 45); }
static Task <int> UpdateGamesTask() { try { var files = new[] { "D:/Documents/BWay/rebetxmlfiles/GetSportEventsHalfTime.xml", "D:/Documents/BWay/rebetxmlfiles/GetSportEventsItalyEngland.xml" }; var database = new ZeusDbContext(); // start of files urls foreach (var file in files) { var matches = new List <Match>(); var matchodds = new List <MatchOdd>(); var xmldoc = new XmlDocument(); xmldoc.Load(file); var oddServiceNode = xmldoc.ChildNodes[1]; var resultsNode = oddServiceNode.ChildNodes[1]; foreach (XmlNode eventNode in resultsNode) { var eventId = eventNode.ChildNodes[0].InnerText; var unformattedStartDate = eventNode.ChildNodes[1].InnerText; var startDateTime = DateTime.Parse(unformattedStartDate); var sportIdNode = eventNode.ChildNodes[2]; var sportId = sportIdNode.InnerText; var sportName = (sportIdNode.Attributes != null) ? sportIdNode.Attributes["Name"].InnerText : String.Empty; var leagueIdNode = eventNode.ChildNodes[3]; var leagueId = leagueIdNode.InnerText; var leagueName = (leagueIdNode.Attributes != null) ? leagueIdNode.Attributes["Name"].InnerText : String.Empty; var locationIdNode = eventNode.ChildNodes[4]; var locationId = locationIdNode.InnerText; var locationName = (locationIdNode.Attributes != null) ? locationIdNode.Attributes["Name"].InnerText : String.Empty; var lastUpdateTime = eventNode.ChildNodes[6].InnerText; var homeTeamNode = eventNode.ChildNodes[8]; var homeTeam = (homeTeamNode.Attributes != null) ? homeTeamNode.Attributes["Name"].InnerText : String.Empty; var awayTeamNode = eventNode.ChildNodes[9]; var awayTeam = awayTeamNode.Attributes != null ? awayTeamNode.Attributes["Name"].InnerText : String.Empty; var outcomesNode = eventNode.ChildNodes[14]; Console.WriteLine("{0} -> {1} vs {2}", leagueName, homeTeam, awayTeam); matches.Add(new Match { AwayTeamName = awayTeam, BetServiceMatchNo = Convert.ToInt32(eventId), GameStatus = "Not Started", HomeTeamName = homeTeam, League = leagueName, RegistrationDate = DateTime.Now, ResultStatus = 0, StartTime = startDateTime }); if (!outcomesNode.HasChildNodes) { continue; } #region OutComes foreach (XmlNode outcomeNode in outcomesNode.ChildNodes) { if (outcomeNode.Attributes == null) { continue; } var outcome = outcomeNode.Attributes["name"].InnerText; //Console.WriteLine("{0} Odds", outcome); var bookmakerNode = outcomeNode.ChildNodes[0]; var oddsNodes = bookmakerNode.ChildNodes; // Locate an out ome in the datbase with that particular name var betcategory = new BetCategory { BetCategoryName = outcome }; database.BetCategories.AddOrUpdate(bc => bc.BetCategoryName, betcategory); database.SaveChanges(); switch (outcome) { #region 1x2 Odds case "1X2": foreach (XmlNode odd in oddsNodes) { if (odd.Attributes == null) { continue; } var bet = odd.Attributes["bet"].InnerText; var line = odd.Attributes["line"].InnerText; var unformattedLastUpdateTime = odd.Attributes["LastUpdate"].InnerText; var betoption = new BetOption { BetCategoryId = betcategory.BetCategoryId, Option = bet, Line = line }; database.BetOptions.AddOrUpdate( bo => new { bo.Option, bo.BetCategoryId, bo.Line }, betoption); database.SaveChanges(); var matchodd = new MatchOdd { BetServiceMatchNo = Convert.ToInt32(eventId), BetOptionId = betoption.BetOptionId, LastUpdateTime = DateTime.Parse(unformattedLastUpdateTime), Odd = Convert.ToDecimal(odd.Attributes["currentPrice"].InnerText) }; matchodds.Add(matchodd); } break; #endregion #region Under/Over Odds case "Under/Over": foreach (XmlNode odd in oddsNodes) { if (odd.Attributes == null) { continue; } var bet = odd.Attributes["bet"].InnerText; var line = odd.Attributes["line"].InnerText; var unformattedLastUpdateTime = odd.Attributes["LastUpdate"].InnerText; var betoption = new BetOption { BetCategoryId = betcategory.BetCategoryId, Option = bet, Line = line }; if (line != "0.5" && line != "1.5" && line != "2.5" && line != "3.5" && line != "4.5" && line != "5.5" && line != "6.5") { continue; } database.BetOptions.AddOrUpdate( bo => new { bo.Option, bo.BetCategoryId, bo.Line }, betoption); database.SaveChanges(); var matchodd = new MatchOdd { BetServiceMatchNo = Convert.ToInt32(eventId), BetOptionId = betoption.BetOptionId, LastUpdateTime = DateTime.Parse(unformattedLastUpdateTime), Odd = Convert.ToDecimal(odd.Attributes["currentPrice"].InnerText) }; matchodds.Add(matchodd); } break; #endregion #region Double Chance Odds case "Double Chance": foreach (XmlNode odd in oddsNodes) { if (odd.Attributes == null) { continue; } var bet = odd.Attributes["bet"].InnerText; var line = odd.Attributes["line"].InnerText; var unformattedLastUpdateTime = odd.Attributes["LastUpdate"].InnerText; var betoption = new BetOption { BetCategoryId = betcategory.BetCategoryId, Option = bet, Line = line }; database.BetOptions.AddOrUpdate( bo => new { bo.Option, bo.BetCategoryId, bo.Line }, betoption); database.SaveChanges(); var matchodd = new MatchOdd { BetServiceMatchNo = Convert.ToInt32(eventId), BetOptionId = betoption.BetOptionId, LastUpdateTime = DateTime.Parse(unformattedLastUpdateTime), Odd = Convert.ToDecimal(odd.Attributes["currentPrice"].InnerText) }; matchodds.Add(matchodd); } break; #endregion #region European Handicap case "European Handicap": foreach (XmlNode odd in oddsNodes) { if (odd.Attributes == null) { continue; } var bet = odd.Attributes["bet"].InnerText; var line = odd.Attributes["line"].InnerText; var unformattedLastUpdateTime = odd.Attributes["LastUpdate"].InnerText; var betoption = new BetOption { BetCategoryId = betcategory.BetCategoryId, Option = bet, Line = line }; database.BetOptions.AddOrUpdate( bo => new { bo.Option, bo.BetCategoryId, bo.Line }, betoption); database.SaveChanges(); var matchodd = new MatchOdd { BetServiceMatchNo = Convert.ToInt32(eventId), BetOptionId = betoption.BetOptionId, LastUpdateTime = DateTime.Parse(unformattedLastUpdateTime), Odd = Convert.ToDecimal(odd.Attributes["currentPrice"].InnerText) }; matchodds.Add(matchodd); } break; #endregion #region Both Teams To Score Odds case "Both Teams To Score": foreach (XmlNode odd in oddsNodes) { if (odd.Attributes == null) { continue; } var bet = odd.Attributes["bet"].InnerText; var line = odd.Attributes["line"].InnerText; var unformattedLastUpdateTime = odd.Attributes["LastUpdate"].InnerText; var betoption = new BetOption { BetCategoryId = betcategory.BetCategoryId, Option = bet, Line = line }; database.BetOptions.AddOrUpdate( bo => new { bo.Option, bo.BetCategoryId, bo.Line }, betoption); database.SaveChanges(); if (odd.Attributes == null) { continue; } var matchodd = new MatchOdd { BetServiceMatchNo = Convert.ToInt32(eventId), BetOptionId = betoption.BetOptionId, LastUpdateTime = DateTime.Parse(unformattedLastUpdateTime), Odd = Convert.ToDecimal(odd.Attributes["currentPrice"].InnerText) }; matchodds.Add(matchodd); } break; #endregion #region Under/Over 1st Period case "Under/Over 1st Period": foreach (XmlNode odd in oddsNodes) { if (odd.Attributes == null) { continue; } var bet = odd.Attributes["bet"].InnerText; var line = odd.Attributes["line"].InnerText; var unformattedLastUpdateTime = odd.Attributes["LastUpdate"].InnerText; var betoption = new BetOption { BetCategoryId = betcategory.BetCategoryId, Option = bet, Line = line }; database.BetOptions.AddOrUpdate( bo => new { bo.Option, bo.BetCategoryId, bo.Line }, betoption); database.SaveChanges(); var matchodd = new MatchOdd { BetServiceMatchNo = Convert.ToInt32(eventId), BetOptionId = betoption.BetOptionId, LastUpdateTime = DateTime.Parse(unformattedLastUpdateTime), Odd = Convert.ToDecimal(odd.Attributes["currentPrice"].InnerText) }; matchodds.Add(matchodd); } break; #endregion #region 1st Period Winner case "1st Period Winner": foreach (XmlNode odd in oddsNodes) { if (odd.Attributes == null) { continue; } var bet = odd.Attributes["bet"].InnerText; var line = odd.Attributes["line"].InnerText; var unformattedLastUpdateTime = odd.Attributes["LastUpdate"].InnerText; var betoption = new BetOption { BetCategoryId = betcategory.BetCategoryId, Option = bet, Line = line }; database.BetOptions.AddOrUpdate( bo => new { bo.Option, bo.BetCategoryId, bo.Line }, betoption); database.SaveChanges(); var matchodd = new MatchOdd { BetServiceMatchNo = Convert.ToInt32(eventId), BetOptionId = betoption.BetOptionId, LastUpdateTime = DateTime.Parse(unformattedLastUpdateTime), Odd = Convert.ToDecimal(odd.Attributes["currentPrice"].InnerText) }; matchodds.Add(matchodd); } break; #endregion } } #endregion } // end of for each for file or url try { const int chunkSize = 100; var totalMatches = matches.Count; var chunksToSave = (totalMatches % chunkSize) > 0 ? (totalMatches / chunkSize) + 1 : totalMatches / chunkSize; for (var i = 0; i < chunksToSave; i++) { var chunk = matches.Skip(i * chunkSize).Take(chunkSize); var startTime = DateTime.Now; database.Matches.AddOrUpdate(m => m.BetServiceMatchNo, chunk.ToArray()); database.SaveChanges(); var endTime = DateTime.Now; var timeSpan = endTime - startTime; Console.WriteLine("Matches in Chunk {0} Updated Successfully in {1} Seconds", i + 1, timeSpan.Seconds); } Console.WriteLine("Matches Updated Successfully"); } catch (Exception ex) { Console.WriteLine("Error updating games: {0}.", ex.Message); } try { const int chunkSize = 100; var totalMatchOdds = matchodds.Count; var chunksToSave = (totalMatchOdds % chunkSize) > 0 ? (totalMatchOdds / chunkSize) + 1 : totalMatchOdds / chunkSize; for (var i = 0; i < chunksToSave; i++) { var chunk = matchodds.Skip(i * chunkSize).Take(chunkSize); var startTime = new DateTime(); database.MatchOdds.AddOrUpdate(key => new { key.BetServiceMatchNo, key.BetOptionId }, chunk.ToArray()); database.SaveChanges(); var endTime = new DateTime(); var timeSpan = endTime - startTime; Console.WriteLine("MatchOdds in Chunk {0} Updated Successfully in {1} Seconds", i + 1, timeSpan.Seconds); } Console.WriteLine("All MatchOdds Updated Successfully"); } catch (Exception ex) { Console.WriteLine("Error updating odds: {0}.", ex.Message); } } } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); } Console.ReadLine(); return(Task.FromResult(0)); }