Example #1
0
        private async Task OnCommandCheck(Message _, string arguments)
        {
            var cards = arguments.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(Card.Parse).ToList();

            if (cards.IndexOf(Card.Invalid) >= 0)
            {
                await Telegram.SendMsg(Chat, "Carte non reconnue:\n" + string.Join("\n", cards.Select(c => c.ToFullString())));

                return;
            }
            var(force, descr) = Card.BestHand(cards);
            var secondary = Card.CardsForce(cards);

            await Telegram.SendMsg(Chat, $"Meilleure main: {descr} (force {force}, {secondary})");
        }
Example #2
0
        // point d'entrée pour la complétion inline
        public async Task OnInline(InlineQuery query)
        {
            await sem.WaitAsync();

            try
            {
                string expr   = query.Query;
                var    player = FindPlayer(query);
                if (player == null)
                {
                    await Telegram.AnswerInline(query);

                    return;
                }
                string descr = null;
                if (Board.Count >= 3)
                {
                    descr = "Votre main: " + Card.BestHand(Board.Concat(player.Cards)).descr;
                }
                await Telegram.AnswerInline(query,
                                            new[] {
                    new InlineQueryResultArticle($"Card_" + string.Join("_", player.Cards),
                                                 "Vos cartes:  " + string.Join("  ", player.Cards),
                                                 new InputTextMessageContent("(je regarde mes cartes)"))
                    {
                        Description = descr
                    },                                                  //, ThumbUrl = "https://raw.githubusercontent.com/hayeah/playing-cards-assets/master/png/2_of_hearts.png", ThumbWidth = 222, ThumbHeight = 323 },
                    //new InlineQueryResultPhoto("2", $"http://via.placeholder.com/{expr}", $"http://via.placeholder.com/{expr}") { Title = "photo", PhotoWidth = 85, PhotoHeight = 85 },
                },
                                            2, isPersonal : true, switchPmText : $"Mise: {BB(player.Bet)} | Stack: {BB(player.Stack)}", switchPmParameter : "cards");
            }
            finally
            {
                sem.Release();
            }
        }
Example #3
0
        private async Task DoChoice(CallbackWord choice)
        {
            string text = CurrentPlayer.ToString();

            switch (choice)
            {
            case CallbackWord.call:
                text += " *suit*.";
                CurrentPlayer.SetBet(CurrentBet);
                break;

            case CallbackWord.raise:
                LastPlayerToRaise = CurrentPlayer;
                CurrentBet       += BigBet;
                text += $" *relance de {BB(CurrentBet - CurrentPlayer.Bet)}* !";
                CurrentPlayer.SetBet(CurrentBet);
                break;

            case CallbackWord.allin:
                int playerBet = CurrentPlayer.Bet + CurrentPlayer.Stack;
                //todo
                if (playerBet > CurrentBet)
                {
                    LastPlayerToRaise = CurrentPlayer;
                    CurrentBet        = playerBet;
                }
                text += $" *allin de {BB(CurrentBet - CurrentPlayer.Bet)}* !";
                CurrentPlayer.SetBet(playerBet);
                break;

            case CallbackWord.fold:
                text += " *passe*.";
                CurrentPlayer.Status = Player.PlayerStatus.Folded;
                break;

            case CallbackWord.check:
                text += " *parle*.";
                break;

            default:
                break;
            }
            await RemoveLastMessageButtons();

            var pot = Players.Sum(p => p.Bet);

            if (PlayersInTurn.Count() == 1)
            {
                var winner = PlayersInTurn.Single();
                winner.Stack += pot;
                foreach (var player in Players)
                {
                    player.Bet = 0;
                }
                await Telegram.SendMsg(Chat, $"{text}\n{winner.MarkDown()} remporte le pot de {BB(pot)}");

                ButtonIdx   = (ButtonIdx + 1) % Players.Count;
                runNextTurn = Task.Delay(7000).ContinueWith(_ => StartTurn());
            }
            else
            {
                var stillBetting = NextPlayer();
#if ABATTAGE_IMMEDIAT
                DistributeBoard(); DistributeBoard(); DistributeBoard(); stillBetting = false;
#endif
                if (stillBetting)
                {
                    text   += $" La mise est à {BB(CurrentBet - StartingBet)}\nC'est au tour de {CurrentPlayer.MarkDown()} de parler";
                    lastMsg = await Telegram.SendMsg(Chat, lastMsgText = text, GetChoices());
                }
                else if (Board.Count == 5)
                {
                    text += $" Abattage des cartes !\nBoard: ";
                    text += string.Join("  ", Board);
                    var hands = PlayersInTurn.Select(player => (player, hand: Card.BestHand(Board.Concat(player.Cards)))).ToList();
                    foreach (var(player, hand) in hands)
                    {
                        text += $"\n{string.Join("  ", player.Cards)} : {hand.descr} pour {player}";
                    }
                    var winners = DetermineWinners(hands);
                    if (winners.Count > 1)
                    {
                        text += $"\nEgalité entre {string.Join(" et ", winners)} ! Partage du pot: {BB(pot)}";
                        foreach (var player in winners)
                        {
                            player.Stack += pot / winners.Count;
                        }
                    }
                    else
                    {
                        text             += $"\n{winners[0].MarkDown()} remporte le pot de {BB(pot)} !";
                        winners[0].Stack += pot;
                    }
                    await Telegram.SendMsg(Chat, text);

                    ButtonIdx   = (ButtonIdx + 1) % Players.Count;
                    runNextTurn = Task.Delay(10000).ContinueWith(_ => StartTurn());
                }
                else
                {
                    text             += $" Le tour d'enchères est terminé. Pot: {BB(pot)}\n{DistributeBoard()}: ";
                    text             += string.Join("  ", Board);
                    StartingBet       = CurrentBet;
                    BigBet            = BigBlind;
                    LastPlayerToRaise = null;
                    CurrentPlayer     = Players[ButtonIdx];
                    NextPlayer();
                    LastPlayerToRaise = CurrentPlayer;
                    text   += $"\nC'est au tour de {CurrentPlayer.MarkDown()} de parler";
                    lastMsg = await Telegram.SendMsg(Chat, lastMsgText = text, GetChoices());
                }
                TraceStatus();
            }
        }