Пример #1
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);
                }
            }
Пример #2
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);
                }
            }
Пример #3
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);
                }
            }