Пример #1
0
        private async Task ResetPlayer(CommandContext ctx, TimeSpan delay, CancellationToken tkn)
        {
            try
            {
                await Task.Delay(delay, tkn);

                KnbState = null;
                await ctx.RespondAsync("Прошел период ожидания второго игрока. Игровая сессия отменена.");
            }
            catch (OperationCanceledException)
            {
            }

            return;
        }
Пример #2
0
        public async Task KnbMultiPlayerCommand(CommandContext ctx)
        {
            await ctx.TriggerTypingAsync();

            if (KnbState == null)
            {
                KnbState = new KnbState(ctx.Member, new CancellationTokenSource());
                await ctx.RespondAsync($"Player 1 = {KnbState.FirstPlayer.Mention}. Ждем второго игрока {KnbSessionWaitTime} секунд. Для присоединения напишите !knb2p.");

                await Task.Run(() => ResetPlayer(ctx, TimeSpan.FromSeconds(KnbSessionWaitTime), KnbState.Cts.Token));

                return;
            }
            else
            {
                KnbState.Cts.Cancel();

                if (KnbState.FirstPlayer.Id == ctx.Member.Id)
                {
                    await ctx.RespondAsync("Необходим второй игрок! Игровая сессия отменена.");
                }
                else
                {
                    var result   = KnbGame.Play();
                    var response = FormKnbResultResponse(result, KnbState.FirstPlayer.Mention, ctx.User.Mention);

                    try
                    {
                        await ctx.RespondAsync(response);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }
                }

                KnbState = null;
            }
        }