Beispiel #1
0
        public HttpResponseMessage DownloadLevel(Int64?id, Int32?version = -1)
        {
            try
            {
                LevelDataDTO level = this.levelsDAL.GetLevel(id ?? -1, version ?? -1);

                return(HttpResponseFactory.Response200Plain(level.ToString()));
            }
            catch (PR2Exception ex)
            {
                return(HttpResponseFactory.Response200Plain(StatusKeys.ERROR, ex.Message));
            }
            catch (Exception ex)
            {
                return(HttpResponseFactory.Response500Plain(ex.Message));
            }
        }
        public void SaveLevel(Int64 userId, String username, LevelDataDTO levelData, String ipAddress)
        {
            // TODO - Validation of level data.
            // TODO - Consider the difference based approach when saving levels.

            if (levelData == null)
            {
                throw new PR2Exception(ErrorMessages.ERR_NO_LEVEL_DATA);
            }
            else if (String.IsNullOrEmpty(levelData.Title))
            {
                throw new PR2Exception(ErrorMessages.ERR_NO_LEVEL_TITLE);
            }
            else if (levelData.GameMode == GameMode.Unknown)
            {
                throw new PR2Exception(ErrorMessages.ERR_INVALID_GAME_MODE);
            }
            else if (!String.IsNullOrEmpty(levelData.Items) &&
                     !Regex.IsMatch(levelData.Items, ValidationConstraints.LEVEL_ITEMS_PATTERN))
            {
                throw new PR2Exception(ErrorMessages.ERR_INVALID_ITEMS);
            }

            using (MD5Wrapper md5 = new MD5Wrapper())
            {
                String hash = md5.GetHashedString(
                    String.Concat(levelData.Title, username?.ToLower() ?? String.Empty, levelData.Data, Pepper.LEVEL_SAVE));

                if (String.CompareOrdinal(hash, levelData.Hash) != 0)
                {
                    throw new PR2Exception(ErrorMessages.ERR_LEVEL_DATA_HASH_MISMATCH);
                }
            }

            DateTime     utcDateMinus1min = DateTime.UtcNow.AddMinutes(-1); // To prevent usage of SQL functions.
            LevelVersion lastSaved        = this.dbContext.LevelVersions
                                            .Where(v => v.Level != null && v.Level.AuthorId == userId && DateTime.Compare(v.SubmittedDate, utcDateMinus1min) > 0)
                                            .OrderByDescending(v => v.SubmittedDate).FirstOrDefault();

            if (lastSaved != null)
            {
                throw new PR2Exception(String.Format(
                                           ErrorMessages.ERR_WAIT_BEFORE_SAVING,
                                           Math.Round(TimeSpan.FromMinutes(1).Subtract(DateTime.UtcNow.Subtract(lastSaved.SubmittedDate.ToUniversalTime())).TotalSeconds)));
            }

            Level level = this.dbContext.Levels.FirstOrDefault(l => l.AuthorId == userId && l.Title == levelData.Title);

            if (level == null)
            {
                level = new Level
                {
                    AuthorId  = userId,
                    Title     = levelData.Title,
                    IsDeleted = false
                };

                this.dbContext.Levels.Add(level);
            }

            level.IsPublished = levelData.Live;

            this.dbContext.LevelVersions.Add(new LevelVersion
            {
                Level         = level,
                SubmittedDate = DateTime.UtcNow,
                SubmittedIP   = ipAddress,
                Note          = levelData.Note,
                GameMode      = levelData.GameMode,
                MinRank       = levelData.MinLevel,
                CowboyChance  = levelData.CowboyChance,
                Gravity       = levelData.Gravity,
                Song          = levelData.Song,
                MaxTime       = levelData.MaxTime,
                Items         = levelData.Items,
                Data          = levelData.Data,
                PassHash      = levelData.PassHash
            });

            this.dbContext.SaveChanges();
        }