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); }
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 { } }
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); } }
public static void Maintenance(Message msg, string[] args) { Program.MaintMode = !Program.MaintMode; Bot.Send(msg.Chat.Id, $"Maintenance Mode: {Program.MaintMode}"); }
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); } }
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)); }
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); }