public static Group GetGroup(long id) { using (var db = new BigTwoDb()) { return(db.Groups.FirstOrDefault(x => x.GroupId == id)); } }
public static void Sql(Message msg, string[] args) { if (args.Length == 1) { msg.Reply("You must enter a sql query."); return; } using (var db = new BigTwoDb()) { var conn = db.Database.Connection; if (conn.State != ConnectionState.Open) { conn.Open(); } string raw = ""; var queries = args[1].Split(';'); foreach (var sql in queries) { try { using (var comm = conn.CreateCommand()) { comm.CommandText = sql; if (string.IsNullOrEmpty(sql)) { continue; } var reader = comm.ExecuteReader(); var result = ""; if (reader.HasRows) { for (int i = 0; i < reader.FieldCount; i++) { raw += $"<code>{reader.GetName(i).FormatHTML()}</code>" + (i == reader.FieldCount - 1 ? "" : " - "); } result += raw + Environment.NewLine; raw = ""; while (reader.Read()) { for (int i = 0; i < reader.FieldCount; i++) { raw += (reader.IsDBNull(i) ? "<i>NULL</i>" : $"<code>{reader[i].ToString().FormatHTML()}</code>") + (i == reader.FieldCount - 1 ? "" : " - "); } result += raw + Environment.NewLine; raw = ""; } } result += reader.RecordsAffected == -1 ? "" : (reader.RecordsAffected + " records affected"); result = !String.IsNullOrEmpty(result) ? result : (sql.ToLower().StartsWith("select") ? "Nothing found" : "Done."); msg.Reply(result); } } catch (Exception e) { msg.Reply($"<b>SQL Exception</b>:\n{e.Message}"); } } } }
public static Player GetPlayer(long id) { using (var db = new BigTwoDb()) { return(db.Players.FirstOrDefault(x => x.TelegramId == id)); } }
public static void NextGame(Message msg, string[] args) { if (msg.Chat.Type == ChatType.Private) { return; } var grpId = msg.Chat.Id; using (var db = new BigTwoDb()) { var dbGrp = db.Groups.FirstOrDefault(x => x.GroupId == grpId); if (dbGrp != null) { var notified = db.NotifyGames.FirstOrDefault(x => x.GroupId == grpId && x.UserId == msg.From.Id); if (notified != null) { Bot.Send(msg.From.Id, GetTranslation("AlreadyInWaitingList", GetLanguage(msg.From.Id))); return; } else { } db.Database.ExecuteSqlCommand($"INSERT INTO NotifyGame VALUES ({msg.From.Id}, {msg.Chat.Id})"); db.SaveChanges(); Bot.Send(msg.From.Id, GetTranslation("NextGame", GetLanguage(msg.From.Id))); } } }
public static void MyChips(Message msg, string[] args) { using (var db = new BigTwoDb()) { var p = db.Players.FirstOrDefault(x => x.TelegramId == msg.From.Id); if (p == null) { return; } var chips = p.Chips; try { if (msg.Chat.Type != ChatType.Private) { msg.ReplyPM(chips.ToString()); } else { msg.Reply(chips.ToString()); } } catch { // } } }
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 static void SetChooseCardTimeConfig(long chatId, int chooseCardTime) { using (var db = new BigTwoDb()) { var grp = db.Groups.FirstOrDefault(x => x.GroupId == chatId); if (grp == null) { return; } grp.ChooseCardTime = chooseCardTime; db.SaveChanges(); } }
public static void SetChipsAmountConfig(long chatId, int chips) { using (var db = new BigTwoDb()) { var grp = db.Groups.FirstOrDefault(x => x.GroupId == chatId); if (grp == null) { return; } grp.ChipsPerCard = chips; db.SaveChanges(); } }
public static void SetPlayChipsConfig(long chatId, bool playChips) { using (var db = new BigTwoDb()) { var grp = db.Groups.FirstOrDefault(x => x.GroupId == chatId); if (grp == null) { return; } grp.PlayChips = playChips; db.SaveChanges(); } }
public static void SetLanguage(int userId, string lang) { using (var db = new BigTwoDb()) { var user = db.Players.FirstOrDefault(x => x.TelegramId == userId); if (user == null) { return; } user.Language = lang; db.SaveChanges(); } }
public void EndGame() { var winner = PlayerQueue.First(); Winner = winner; var finalMsg = $"{winner.GetName()} {GetTranslation("Won")}" + Environment.NewLine + Environment.NewLine; if (!PlayChips) { finalMsg += PlayerQueue.GetNumOfCardsString(); } var winnerChips = Players.Select(x => x.CardCount).Sum() * ChipsPerCard; Send(finalMsg); finalMsg = ""; using (var db = new BigTwoDb()) { foreach (var p in Players) { var dbgp = db.GamePlayers.FirstOrDefault(x => x.GameId == GameId && x.PlayerId == p.Id); dbgp.Won = p == Winner; dbgp.CardsLeft = p.CardCount; db.SaveChanges(); Thread.Sleep(200); if (PlayChips) { var dbct = new ChipsTransaction { GameId = DbGame.Id, GamePlayerId = dbgp.Id, PlayerId = db.Players.FirstOrDefault(x => x.TelegramId == p.TelegramId).Id, ChipsTransacted = p.CardCount == 0 ? winnerChips : -(p.CardCount * ChipsPerCard) }; db.ChipsTransactions.Add(dbct); db.SaveChanges(); finalMsg += $"{p.GetName()} [{dbct.ChipsTransacted?.ToString("+#;-#;0").ToBold()}] - {p.CardCount}\n"; Thread.Sleep(200); } } var g = db.Games.FirstOrDefault(x => x.Id == GameId); g.TimeEnded = DateTime.UtcNow; db.SaveChanges(); } Send(finalMsg); }
public static void SetLanguage(long chatId, string lang) { if (int.TryParse(chatId.ToString(), out int o)) { SetLanguage(o, lang); return; } using (var db = new BigTwoDb()) { var grp = db.Groups.FirstOrDefault(x => x.GroupId == chatId); if (grp == null) { return; } grp.Language = lang; db.SaveChanges(); } }
public static string GetLanguage(int id) { using (var db = new BigTwoDb()) { Player p = null; var grp = db.Groups.FirstOrDefault(x => x.GroupId == id); if (grp == null) { p = db.Players.FirstOrDefault(x => x.TelegramId == id); } if (p != null && String.IsNullOrEmpty(p.Language)) { p.Language = "English"; db.SaveChanges(); } return(grp?.Language ?? p?.Language ?? "English"); } }
public void NotifyNextGamePlayers() { var grpId = ChatId; using (var db = new BigTwoDb()) { var dbGrp = db.Groups.FirstOrDefault(x => x.GroupId == grpId); if (dbGrp != null) { var toNotify = db.NotifyGames.Where(x => x.GroupId == grpId && x.UserId != Initiator.TelegramId).Select(x => x.UserId).ToList(); foreach (int user in toNotify) { Bot.Send(user, GetTranslation("GameIsStarting", GroupLink != null ? $"<a href='{GroupLink}'>{GroupName}</a>" : GroupName), GroupMarkup); } db.Database.ExecuteSqlCommand($"DELETE FROM NotifyGame WHERE GROUPID = {grpId}"); db.SaveChanges(); } } }
public static void Config(Message msg, string[] args) { var id = msg.Chat.Id; //make sure the group is in the database using (var db = new BigTwoDb()) { switch (msg.Chat.Type) { case ChatType.Group: case ChatType.Supergroup: var grp = db.Groups.FirstOrDefault(x => x.GroupId == id); if (grp == null) { grp = Helpers.MakeDefaultGroup(msg.Chat); db.Groups.Add(grp); } grp.UserName = msg.Chat.Username; grp.Name = msg.Chat.Title; break; case ChatType.Private: var p = db.Players.FirstOrDefault(x => x.TelegramId == id); if (p == null) { p = Helpers.MakeDefaultPlayer(msg.From); db.Players.Add(p); } p.UserName = msg.From.Username; p.Name = msg.From.FirstName; break; } db.SaveChanges(); } var menu = Handler.GetConfigMenu(msg.Chat.Id); Bot.Send(msg.From.Id, GetTranslation("WhatToDo", GetLanguage(msg.Chat.Id)), replyMarkup: menu); }
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 HandleMessage(Message msg) { switch (msg.Type) { case MessageType.TextMessage: string text = msg.Text; string[] args = text.Contains(' ') ? new[] { text.Split(' ')[0].ToLower(), text.Remove(0, text.IndexOf(' ') + 1) } : new[] { text.ToLower(), null }; if (args[0].EndsWith('@' + Bot.Me.Username.ToLower())) { args[0] = args[0].Remove(args[0].Length - Bot.Me.Username.Length - 1); } if (msg.Text.StartsWith("/")) { args[0] = args[0].Substring(1); var cmd = Bot.Commands.FirstOrDefault(x => x.Trigger == args[0]); if (cmd != null) { if (new[] { ChatType.Supergroup, ChatType.Group }.Contains(msg.Chat.Type)) { using (var db = new BigTwoDb()) { var DbGroup = db.Groups.FirstOrDefault(x => x.GroupId == msg.Chat.Id); if (DbGroup == null) { DbGroup = Helpers.MakeDefaultGroup(msg.Chat); db.Groups.Add(DbGroup); db.SaveChanges(); } } } if (cmd.GroupOnly && !new[] { ChatType.Supergroup, ChatType.Group }.Contains(msg.Chat.Type)) { msg.Reply("This command can only be used in groups!"); return; } if (cmd.AdminOnly && new[] { ChatType.Supergroup, ChatType.Group }.Contains(msg.Chat.Type) && !Helpers.IsGroupAdmin(msg)) { msg.Reply("You aren't a group admin!"); return; } if (cmd.DevOnly && !Constants.Dev.Contains(msg.From.Id)) { msg.Reply("You aren't a bot dev!"); return; } cmd.Method.Invoke(msg, args); return; } } break; case MessageType.ServiceMessage: // break; /* * case MessageType.SuccessfulPayment: * var randomRef = Guid.NewGuid().ToString(); * randomRef = $"#crim_{randomRef.Substring(randomRef.Length - 12)}"; * using (var db = new BigTwoDb()) * { * var donate = new Donation * { * TelegramId = msg.From.Id, * Amount = msg.SuccessfulPayment.TotalAmount / 100, * Reference = randomRef, * DonationTime = DateTime.UtcNow * }; * db.Donations.Add(donate); * db.SaveChanges(); * } * // notify user successful donation, provide reference code for checking in case * msg.Reply(GetTranslation("DonateSuccessful", GetLanguage(msg.From.Id), randomRef)); * // log who, how much, when and ref code to log group * Bot.Send(Constants.LogGroupId, $"Donation from user <a href='tg://user?id={msg.From.Id}'>{msg.From.FirstName.FormatHTML()}</a>.\nAmount: {msg.SuccessfulPayment.TotalAmount / 100} HKD\nReference: {randomRef}"); * 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); }
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)); }