Пример #1
0
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            AuthConfig.RegisterAuth();

            Database.SetInitializer<UnityContext>(new InitUnityDb());

            //initialize now
            //это позволяет отлавливать ошибки с БД сразу же, а не потом.
            var context = new UnityContext(false);

            // опасный трай. если вдруг на сервере сработает -- вся база умрет.
            // наверное.
            // но без этого локальная не работает.
            // файл с бд отсутствует, а база данных почему-то есть.
            // ниже строчка с дропом должна быть всегда закомментирована в гите на всякий случай.
            // при необходимости запустить локально -- у себя локально раскомментировать.
            // это лучшее решение, которое я придумал
            try
            {
                context.UnityStatus.ToArray();
            }
            catch (DataException)
            {
                //context.Database.Delete();
                context = new UnityContext(false);
                context.UnityStatus.ToArray();
            }
        }
Пример #2
0
 public ActionResult Delete(int gameId)
 {
     var context = new UnityContext();
     var game = context.GameResults.FirstOrDefault(r => r.Id == gameId);
     if (game == null)
     {
         ViewBag.Message = "игра не найдена";
         return RedirectToAction("DeleteGame");
     }
     context.GameResults.Remove(game);
     context.SaveChanges();
     ViewBag.Message = "Игра удалена";
     return RedirectToAction("DeleteGame");
 }
Пример #3
0
 public ActionResult CleanUp(FormCollection collection)
 {
     if (collection["UserName"] != User.Identity.Name)
     {
         ViewBag.Message = "Неверно введено ваше имя пользователя";
         return View();
     }
     var context = new UnityContext();
     foreach (var value in context.GameResults)
         context.GameResults.Remove(value);
     context.SaveChanges();
     ViewBag.Message = "Все результаты игр удалены.";
     return View();
 }
Пример #4
0
        public ActionResult PushResult(GameResultInfo result)
        {
            if (result.PushPassword != WebConstants.WebPassword)
                return new ContentResult { Content = "Password fail" };
            var context = new UnityContext();
            var users = context.UserProfiles.ToArray();
            var tags = users.Select(u => u.CvarcTag).ToArray();
            if (result.Players.Length == 2)
            {
                if (!tags.Contains(result.Players[0].CvarcTag) || !tags.Contains(result.Players[1].CvarcTag))
                    return new ContentResult {Content = "tag fail"};

                context.GameResults.Add(new GameResults
                {
                    Time = WebConstants.GetCurrentTime(),
                    LeftPlayerUserName = users.First(u => u.CvarcTag == result.Players[0].CvarcTag).UserName,
                    RightPlayerUserName = users.First(u => u.CvarcTag == result.Players[1].CvarcTag).UserName,
                    LeftPlayerScores = result.Players[0].Score,
                    RightPlayerScores = result.Players[1].Score,
                    LogFileName = result.LogFileName,
                    Type = result.Tag,
                    Subtype = result.Subtag
                });
                context.SaveChanges();
                return new ContentResult {Content = "successful"};
            }

            var player = result.Players[0];

            if (!tags.Contains(player.CvarcTag))
                return new ContentResult { Content = "tag fail" };

            context.GameResults.Add(new GameResults
            {
                Time = WebConstants.GetCurrentTime(),
                LeftPlayerUserName = users.First(u => u.CvarcTag == player.CvarcTag).UserName,
                LeftPlayerScores = player.Score,
                LogFileName = result.LogFileName,
                Type = result.Tag,
                Subtype = result.Subtag
            });
            context.SaveChanges();
            return new ContentResult { Content = "successful" };
        }
Пример #5
0
 public ActionResult UnityStatus()
 {
     var context = new UnityContext();
     var hourAgo = WebConstants.GetCurrentTime() - TimeSpan.FromHours(1);
     var lastHoursGames = context.GameResults.Where(r => r.Time > hourAgo);
     var gamesCount = lastHoursGames.Count();
     var uniquePlayersCount =
         lastHoursGames.Select(r => r.LeftPlayerUserName)
         .Union(lastHoursGames.Select(r => r.RightPlayerUserName))
         .Count();
     var status = context.UnityStatus.First();
     var model = new UnityStatistics
     {
         IsOnline = status.Online,
         GamePlayed = gamesCount,
         UniquePlayers = uniquePlayersCount,
         UpTime = status.Online ? status.UpTime : null
     };
     return PartialView("_UnityStatusPartial", model);
 }
Пример #6
0
 public ActionResult RegisterUser(RegisterModel model)
 {
     if (WebSecurity.UserExists(model.UserName))
     {
         ViewBag.Message =
             "Такой пользователь уже есть!";
         return View(model);
     }
     if (!RegisterModel.IsCorrectUserName(model.UserName))
     {
         ViewBag.Message =
             "В имени пользователя допустимы только рус/англ буквы, точка, пробел, земля и дефис.";
         return View(model);
     }
     WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
     var context = new UnityContext();
     context.UserProfiles.First(z => z.UserName == model.UserName).CvarcTag = Guid.NewGuid().ToString();
     context.SaveChanges();
     ViewBag.Message = "Аккаунт создан успешно";
     return View();
 }
Пример #7
0
        public ActionResult ForgotPassword(string email)
        {
            var user = new UnityContext().UserProfiles.FirstOrDefault(u => u.Email == email);
            if (user == null)
            {
                ViewBag.Message = "Пользователя с таким email не существует.";
                return View();
            }
            var token = WebSecurity.GeneratePasswordResetToken(user.UserName);

            string body = "Hello! \nYour username: "******"\nYour token: " + token;
            ViewBag.Message = TrySendEmail(email, "Password recovery", body)
                ? "Письмо отправлено."
                : "Произошла ошибка отправки письма. Обратитесь к администратору :(";
            return View();
        }
Пример #8
0
 public ActionResult UploadSolution(SimpleFileView simpleFileView)
 {
     if (!Directory.Exists(WebConstants.BasePath + WebConstants.RelativeSolutionsPath))
         Directory.CreateDirectory(WebConstants.BasePath + WebConstants.RelativeSolutionsPath);
     if (simpleFileView.UploadedFile == null)
     {
         ViewBag.Message = "Ошибка: Выберете файл для загрузки!";
         return View(simpleFileView);
     }
     if (simpleFileView.UploadedFile.ContentLength > 7 * 512 * 1024) // 3.5 MB
     {
         ViewBag.Message = "Ошибка: Файл слишком большой! Максимальный размер 3.5 МБ. Попробуйте удалить все бинарные файлы из архива.";
         return View(simpleFileView);
     }
     var path = WebConstants.BasePath + WebConstants.RelativeSolutionsPath;
     var extention = simpleFileView.UploadedFile.FileName.Split('.').Last();
     if (extention != "zip")
     {
         ViewBag.Message = "Ошибка: вы должны предоставить архив с решением в формате *.zip";
         return View(simpleFileView);
     }
     var expectedFileName = User.Identity.Name + "." + extention;
     simpleFileView.UploadedFile.SaveAs(path + expectedFileName);
     var context = new UnityContext();
     context.UserProfiles.First(u => u.UserName == User.Identity.Name).SolutionLoaded = WebConstants.GetCurrentTime();
     context.SaveChanges();
     ViewBag.Message = "Решение было загружено успешно!";
     return View(simpleFileView);
 }
Пример #9
0
 public ActionResult TournamentResult()
 {
     var collection = new UnityContext().GameResults.Where(r => r.Type == "tournament");
     return View(new TournamentResults(collection.ToList(), WebConstants.CountOfPlayoffPlayers));
 }
Пример #10
0
 private string GetLink(string username)
 {
     var user = new UnityContext().UserProfiles.FirstOrDefault(u => u.UserName == username);
     return user == null ? null : user.SocialLink;
 }
Пример #11
0
        public ActionResult SetAdditionalInfo(string email, string socialLink)
        {
            /*Смысл примерно такой: если пользователь указал что-то -- меняем всегда.
            Если не указал -- проверяем на то, что он уже не пустой.
            Если он уже пустой -- принудительно просим ввести еще раз.
            Если нет -- все норм*/
            var context = new UnityContext();
            var user = context.UserProfiles.First(u => u.UserName == User.Identity.Name);
            bool changed = false;

            if (!string.IsNullOrEmpty(email))
            {
                user.Email = email;
                changed = true;
            }
            else if (string.IsNullOrEmpty(user.Email))
            {
                ViewBag.Message = "Вам нужно указать email";
                return View(user);
            }

            if (changed)
                context.SaveChanges();

            if (!string.IsNullOrEmpty(socialLink))
            {
                if (!socialLink.StartsWith("http"))
                    socialLink = "http://" + socialLink;
                user.SocialLink = socialLink;
                changed = true;
            }
            else if (string.IsNullOrEmpty(user.SocialLink))
            {
                ViewBag.Message = "Вам нужно указать ссылку на соц сеть";
                return View(user);
            }

            if (changed)
                context.SaveChanges();
            return RedirectToAction("Manage");
        }
Пример #12
0
 public ActionResult SetAdditionalInfo()
 {
     var user = new UnityContext().UserProfiles.First(u => u.UserName == User.Identity.Name);
     return View(user);
 }
Пример #13
0
        public ActionResult Register(RegisterModel model)
        {
            if (!WebConstants.IsRegistrationAvailable)
                return View();
            if (!ModelState.IsValid) return View(model);

            // Attempt to register the user
            try
            {
                if (!RegisterModel.IsCorrectUserName(model.UserName))
                {
                    ViewBag.Message =
                        "В имени пользователя допустимы только рус/англ буквы, точка, пробел, земля и дефис.";
                    return View(model);
                }
                WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new {Email = model.Email});
                var context = new UnityContext();
                context.UserProfiles.First(z => z.UserName == model.UserName).CvarcTag = Guid.NewGuid().ToString();
                context.SaveChanges();
                WebSecurity.Login(model.UserName, model.Password);
                return RedirectToAction("Index", "Home");
            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }
Пример #14
0
 public ActionResult RecreateCvarcTag()
 {
     if (!WebConstants.IsRecreateTagAvailable)
         return RedirectToAction("Manage", new {Message = ManageMessageId.RecreateCvarcTagFail});
     var context = new UnityContext();
     context.UserProfiles.First(u => u.UserName == User.Identity.Name).CvarcTag = Guid.NewGuid().ToString();
     context.SaveChanges();
     return RedirectToAction("Manage", new {Message = ManageMessageId.RecreateCvarcTagSuccess});
 }
Пример #15
0
        //
        // GET: /Account/Manage
        public ActionResult Manage(ManageMessageId? message)
        {
            var context = new UnityContext();
            var user = context.UserProfiles.FirstOrDefault(z => z.UserName == User.Identity.Name);
            if (!User.IsInRole("Admin") && !User.IsInRole("SuperAdmin") &&
                (string.IsNullOrEmpty(user.Email) ||
                 string.IsNullOrEmpty(user.SocialLink)))
            {
                ViewBag.Message = "Нам необходима следующая информация о вас:";
                return RedirectToAction("SetAdditionalInfo");
            }

            ViewBag.CvarcTag = (user == null || string.IsNullOrEmpty(user.CvarcTag))
                ? "У вас нет кварк тега и вы не можете играть. Возможно, что-то пошло не так."
                : user.CvarcTag;
            ViewBag.Email = user.Email;
            ViewBag.SocialLink = user.SocialLink;
            ViewBag.PlayedGames = context.GameResults
                .Where(r => r.LeftPlayerUserName == User.Identity.Name || r.RightPlayerUserName == User.Identity.Name)
                .ToArray();
            ViewBag.SolutionLoadedTime = user.SolutionLoaded == null ? "неизвестно" : user.SolutionLoaded.ToString();
            var baseFileName = WebConstants.BasePath + WebConstants.RelativeSolutionsPath + User.Identity.Name;
            ViewBag.SolutionExists = System.IO.File.Exists(baseFileName + ".zip") ||
                                     System.IO.File.Exists(baseFileName + ".rar");
            ViewBag.StatusMessage =
                message == ManageMessageId.ChangePasswordSuccess ? "Ваш пароль изменен."
                : message == ManageMessageId.SetPasswordSuccess ? "Ваш пароль установлен."
                : message == ManageMessageId.RemoveLoginSuccess ? "Дополнительный способ входа удален."
                : message == ManageMessageId.RecreateCvarcTagSuccess ? "Вам присвоен новый CvarcTag. Старый больше не активен."
                : message == ManageMessageId.RecreateCvarcTagFail ? "Вы не можете сейчас пересоздать свой CvarcTag. Вероятно, потому что турнир уже начался"
                : "";
            ViewBag.HasLocalPassword = OAuthWebSecurity.HasLocalAccount(WebSecurity.GetUserId(User.Identity.Name));
            ViewBag.ReturnUrl = Url.Action("Manage");
            return View();
        }
Пример #16
0
        public ActionResult DeleteGamesByFilter(FormCollection collection)
        {
            var gameContext = new UnityContext();
            var contextChanged = false;
            double minutesToDelete;
            if (double.TryParse(collection["Time"], out minutesToDelete))
            {
                var timeToDeleteFrom = WebConstants.GetCurrentTime() - TimeSpan.FromMinutes(minutesToDelete);
                var gamesToDeleteByTime = gameContext.GameResults.Where(r => r.Time > timeToDeleteFrom).ToArray();
                contextChanged = gamesToDeleteByTime.Length > 0;
                foreach (var game in gamesToDeleteByTime)
                    gameContext.GameResults.Remove(game);
            }

            string tag = collection["Tag"];
            string subtag = collection["Subtag"];
            var gamesToDelete = string.IsNullOrEmpty(subtag)
                ? gameContext.GameResults.Where(r => r.Type == tag).ToArray()
                : gameContext.GameResults.Where(r => r.Type == tag && r.Subtype == subtag).ToArray();
            contextChanged = contextChanged || gamesToDelete.Length > 0;
            foreach (var game in gamesToDelete)
                gameContext.GameResults.Remove(game);
            if (contextChanged)
                gameContext.SaveChanges();
            return View();
        }
Пример #17
0
 public ActionResult SoloResult()
 {
     var collection = new UnityContext().GameResults.Where(r => r.RightPlayerUserName == null).OrderByDescending(r => r.Time).ToArray();
     return View(collection);
 }
Пример #18
0
        public static string GetLinkForUser(string username)
        {
            var user = new UnityContext().UserProfiles.FirstOrDefault(u => u.UserName == username);

            return(user == null ? null : user.SocialLink);
        }
Пример #19
0
 public ActionResult UploadSolution()
 {
     var baseFileName = WebConstants.BasePath + WebConstants.RelativeSolutionsPath + User.Identity.Name;
     var solutionExists = System.IO.File.Exists(baseFileName + ".zip");
     if (solutionExists)
     {
         var time = new UnityContext().UserProfiles.First(u => u.UserName == User.Identity.Name).SolutionLoaded;
         string valueToDisplay = time == null ? "неизвестно" : time.ToString();
         ViewBag.Message = "Ваше решение уже загружено. Время загрузки " +
                           valueToDisplay +
                           ". Вы можете его перезаписать. В этом случае, старое решение будет недоступно.";
     }
     return View(new SimpleFileView());
 }
Пример #20
0
 public ActionResult GetAllUsers()
 {
     var context = new UnityContext();
     var users = context.UserProfiles.ToArray();
     return View(users);
 }
Пример #21
0
 public ActionResult GroupResults()
 {
     var collection = new UnityContext().GameResults.Where(r => r.Type == "group");
     return View(new GroupResults(collection.ToList()));
 }
Пример #22
0
 public ActionResult RegisterManyUsers(string users)
 {
     var splited = users.Split(new[] {'\n', '\r'}, StringSplitOptions.RemoveEmptyEntries)
         .Where(l => !string.IsNullOrEmpty(l)).Select(line => line.Split(';')).ToArray();
     var uncorrect = splited.Where(s =>
     s.Length < 2 ||
     !RegisterModel.IsCorrectUserName(s[0]) ||
     s[1].Length < 6 ||
     WebSecurity.UserExists(s[0]))
     .ToArray();
     if (uncorrect.Any())
     {
         ViewBag.Message = "Что-то не так(пароль меньше 6 или не указан, в имени некорректные символы, пользователь уже сущ-вует) для пользователей: ";
         foreach (var value in uncorrect)
             ViewBag.Message += string.Join(";", value);
         return View();
     }
     ViewBag.Message = "";
     foreach (var value in splited)
         ViewBag.Message += WebSecurity.CreateUserAndAccount(value[0], value[1]);
     var userNames = splited.Select(s => s[0]);
     var context = new UnityContext();
     foreach (var value in splited)
     {
         var name = value[0];
         var user = context.UserProfiles.First(u => u.UserName == name);
         user.CvarcTag = Guid.NewGuid().ToString();
         if (value.Length > 2)
             user.Email = value[2];
         if (value.Length > 3)
             user.SocialLink = value[3];
     }
     context.SaveChanges();
     ViewBag.Message = "Пользователи успешно зарегистрированы";
     return View();
 }
Пример #23
0
 public ActionResult SayStatus(string password, bool isOnline)
 {
     if (password != WebConstants.WebPassword)
         return new ContentResult {Content = "password fail"};
     var context = new UnityContext();
     var status = context.UnityStatus.First();
     if (status.Online == isOnline)
         return new ContentResult {Content = "already know!"};
     status.Online = isOnline;
     if (isOnline)
         status.UpTime = WebConstants.GetCurrentTime();
     context.SaveChanges();
     return new ContentResult {Content = "successful"};
 }
Пример #24
0
        public ActionResult ExternalLoginConfirmation(RegisterExternalLoginModel model, string returnUrl)
        {
            string provider = null;
            string providerUserId = null;

            if (User.Identity.IsAuthenticated || !OAuthWebSecurity.TryDeserializeProviderUserId(model.ExternalLoginData, out provider, out providerUserId))
            {
                return RedirectToAction("Manage");
            }

            if (ModelState.IsValid)
            {
                // Insert a new user into the database
                using (UnityContext db = new UnityContext())
                {
                    UserProfile user = db.UserProfiles.FirstOrDefault(u => u.UserName.ToLower() == model.UserName.ToLower());
                    // Check if user already exists
                    if (user == null)
                    {
                        // Insert name into the profile table
                        db.UserProfiles.Add(new UserProfile { UserName = model.UserName });
                        db.SaveChanges();

                        OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, model.UserName);
                        OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);

                        return RedirectToLocal(returnUrl);
                    }
                    else
                    {
                        ModelState.AddModelError("UserName", "Такой пользователь уже существует. Выберете другое имя.");
                    }
                }
            }

            ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(provider).DisplayName;
            ViewBag.ReturnUrl = returnUrl;
            return View(model);
        }