Ejemplo n.º 1
0
        public void GetAll_ShouldReturnAllGamesFromDb()
        {
            //Arrange
            var someGame = new LotteryGame
            {
                Name = Guid.NewGuid().ToString(),
                NumberOfNumbersInADraw = 6,
                MaximumNumber          = 45
            };
            var originalAmountOfGames = 0;

            using (var context = CreateDbContext())
            {
                originalAmountOfGames = context.Set <LotteryGame>().Count();

                context.Add(someGame);
                context.SaveChanges();
            }

            using (var context = CreateDbContext())
            {
                var repo = new LotteryGameRepository(context);

                //Act
                var allGames = repo.GetAll();

                //Assert
                Assert.That(allGames, Has.Count.EqualTo(originalAmountOfGames + 1), () => "Not all games in the database are returned.");
                var expectedGame = allGames.FirstOrDefault(game => game.Name == someGame.Name);
                Assert.That(expectedGame, Is.Not.Null, () => "Not all games in the database are returned.");
            }
        }
        private bool AssertIsValidDraw(Draw draw, LotteryGame game, DateTime now)
        {
            Assert.That(draw.LotteryGameId, Is.EqualTo(game.Id), () => "The 'LotteryGameId' of the draw is incorrect.");
            Assert.That(draw.Date, Is.EqualTo(now).Within(10).Seconds,
                        () => "The 'Date' of the draw should be set to the current date.");
            Assert.That(draw.DrawNumbers, Is.Not.Empty, () => "The 'DrawNumbers' collection of the draw should be set.");
            Assert.That(draw.DrawNumbers.Count, Is.EqualTo(game.NumberOfNumbersInADraw), () => "An incorrect amount of draw numbers were generated.");

            var drawNumberList   = draw.DrawNumbers.ToList();
            var expectedPosition = 1;

            foreach (var drawNumber in drawNumberList)
            {
                Assert.That(drawNumber.Position, Is.EqualTo(expectedPosition), () =>
                            "One of the draw numbers has an unexpected position. " +
                            "The position of the draw numbers should start at 1 and increment for each new draw number");
                expectedPosition++;
            }

            Assert.That(drawNumberList, Has.All.Matches((DrawNumber drawNumber) => drawNumber.Number >= 1),
                        () => "Not all draw numbers are greater than or equal to one.");

            Assert.That(drawNumberList, Has.All.Matches((DrawNumber drawNumber) => drawNumber.Number <= game.MaximumNumber),
                        () => "Not all draw numbers are less than or equal to the maximum number of the game.");

            return(true);
        }
        protected IList <LotteryGame> GetAllGames()
        {
            var a = new List <LotteryGame>();

            using (var b = Cc())
            {
                b.Open();
                var c = A(X.A, b);
                using (var d = C(c))
                {
                    int e = B(d, "Id");
                    int f = B(d, "Name");
                    int g = B(d, "NumberOfNumbersInADraw");
                    int h = B(d, "MaximumNumber");

                    while (d.Read())
                    {
                        var i = new LotteryGame
                        {
                            Id   = d.GetInt32(e),
                            Name = d.GetString(f),
                            NumberOfNumbersInADraw = d.GetInt32(g),
                            MaximumNumber          = d.GetInt32(h),
                        };
                        a.Add(i);
                    }
                }
            }
            return(a);
        }
 public LotteryGameBuilder()
 {
     _random = new Random();
     _game   = new LotteryGame
     {
         Name          = Guid.NewGuid().ToString(),
         MaximumNumber = _random.Next(1, 100)
     };
     _game.NumberOfNumbersInADraw = _random.Next(1, _game.MaximumNumber + 1);
 }
Ejemplo n.º 5
0
            public async Task ExecuteGroupAsync(CommandContext ctx,
                                                [RemainingText, Description("Three numbers.")] params int[] numbers)
            {
                if (this.Shared.IsEventRunningInChannel(ctx.Channel.Id))
                {
                    if (this.Shared.GetEventInChannel(ctx.Channel.Id) is LotteryGame)
                    {
                        await this.JoinAsync(ctx, numbers);
                    }
                    else
                    {
                        throw new CommandFailedException("Another event is already running in the current channel.");
                    }
                    return;
                }

                long?balance = await this.Database.GetBankAccountBalanceAsync(ctx.User.Id, ctx.Guild.Id);

                if (!balance.HasValue || balance < LotteryGame.TicketPrice)
                {
                    throw new CommandFailedException($"You do not have enough {this.Shared.GetGuildConfig(ctx.Guild.Id).Currency ?? "credits"} to buy a lottery ticket! Use command {Formatter.InlineCode("bank")} to check your account status. The lottery ticket costs {LotteryGame.TicketPrice} {this.Shared.GetGuildConfig(ctx.Guild.Id).Currency ?? "credits"}!");
                }

                var game = new LotteryGame(ctx.Client.GetInteractivity(), ctx.Channel);

                this.Shared.RegisterEventInChannel(game, ctx.Channel.Id);
                try {
                    await this.InformAsync(ctx, StaticDiscordEmoji.Clock1, $"The Lottery game will start in 30s or when there are 10 participants. Use command {Formatter.InlineCode("casino lottery")} to join the pool.");

                    await this.JoinAsync(ctx, numbers);

                    await Task.Delay(TimeSpan.FromSeconds(30));

                    await game.RunAsync();

                    if (game.Winners.Any())
                    {
                        await this.InformAsync(ctx, StaticDiscordEmoji.MoneyBag, $"Winnings:\n\n{string.Join(", ", game.Winners.Select(w => $"{w.User.Mention} : {w.WinAmount}"))}");

                        foreach (var winner in game.Winners)
                        {
                            await this.Database.IncreaseBankAccountBalanceAsync(winner.Id, ctx.Guild.Id, winner.WinAmount);
                        }
                    }
                    else
                    {
                        await this.InformAsync(ctx, StaticDiscordEmoji.MoneyBag, "Better luck next time!");
                    }
                } finally {
                    this.Shared.UnregisterEventInChannel(ctx.Channel.Id);
                }
            }
        private bool AssertIsValidNumbersList(LotteryGame game, IList <int> numbers)
        {
            Assert.That(numbers, Is.Not.Null.Or.Empty, "The 'numbers' list should not be null or empty.");
            Assert.That(numbers.Count, Is.EqualTo(game.NumberOfNumbersInADraw), "An incorrect amount of draw numbers were generated.");

            Assert.That(numbers, Has.All.Matches((int number) => number >= 1),
                        "Not all numbers are greater than or equal to one.");

            Assert.That(numbers, Has.All.Matches((int number) => number <= game.MaximumNumber),
                        "Not all draw numbers are less than or equal to the maximum number of the game.");

            return(true);
        }
Ejemplo n.º 7
0
        public void TestCheckNumbers()
        {
            LotteryGame kenoGame = new LotteryGame("Keno Game");

            Draw draw = new Draw();

            draw.AddDrawNumber(2);
            draw.AddDrawNumber(36);
            draw.AddDrawNumber(45);
            draw.AddDrawNumber(29);
            draw.AddDrawNumber(63);
            draw.AddDrawNumber(78);
            draw.AddDrawNumber(80);
            draw.AddDrawNumber(16);
            draw.AddDrawNumber(56);
            draw.AddDrawNumber(52);
            draw.AddDrawNumber(58);
            draw.AddDrawNumber(8);

            LotteryTicket ticket = new LotteryTicket();

            ticket.AddSelectedNumber(36);
            ticket.AddSelectedNumber(3);
            ticket.AddSelectedNumber(28);
            ticket.AddSelectedNumber(78);
            ticket.AddSelectedNumber(30);
            ticket.AddSelectedNumber(10);

            kenoGame.AddDraw(draw);
            draw.AddTicket(ticket);

            var wonNumbers = new List <int>
            {
                36,
                78
            };

            TicketChecker checker = kenoGame.CheckResults();

            Assert.AreEqual(TicketChecker.ReturnStatus.Success, checker.Message);

            CollectionAssert.AreEqual(ticket.WinningNumbers, wonNumbers);
        }
Ejemplo n.º 8
0
        public void CreateDrawFor(LotteryGame lotteryGame)
        {
            Draw newDraw = new Draw()
            {
                LotteryGameId = lotteryGame.Id,
                LotteryGame   = lotteryGame,
                Date          = DateTime.Now
            };

            int                number;
            ArrayList          checkNumbers = new ArrayList();
            IList <DrawNumber> numbers      = new List <DrawNumber>();

            for (int i = 1; i <= lotteryGame.NumberOfNumbersInADraw; i++)
            {
                Random rnd = new Random();
                number = rnd.Next(1, lotteryGame.MaximumNumber);
                if (checkNumbers.Contains(number))
                {
                    do
                    {
                        number = rnd.Next(1, lotteryGame.MaximumNumber);
                    } while (checkNumbers.Contains(number));

                    checkNumbers.Add(number);
                }
                else
                {
                    checkNumbers.Add(number);
                }

                var nummer = new DrawNumber()
                {
                    DrawId = i, Number = number, Position = i
                };
                numbers.Add(nummer);
            }

            newDraw.DrawNumbers = numbers;

            drawRepository.Add(newDraw);
        }
 public void CreateDrawFor(LotteryGame lotteryGame)
 {
 }
Ejemplo n.º 10
0
        public void ComputeMostFrequentNumbers()
        {
            LotteryGame kenoGame = new LotteryGame("Keno Game");

            Draw draw1 = new Draw();

            draw1.AddDrawNumber(2);
            draw1.AddDrawNumber(36);
            draw1.AddDrawNumber(45);
            draw1.AddDrawNumber(29);
            draw1.AddDrawNumber(63);
            draw1.AddDrawNumber(78);
            draw1.AddDrawNumber(80);
            draw1.AddDrawNumber(16);
            draw1.AddDrawNumber(56);
            draw1.AddDrawNumber(52);
            draw1.AddDrawNumber(58);
            draw1.AddDrawNumber(8);

            Draw draw2 = new Draw();

            draw2.AddDrawNumber(2);
            draw2.AddDrawNumber(67);
            draw2.AddDrawNumber(45);
            draw2.AddDrawNumber(24);
            draw2.AddDrawNumber(60);
            draw2.AddDrawNumber(23);
            draw2.AddDrawNumber(66);
            draw2.AddDrawNumber(53);
            draw2.AddDrawNumber(20);
            draw2.AddDrawNumber(44);
            draw2.AddDrawNumber(51);
            draw2.AddDrawNumber(9);

            Draw draw3 = new Draw();

            draw3.AddDrawNumber(2);
            draw3.AddDrawNumber(67);
            draw3.AddDrawNumber(43);
            draw3.AddDrawNumber(25);
            draw3.AddDrawNumber(61);
            draw3.AddDrawNumber(22);
            draw3.AddDrawNumber(33);
            draw3.AddDrawNumber(55);
            draw3.AddDrawNumber(19);
            draw3.AddDrawNumber(57);
            draw3.AddDrawNumber(3);
            draw3.AddDrawNumber(6);

            kenoGame.AddDraw(draw1);
            kenoGame.AddDraw(draw2);
            kenoGame.AddDraw(draw3);

            var countDictionary = new Dictionary <int, int>();

            countDictionary.Add(2, 3);
            countDictionary.Add(45, 2);
            countDictionary.Add(67, 2);

            LotteryStatistics result = kenoGame.ComputeStatistics();

            CollectionAssert.AreEqual(countDictionary, result.ThreeMostNumbers);
        }
Ejemplo n.º 11
0
 public void UpdateLotteryGame(LotteryGame lotteryGame)
 {
     this.Update <LotteryGame>(lotteryGame);
 }
Ejemplo n.º 12
0
 public void AddLotteryGame(LotteryGame entity)
 {
     this.Add <LotteryGame>(entity);
 }
Ejemplo n.º 13
0
            public async Task ExecuteGroupAsync(CommandContext ctx,
                                                [RemainingText, Description("Three numbers.")] params int[] numbers)
            {
                if (this.Shared.IsEventRunningInChannel(ctx.Channel.Id))
                {
                    if (this.Shared.GetEventInChannel(ctx.Channel.Id) is LotteryGame)
                    {
                        await this.JoinAsync(ctx, numbers);
                    }
                    else
                    {
                        throw new CommandFailedException("Another event is already running in the current channel.");
                    }
                    return;
                }

                var game = new LotteryGame(ctx.Client.GetInteractivity(), ctx.Channel);

                this.Shared.RegisterEventInChannel(game, ctx.Channel.Id);
                try {
                    await this.InformAsync(ctx, StaticDiscordEmoji.Clock1, $"The Lottery game will start in 30s or when there are 10 participants. Use command {Formatter.InlineCode("casino lottery")} to join the pool.");

                    await this.JoinAsync(ctx, numbers);

                    await Task.Delay(TimeSpan.FromSeconds(30));

                    if (game.ParticipantCount > 1)
                    {
                        await game.RunAsync();

                        if (game.Winners.Any())
                        {
                            await this.InformAsync(ctx, StaticDiscordEmoji.MoneyBag, $"Winnings:\n\n{string.Join(", ", game.Winners.Select(w => $"{w.User.Mention} : {w.WinAmount}"))}");

                            using (DatabaseContext db = this.Database.CreateContext()) {
                                foreach (LotteryParticipant winner in game.Winners)
                                {
                                    await db.ModifyBankAccountAsync(ctx.User.Id, ctx.Guild.Id, v => v + winner.WinAmount);
                                }
                                await db.SaveChangesAsync();
                            }
                        }
                        else
                        {
                            await this.InformAsync(ctx, StaticDiscordEmoji.MoneyBag, "Better luck next time!");
                        }
                    }
                    else
                    {
                        if (game.IsParticipating(ctx.User))
                        {
                            using (DatabaseContext db = this.Database.CreateContext()) {
                                await db.ModifyBankAccountAsync(ctx.User.Id, ctx.Guild.Id, v => v + LotteryGame.TicketPrice);

                                await db.SaveChangesAsync();
                            }
                        }
                        await this.InformAsync(ctx, StaticDiscordEmoji.AlarmClock, "Not enough users joined the Blackjack game.");
                    }
                } finally {
                    this.Shared.UnregisterEventInChannel(ctx.Channel.Id);
                }
            }
Ejemplo n.º 14
0
        public ActionResult Subscribe(StudentSubscriptionModel model)
        {
            var org      = GetMyOrganisation();
            var semester = SemesterService.GetSemester(model.SemesterName.Trim());

            if (semester == null)
            {
                ModelState.AddModelError("SemesterName", "Es existiert kein Semester mit dieser Bezeichnung");
                return(View(model));
            }


            var courses = Db.Activities.OfType <Course>().Where(x =>
                                                                x.ShortName.Equals(model.CourseShortName.Trim()) &&
                                                                x.SemesterGroups.Any(g =>
                                                                                     g.Semester.Id == semester.Id && g.CapacityGroup.CurriculumGroup.Curriculum.Organiser.Id == org.Id)).ToList();

            if (!courses.Any())
            {
                ModelState.AddModelError("CourseShortName", "Es existiert keine Lehrveranstaltung mit dieser Bezeichnung");
                return(View(model));
            }

            if (courses.Count > 1)
            {
                ModelState.AddModelError("CourseShortName", $"Bezeichnung nicht eindeutig. Es existieren {courses.Count} Lehrveranstaltungen mit dieser Bezeichnung");
                return(View(model));
            }

            var host   = GetCurrentUser();
            var course = courses.First();

            var subscription = course.Occurrence.Subscriptions.FirstOrDefault(x => x.UserId.Equals(model.User.Id));

            if (subscription != null)
            {
                ModelState.AddModelError("CourseShortName", "Ist bereits in dieser Lehrveranstaltung eingetragen.");
                return(View(model));
            }

            subscription               = new OccurrenceSubscription();
            subscription.TimeStamp     = DateTime.Now;
            subscription.UserId        = model.User.Id;
            subscription.OnWaitingList = false;
            subscription.Occurrence    = course.Occurrence;
            course.Occurrence.Subscriptions.Add(subscription);

            // wenn es ein Wahlverfahren gibt, dann als Prio 1
            var lottery =
                Db.Lotteries.FirstOrDefault(x => x.Occurrences.Any(y => y.Id == course.Occurrence.Id));

            if (lottery != null)
            {
                subscription.Priority = 1;

                var game = lottery.Games.FirstOrDefault(x => x.UserId.Equals(model.User.Id));
                if (game == null)
                {
                    game = new LotteryGame
                    {
                        Lottery       = lottery,
                        UserId        = subscription.UserId,
                        AcceptDefault = false,
                        CoursesWanted = lottery.MaxConfirm,
                        Created       = DateTime.Now,
                        LastChange    = DateTime.Now
                    };
                    lottery.Games.Add(game);
                }
            }

            Db.SaveChanges();

            // Bei Erfolg Mail versenden
            var mailService = new SubscriptionMailService();

            mailService.SendSubscriptionEMail(course, subscription, host);



            return(RedirectToAction("CoursePlan", new { id = model.User.Id, semId = semester.Id }));
        }
Ejemplo n.º 15
0
            public async Task ExecuteGroupAsync(CommandContext ctx,
                                                [RemainingText, Description("desc-gamble-numbers-3")] params int[] numbers)
            {
                if (this.Service.IsEventRunningInChannel(ctx.Channel.Id))
                {
                    if (this.Service.GetEventInChannel(ctx.Channel.Id) is LotteryGame)
                    {
                        await this.JoinAsync(ctx);
                    }
                    else
                    {
                        throw new CommandFailedException(ctx, "cmd-err-evt-dup");
                    }
                    return;
                }

                string currency = ctx.Services.GetRequiredService <GuildConfigService>().GetCachedConfig(ctx.Guild.Id).Currency;
                var    game     = new LotteryGame(ctx.Client.GetInteractivity(), ctx.Channel);

                this.Service.RegisterEventInChannel(game, ctx.Channel.Id);
                try {
                    await ctx.ImpInfoAsync(this.ModuleColor, Emojis.Clock1, "str-casino-lottery-start",
                                           LotteryGame.MaxParticipants, LotteryGame.TicketPrice, currency
                                           );

                    await this.JoinAsync(ctx, numbers);

                    await Task.Delay(TimeSpan.FromSeconds(30));

                    BankAccountService bas = ctx.Services.GetRequiredService <BankAccountService>();
                    if (game.ParticipantCount > 1)
                    {
                        await game.RunAsync(this.Localization);

                        if (game.Winners.Any())
                        {
                            await ctx.ImpInfoAsync(this.ModuleColor, Emojis.Cards.Suits[0], "fmt-winnings",
                                                   game.Winners.Select(w => $"{w.User.Mention}: {w.WinAmount:n0} {currency}").JoinWith()
                                                   );

                            foreach (LotteryGame.Participant winner in game.Winners)
                            {
                                await bas.IncreaseBankAccountAsync(ctx.Guild.Id, winner.Id, winner.WinAmount);
                            }
                        }
                        else
                        {
                            await ctx.ImpInfoAsync(this.ModuleColor, Emojis.Cards.Suits[0], "str-casino-lottery-lose");
                        }
                    }
                    else
                    {
                        if (game.IsParticipating(ctx.User))
                        {
                            await bas.IncreaseBankAccountAsync(ctx.Guild.Id, ctx.User.Id, LotteryGame.TicketPrice);
                        }
                        await ctx.ImpInfoAsync(this.ModuleColor, Emojis.AlarmClock, "str-casino-lottery-none");
                    }
                } finally {
                    this.Service.UnregisterEventInChannel(ctx.Channel.Id);
                }
            }
Ejemplo n.º 16
0
        public void InitLotPots()
        {
            AddMessage(null, null, "Beginn Initialisierung der Lostöpfe");
            AddMessage(null, null, $"Anzahl Lehrveranstaltungen: {Courses.Count}");

            var bookingService = new BookingService(db);

            // Pro Kurs die Lostöpfe anlegen
            foreach (var course in Courses)
            {
                var bookingLists = bookingService.GetBookingLists(course.Occurrence.Id);
                AddMessage(course, null, $"Anzahl Buchungslisten: {bookingLists.Count}");

                foreach (var bookingList in bookingLists)
                {
                    var lotPot = new DrawingLotPot();

                    lotPot.BookingList = bookingList;
                    lotPot.Course      = course;

                    // Alle Subscriptions durchgehen
                    // Sichern des Status vor der Verlosung!

                    foreach (var booking in bookingList.Bookings)
                    {
                        var subscription = booking.Subscription;
                        var game         =
                            Games.FirstOrDefault(x => x.UserId.Equals(subscription.UserId));

                        if (game == null)
                        {
                            var student = db.Students.Where(x => x.UserId.Equals(subscription.UserId))
                                          .OrderByDescending(x => x.Created).FirstOrDefault();
                            var lotteryGame = db.LotteryGames.Where(x =>
                                                                    x.Lottery.Id == Lottery.Id &&
                                                                    x.UserId.Equals(subscription.UserId))
                                              .OrderByDescending(x => x.Created).FirstOrDefault();

                            // Eintragung wurde außerhalb des Wahlverfahrens gemacht => Standard aufnehmen, damit Studierende an die Wahl dann auch rankommen
                            if (lotteryGame == null)
                            {
                                lotteryGame               = new LotteryGame();
                                lotteryGame.Lottery       = Lottery;
                                lotteryGame.UserId        = subscription.UserId;
                                lotteryGame.AcceptDefault = false;
                                lotteryGame.CoursesWanted = Lottery.MaxConfirm;
                                lotteryGame.Created       = DateTime.Now;
                                lotteryGame.LastChange    = DateTime.Now; // bisher nicht angegeben

                                Lottery.Games.Add(lotteryGame);
                            }

                            game             = new DrawingGame();
                            game.UserId      = subscription.UserId;
                            game.Student     = student;
                            game.LotteryGame = lotteryGame;
                            game.Lottery     = Lottery;

                            Games.Add(game);
                        }

                        // Trennung von bereits erhaltenen Plätzen und Losen
                        if (subscription.OnWaitingList == false)
                        {
                            var seat = new DrawingSeat();
                            seat.Course       = course;
                            seat.Subscription = subscription;

                            game.Seats.Add(seat);

                            AddMessage(course, subscription, "Vorhandener Platz");
                        }
                        else
                        {
                            var drawingLot = new DrawingLot();
                            drawingLot.IsValid      = true; // Am Beginn ist das Ticket gültig
                            drawingLot.IsTouched    = false;
                            drawingLot.Course       = course;
                            drawingLot.Subscription = subscription;

                            game.Lots.Add(drawingLot);

                            lotPot.Lots.Add(drawingLot);

                            AddMessage(course, subscription, "Ein Los für die Verlosung erhalten");
                        }
                    }

                    LotPots.Add(lotPot);
                }
            }
        }