示例#1
0
        public void HandleQuery(CallbackQuery query, string[] args)
        {
            try
            {
                // args[0] = GameGuid
                // args[1] = playerId
                // args[2] = "card" or "row"
                // args[2] = cardChosen
                var p = Players.FirstOrDefault(x => x.TelegramId == int.Parse(args[1]));
                _playCardSecondsToAdd += 3;
                switch (args[2])
                {
                case "card":
                    var chosen = args[3];
                    if (chosen == "dummy")
                    {
                        Bot.Api.AnswerCallbackQueryAsync(query.Id);
                    }
                    else if (chosen == "skip")
                    {
                        if (CurrentHand.Count == 0)     // no cards, you can use any cards
                        {
                            Bot.Api.AnswerCallbackQueryAsync(query.Id, GetTranslation("UseAnything"), true);
                            return;
                        }
                        Bot.Edit(query.Message.Chat.Id, query.Message.MessageId, GetTranslation("Pass"), GroupMarkup);
                        p.UpdateChosenIndexes(empty: true);
                        p.CurrentQuestion = null;
                        return;
                    }
                    else if (chosen == "invalid")
                    {
                        Bot.Api.AnswerCallbackQueryAsync(query.Id, GetTranslation("InvalidHand"), true);
                        return;
                    }
                    else if (chosen == "go")
                    {
                        var chosenCards = p.Hand.Cards.Where(x => p.DealCardMenu.LastValidIndexes.Contains(x.Index)).ToList();
                        if (p.FirstPlayer && !chosenCards.Any(x => x.GameValue == 3 && x.Suit == BTCardSuit.Diamonds))
                        {
                            Bot.Api.AnswerCallbackQueryAsync(query.Id, GetTranslation("MustUseDiamondThree"), true);
                            return;
                        }
                        if (chosenCards.CheckChosenCards() == null)
                        {
                            Bot.Api.AnswerCallbackQueryAsync(query.Id, GetTranslation("PlayCheckAgain"), true);
                            p.DealCardMenu.UpdateMenu();
                            Bot.Api.EditMessageReplyMarkupAsync(query.Message.Chat.Id, query.Message.MessageId, p.DealCardMenu.MarkUp);
                            return;
                        }
                        var res = chosenCards.CompareHandWith(CurrentHand);
                        if (!res.Success)
                        {
                            Bot.Api.AnswerCallbackQueryAsync(query.Id, res.Reason.ToString(), true);
                            return;
                        }
                        var text = chosenCards.GetString();
                        Bot.Edit(query.Message.Chat.Id, query.Message.MessageId, text, GroupMarkup);
                        p.UseCards(chosenCards);
                        CurrentHand       = chosenCards.ToList();
                        CurrentHandType   = CurrentHand.CheckChosenCards();
                        CurrentDealer     = p;
                        p.CurrentQuestion = null;
                        return;
                    }
                    else if (chosen == "reset")
                    {
                        p.UpdateChosenIndexes(empty: true);
                    }
                    else if (chosen == "sort")
                    {
                        p.DealCardMenu.SortBySuit = !p.DealCardMenu.SortBySuit;
                        p.DealCardMenu.UpdateMenu();
                    }
                    else
                    {
                        var indexChosen = int.Parse(args[3]);
                        p.UpdateChosenIndexes(indexChosen);

                        var cardChosen = p.Hand.FirstOrDefault(x => x.Index == indexChosen);
                    }
                    Bot.Api.EditMessageReplyMarkupAsync(query.Message.Chat.Id, query.Message.MessageId, p.DealCardMenu.MarkUp);

                    break;

                case "refresh":
                    if (Phase == GamePhase.InGame)
                    {
                        var txt = GetTranslation("CardsInHand") + Environment.NewLine + p.Hand.ToList().GetString();
                        if (txt != p.DeckText)
                        {
                            p.DeckText = txt;
                            Bot.Edit(query.Message.Chat.Id, query.Message.MessageId, txt, GetRefreshMarkup(p));
                        }
                        else
                        {
                            BotMethods.AnswerCallback(query, GetTranslation("CardsNoChange"), true);
                        }
                    }
                    break;
                }
            }
            catch (Exception e)
            {
                Bot.Send(query.From.Id, e.Message + e.StackTrace);
            }
        }
示例#2
0
        public static void ConfigQuery(CallbackQuery query, string[] args)
        {
            var temp   = args[1].Split('|');
            var chatId = long.Parse(temp[1]);

            if (temp[0] == "lang")
            {
                if (temp.Length == 2)
                {
                    var menu = Handler.GetConfigLangMenu(chatId);
                    Bot.Edit(query.Message.Chat.Id, query.Message.MessageId, GetTranslation(chatId > 0 ? "ChoosePMLanguage" : "ChooseLanguage", GetLanguage(chatId)), menu);
                }
                if (temp.Length > 2)
                {
                    var chosenLang = temp[2];
                    Handler.SetLanguage(chatId, chosenLang);
                    var menu   = Handler.GetConfigMenu(chatId);
                    var toSend = GetTranslation("ReceivedButton", GetLanguage(chatId)) + Environment.NewLine + GetTranslation("WhatToDo", GetLanguage(chatId));
                    Bot.Edit(query.Message.Chat.Id, query.Message.MessageId, toSend, menu);
                }
            }
            else if (temp[0] == "choosetime")
            {
                if (temp.Length == 2)
                {
                    var menu = Handler.GetConfigChooseCardTimeMenu(chatId);
                    // should be group only
                    var group   = Helpers.GetGroup(chatId);
                    var current = group.ChooseCardTime ?? Constants.ChooseCardTime;
                    Bot.Edit(query.Message.Chat.Id, query.Message.MessageId,
                             GetTranslation("ConfigChooseCardTimeDetail", GetLanguage(chatId), current), menu);
                }
                if (temp.Length > 2)
                {
                    var chosen = int.Parse(temp[2]);
                    Handler.SetChooseCardTimeConfig(chatId, chosen);
                    var menu   = Handler.GetConfigMenu(chatId);
                    var toSend = GetTranslation("ReceivedButton", GetLanguage(chatId)) + Environment.NewLine + GetTranslation("WhatToDo", GetLanguage(chatId));
                    Bot.Edit(query.Message.Chat.Id, query.Message.MessageId, toSend, menu);
                }
            }
            else if (temp[0] == "playchips")
            {
                if (temp.Length == 2)
                {
                    var menu = Handler.GetConfigPlayChipsMenu(chatId);
                    // should be group only
                    var group   = Helpers.GetGroup(chatId);
                    var current = group.PlayChips ?? false;
                    Bot.Edit(query.Message.Chat.Id, query.Message.MessageId,
                             GetTranslation("ConfigPlayChipsDetail", GetLanguage(chatId), current == true ? GetTranslation("ConfigYes", GetLanguage(chatId)) : GetTranslation("ConfigNo", GetLanguage(chatId))), menu);
                }
                if (temp.Length > 2)
                {
                    var chosen = temp[2] == "yes";
                    Handler.SetPlayChipsConfig(chatId, chosen);
                    var menu   = Handler.GetConfigMenu(chatId);
                    var toSend = "";
                    if (!chosen)
                    {
                        toSend = GetTranslation("ReceivedButton", GetLanguage(chatId)) + Environment.NewLine + GetTranslation("WhatToDo", GetLanguage(chatId));
                    }
                    else
                    {
                        var group   = Helpers.GetGroup(chatId);
                        var current = group.ChipsPerCard ?? Constants.ChipsPerCard;
                        toSend = GetTranslation("ConfigChipsAmountDetail", GetLanguage(chatId), current);
                        menu   = Handler.GetChipsAmountMenu(chatId);
                    }
                    Bot.Edit(query.Message.Chat.Id, query.Message.MessageId, toSend, menu);
                }
            }
            else if (temp[0] == "chips")
            {
                if (temp.Length > 2)
                {
                    var chosen = int.Parse(temp[2]);
                    Handler.SetChipsAmountConfig(chatId, chosen);
                    var menu   = Handler.GetConfigMenu(chatId);
                    var toSend = GetTranslation("ReceivedButton", GetLanguage(chatId)) + Environment.NewLine + GetTranslation("WhatToDo", GetLanguage(chatId));
                    Bot.Edit(query.Message.Chat.Id, query.Message.MessageId, toSend, menu);
                }
            }
            else if (temp[0] == "done")
            {
                Bot.Edit(query.Message.Chat.Id, query.Message.MessageId, GetTranslation("ConfigDone", GetLanguage(chatId)));
            }
            else if (temp[0] == "back")
            {
                Bot.Edit(query.Message.Chat.Id, query.Message.MessageId, GetTranslation("WhatToDo", Handler.GetLanguage(chatId)), Handler.GetConfigMenu(chatId));
            }
            return;
        }
示例#3
0
        /*
         * public FileToSend GetTableCardsImage(List<BTCard[]> cards)
         * {
         *  using (MemoryStream ms = new MemoryStream())
         *  {
         *      Image temp = (Image)Constants.boardImage.Clone();
         *      Graphics board = Graphics.FromImage(temp);
         *
         *      int w = Constants.widthSides;
         *      int h = Constants.heightSides;
         *      for (int i = 0; i < 5; i++)
         *      {
         *          for (int j = 0; j < 4; j++)
         *          {
         *              var c = cards[j][i];
         *              if (c != null)
         *                  board.DrawImage(Constants.cardImages[c.Number - 1], w, h);
         *              h += Constants.eachHeight;
         *          }
         *          w += Constants.eachWidth;
         *          h = Constants.heightSides;
         *      }
         *
         *      var s = ToStream(temp, ImageFormat.Png);
         *      // boardImage.Save(outputPath);
         *      return new FileToSend("sticker", s);
         *  }
         * }
         *
         * private Stream ToStream(Image image, ImageFormat format)
         * {
         *  //
         *  // image.Save(stream, format);
         *  Bitmap img = new Bitmap(image);
         *  byte[] bytes;
         *  using (WebP webp = new WebP())
         *      bytes = webp.EncodeLossless(img);
         *  var stream = new System.IO.MemoryStream(bytes);
         *  stream.Position = 0;
         *  return stream;
         * }
         */

        #endregion


        #region Game Methods

        public void PlayersChooseCard()
        {
            try
            {
                if (Players.Any(x => x.Hand.Cards.Count() == 0))
                {
                    Phase = GamePhase.Ending;
                }
                if (Phase == GamePhase.Ending)
                {
                    return;
                }

                CurrentLargestDealt   = false;
                CurrentLargestDealtBy = null;


                var p = PlayerQueue.First();

                // Send Menu to P
                if (CurrentDealer?.Id == p.Id)
                {
                    CurrentDealer = null;
                    CurrentHand.Clear();
                    CurrentHandType = null;
                }
                var forP = CurrentHand.Count > 0 ? GetTranslation("CurrentlyOnTable") + Environment.NewLine + CurrentHand.GetString() + Environment.NewLine + GetTranslation("ChooseCard") : GetTranslation("ChooseCard");
                SendMenu(p, forP, p.DealCardMenu.MarkUp);
                var forGroup = PlayerQueue.GetNumOfCardsString() + Environment.NewLine + Environment.NewLine;
                forGroup += CurrentHand.Count > 0 ? GetTranslation("CurrentlyOnTable") + CurrentDealer.GetName() + ":" + Environment.NewLine + CurrentHand.GetString() : GetTranslation("TableClean");
                forGroup += Environment.NewLine + Environment.NewLine + GetTranslation("PlayersTurn", p.GetMention(), ChooseCardTime);
                Send(forGroup, BotMarkup);

                // choose card time
                for (int i = 0; i < ChooseCardTime; i++)
                {
                    Thread.Sleep(1000);
                    if (p.CurrentQuestion == null)
                    {
                        break;
                    }
                    if (_playCardSecondsToAdd != 0)
                    {
                        i = i - _playCardSecondsToAdd;
                        // Bot.Send(ChatId, GetTranslation("JoinTimeLeft", TimeSpan.FromSeconds(Constants.JoinTime - i).ToString(@"mm\:ss")));
                        _playCardSecondsToAdd = 0;
                    }
                }

                if (p.CurrentQuestion != null)
                {
                    Bot.Edit(p.TelegramId, p.CurrentQuestion.MessageId, GetTranslation("TimesUpButton"));
                    p.CurrentQuestion = null;
                }

                if (CurrentDealer?.Id == p.Id)
                {
                    Send(GetTranslation("PlayedHand", p.GetName(), GetTranslation(CurrentHandType.ToString()), CurrentHand.GetString()));
                }
                else
                {
                    Send(GetTranslation("Passed", p.GetName()));
                }

                if (p.Hand.Count == 0)
                {
                    Winner = p;
                    Phase  = GamePhase.Ending;
                }

                // Single Card and it's the largest
                // old
                // if (CurrentHand.Count == 1 && CurrentHand.First().Value == 2 && CurrentHand.First().Suit == BTCardSuit.Spades)
                if (CurrentHand.Count == 1 && Players.All(x => x.Hand.Cards.All(y => y < CurrentHand.First())))
                {
                    // Send("");
                    CurrentLargestDealt   = true;
                    CurrentLargestDealtBy = p;
                    // return;
                }
                // check for pairs too

                /* to do
                 * if (CurrentHand.Count == 2 && Players.All(x => x.Hand.GetSameGameValuedCards(BTPokerHands.Double).OrderByDescending(y => y.Key).First().CompareHandWith(CurrentHand).Success == false))
                 * // if (CurrentHand.Count == 2)
                 * {
                 *  {
                 *      Send("");
                 *      CurrentLargestDealt = true;
                 *      CurrentLargestDealtBy = p;
                 *      // return;
                 *  }
                 * }
                 */

                CleanPlayers();
            }
            catch (Exception ex)
            {
                Log(ex);
            }
        }