private void Bet_TimeToGraphReached(object sender, EventArgs e) { try { GameBet bet = sender as GameBet; if (bet == null) { return; } // Do initial Check if (assetCache.ContainsKey(bet.AssetPair)) { if (assetCache[bet.AssetPair].CurrentPrice != null && assetCache[bet.AssetPair].PreviousPrice != null && assetCache[bet.AssetPair].CurrentPrice.MidPrice() > 0 && assetCache[bet.AssetPair].PreviousPrice.MidPrice() > 0) { ProcessBetCheck(bet, true); } } // Add bet to cache lock (BetCacheLock) { betCache.Add(bet); } } catch (Exception ex) { LogError("Bet_TimeToGraphReached", ex); } }
/// <summary> /// Set bet status to Lose(if not won), publish WIN to WAMP, Save to DB /// </summary> /// <param name="bet">Bet</param> private void ProcessBetTimeOut(GameBet bet) { // Remove bet from cache lock (BetCacheLock) { bool res = betCache.Remove(bet); } // If bet was not won previously if (bet.BetStatus != BetStates.Win) { // Set bet Status to lose bet.BetStatus = BetStates.Lose; // publish LOSE to WAMP topic var t = Task.Run(() => { // Publish LOSE to WAMP topic GameEvent ev = new GameEvent { EventType = (int)GameEventType.BetResult, EventParameters = string.Format("{0};{1}", bet.Box.Id, (int)bet.BetStatus) }; bet.User.PublishToWamp(ev); // Save bet to Database database.SaveGameBet(bet); // Set User Status UserState user = GetUserState(bet.UserId); SetUserStatus(user, GameStatus.BetLost, 0, $"Bet LOST [{bet.Box.Id}] [{bet.AssetPair}] Bet:{bet.BetAmount}"); }); } }
/// <summary> /// Checks Bet WIN agains given parameters /// </summary> /// <param name="bet"></param> /// <param name="dCurrentPrice"></param> /// <param name="dPreviousPrice"></param> /// <returns>TRUE if WIN</returns> private bool CheckWinOngoing(GameBet bet, double dCurrentPrice, double dPreviousPrice) { decimal currentPrice = Convert.ToDecimal(dCurrentPrice); decimal previousPrice = Convert.ToDecimal(dPreviousPrice); double currentDelta = (double)currentPrice - dCurrentPrice; double previousDelta = (double)previousPrice - dPreviousPrice; if (currentDelta > 0.000001 || currentDelta < -0.000001) { LogWarning("CheckWinOngoing", $"Double to Decimal conversion Fail! CurrDelta={currentDelta} double:{dCurrentPrice} decimal:{currentPrice}"); } if (previousDelta > 0.000001 || previousDelta < -0.000001) { LogWarning("CheckWinOngoing", $"Double to Decimal conversion Fail! PrevDelta={previousDelta} double:{dPreviousPrice} decimal:{previousPrice}"); } if ((currentPrice > bet.Box.MinPrice && currentPrice < bet.Box.MaxPrice) || // currentPrice> minPrice and currentPrice<maxPrice (previousPrice > bet.Box.MaxPrice && currentPrice < bet.Box.MinPrice) || // OR previousPrice > maxPrice and currentPrice < minPrice (previousPrice < bet.Box.MinPrice && currentPrice > bet.Box.MaxPrice)) // OR previousPrice < minPrice and currentPrice > maxPrice { return(true); } else { return(false); } }
private GameBet[] GetRunningBets() { GameBet[] retval; lock (BetCacheLock) { retval = new GameBet[betCache.Count]; betCache.CopyTo(retval); } return(retval); }
private void Bet_TimeLenghFinished(object sender, EventArgs e) { GameBet sdr = sender as GameBet; if (sdr == null) { return; } ProcessBetTimeOut(sdr); }
public void AddGameBet(GameBet gameBet) { DatabaseContext.ExecuteProcedure("AddGameBet", new { gameBet.UserId, gameBet.GameId, gameBet.HomeWins, gameBet.HomeScore, gameBet.AwayScore }); }
/// <summary> /// Set bet status to WIN, update user balance, publish WIN to WAMP, Save to DB /// </summary> /// <param name="bet">Bet</param> /// <param name="res">WinCheck Result</param> private void ProcessBetWin(GameBet bet) { // Set bet to win bet.BetStatus = BetStates.Win; bet.WinStamp = DateTime.UtcNow; //Update user balance with prize decimal prize = bet.BetAmount * bet.Box.Coefficient; bet.User.SetBalance(bet.User.Balance + prize); // Publish WIN to WAMP topic var t = Task.Run(() => { //BetResult checkres = new BetResult(bet.Box.Id) //{ // BetAmount = bet.BetAmount, // Coefficient = bet.Box.Coefficient, // MinPrice = bet.Box.MinPrice, // MaxPrice = bet.Box.MaxPrice, // TimeToGraph = bet.Box.TimeToGraph, // TimeLength = bet.Box.TimeLength, // PreviousPrice = assetCache[bet.AssetPair].PreviousPrice, // CurrentPrice = assetCache[bet.AssetPair].CurrentPrice, // Timestamp = bet.Timestamp, // TimeToGraphStamp = bet.TimeToGraphStamp, // WinStamp = bet.WinStamp, // FinishedStamp = bet.FinishedStamp, // BetState = (int)bet.BetStatus, // IsWin = true //}; // Publish to WAMP topic GameEvent ev = new GameEvent() { EventType = (int)GameEventType.BetResult, EventParameters = string.Format("{0};{1}", bet.Box.Id, (int)bet.BetStatus) //EventParameters = checkres.ToJson() }; bet.User.PublishToWamp(ev); // Save bet to Database database.SaveGameBet(bet); // Set User Status UserState user = GetUserState(bet.UserId); SetUserStatus(user, GameStatus.BetWon, Convert.ToDouble(bet.BetAmount * bet.Box.Coefficient), $"Bet WON [{bet.Box.Id}] [{bet.AssetPair}] Bet:{bet.BetAmount} Coef:{bet.Box.Coefficient} Prize:{bet.BetAmount * bet.Box.Coefficient}"); }); }
public void Create(CreateGameBetViewModel model) { using (var transaction = _entityContext.Database.BeginTransaction()) { try { Player player = _playerLogic.GetById(model.PlayerId); if (player.Balance < model.Sum) { throw new ArgumentException("The player's balance is smaller and the sum provided"); } player.Balance -= model.Sum; player.NumberOfGamesPlayed += 1; player.TotalSpent += model.Sum; Transaction transactionModel = new Transaction { Sum = model.Sum, CreatedAt = DateTime.UtcNow, UpdatedAt = DateTime.UtcNow, Player = player }; GameBet bet = new GameBet { GameId = model.GameId, PlayerId = model.PlayerId, ChosenNumbers = JsonConvert.SerializeObject(model.Numbers), BetStatus = BetStatus.InProgress, CreatedAt = DateTime.UtcNow, UpdatedAt = DateTime.UtcNow, Transaction = transactionModel }; _entityContext.Update(player); _entityContext.Add(bet); _entityContext.SaveChanges(); transaction.Commit(); } catch (Exception) { transaction.Rollback(); throw; } } }
//[Authorize(Roles = "Cashier, Admin")] public ActionResult Index(int id) { var bets = Unit.PokerBetSrvc.GetGameBet(id); var firstBet = bets.First(); var margin = ""; double sum = 0; var eachSum = (firstBet.Sum / bets.Count()).ToString(); for (int i = 0; i < bets.Length; i++) { sum += (firstBet.Sum / bets.Count()) * bets[i].Index; if (i != bets.Length - 1) { margin += eachSum + " x " + bets[i].Index + " + "; } else { margin += eachSum + " x " + bets[i].Index + " = " + sum; } } var games = new GameBet[bets.Count()]; for (int i = 0; i < games.Count(); i++) { games[i] = new GameBet() { Index = bets[i].Index, Winner = bets[i].Winner, TableNumber = bets[i].TableNumber, TableCode = bets[i].TableCode, Event = bets[i].Event, StartDate = bets[i].StartDate }; } var model = new CheckModel() { ContractNumber = "978" + firstBet.ContractNumber, CurrentDate = DateTime.Now, Games = games, Margin = margin, ContractSum = firstBet.Sum, }; return(View(model)); }
/// <summary> /// Performs a check to validate bet WIN /// </summary> /// <param name="bet">Bet</param> private void ProcessBetCheck(GameBet bet, bool IsFirstCheck) { if (bet == null || bet.BetStatus == BetStates.Win || bet.BetStatus == BetStates.Lose) { // bet already processed; return; } // Run Check Asynchronously Task.Run(() => { var assetHist = assetCache[bet.AssetPair]; bool IsWin = false; if (IsFirstCheck) { IsWin = CheckWinOnstarted(bet, assetHist.CurrentPrice.MidPrice()); } else { IsWin = CheckWinOngoing(bet, assetHist.CurrentPrice.MidPrice(), assetHist.PreviousPrice.MidPrice()); } if (IsWin) { // Process WIN ProcessBetWin(bet); } else { if (IsFirstCheck) { // Report TimeTograph Reached GameEvent ev = new GameEvent { EventType = (int)GameEventType.BetResult, EventParameters = string.Format("{0};{1}", bet.Box.Id, (int)bet.BetStatus) //EventParameters = checkres.ToJson() }; bet.User.PublishToWamp(ev); } } }); }
private bool CheckWinOnstarted(GameBet bet, double dCurrentPrice) { decimal currentPrice = Convert.ToDecimal(dCurrentPrice); double currentDelta = (double)currentPrice - dCurrentPrice; if (currentDelta > 0.000001 || currentDelta < -0.000001) { LogWarning("CheckWinOnstarted", $"Double to Decimal conversion Fail! CurrDelta={currentDelta} double:{dCurrentPrice} decimal:{currentPrice}"); } if (currentPrice > bet.Box.MinPrice && currentPrice < bet.Box.MaxPrice) { return(true); } else { return(false); } }
private GameBet ParseGameRezult(Bet bet, int eventId, Dictionary <int, CustomFactor> s, int one, int two) { List <CustomFactor> gt = s.Where(x => (x.Key == one || x.Key == two) && !x.Value.IsBlocked).Select(x => x.Value).OrderBy(x => x.F).ToList(); if (gt.Count == 2) { GameBet gameBet = new GameBet { Team1 = bet.Team1, Team2 = bet.Team2, GameNumber = (TenisGamePart)Enum.Parse(typeof(TenisGamePart), gt[0].Pt), Coef1 = gt[0].V, Coef1o = eventId + "f" + gt[0].F + "," + gt[0].F + "," + eventId, Coef2 = gt[1].V, Coef2o = eventId + "f" + gt[1].F + "," + gt[1].F + "," + eventId }; return(gameBet); } return(null); }
private GameBet PlaceNewBet(string userId, string assetPair, string box, decimal bet, out string message) { message = "Placing Bet"; // Get user state UserState userState = GetUserState(userId); // Validate balance if (bet > userState.Balance) { message = "User has no balance for the bet."; SetUserStatus(userState, GameStatus.Error, 0, "PlaceBet Failed:" + message); return(null); } Box boxObject = Box.FromJson(box); // Get Current Coeffs for Game's Assetpair var assetConfig = dbBoxConfig.Where(b => b.GameAllowed).Where(b => b.AssetPair == assetPair).FirstOrDefault(); if (assetConfig == null) { message = $"Box Size parameters are not set for Asset Pair[{ assetPair}]."; SetUserStatus(userState, GameStatus.Error, 0, "PlaceBet Failed:" + message); return(null); } // Validate Coeff: bool IsCoefValid = ValidateCoeff(assetPair, boxObject, assetConfig); if (!IsCoefValid) { message = $"Invalid Coefficient[{boxObject.Coefficient}]."; SetUserStatus(userState, GameStatus.Error, 0, "PlaceBet Failed:" + message); return(null); } // Place Bet GameBet newBet = userState.PlaceBet(boxObject, assetPair, bet, assetConfig); newBet.TimeToGraphReached += Bet_TimeToGraphReached; newBet.TimeLenghFinished += Bet_TimeLenghFinished; // Update user balance userState.SetBalance(userState.Balance - bet); // Run bet newBet.StartWaitTimeToGraph(); // Async Save to Database Task.Run(() => { // Save bet to DB database.SaveGameBet(newBet); // Set Status, saves User to DB SetUserStatus(userState, GameStatus.BetPlaced, -Convert.ToDouble(bet), $"BetPlaced[{boxObject.Id}]. Asset:{assetPair} Bet:{bet} Balance:{userState.Balance}"); }); message = "OK"; return(newBet); }
public IHttpActionResult UpdateGameBet(GameBet gameBet) { _gameBetRepository.UpdateGameBet(gameBet); return(Ok()); }
private Bet ParsePage(string href) { #if DEBUGPAGE Stopwatch sw = new Stopwatch(); sw.Start(); #endif HttpRequest req = new HttpRequest { CharacterSet = Encoding.GetEncoding(1251), UserAgent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 OPR/42.0.2393.94" }; if (UsingProxy) { req.Proxy = ProxyClient.Parse(ProxyList.GetRnd()); req.Proxy.ConnectTimeout = 1500; req.Proxy.ReadWriteTimeout = 1500; } var response = req.Get($"{_url}{href}").ToString(); HtmlParser parser = new HtmlParser(); IHtmlDocument document = parser.Parse(response); IElement oddsList = document.GetElementById("oddsList"); Bet bet = new Bet { Bookmaker = BookmakerType.Parimatch, Site = "P", SportType = SportTypeHelper.Parse(oddsList.Children[0].ChildNodes[1].ChildNodes[2].TextContent), Groupe = oddsList.Children[0].ChildNodes[1].ChildNodes[2].TextContent, Time = "0", URL = href }; List <IElement> tables = document.QuerySelectorAll("div#oddsList div.wrapper > table > tbody").ToList(); if (tables == null) { throw new ArgumentNullException("Parimatch: Ошибка получения таблицы со ставками"); } IElement table = tables[1].Children.FirstOrDefault(); if (table == null) { throw new ArgumentNullException(nameof(table)); } //тупая система. Иногда есть картинка между командами //иногда команды обернуты в доп. теги bet.Team1 = table.Children[1].ChildNodes[0].TextContent; if (bet.Team1.Contains("угловые")) { throw new ArgumentException("Parimatch: статика"); } for (int i = 1; i < table.Children[1].ChildNodes.Length; i++) { if (!String.IsNullOrWhiteSpace(table.Children[1].ChildNodes[i].TextContent)) { bet.Team2 = table.Children[1].ChildNodes[i].TextContent; break; } } bet.Name = bet.Team1 + " - " + bet.Team2; //получаем заголовок таблицы //и таблицу IElement tableHeader = tables[0].Children.FirstOrDefault(); IElement tableMainDesc = tables[1].Children.FirstOrDefault(); if (tableMainDesc != null) { tableMainDesc = FixTable(tableMainDesc); } if (tableHeader == null || tableMainDesc == null || tableHeader.ChildElementCount != tableMainDesc.ChildElementCount) { throw new ArgumentException("Parimatch main table is corrupt"); } ParseBet(bet, tableHeader, tableMainDesc); if (tables.Count == 3) { IHtmlCollection <IElement> dopTables = tables[2].Children.Where(x => x.Attributes["class"] != null && x.Attributes["class"].Value == "bk") .ToCollection(); for (int i = 0; i < dopTables.Length; i++) { var dopTable = dopTables[i]; if (dopTable.TextContent.Contains("Прием ставок приостановлен")) { continue; } dopTable = FixTable(dopTable); if (dopTable.ChildElementCount != tableHeader.ChildElementCount) { throw new ArgumentException(); } var dopBet = bet.ShortCopy(); var t = dopTable.Children[1].TextContent.Split('-').First(); if (dopBet.SportType == SportType.Баскетбол) { if (dopTable.Children[1].TextContent.Contains("половина")) { if (dopTable.Children[1].TextContent.Contains("Первая половина:")) { t = "11"; } else if (dopTable.Children[1].TextContent.Contains("Вторая половина:")) { t = "12"; } } } var timePart = SportTimePartHelper.Parse(t); if (timePart == SportTimePart.Nan) { continue; } ParseBet(dopBet, tableHeader, dopTable); bet.Parts[timePart] = dopBet; } if (bet.SportType == SportType.Теннис) { foreach (IElement tr in tables[2].Children) { Regex reg = new Regex("Сет . гейм .: победа"); if (reg.IsMatch(tr.TextContent)) { var data = tr.Children[1].Children[0].TextContent.Split(' '); GameBet gmBet = new GameBet(); gmBet.Set = SportTimePartHelper.Parse(data[1]); gmBet.Team1 = bet.Team1; gmBet.Team2 = bet.Team2; gmBet.GameNumber = (TenisGamePart)Enum.Parse(typeof(TenisGamePart), data[3].Replace(":", "")); gmBet.Coef1 = TryFloatParse(tr.Children[1].Children[1].Children[0].Children.FirstOrDefault()?.Children.FirstOrDefault()?.TextContent); if (gmBet.Coef1 != 0) { gmBet.Coef1o = tr.Children[1].Children[1].Children[0].Children[0].Children[0].Id; } gmBet.Coef2 = TryFloatParse(tr.Children[1].Children[2].Children[0].Children.FirstOrDefault()?.Children.FirstOrDefault()?.TextContent); if (gmBet.Coef2 != 0) { gmBet.Coef2o = tr.Children[1].Children[2].Children[0].Children[0].Children[0].Id; } bet.Games.Add(gmBet); } } } } #if DEBUGPAGE Console.WriteLine(bet); Console.WriteLine($"Parimatch pageparse: {href} {sw.Elapsed} мс"); #endif return(bet); }
public int?CreateStake(string[] playerList, string[] oddList, string sum) { try { Random random = new Random(); GameBet bet = new GameBet(); for (int i = 0; i < oddList.Length; i++) { if (Convert.ToDouble(oddList[i]) > 1) { int gameId; switch (Convert.ToInt32(playerList[i].Substring(0, 1))) { case 1: gameId = ctx.GameStates.FirstOrDefault().Table4PlayerId; break; case 2: gameId = ctx.GameStates.FirstOrDefault().Table6PlayerId; break; default: gameId = ctx.GameStates.FirstOrDefault().Table8PlayerId; break; } bet = new GameBet { Winner = Convert.ToInt32(playerList[i]), Index = Convert.ToDouble(oddList[i]), Sum = Convert.ToInt32(sum), StartDate = DateTime.Now, TableNumber = Convert.ToInt32(playerList[i].Substring(0, 1)), TableCode = GetRound(), //need to set to current game number Event = ctx.Constants.FirstOrDefault(p => p.Name == "Event").Value + Convert.ToInt64(playerList[i].Substring(0, 1)), ContractNumber = ctx.Constants.FirstOrDefault(p => p.Name == "ContractNumber").Value + 1, GameUniqueNumber = ctx.Constants.FirstOrDefault(p => p.Name == "GameUniqueNumber").Value, GameId = gameId }; ctx.GameBets.Add(bet); var numberOfPlayers = GetNumberOfPlayers(Convert.ToInt16(playerList[i].Substring(0, 1))); var riverFinder = ctx.RiverFinder.SingleOrDefault(p => p.NumberOfPlayers == numberOfPlayers); var prize = (Convert.ToInt32(sum) / oddList.Length) * Convert.ToDouble(oddList[i]); switch (Convert.ToInt32(playerList[i].Substring(1, 1)) + 1) { case 1: riverFinder.Prize1 += prize; break; case 2: riverFinder.Prize2 += prize; break; case 3: riverFinder.Prize3 += prize; break; case 4: riverFinder.Prize4 += prize; break; case 5: riverFinder.Prize5 += prize; break; case 6: riverFinder.Prize6 += prize; break; case 7: riverFinder.Prize7 += prize; break; case 8: riverFinder.Prize8 += prize; break; } } } ctx.Constants.FirstOrDefault(p => p.Name == "Event").Value += 3; ctx.Constants.FirstOrDefault(p => p.Name == "ContractNumber").Value += 1; if (ctx.GameStates.FirstOrDefault().State != 3) { ctx.SaveChanges(); return(bet.Id); } return(null); } catch { return(null); } }
public IHttpActionResult AddGameBet(GameBet gameBet) { _gameBetRepository.AddGameBet(gameBet); return(Ok()); }