示例#1
0
 public void Log(Exception ex)
 {
     ex.LogError(ChatId);
     Send("Sorry there is some problem with me, I gonna go die now.");
     this.Phase = GamePhase.Ending;
     Bot.RemoveGame(this);
 }
示例#2
0
        public BigTwo(long chatId, User u, string groupName, string chatUsername = null)
        {
            ChatId    = chatId;
            GroupName = groupName;
            Players   = new List <BTPlayer>();
            Deck      = new BTDeck();
            #region Creating New Game - Preparation
            using (var db = new BigTwoDb())
            {
                DbGroup          = db.Groups.FirstOrDefault(x => x.GroupId == ChatId);
                DbGroup.UserName = chatUsername;
                GroupLink        = DbGroup.UserName != null ? $"https://t.me/{DbGroup.UserName}" : DbGroup.GroupLink ?? null;
                LoadLanguage(DbGroup.Language);
                if (DbGroup == null)
                {
                    Bot.RemoveGame(this);
                }
                ChooseCardTime = DbGroup.ChooseCardTime ?? Constants.ChooseCardTime;
                PlayChips      = DbGroup.PlayChips ?? false;
                ChipsPerCard   = DbGroup.ChipsPerCard ?? Constants.ChipsPerCard;
                db.SaveChanges();
                if (GroupLink != null)
                {
                    GroupMarkup = new InlineKeyboardMarkup(
                        new InlineKeyboardButton[][] {
                        new InlineKeyboardUrlButton[] {
                            new InlineKeyboardUrlButton(GetTranslation("BackGroup", GroupName), GroupLink)
                        }
                    });
                }
                BotMarkup = new InlineKeyboardMarkup(
                    new InlineKeyboardButton[][] {
                    new InlineKeyboardButton[] {
                        new InlineKeyboardUrlButton(GetTranslation("GoToBot"), $"https://t.me/{Bot.Me.Username}")
                    }
                });
            }
            // something
            #endregion

            var msg = GetTranslation("NewGame", u.GetName());
            if (PlayChips)
            {
                msg += Environment.NewLine + GetTranslation("GameChipsPerCard", ChipsPerCard);
            }
            // beta message
            msg += Environment.NewLine + Environment.NewLine + GetTranslation("Beta");
            Bot.Send(chatId, msg);
            AddPlayer(u, true);
            Initiator = Players[0];

            new Task(() => { NotifyNextGamePlayers(); }).Start();
            new Thread(GameTimer).Start();
        }
示例#3
0
        public void HandleMessage(Message msg)
        {
            switch (msg.Text.ToLower().Substring(1).Split()[0].Split('@')[0])
            {
            case "join":
                if (Phase == GamePhase.Joining)
                {
                    AddPlayer(msg.From);
                }
                break;

            case "flee":
                if (Phase == GamePhase.Joining)
                {
                    RemovePlayer(msg.From);
                }
                else if (Phase == GamePhase.InGame)
                {
                    Send(GetTranslation("CantFleeRunningGame"));
                }
                break;

            case "startgame":
                if (Phase == GamePhase.Joining)
                {
                    AddPlayer(msg.From);
                }
                break;

            case "forcestart":
                if (this.Players.Count() >= 2)
                {
                    Phase = GamePhase.InGame;
                }
                else
                {
                    Send(GetTranslation("GameEnded"));
                    Phase = GamePhase.Ending;
                    Bot.RemoveGame(this);
                }
                break;

            case "killgame":
                Send(GetTranslation("KillGame"));
                Phase = GamePhase.Ending;
                Bot.RemoveGame(this);
                break;

            case "seq":
                if (_playerList == 0)
                {
                    Reply(msg.MessageId, GetTranslation("PlayerSequenceNotStarted"));
                }
                else
                {
                    Reply(_playerList, GetTranslation("GetPlayerSequence"));
                }
                break;

            case "extend":
                if (Phase == GamePhase.Joining)
                {
                    _secondsToAdd += Constants.ExtendTime;
                    Reply(msg.MessageId, GetTranslation("ExtendJoining", Constants.ExtendTime));
                }
                break;

            case "showdeck":
                if (Phase == GamePhase.InGame)
                {
                    var p = Players.FirstOrDefault(x => x.TelegramId == msg.From.Id);
                    SendDeck(p, msg);
                }
                break;
            }
        }
示例#4
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);
        }