Пример #1
0
 public static Group GetGroup(long id)
 {
     using (var db = new BigTwoDb())
     {
         return(db.Groups.FirstOrDefault(x => x.GroupId == id));
     }
 }
Пример #2
0
        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}");
                    }
                }
            }
        }
Пример #3
0
 public static Player GetPlayer(long id)
 {
     using (var db = new BigTwoDb())
     {
         return(db.Players.FirstOrDefault(x => x.TelegramId == id));
     }
 }
Пример #4
0
        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)));
                }
            }
        }
Пример #5
0
 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
         {
             //
         }
     }
 }
Пример #6
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();
        }
Пример #7
0
 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();
     }
 }
Пример #8
0
 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();
     }
 }
Пример #9
0
 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();
     }
 }
Пример #10
0
 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();
     }
 }
Пример #11
0
        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);
        }
Пример #12
0
 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();
     }
 }
Пример #13
0
 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");
     }
 }
Пример #14
0
        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();
                }
            }
        }
Пример #15
0
        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);
        }
Пример #16
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);
        }
Пример #17
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 { }
        }
Пример #18
0
        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;
                 */
            }
        }
Пример #19
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);
        }
Пример #20
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));
        }