public IEnumerable <User> Setup(int numberOfPlayers, GameSetupInfo setup)
 {
     for (int i = 0; i < numberOfPlayers; i++)
     {
         yield return(CreateUser(setup));
     }
 }
        private int CalculateMaxHandsPerDay(GameSetupInfo setupInfo)
        {
            var num      = Random.Next(1, setupInfo.AverageHandsPerUserPerDay);
            var variance = num * setupInfo.PercentageVarianceOnAverageHands;

            num = num + System.Convert.ToInt32(num * variance);

            return(num);
        }
        private User CreateUser(GameSetupInfo setupInfo)
        {
            var user = new User
            {
                Id               = Guid.NewGuid(),
                MaxHandsPerDay   = CalculateMaxHandsPerDay(setupInfo),
                MaxVisitsPerWeek = CalculateMaxVisitsPerWeek(setupInfo),
                Name             = NameGenerator.Name()
            };

            return(user);
        }
        public User Convert(ElasticUser eUser, GameSetupInfo setupInfo)
        {
            var user = new User
            {
                Id               = eUser.UserId,
                MaxHandsPerDay   = CalculateMaxHandsPerDay(setupInfo),
                MaxVisitsPerWeek = CalculateMaxVisitsPerWeek(setupInfo),
                Name             = eUser.Name,
            };

            return(user);
        }
        private int CalculateMaxVisitsPerWeek(GameSetupInfo setupInfo)
        {
            var num      = Random.Next(1, setupInfo.AverageVisitsPerWeek);
            var variance = num * setupInfo.PercentageVarianceOnVisitsPerWeek;

            num = num + System.Convert.ToInt32(num * variance);
            if (num > 7)
            {
                return(7);
            }

            return(num);
        }
        private void EnsureUsersAreSetup(GameSetupInfo setupInfo)
        {
            Console.WriteLine("getting existing users from elastic");
            var elasticUsersCount = _client.Count <ElasticUser>(s => s.Query(q => q.MatchAll())).Count;

            Console.WriteLine($"{elasticUsersCount} users found");

            if (elasticUsersCount < setupInfo.NumberOfPlayers)
            {
                var numberLeftToCreate = Convert.ToInt32(setupInfo.NumberOfPlayers - elasticUsersCount);
                Console.WriteLine($"need to create {numberLeftToCreate} more users");

                var users = _converter.Convert(new PlayerGenerator().Setup(numberLeftToCreate, setupInfo).ToList());

                _writer.BulkWriteData(users, _client);
            }

            var playerGenerator = new PlayerGenerator();

            _users = new List <User>();

            long userCount = 0;

            while (userCount < setupInfo.NumberOfPlayers)
            {
                Console.WriteLine("_");
                System.Threading.Thread.Sleep(10000);
                var elasticUsers = _client.RockAndScroll <ElasticUser>(StringConstants.UserIndex).Result.ToList();
                userCount = elasticUsers.Count;
                if (userCount < setupInfo.NumberOfPlayers)
                {
                    continue;
                }

                //convert them back so the system can use them.
                foreach (var elasticUser in elasticUsers)
                {
                    _users.Add(playerGenerator.Convert(elasticUser, setupInfo));
                }
            }


            Console.WriteLine($"{_users.Count} users loaded");
            if (_users.Count == 0)
            {
                System.Diagnostics.Debugger.Break();
            }
        }
示例#7
0
        private static IEnumerable <GameSetupInfo> SplitByYear(GameSetupInfo info)
        {
            var years = Convert.ToInt32((info.EndDate - info.StartDate).TotalDays / 365);

            for (int i = 0; i < years; i++)
            {
                yield return(new GameSetupInfo
                {
                    StartDate = info.StartDate.AddYears(i),
                    EndDate = info.StartDate.AddYears(i + 1),
                    AverageHandsPerUserPerDay = info.AverageHandsPerUserPerDay,
                    AverageVisitsPerWeek = info.AverageVisitsPerWeek,
                    NumberOfPlayers = info.NumberOfPlayers,
                    PercentageVarianceOnAverageHands = info.PercentageVarianceOnAverageHands,
                    PercentageVarianceOnVisitsPerWeek = info.PercentageVarianceOnVisitsPerWeek
                });
            }
        }
示例#8
0
        private int CreateData(GameSetupInfo setupInfo, List <User> users)
        {
            var startTime = DateTime.Now;

            var generator = new StatGenerator(users);
            var handTotal = generator.Setup(setupInfo);

            var timeTaken = startTime.TimedNowToFriendlyDisplay();

            Console.WriteLine("");
            Console.WriteLine($"Generating Data took {timeTaken}");
            Console.WriteLine("");
            Console.WriteLine($"Hands: {handTotal.ToString("N0")}");
            Console.WriteLine("===========================");
            Console.WriteLine("");

            return(handTotal);
        }
示例#9
0
        public void CreateDataAndWriteToElastic(GameSetupInfo info, List <User> users)
        {
            var startTime = DateTime.Now;

            Console.WriteLine("RANDOM STATS GAME GENERATOR");
            Console.WriteLine("===========================");

            var userTotal = 0;
            var handTotal = 0;

            userTotal = users.Count;

            var infoByYear = SplitByYear(info);

            foreach (var yearlyInfo in infoByYear)
            {
                Console.WriteLine("");
                Console.WriteLine($"Creating Data for year {yearlyInfo.StartDate.Year}...");
                Console.WriteLine("");

                var data = CreateData(yearlyInfo, users);

                handTotal += data;

                Console.WriteLine("");
                Console.WriteLine($"Year {yearlyInfo.StartDate.Year} Created and Saved to elastic.");
                Console.WriteLine("");
            }

            var timeTaken = startTime.TimedNowToFriendlyDisplay();

            Console.WriteLine("===========================");
            Console.WriteLine($"ALL DATA CREATED IN - {timeTaken}");
            Console.WriteLine("");

            Console.WriteLine($"Users: {userTotal.ToString("N0")}");
            Console.WriteLine($"Hands: {handTotal.ToString("N0")}");

            Console.WriteLine("===========================");

            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
        private List <DateTime> SplitIntoWeeklyDates(GameSetupInfo setup)
        {
            if (setup.StartDate >= setup.EndDate)
            {
                throw new ArgumentException("start date is newer than end date");
            }

            var dates = new List <DateTime>();

            dates.Add(setup.StartDate);
            var nextDate = setup.StartDate.AddDays(7);

            while (nextDate < setup.EndDate)
            {
                dates.Add(nextDate);
                nextDate = nextDate.AddDays(7);
            }

            return(dates);
        }
示例#11
0
        private static void CreateGameData()
        {
            var startDate    = new DateTime(2008, 1, 1);
            var endDate      = new DateTime(2009, 2, 1);
            var numOfPlayers = 10000;
            var averageHandsPerUserPerDay         = 500;
            var percentageVarianceOnAverageHands  = 0.3;
            var averageVisitsPerWeek              = 5;
            var percentageVarianceOnVisitsPerWeek = 0.3;

            var info = new GameSetupInfo
            {
                StartDate                         = startDate,
                EndDate                           = endDate,
                NumberOfPlayers                   = numOfPlayers,
                AverageHandsPerUserPerDay         = averageHandsPerUserPerDay,
                PercentageVarianceOnAverageHands  = percentageVarianceOnAverageHands,
                AverageVisitsPerWeek              = averageVisitsPerWeek,
                PercentageVarianceOnVisitsPerWeek = percentageVarianceOnVisitsPerWeek
            };

            new CreateAndWriteManager().Go(info);
        }
        public void Go(GameSetupInfo setupInfo)
        {
            EnsureUsersAreSetup(setupInfo);

            new DataCreator().CreateDataAndWriteToElastic(setupInfo, _users);
        }
        public int Setup(GameSetupInfo setup)
        {
            var weekDates = SplitIntoWeeklyDates(setup);

            foreach (var weekDate in weekDates)
            {
                var userHandStats = new List <ElasticUserStat>();

                Console.WriteLine("");
                Console.WriteLine($"{setup.StartDate.Year} - {weekDate.GetIso8601WeekOfYear()} week started...");

                ResetPlayersGamesPlayedCounter();
                var maxNumberOfGamesToPlay = _random.Next(5, 500);
                for (int i = 0; i < maxNumberOfGamesToPlay; i++)
                {
                    var shouldStopEarly = _random.Next(0, 100) > 95;
                    if (shouldStopEarly)
                    {
                        break;
                    }

                    var game = _gameGenerator.Create(weekDate);

                    ResetPlayersHandsPlayedCounter();

                    var previousPlayersInHand = new List <User>();
                    for (int j = 0; j < game.MaxNumberOfHands; j++)
                    {
                        var hand = _handGenerator.Create(game, _users, previousPlayersInHand, j);
                        if (hand == null)
                        {
                            break;
                        }

                        _hands++;

                        previousPlayersInHand = hand.Players;

                        //play hand
                        var playersInHand = hand.Players;
                        for (int k = 0; k < 4; k++)
                        {
                            var round = _betGenerator.CreateRound(playersInHand, k, hand, game);

                            playersInHand = round.Bets.Where(b => b.Value > 0).Select(b => b.Player).ToList();

                            if (playersInHand.Count == 1)
                            {
                                break;
                            }
                        }

                        var winningTemp = _winningsGenerator.Create(hand, playersInHand);
                        userHandStats.AddRange(ConvertToElasticData(hand, winningTemp));
                    }
                }

                var writer = new ElasticWriter();
                Console.WriteLine($"Writing week {weekDate.GetIso8601WeekOfYear()}");

                writer.WriteAllData(userHandStats);
            }

            return(_hands);
        }