Ejemplo n.º 1
0
        public static void SetLang(Message msg, string[] args)
        {
            var id = msg.From.Id;

            //make sure the user is in the database
            using (var db = new BigTwoDb())
            {
                var user = db.Players.FirstOrDefault(x => x.TelegramId == id);
                if (user == null)
                {
                    user = Helpers.MakeDefaultPlayer(msg.From);
                    db.Players.Add(user);
                }

                user.UserName = msg.From.Username;
                user.Name     = msg.From.FirstName;
                db.SaveChanges();
            }

            var menu = Handler.GetConfigLangMenu(msg.From.Id, true);

            Bot.Send(msg.From.Id, GetTranslation("ChoosePMLanguage", GetLanguage(msg.From.Id)), replyMarkup: menu);
        }
Ejemplo n.º 2
0
        public static void ChangeGroupLang(Message msg, string[] args)
        {
            if (args == null)
            {
                return;
            }
            var lang = args[1];

            try
            {
                using (var db = new BigTwoDb())
                {
                    var p = db.Groups.FirstOrDefault(x => x.GroupId == msg.Chat.Id);
                    if (p != null)
                    {
                        p.Language = lang;
                        db.SaveChanges();
                        Bot.Send(msg.Chat.Id, "OK");
                    }
                }
            }
            catch { }
        }
Ejemplo n.º 3
0
 public static void UploadLang(Message msg, string[] args)
 {
     try
     {
         var id = msg.Chat.Id;
         if (msg.ReplyToMessage?.Type != MessageType.DocumentMessage)
         {
             Bot.Send(id, "Please reply to the file with /uploadlang");
             return;
         }
         var fileid = msg.ReplyToMessage.Document?.FileId;
         if (fileid != null)
         {
             UploadFile(fileid, id,
                        msg.ReplyToMessage.Document.FileName,
                        msg.MessageId);
         }
     }
     catch (Exception e)
     {
         Bot.Send(msg.Chat.Id, e.Message, parseMode: ParseMode.Default);
     }
 }
Ejemplo n.º 4
0
 public static void Maintenance(Message msg, string[] args)
 {
     Program.MaintMode = !Program.MaintMode;
     Bot.Send(msg.Chat.Id, $"Maintenance Mode: {Program.MaintMode}");
 }
Ejemplo n.º 5
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);
            }
        }
Ejemplo n.º 6
0
        private void AddPlayer(User u, bool newGame = false)
        {
            var player = this.Players.FirstOrDefault(x => x.TelegramId == u.Id);

            if (player != null)
            {
                return;
            }

            using (var db = new BigTwoDb())
            {
                var DbPlayer = db.Players.FirstOrDefault(x => x.TelegramId == u.Id);
                if (DbPlayer == null)
                {
                    DbPlayer = Helpers.MakeDefaultPlayer(u);
                    db.Players.Add(DbPlayer);
                    db.SaveChanges();
                }
                else
                {
                    DbPlayer.Name     = u.FirstName;
                    DbPlayer.UserName = u.Username;
                    db.SaveChanges();
                }
                BTPlayer p = new BTPlayer(u, DbPlayer.Id);
                try
                {
                    Message ret;
                    try
                    {
                        ret = SendPM(p, GetTranslation("YouJoined", GroupName), GroupMarkup);
                        if (ret == null)
                        {
                            throw new Exception();
                        }
                    }
                    catch
                    {
                        Bot.Send(ChatId, GetTranslation("NotStartedBot", u.GetName()), GenerateStartMe());
                        return;
                    }
                }
                catch { }
                this.Players.Add(p);
            }
            if (!newGame)
            {
                _secondsToAdd += 15;
            }

            do
            {
                BTPlayer p = Players.FirstOrDefault(x => Players.Count(y => y.TelegramId == x.TelegramId) > 1);
                if (p == null)
                {
                    break;
                }
                Players.Remove(p);
            }while (true);

            Send(GetTranslation("JoinedGame", u.GetName()) + Environment.NewLine + GetTranslation("JoinInfo", Players.Count, 4));
        }
Ejemplo n.º 7
0
        private void GameTimer()
        {
            while (Phase != GamePhase.Ending && Phase != GamePhase.KillGame)
            {
                try
                {
#if DEBUG
                    AddPlayer(new User {
                        Id = 433942669, FirstName = "Mud9User", IsBot = false, LanguageCode = "zh-HK", Username = "******"
                    });
                    AddPlayer(new User {
                        Id = 415774316, FirstName = "Avalonese Dev", IsBot = false, LanguageCode = "zh-HK", Username = "******"
                    });
                    AddPlayer(new User {
                        Id = 267359519, FirstName = "Ian", IsBot = false, LanguageCode = "zh-HK", Username = "******"
                    });
#endif
                    for (var i = 0; i < JoinTime; i++)
                    {
                        if (Players.Count == 4)
                        {
                            break;
                        }
                        if (this.Phase == GamePhase.InGame)
                        {
                            break;
                        }
                        if (this.Phase == GamePhase.Ending)
                        {
                            return;
                        }
                        if (this.Phase == GamePhase.KillGame)
                        {
                            return;
                        }
                        //try to remove duplicated game
                        if (i == 10)
                        {
                            var count = Bot.Games.Count(x => x.ChatId == ChatId);
                            if (count > 1)
                            {
                                var toDel = Bot.Games.Where(x => x.Players.Count < this.Players.Count).OrderBy(x => x.Players.Count).Where(x => x.Id != this.Id && x.Phase != GamePhase.InGame);
                                if (toDel != null)
                                {
                                    Send(GetTranslation("DuplicatedGameRemoving"));
                                    foreach (var g in toDel)
                                    {
                                        g.Phase = GamePhase.KillGame;

                                        try
                                        {
                                            Bot.RemoveGame(g);
                                        }
                                        catch
                                        {
                                            // should be removed already
                                        }
                                    }
                                }
                            }
                        }
                        if (_secondsToAdd != 0)
                        {
                            i = Math.Max(i - _secondsToAdd, Constants.JoinTime - Constants.JoinTimeMax);
                            // Bot.Send(ChatId, GetTranslation("JoinTimeLeft", TimeSpan.FromSeconds(Constants.JoinTime - i).ToString(@"mm\:ss")));
                            _secondsToAdd = 0;
                        }
                        var specialTime = JoinTime - i;
                        if (new int[] { 10, 30, 60, 90 }.Contains(specialTime))
                        {
                            Bot.Send(ChatId, GetTranslation("JoinTimeSpecialSeconds", specialTime));
                        }
                        if (Players.Count == 4)
                        {
                            break;
                        }
                        Thread.Sleep(1000);
                    }

                    if (this.Phase == GamePhase.Ending)
                    {
                        return;
                    }
                    do
                    {
                        BTPlayer p = Players.FirstOrDefault(x => Players.Count(y => y.TelegramId == x.TelegramId) > 1);
                        if (p == null)
                        {
                            break;
                        }
                        Players.Remove(p);
                    }while (true);

                    if (this.Phase == GamePhase.Ending)
                    {
                        return;
                    }

                    if (this.Players.Count() == 4)
                    {
                        this.Phase = GamePhase.InGame;
                    }
                    if (this.Phase != GamePhase.InGame)
                    {
                        /*
                         * this.Phase = GamePhase.Ending;
                         * Bot.RemoveGame(this);
                         * Bot.Send(ChatId, "Game ended!");
                         */
                    }
                    else
                    {
                        #region Ready to start game
                        if (Players.Count < 4)
                        {
                            Send(GetTranslation("GameEnded"));
                            return;
                        }

                        Send(GetTranslation("GameStart"));

                        // create game + gameplayers in db
                        using (var db = new BigTwoDb())
                        {
                            DbGame = new Database.Game
                            {
                                GrpId        = DbGroup.Id,
                                GroupId      = ChatId,
                                GroupName    = GroupName,
                                TimeStarted  = DateTime.UtcNow,
                                ChipsPerCard = ChipsPerCard
                            };
                            db.Games.Add(DbGame);
                            db.SaveChanges();
                            GameId = DbGame.Id;
                            foreach (var p in Players)
                            {
                                GamePlayer DbGamePlayer = new GamePlayer
                                {
                                    PlayerId = db.Players.FirstOrDefault(x => x.TelegramId == p.TelegramId).Id,
                                    GameId   = GameId
                                };
                                db.GamePlayers.Add(DbGamePlayer);
                            }
                            db.SaveChanges();
                        }

                        PrepareGame();

                        // remove joined players from nextgame list
                        // RemoveFromNextGame(Players.Select(x => x.TelegramId).ToList());

                        #endregion

                        #region Start!
                        foreach (var player in Players)
                        {
                            SendDeck(player);
                        }
                        while (Phase != GamePhase.Ending)
                        {
                            // _playerList = Send(GeneratePlayerList()).MessageId;
                            PlayersChooseCard();
                            if (Phase == GamePhase.Ending)
                            {
                                break;
                            }
                            if (CurrentLargestDealt)
                            {
                                NextPlayerAfterCurrentLargest(CurrentLargestDealtBy);
                            }
                            else
                            {
                                NextPlayer();
                            }
                        }
                        EndGame();
                        #endregion
                    }
                    this.Phase = GamePhase.Ending;
                    Bot.Send(ChatId, GetTranslation("GameEnded"));
                }
                catch (Exception ex)
                {
                    if (Phase == GamePhase.KillGame)
                    {
                        // normal
                    }
                    else
                    {
                        Log(ex);
                        Phase = GamePhase.KillGame;
                    }
                }
            }

            Bot.RemoveGame(this);
        }