コード例 #1
0
        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); }
        }
コード例 #2
0
        /// <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}");
                });
            }
        }
コード例 #3
0
        /// <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);
            }
        }
コード例 #4
0
 private GameBet[] GetRunningBets()
 {
     GameBet[] retval;
     lock (BetCacheLock)
     {
         retval = new GameBet[betCache.Count];
         betCache.CopyTo(retval);
     }
     return(retval);
 }
コード例 #5
0
        private void Bet_TimeLenghFinished(object sender, EventArgs e)
        {
            GameBet sdr = sender as GameBet;

            if (sdr == null)
            {
                return;
            }

            ProcessBetTimeOut(sdr);
        }
コード例 #6
0
 public void AddGameBet(GameBet gameBet)
 {
     DatabaseContext.ExecuteProcedure("AddGameBet", new
     {
         gameBet.UserId,
         gameBet.GameId,
         gameBet.HomeWins,
         gameBet.HomeScore,
         gameBet.AwayScore
     });
 }
コード例 #7
0
        /// <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}");
            });
        }
コード例 #8
0
        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;
                }
            }
        }
コード例 #9
0
        //[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));
        }
コード例 #10
0
        /// <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);
                    }
                }
            });
        }
コード例 #11
0
        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);
            }
        }
コード例 #12
0
        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);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
 public IHttpActionResult UpdateGameBet(GameBet gameBet)
 {
     _gameBetRepository.UpdateGameBet(gameBet);
     return(Ok());
 }
コード例 #15
0
        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);
        }
コード例 #16
0
        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);
            }
        }
コード例 #17
0
 public IHttpActionResult AddGameBet(GameBet gameBet)
 {
     _gameBetRepository.AddGameBet(gameBet);
     return(Ok());
 }