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); }
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(); }
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; } }
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); }