Example #1
0
        public static void NextGame(Update update, string[] args)
        {
            var id = update.Message.Chat.Id;

            using (var db = new WWContext())
            {
                var grp = db.Groups.FirstOrDefault(x => x.GroupId == id);
                if (grp == null)
                {
                    grp = MakeDefaultGroup(id, update.Message.Chat.Title, "nextgame");
                    db.Groups.Add(grp);
                    db.SaveChanges();
                }

                //check nodes to see if player is in a game
                //node = GetPlayerNode(update.Message.From.Id);
                var game = GetGroupNodeAndGame(update.Message.Chat.Id);
                if (game != null && (game?.Users.Contains(update.Message.From.Id) ?? false) && game?.GroupId != update.Message.Chat.Id)
                {
                    //player is already in a game, and alive
                    Send(
                        GetLocaleString("AlreadyInGame", grp.Language ?? "English",
                                        game.ChatGroup.ToBold()), update.Message.Chat.Id);
                    return;
                }

                var button = new InlineKeyboardMarkup(new[] {
                    new InlineKeyboardCallbackButton(GetLocaleString("Cancel", grp.Language), $"stopwaiting|{id}")
                });
                if (db.NotifyGames.Any(x => x.GroupId == id && x.UserId == update.Message.From.Id))
                {
                    Send(GetLocaleString("AlreadyOnWaitList", grp.Language, grp.Name.ToBold()),
                         update.Message.From.Id, customMenu: button);
                }
                else
                {
                    db.Database.ExecuteSqlCommand(
                        $"INSERT INTO NotifyGame VALUES ({update.Message.From.Id}, {id})");
                    db.SaveChanges();
                    Send(GetLocaleString("AddedToWaitList", grp.Language, grp.Name.ToBold()),
                         update.Message.From.Id, customMenu: button);
                }
            }
        }
Example #2
0
        public static void Smite(Update u, string[] args)
        {
            //if (u.Message.ReplyToMessage == null)
            //{
            //    Bot.Send(GetLocaleString("MustReplySmite",GetLanguage(u.Message.Chat.Id)).ToBold(), u.Message.Chat.Id);
            //    return;
            //}

            //get the names to smite



            if (UpdateHelper.IsGroupAdmin(u))
            {
                foreach (var e in u.Message.Entities)
                {
                    switch (e.Type)
                    {
                    case MessageEntityType.Mention:
                        //get user
                        var username = u.Message.Text.Substring(e.Offset + 1, e.Length - 1);
                        using (var db = new WWContext())
                        {
                            var id = db.Players.FirstOrDefault(x => x.UserName == username)?.TelegramId ?? 0;
                            if (id != 0)
                            {
                                Bot.GetGroupNodeAndGame(u.Message.Chat.Id)?.SmitePlayer(id);
                            }
                        }
                        break;

                    case MessageEntityType.TextMention:
                        Bot.GetGroupNodeAndGame(u.Message.Chat.Id)?.SmitePlayer(e.User.Id);
                        break;
                    }
                }

                var did = 0;
                if (int.TryParse(args[1], out did))
                {
                    Bot.GetGroupNodeAndGame(u.Message.Chat.Id)?.SmitePlayer(did);
                }
            }
        }
Example #3
0
 public static void TopAfk(Update update, string[] args)
 {
     using (var db = new WWContext())
     {
         var topPlayers = db.Players.OrderByDescending(x => x.GameKills.Count(y => y.KillMethodId == 16));
         var reply      = "Top 10 Afk:\n";
         reply.ToBold();
         reply += "\n";
         var topScore = topPlayers.Take(10);
         var i        = 1;
         foreach (var p in topScore)
         {
             var count = p.GameKills.Count(y => y.KillMethodId == 16);
             reply += i + "º " + p.Name + " (" + count + ")\n";
             i++;
         }
         Send(reply, update.Message.Chat.Id);
     }
 }
Example #4
0
 public JsonResult PlayerDeaths(int pid, bool json = false)
 {
     using (var DB = new WWContext())
     {
         var p = DB.Players.FirstOrDefault(x => x.TelegramId == pid);
         if (p == null)
         {
             return(Json("", JsonRequestBehavior.AllowGet));
         }
         var deaths = (from gk in DB.GameKills
                       join pla in DB.Players on gk.VictimId equals pla.Id
                       where pla.TelegramId == p.TelegramId
                       where gk.KillMethodId != 0
                       group gk by new { kid = gk.KillMethodId, gid = gk.GameId, day = gk.Day });
         var temp = (from i in deaths
                     group i by i.Key.kid);
         var totalDeaths = temp.Sum(x => x.Count());
         // var totalDeaths = deaths.Sum(x => x.Count());
         // var deathInfo = deaths.OrderByDescending(x => x.Count()).Take(5);
         var deathInfo = temp.OrderByDescending(x => x.Count()).Take(5);
         if (!json)
         {
             var reply = "<table class=\"table table-hover\"><tbody><tr><th>Death Type</th><th>Percentage</th></tr>";
             foreach (var a in deathInfo)
             {
                 var killMethod = Enum.GetName(typeof(KillMthd), a.Key);
                 reply += "<tr><td><b>" + killMethod + "</b></td><td>" + ((double)(a.Count() / (double)totalDeaths) * 100.0).ToString("#0.0") + "%</td></tr>";
             }
             reply += "</tbody></table>";
             return(Json(reply, JsonRequestBehavior.AllowGet));
         }
         else
         {
             List <object> reply = new List <object>();
             foreach (var a in deathInfo)
             {
                 var killMethod = Enum.GetName(typeof(KillMthd), a.Key);
                 reply.Add(new { method = killMethod, percent = ((double)(a.Count() / (double)totalDeaths) * 100.0).ToString("#0.0") });
             }
             return(Json(reply, JsonRequestBehavior.AllowGet));
         }
     }
 }
Example #5
0
        public static void Donate2(Update u, string[] args)
        {
            //Bot.Api.SendTextMessageAsync(u.Message.Chat.Id,
            //    "Want to help keep Werewolf online? Please donate to:\n" +
            //    "•PayPal: PayPal.me/greywolfdevelopment\n" +
            //    "•Bitcoin: 13QvBKfAattcSxSsW274fbgnKU5ASpnK3A" +
            //    "\n\nDonations help us pay to keep the expensive servers running and the game online. Every donation you make helps to keep us going for another month. For more information please contact @werewolfsupport", ParseMode.Html, true);
            var menu = new Menu();

            if (u.Message.Chat.Type == ChatType.Private)
            {
                menu.Buttons.Add(new InlineKeyboardCallbackButton("Telegram", "donatetg"));
            }
            else
            {
                menu.Buttons.Add(new InlineKeyboardUrlButton("Telegram", $"https://t.me/{Bot.Me.Username}?start=donatetg"));
            }
            menu.Buttons.Add(new InlineKeyboardUrlButton("PayPal", "https://PayPal.me/greywolfdevelopment"));
            var markup = menu.CreateMarkupFromMenu();
            var gif    = "Custom gif packs are not available at this time, watch the update channel for more news!  ";

            using (var db = new WWContext())
            {
                var count = db.Players.Count(x => x.GifPurchased == true);
                if (count < 100)
                {
                    gif = "Donate $10USD or more to unlock a custom gif pack that you can choose.  ";
                }
            }
            Bot.Api.SendTextMessageAsync(u.Message.Chat.Id,
                                         "Want to help keep Werewolf online?\n" +
                                         "We now offer some rewards for donating!\n" +
                                         gif + "There are also donation badges you can get in game.  These badges are added to the end of your name in game, so everyone can see you donated!\n\n" +
                                         "•$10 USD: 🥉\n" +
                                         "•$50 USD: 🥈\n" +
                                         "•$100 USD: 🥇\n\n" +
                                         "You might also see this special badge: 💎\nThis is reserved for people who donated prior to there being any rewards for donating\n" +
                                         "We also accept Bitcoin donations at: 13QvBKfAattcSxSsW274fbgnKU5ASpnK3A\n" +
                                         "If you donate via PayPal or Bitcoin, you will need to contact @werewolfsupport to claim your prize.  If you donate via Telegram, it's automated, no need to contact an admin :)\n" +
                                         "More information about the Custom Gif Packs: http://telegra.ph/Custom-Gif-Packs-and-Donation-Levels-07-31\n" +
                                         "How would you like to donate?",
                                         replyMarkup: markup);
        }
Example #6
0
 public static void Sql(Update u, string[] args)
 {
     if (args.Length == 1)
     {
         Send("You must enter a sql command...", u.Message.Chat.Id);
     }
     using (var db = new WWContext())
     {
         var sql  = args[1];
         var conn = db.Database.Connection;
         if (conn.State != ConnectionState.Open)
         {
             conn.Open();
         }
         string raw = "";
         using (var comm = conn.CreateCommand())
         {
             comm.CommandText = sql;
             var reader = comm.ExecuteReader();
             var result = "";
             if (reader.HasRows)
             {
                 for (int i = 0; i < reader.FieldCount; i++)
                 {
                     raw += reader.GetName(i) + " - ";
                 }
                 result += raw + Environment.NewLine;
                 raw     = "";
                 while (reader.Read())
                 {
                     for (int i = 0; i < reader.FieldCount; i++)
                     {
                         raw += reader[i] + " - ";
                     }
                     result += raw + Environment.NewLine;
                     raw     = "";
                 }
             }
             Send(result + reader.RecordsAffected + " records affected", u.Message.Chat.Id);
         }
     }
 }
Example #7
0
        /// <summary>
        ///     Gets the language for the group, defaulting to English
        /// </summary>
        /// <param name="id">The ID of the group</param>
        /// <returns></returns>
        public static string GetLanguage(long id)
        {
            using (var db = new WWContext())
            {
                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");
            }
        }
Example #8
0
        public static void GetBans(Update u, string[] args)
        {
            using (var db = new WWContext())
            {
                var reply = "Spam Ban List:\n";
                foreach (var id in UpdateHandler.SpamBanList)
                {
                    var p = db.Players.FirstOrDefault(x => x.TelegramId == id);
                    if (p != null) //it really shouldn't be...
                    {
                        reply += $"{id} - {p.Name} @{p.UserName}\n";
                    }
                }
                reply += "\nGlobal Bans in Database\n";

                reply = UpdateHandler.BanList.OrderBy(x => x.Expires).Aggregate(reply, (current, ban) => current + $"{ban.TelegramId} - {ban.Name.FormatHTML()}: {ban.Reason}".ToBold() + $"\n{(ban.Expires < new DateTime(3000, 1, 1) ? "Expires: " + TimeZoneInfo.ConvertTimeToUtc(ban.Expires, TimeZoneInfo.Local).ToString("u") + "\n" : "")}");

                Send(reply, u.Message.Chat.Id);
            }
        }
Example #9
0
        public JsonResult GetPublicGroups()
        {
            using (var DB = new WWContext())
            {
                var pubGroups = (from g in DB.Groups
                                 where g.Preferred == true & !String.IsNullOrEmpty(g.UserName)
                                 select
                                 new
                {
                    Name = g.Name,
                    Language = g.Language,
                    UserName = g.UserName,
                    Link = "http://telegram.me/" + g.UserName
                }).ToList();

                //var result = pubGroups.Aggregate("", (current, group) => current + $"<tr><td>{group.Name}</td><td>{group.Language}</td><td>{group.Link}</td></tr>");
                //var table = @"<table class=""table table-hover table-responsive""><thead><tr><th>Name</th><th>Language / Region</th><th>Link</th></tr></thead><tbody>" + result + "</tbody></table>";
                return(Json(pubGroups, JsonRequestBehavior.AllowGet));
            }
        }
Example #10
0
        public JsonResult PlayerLockedAchievements(int pid, bool json = false)
        {
            using (var DB = new WWContext())
            {
                var p = DB.Players.FirstOrDefault(x => x.TelegramId == pid);
                if (p == null)
                {
                    return(Json("", JsonRequestBehavior.AllowGet));
                }
                var ach = p.NewAchievements != null
                    ? new BitArray(p.NewAchievements)
                    : new BitArray(200);
                var has = ach.GetUniqueFlags().ToList();
                if (!json)
                {
                    var reply = "<table class=\"table table-hover\"><tbody style=\"color: red\">";
                    foreach (AchievementsReworked a in Enum.GetValues(typeof(AchievementsReworked)))
                    {
                        if (!has.Contains(a) && a != AchievementsReworked.None && a != AchievementsReworked.OHAIDER)
                        {
                            reply += "<tr><td><b>" + a.GetName() + "</b></td><td>" + a.GetDescription() + "</td></tr>";
                        }
                    }

                    reply += "</tbody></table>";
                    return(Json(reply, JsonRequestBehavior.AllowGet));
                }
                else
                {
                    List <object> reply = new List <object>();
                    foreach (AchievementsReworked a in Enum.GetValues(typeof(AchievementsReworked)))
                    {
                        if (!has.Contains(a) && a != AchievementsReworked.None && a != AchievementsReworked.OHAIDER)
                        {
                            reply.Add(new { name = a.GetName(), description = a.GetDescription() });
                        }
                    }
                    return(Json(reply, JsonRequestBehavior.AllowGet));
                }
            }
        }
Example #11
0
        public KilledByInlineCommand(InlineQuery q)
        {
            User u = q.From;

            Command = "killedby";
            try
            {
                using (var db = new WWContext())
                {
                    Content = "";
                    //find the player
                    Player p;
                    p = db.Players.FirstOrDefault(x => x.TelegramId == u.Id);
                    if (p == null)
                    {
                        //remove the command
                        Command = "";
                        return;
                    }
                    Description = $"Get the players who killed {p.Name} the most";

                    var killed = db.PlayerMostKilledBy(p.TelegramId).AsEnumerable().Take(5);
                    if (p.UserName != null)
                    {
                        Content += $"\nPlayers who killed <a href=\"https://telegram.me/{p.UserName}\">{p.Name.FormatHTML()}</a> most:\n";
                    }
                    else
                    {
                        Content += $"\nPlayers who killed {p.Name.FormatHTML()} most:\n";
                    }
                    foreach (var a in killed)
                    {
                        Content += $"{a.times?.Pad()} {a.Name.ToBold()}\n";
                    }
                }
            }
            catch (Exception e)
            {
                Content = "Unable to load kills: " + e.Message;
            }
        }
 public static void Start()
 {
     while (true)
     {
         try
         {
             using (var db = new WWContext())
             {
                 var status = db.BotStatus.ToList();
                 _bot1    = status.First(x => x.BotName == "Bot 1").BotStatus;
                 _bot2    = status.First(x => x.BotName == "Bot 2").BotStatus;
                 _betaBot = status.First(x => x.BotName == "Beta Bot").BotStatus;
             }
         }
         catch
         {
             // ignored
         }
         Thread.Sleep(500);
     }
 }
Example #13
0
        private static string GetRoleTop(string emoji)
        {
            var getDatRole = TransEmoji(emoji);

            if (getDatRole == null)
            {
                return("Invalid emoji.");
            }
            var reply = "Top " + GetLocaleString(getDatRole, "Spanish.xml").ToBold() + "\n";

            using (var db = new WWContext())
            {
                var list          = new List <KeyValuePair <int, double> >();
                var rankedPlayers = db.Players.Where(x => x.Score >= 1200);
                foreach (var p in rankedPlayers)
                {
                    var pair  = new KeyValuePair <int, double>(p.Id, 0);
                    var total = p.GamePlayers.Count(x => x.Role == getDatRole);
                    if (total > 5)
                    {
                        var won = p.GamePlayers.Count(x => x.Role == getDatRole && x.Won);
                        pair = new KeyValuePair <int, double>(p.Id, won * 100 / total);
                    }
                    list.Add(pair);
                }
                var orderedList = list.OrderByDescending(x => x.Value).Take(5);
                reply += "\n";
                var i = 1;
                foreach (var p in orderedList)
                {
                    if (p.Value > 0)
                    {
                        var pl = db.Players.FirstOrDefault(x => x.Id == p.Key);
                        reply += i + "º " + pl.Name + " " + p.Value + "%\n";
                        i++;
                    }
                }
            }
            return(reply);
        }
Example #14
0
        public static void RequestGif(CallbackQuery q)
        {
            Bot.Api.DeleteMessageAsync(q.From.Id, q.Message.MessageId);
            var choice = q.Data.Split('|')[1].Split(' ')[0];

            if (choice == "submit")
            {
                var menu = new Menu(2);
                menu.Buttons.Add(new InlineKeyboardCallbackButton("Review", "reviewgifs|" + q.From.Id));
                menu.Buttons.Add(new InlineKeyboardCallbackButton("Dismiss", "cancel|cancel|cancel"));
                menu.Buttons.Add(new InlineKeyboardCallbackButton("Approved: SFW", "approvesfw|" + q.From.Id));
                menu.Buttons.Add(new InlineKeyboardCallbackButton("Approved: NSFW", "approvensfw|" + q.From.Id));
                Bot.Send($"User {q.From.Id} - @{q.From.Username} - has submitted a gif pack for approval", Settings.AdminChatId, customMenu: menu.CreateMarkupFromMenu());
                Bot.Send("Your pack has been submitted for approval to the admin.  Please wait while we review.",
                         q.From.Id);
                return;
            }
            if (choice == "togglebadge")
            {
                using (var db = new WWContext())
                {
                    var p    = db.Players.FirstOrDefault(x => x.TelegramId == q.From.Id);
                    var json = p?.CustomGifSet;
                    var data = JsonConvert.DeserializeObject <CustomGifData>(json);
                    data.ShowBadge = !data.ShowBadge;
                    p.CustomGifSet = JsonConvert.SerializeObject(data);
                    db.SaveChanges();
                    Bot.Send($"You badge will {(data.ShowBadge ? "" : "not ")}be shown.", q.From.Id, customMenu: GetGifMenu(data));
                    return;
                }
            }
            Bot.Api.SendTextMessageAsync(q.From.Id,
                                         q.Data.Split('|')[1] + "\nOk, send me the GIF you want to use for this situation, as a reply\n" +
                                         "#" + choice,
                                         replyMarkup: new ForceReply()
            {
                Force = true
            });
        }
Example #15
0
        public static void Start(Update update, string[] args)
        {
            if (update.Message.Chat.Type == ChatType.Private)
            {
                if (update.Message.From != null)
                {
                    using (var db = new WWContext())
                    {
                        var p = GetDBPlayer(update.Message.From.Id, db);
                        if (p == null)
                        {
                            var u = update.Message.From;
                            p = new Player
                            {
                                UserName   = u.Username,
                                Name       = (u.FirstName + " " + u.LastName).Trim(),
                                TelegramId = u.Id,
                                Language   = "English"
                            };
                            db.Players.Add(p);
                            db.SaveChanges();
                            p = GetDBPlayer(update.Message.From.Id, db);
                        }
#if RELEASE
                        p.HasPM = true;
#elif RELEASE2
                        p.HasPM2 = true;
#elif BETA
                        p.HasDebugPM = true;
#endif
                        db.SaveChanges();
                        Bot.Send(
                            $"Hi there! I'm @{Bot.Me.Username}, and I moderate games of Werewolf.\nJoin the main group @werewolfgame, or to find a group to play in, you can use /grouplist.\nFor role information, use /rolelist.\nIf you want to set your default language, use /setlang.\nBe sure to stop by <a href=\"https://telegram.me/werewolfsupport\">Werewolf Support</a> for any questions, and subscribe to @werewolfdev for updates from the developer.\nMore infomation can be found <a href=\"www.tgwerewolf.com?referrer=start\">here</a>!",
                            update.Message.Chat.Id);
                        //Bot.Send(GetLocaleString("PMTrue", GetLanguage(update.Message.Chat.Id)), update.Message.Chat.Id);
                    }
                }
            }
        }
Example #16
0
 internal static List <v_GroupRanking> GetAll()
 {
     if (_lastGetAll < DateTime.UtcNow.AddMinutes(-20))
     {
         //only refresh the list cache once every 20 minutes
         using (var db = new WWContext())
         {
             var lastUpdate = db.v_GroupRanking.Max(x => x.LastRefresh);
             try
             {
                 _list = db.v_GroupRanking.GroupBy(x => new { x.TelegramId, x.Name, x.Language, x.Ranking, x.LastRefresh })
                         .SelectMany(x => x).ToList();
             }
             catch (Exception e)
             {
                 Console.WriteLine(e);
             }
         }
         _lastGetAll = DateTime.UtcNow;
     }
     return(_list);
 }
Example #17
0
 public ActionResult Player(int id, bool json = false)
 {
     if (json)
     {
         using (var DB = new WWContext())
         {
             var user = DB.Players.FirstOrDefault(x => x.TelegramId == id);
             return(Json(user));
         }
     }
     ViewBag.Id = id;
     using (var DB = new WWContext())
     {
         var user      = DB.Players.FirstOrDefault(x => x.TelegramId == id);
         var userName  = user?.Name ?? "Invalid User Id";
         var userImage = user?.ImageFile ?? "noimage.png";
         ViewBag.Description = $"Werewolf for Telegram. Stats for {userName}";
         ViewBag.Title       = userName;
         ViewBag.ImagePath   = "/Images/" + userImage;
     }
     return(View());
 }
Example #18
0
        public static void ForceStart(Update update, string[] args)
        {
            var id = update.Message.Chat.Id;

            using (var db = new WWContext())
            {
                var grp = db.Groups.FirstOrDefault(x => x.GroupId == id);
                if (grp == null)
                {
                    grp = MakeDefaultGroup(id, update.Message.Chat.Title, "forcestart");
                    db.Groups.Add(grp);
                    db.SaveChanges();
                }
                if (UpdateHelper.IsGroupAdmin(update))
                {
                    var game = GetGroupNodeAndGame(update.Message.Chat.Id);
                    if (game != null)
                    {
                        if (game.Users.Contains(update.Message.From.Id))
                        {
                            //send forcestart
                            game.ForceStart();
                        }
                        else
                        {
                            Send(GetLocaleString("NotInGame", grp.Language), id);
                        }
                    }
                    else
                    {
                        Send(GetLocaleString("NoGame", grp.Language), id);
                    }
                }
                else
                {
                    Send(GetLocaleString("GroupAdminOnly", grp?.Language ?? "English"), id);
                }
            }
        }
Example #19
0
        public static void Join(Update update, string[] args)
        {
            var id = update.Message.Chat.Id;

            using (var db = new WWContext())
            {
                if (update.Message.Chat.Type == ChatType.Private)
                {
                    //PM....  can't do that here
                    Send(GetLocaleString("JoinFromGroup", GetLanguage(update.Message.From.Id)), id);
                    return;
                }
                //check nodes to see if player is in a game

                var game = GetGroupNodeAndGame(update.Message.Chat.Id);
                if (game == null)
                {
                    Thread.Sleep(50);
                    game = GetGroupNodeAndGame(update.Message.Chat.Id);
                }
                if (game == null)
                {
                    Thread.Sleep(50);
                    game = GetGroupNodeAndGame(update.Message.Chat.Id);
                }
                game?.AddPlayer(update);
                if (game == null)
                {
                    var grp = db.Groups.FirstOrDefault(x => x.GroupId == id);
                    if (grp == null)
                    {
                        grp = MakeDefaultGroup(id, update.Message.Chat.Title, "join");
                        db.Groups.Add(grp);
                        db.SaveChanges();
                    }
                    Send(GetLocaleString("NoGame", grp?.Language ?? "English"), id);
                }
            }
        }
Example #20
0
 public JsonResult GlobalStats(bool json = false)
 {
     using (var DB = new WWContext())
     {
         var stat          = DB.GlobalStats.First();
         var night1dielink = $"<a href='/Stats/Player/{stat.MostKilledFirstNightId}'>{stat.MostKilledFirstNight}</a>";
         var day1lynchlink = $"<a href='/Stats/Player/{stat.MostLynchedFirstDayId}'>{stat.MostLynchedFirstDay}</a>";
         var day1dielink   = $"<a href='/Stats/Player/{stat.MostKilledFirstDayId}'>{stat.MostKilledFirstDay}</a>";
         var survivorlink  = $"<a href='/Stats/Player/{stat.BestSurvivorId}'>{stat.BestSurvivor}</a>";
         if (!json)
         {
             var statReply = "<table class=\"table table-hover\"><tbody>" +
                             $"<tr><td>Games played total</td><td><b>{stat.GamesPlayed}</b></td></tr>" +
                             $"<tr><td>Total player deaths</td><td><b>{stat.PlayersKilled}</b></td></tr>" +
                             $"<tr><td>Total player survivals</td><td><b>{stat.PlayersSurvived}</b></td></tr>" +
                             $"<tr><td>Total players in database</td><td><b>{stat.TotalPlayers}</b></td></tr>" +
                             $"<tr><td>Total groups in database</td><td><b>{stat.TotalGroups}</b></td></tr>" +
                             $"<tr><td>Most likely to die first night</td><td><b>{night1dielink}</td><td>{stat.MostKilledFirstPercent}%</b></td></tr>" +
                             $"<tr><td>Most likely to get lynched first day</td><td><b>{day1lynchlink}</td><td>{stat.MostLynchedFirstPercent}%</b></td></tr>" +
                             $"<tr><td>Most likely to die first 24 hours</td><td><b>{day1dielink}</td><td>{stat.MostKilledFirstDayPercent}%</b></td></tr>" +
                             $"<tr><td>Best survivor</td><td><b>{survivorlink}</td><td>{stat.BestSurvivorPercent}%</b></td></tr>" +
                             $"<tr><td>Last time global stats calculated</td><td><b>{stat.LastRun} (Central US)</b></td></tr>" +
                             "</tbody></table>";
             return(Json(statReply, JsonRequestBehavior.AllowGet));
         }
         else
         {
             var statReply = new { gamesPlayed          = stat.GamesPlayed, playersKilled = stat.PlayersKilled, playersSurvived = stat.PlayersSurvived,
                                   totalPlayers         = stat.TotalPlayers, totalGroups = stat.TotalGroups,
                                   mostKilledFirstNight = new { name = stat.MostKilledFirstNight, id = stat.MostKilledFirstNightId, link = night1dielink, percent = stat.MostKilledFirstPercent },
                                   mostLynchedFirstDay  = new { name = stat.MostLynchedFirstDay, id = stat.MostLynchedFirstDayId, link = day1lynchlink, percent = stat.MostLynchedFirstPercent },
                                   mostKilledFirstDay   = new { name = stat.MostKilledFirstDay, id = stat.MostKilledFirstDayId, link = day1dielink, percent = stat.MostKilledFirstDayPercent },
                                   bestSurvivor         = new { name = stat.BestSurvivor, id = stat.BestSurvivorId, link = survivorlink, percent = stat.BestSurvivorPercent },
                                   lastCalculated       = stat.LastRun.ToString() };
             return(Json(statReply, JsonRequestBehavior.AllowGet));
         }
     }
 }
Example #21
0
        public static void MyIdles(Update update, string[] args)
        {
            bool isgroup = new[] { ChatType.Group, ChatType.Supergroup }.Contains(update.Message.Chat.Type);

            var idles      = 0;
            var groupidles = 0;

            using (var db = new WWContext())
            {
                idles = db.GetIdleKills24Hours(update.Message.From.Id).FirstOrDefault() ?? 0;
                if (isgroup)
                {
                    groupidles = db.GetGroupIdleKills24Hours(update.Message.From.Id, update.Message.Chat.Id).FirstOrDefault() ?? 0;
                }
            }

            var str      = $"{update.Message.From.Id} ({update.Message.From.FirstName})";
            var language = GetLanguage(update.Message.Chat.Id);
            var reply    = GetLocaleString("IdleCount", language, str, idles);

            if (isgroup)
            {
                reply += " " + GetLocaleString("GroupIdleCount", language, groupidles);
            }

            try
            {
                var result = Bot.Api.SendTextMessageAsync(update.Message.From.Id, reply).Result;
                if (update.Message.Chat.Type != ChatType.Private)
                {
                    Send(GetLocaleString("SentPrivate", GetLanguage(update.Message.From.Id)), update.Message.Chat.Id);
                }
            }
            catch
            {
                RequestPM(update.Message.Chat.Id);
            }
        }
Example #22
0
        public static void StopWaiting(Update update, string[] args)
        {
            using (var db = new WWContext())
            {
                long groupid   = 0;
                var  groupname = "";

                if (update.Message.Chat.Id < 0) //it's a group
                {
                    groupid   = update.Message.Chat.Id;
                    groupname = update.Message.Chat.Title;
                }
                else if (args.Length >= 2 && !string.IsNullOrEmpty(args[1]))
                {
                    var grp = GetGroup(args[1], db);
                    groupid   = grp?.GroupId ?? 0;
                    groupname = grp?.Name ?? "";
                }

                if (groupid == 0)
                {
                    Send(GetLocaleString("GroupNotFound", GetLanguage(update.Message.From.Id)), update.Message.Chat.Id);
                    return;
                }

                var notifier =
                    db.NotifyGame.FirstOrDefault(x => x.GroupId == groupid && x.UserId == update.Message.From.Id);

                if (notifier != null)
                {
                    db.NotifyGame.Remove(notifier);
                    db.SaveChanges();
                }

                Send(GetLocaleString("DeletedFromWaitList", GetLanguage(update.Message.From.Id), groupname.ToBold()),
                     update.Message.From.Id);
            }
        }
Example #23
0
        public static Database.Group GetGroup(string str, WWContext db)
        {
            //try with id
            if (long.TryParse(str, out long id))
            {
                return(db.Groups.FirstOrDefault(x => x.GroupId == id));
            }
            //try with username
            if (str.StartsWith("@"))
            {
                return(db.Groups.FirstOrDefault(x => x.UserName == str.Substring(1)));
            }
            //hope str is a link, and compare the hash part
            var index = str.LastIndexOf("me/");

            if (index == -1)
            {
                return(null);
            }
            var hash = str.Substring(index); //dummy variable becase LINQ to Entity doesn't like it.

            return(db.Groups.FirstOrDefault(x => x.GroupLink.EndsWith(hash)));
        }
Example #24
0
 public JsonResult PlayerAchievements(int pid)
 {
     using (var DB = new WWContext())
     {
         var p = DB.Players.FirstOrDefault(x => x.TelegramId == pid);
         if (p == null)
         {
             return(Json("", JsonRequestBehavior.AllowGet));
         }
         if (p.Achievements == null)
         {
             p.Achievements = 0;
         }
         var ach   = (Achievements)p.Achievements;
         var reply = "<br/><table class=\"table table-hover\"><tbody>";
         foreach (var a in ach.GetUniqueFlags())
         {
             reply += "<tr><td><b>" + a.GetName() + "</b></td><td>" + a.GetDescription() + "</td></tr>";
         }
         reply += "</tbody></table>";
         return(Json(reply, JsonRequestBehavior.AllowGet));
     }
 }
Example #25
0
        public static void MyIdles(Update update, string[] args)
        {
            var idles = 0;

            using (var db = new WWContext())
            {
                idles = db.GetIdleKills24Hours(update.Message.From.Id).FirstOrDefault() ?? 0;
            }

            var str = $"{update.Message.From.Id} ({update.Message.From.FirstName})";
            var reply = GetLocaleString("IdleCount", GetLanguage(update.Message.Chat.Id), str, idles);

            try
            {
                var result = Bot.Api.SendTextMessageAsync(update.Message.From.Id, reply).Result;
                if (update.Message.Chat.Type != ChatType.Private)
                    Send(GetLocaleString("SentPrivate", GetLanguage(update.Message.From.Id)), update.Message.Chat.Id);
            }
            catch
            {
                RequestPM(update.Message.Chat.Id);
            }
        }
Example #26
0
        public static void Players(Update update, string[] args)
        {
            var id = update.Message.Chat.Id;

            var game = GetGroupNodeAndGame(id);

            if (game == null)
            {
                Send(GetLocaleString("NoGame", GetLanguage(id)), id);
            }
            else
            {
                if (game.State.Equals(Models.GameState.Joining))
                {
                    using (var db = new WWContext())
                    {
                        string msg;
                        if (game.Users.Count == 1)
                        {
                            msg = "Apenas 1 jogador deu /join até agora:\n";
                        }
                        else
                        {
                            msg = $"{game.Users.Count} jogadores deram /join:\n";
                        }

                        var user = db.Players.Where(p => game.Users.Contains(p.TelegramId)).AsEnumerable();
                        msg += user.Aggregate("", (current, p) => current + ($"{p.Name.ToBold()} (@{p.UserName})\n"));
                        Send(msg, id);
                    }
                }
                else
                {
                    game.ShowPlayers();
                }
            }
        }
Example #27
0
        public static void SetLink(Update update, string[] args)
        {
            //args[1] should be the link

            //first, check if the group has a username
            if (!string.IsNullOrEmpty(update.Message.Chat.Username))
            {
                Send($"Your group link has already been set to https://telegram.me/{update.Message.Chat.Username}",
                     update.Message.Chat.Id);
                return;
            }

            //now check the args
            if (args.Length < 2 || string.IsNullOrEmpty(args[1]))
            {
                Send($"You must use /setlink with the link to the group (invite link)", update.Message.Chat.Id);
                return;
            }

            var link = args[1].Trim();

            if (!Regex.IsMatch(link, @"^(https?:\/\/)?t(elegram)?\.me\/joinchat\/([a-zA-Z0-9_\-]+)$"))
            {
                Send("This is an invalid telegram join link.", update.Message.Chat.Id);
                return;
            }

            using (var db = new WWContext())
            {
                var grp = db.Groups.FirstOrDefault(x => x.GroupId == update.Message.Chat.Id) ??
                          MakeDefaultGroup(update.Message.Chat.Id, update.Message.Chat.Title, "setlink");
                grp.GroupLink = link;
                db.SaveChanges();
            }

            Send($"Link set: <a href=\"{link}\">{update.Message.Chat.Title}</a>", update.Message.Chat.Id);
        }
Example #28
0
        public StatsInlineCommand(User u)
        {
            Description = "Get personal stats";
            Command     = "stats";
            using (var db = new WWContext())
            {
                Content = "";
                //find the player
                var p = db.Players.FirstOrDefault(x => x.TelegramId == u.Id);
                if (p == null)
                {
                    //remove the command
                    Command = "";
                    return;
                }

                var gamesPlayed = p.GamePlayers.Count();
                var won         = p.GamePlayers.Count(x => x.Won);
                var lost        = gamesPlayed - won;
                var survived    = p.GamePlayers.Count(x => x.Survived);
                var roleInfo    = db.PlayerRoles(u.Id).ToList();
                var killed      = db.PlayerMostKilled(u.Id).FirstOrDefault();
                var killedby    = db.PlayerMostKilledBy(u.Id).FirstOrDefault();
                var ach         = (Achievements)(p.Achievements ?? 0);
                var count       = ach.GetUniqueFlags().Count();

                Content  = String.IsNullOrWhiteSpace(u.Username) ? $"{u.FirstName.FormatHTML()} the {roleInfo.OrderByDescending(x => x.times).FirstOrDefault()?.role ?? "Noob"}" : $"<a href=\"https://telegram.me/{u.Username}\">{u.FirstName.FormatHTML()} the {roleInfo.OrderByDescending(x => x.times).FirstOrDefault()?.role ?? "Noob"}</a>";
                Content += $"\n{count.Pad()}Achievements Unlocked!\n" +
                           $"{won.Pad()}Games won ({won*100/gamesPlayed}%)\n" +
                           $"{lost.Pad()}Games lost ({lost*100/gamesPlayed}%)\n" +
                           $"{survived.Pad()}Games survived ({survived*100/gamesPlayed}%)\n" +
                           $"{gamesPlayed.Pad()}Total Games\n" +
                           $"<code>{killed?.times}</code>\ttimes I've gleefully killed {killed?.Name.FormatHTML()}\n" +
                           $"<code>{killedby?.times}</code>\ttimes I've been slaughted by {killedby?.Name.FormatHTML()}";
            }
        }
Example #29
0
        private static void MonitorStatus()
        {
            var dead       = false;
            var lastChange = DateTime.Now;

            while (true)
            {
                using (var DB = new WWContext())
                {
                    var status = DB.BotStatus.First(x => x.Id == 1);
                    if (status.BotStatus != "Normal")
                    {
                        if (!dead)
                        {
                            dead       = true;
                            lastChange = DateTime.Now;
                            Console.WriteLine(lastChange + " - Detected issue.");
                        }
                        if ((DateTime.Now - lastChange) > TimeSpan.FromSeconds(3))
                        {
                            Console.WriteLine(DateTime.Now + " - Issue persisted, clearing.");
                            ClearQueue();
                            dead       = false;
                            lastChange = DateTime.Now;
                        }
                    }
                    else
                    {
                        dead       = false;
                        lastChange = DateTime.Now;
                    }
                }
                Console.WriteLine($"Dead: {dead} - {lastChange}");
                Thread.Sleep(1000);
            }
        }
Example #30
0
        public static void TeamWinChart(string input, Update u)
        {
            //first we need to get the start date / timespan, otherwise default.
            var start = new DateTime(2016, 5, 15);
            var mode  = "";

            if (!string.IsNullOrWhiteSpace(input))
            {
                var args = input.Split(' ');
                if (int.TryParse(args[0], out var amount) && args.Length >= 2)
                {
                    //get the interval
                    switch (args[1])
                    {
                    case "weeks":
                    case "week":
                        start = DateTime.UtcNow.AddDays(-(amount * 7));
                        break;

                    case "day":
                    case "days":
                        start = DateTime.UtcNow.AddDays(-amount);
                        break;

                    case "hour":
                    case "hours":
                        start = DateTime.UtcNow.AddHours(-amount);
                        break;

                    default:
                        Bot.Api.SendTextMessageAsync(u.Message.Chat.Id,
                                                     "Acceptable intervals are: hour(s), day(s), week(s)");
                        break;
                    }
                }

                switch (args.Length)
                {
                case 3:
                    mode = $"AND gm.MODE = '{args[2]}'";
                    break;

                case 1:
                    mode = $"AND gm.MODE = '{args[0]}'";
                    break;
                }
            }

            var query = $@"SELECT x.Players,
 Round((COUNT (x.GameId) * 100.0 / sum (count(x.GameId)) OVER (PARTITION BY Players)), 2) AS Wins,
sum(count(x.Gameid)) over (partition by players) as Games
 , X.Winner AS Team
 FROM
 (SELECT count (gp.PlayerId) AS Players, gp.GameId, CASE WHEN gm.Winner = 'Wolves' THEN 'Wolf' ELSE gm.Winner END AS Winner
 FROM Game AS gm
 INNER JOIN GamePlayer AS gp ON gp.GameId = gm.Id
 WHERE gm.Winner is not null AND gm.TimeStarted > '{start:yyyy-MM-dd HH:mm:ss}' {mode}
 GROUP BY gp.GameId, gm.Winner
 HAVING COUNT (gp.PlayerId)> = 5)
 AS x 
 GROUP BY x.Winner, x.Players
 ORDER BY x.Players, Wins DESC";

            List <TeamWinResult> result;

            using (var db = new WWContext())
            {
                result = db.Database.SqlQuery <TeamWinResult>(query).ToListAsync().Result;
            }

            //we have our results, now chart it...
            //build a datatable
            var dataSet = new DataSet();
            var dt      = new DataTable();

            dt.Columns.Add("Players", typeof(int));
            dt.Columns.Add("Wins", typeof(int));
            dt.Columns.Add("Games", typeof(int));
            dt.Columns.Add("Team", typeof(string));

            foreach (var r in result)
            {
                var row = dt.NewRow();
                row[0] = r.Players;
                row[1] = (int)r.Wins;
                row[2] = r.Games;
                row[3] = r.Team;
                dt.Rows.Add(row);
            }

            dataSet.Tables.Add(dt);

            //now build the chart
            var chart = new Chart
            {
                Width  = 1000,
                Height = 400
            };
            //chart.DataSource = dataSet.Tables[0];
            var legend = new Legend();

            //create serie...
            foreach (var team in new[] { "Wolf", "Village", "Tanner", "Cult", "SerialKiller", "Lovers" })
            {
                var serie1 = new Series
                {
                    LegendText = team,
                    Name       = team
                };
                //serie1.Label = team;
                switch (team)
                {
                case "Wolf":
                    serie1.Color = Color.SaddleBrown;
                    break;

                case "Village":
                    serie1.Color = Color.Green;
                    break;

                case "Tanner":
                    serie1.Color = Color.Red;
                    break;

                case "Cult":
                    serie1.Color = Color.Blue;
                    break;

                case "SerialKiller":
                    serie1.Color = Color.Black;
                    break;

                case "Lovers":
                    serie1.Color = Color.Pink;
                    break;
                }

                serie1.MarkerBorderWidth   = 2;
                serie1.BorderColor         = Color.FromArgb(164, 164, 164);
                serie1.ChartType           = SeriesChartType.StackedBar100;
                serie1.BorderDashStyle     = ChartDashStyle.Solid;
                serie1.BorderWidth         = 1;
                serie1.IsValueShownAsLabel = false;
                serie1.XValueMember        = "Players";
                serie1.YValueMembers       = "Wins";
                serie1.Font = new Font("Tahoma", 8.0f);
                serie1.BackSecondaryColor = Color.FromArgb(0, 102, 153);
                serie1.LabelForeColor     = Color.FromArgb(100, 100, 100);
                //add our values
                var pl = 4;
                foreach (var r in result.Where(x => x.Team == team).OrderBy(x => x.Players))
                {
                    pl++;
                    if (r.Players != pl)
                    {
                        while (pl < r.Players)
                        {
                            serie1.Points.AddXY(pl, 0);
                            pl++;
                        }
                    }

                    serie1.Points.AddXY(r.Players, r.Wins);
                }

                //make sure we filled all the points...
                var top = (int)(serie1.Points.OrderByDescending(x => x.XValue).FirstOrDefault()?.XValue ?? 4);

                if (top < 35)
                {
                    top++;
                    while (top <= 35)
                    {
                        serie1.Points.AddXY(top, 0);
                        top++;
                    }
                }

                //legend.CustomItems.Add(serie1.Color, team);
                chart.Series.Add(serie1);
            }

            //create chartareas...
            var ca = new ChartArea();

            ca.Name            = "ChartArea1";
            ca.BackColor       = Color.White;
            ca.BorderColor     = Color.FromArgb(26, 59, 105);
            ca.BorderWidth     = 0;
            ca.BorderDashStyle = ChartDashStyle.Solid;
            ca.AxisX           = new Axis();
            ca.AxisY           = new Axis();
            chart.ChartAreas.Add(ca);
            chart.Legends.Add(legend);
            //databind...
            //chart.DataBind();
            //save result


            var path = Path.Combine(Bot.RootDirectory, "myChart.png");

            chart.SaveImage(path, ChartImageFormat.Png);
            SendImage(path, u.Message.Chat.Id);
            UpdateHandler.Send(
                result.Select(x => new { x.Players, x.Games }).Distinct()
                .Aggregate("", (a, b) => $"{a}\n{b.Players}: {b.Games}"), u.Message.Chat.Id);
        }
Example #31
0
 internal static void gamelist(Update update, string[] args)
 {
     var reply = "";
     using (var db = new WWContext())
     {
         reply = Enumerable.Aggregate(db.v_PreferredGroups, "", (current, g) => current + $"{GetLanguageName(g.Language)}{(String.IsNullOrEmpty(g.Description) ? "" : $" - {g.Description}")}\n<a href=\"{g.GroupLink}\">{g.Name}</a>\n\n");
     }