예제 #1
0
 protected Storage(string baseName)
 {
     BaseName = FileSafety.FilenameStrip(baseName);
     BasePath = LocateBasePath();
     if (BasePath == null)
     {
         throw new NullReferenceException(nameof(BasePath));
     }
 }
예제 #2
0
 protected override void Complete(Exception e = null)
 {
     ResponseStream?.Close();
     if (e != null)
     {
         FileSafety.FileDelete(Filename);
     }
     base.Complete(e);
 }
예제 #3
0
        /// <summary>
        /// Create all required <see cref="FileInfo"/>s for the provided archive, adding them to the global file store.
        /// </summary>
        private List <TFileModel> createFileInfos(ArchiveReader reader, FileStore files)
        {
            var fileInfos = new List <TFileModel>();

            // import files to manager
            foreach (string file in reader.Filenames)
            {
                using (Stream s = reader.GetStream(file))
                    fileInfos.Add(new TFileModel
                    {
                        Filename = FileSafety.PathStandardise(file),
                        FileInfo = files.Add(s)
                    });
            }

            return(fileInfos);
        }
        private void handleEvent(string line)
        {
            string[] split = line.Split(',');

            EventType type;

            if (!Enum.TryParse(split[0], out type))
            {
                throw new InvalidDataException($@"Unknown event type: {split[0]}");
            }

            switch (type)
            {
            case EventType.Background:
                string bgFilename = split[2].Trim('"');
                beatmap.BeatmapInfo.Metadata.BackgroundFile = FileSafety.PathStandardise(bgFilename);
                break;

            case EventType.Video:
                string videoFilename = split[2].Trim('"');
                beatmap.BeatmapInfo.Metadata.VideoFile = FileSafety.PathStandardise(videoFilename);
                break;

            case EventType.Break:
                double start = getOffsetTime(Parsing.ParseDouble(split[1]));

                var breakEvent = new BreakPeriod
                {
                    StartTime = start,
                    EndTime   = Math.Max(start, getOffsetTime(Parsing.ParseDouble(split[2])))
                };

                if (!breakEvent.HasEffect)
                {
                    return;
                }

                beatmap.Breaks.Add(breakEvent);
                break;
            }
        }
예제 #5
0
        /// <summary>
        /// Deletes log file from disk.
        /// </summary>
        /// <param name="lastLogSuffix">If specified, creates a copy of the last log file with specified suffix.</param>
        public void Clear(string lastLogSuffix = null)
        {
            if (Filename == null)
            {
                return;
            }

            backgroundScheduler.Add(delegate
            {
                if (!string.IsNullOrEmpty(lastLogSuffix))
                {
                    FileSafety.FileMove(Filename, Filename.Replace(@".log", $@"_{lastLogSuffix}.log"));
                }
                else
                {
                    FileSafety.FileDelete(Filename);
                }
            });

            addHeader();
        }
예제 #6
0
        protected GameHost(string gameName = @"")
        {
            toolkit = Toolkit.Init();

            AppDomain.CurrentDomain.UnhandledException += exceptionHandler;

            Trace.Listeners.Clear();
            Trace.Listeners.Add(new ThrowingTraceListener());

            FileSafety.DeleteCleanupDirectory();

            Dependencies.CacheAs(this);
            Dependencies.CacheAs(Storage = GetStorage(gameName));

            Name = gameName;
            Logger.GameIdentifier = gameName;

            threads = new List <GameThread>
            {
                (DrawThread = new DrawThread(DrawFrame)
                {
                    OnThreadStart = DrawInitialize,
                }),
                (UpdateThread = new UpdateThread(UpdateFrame)
                {
                    OnThreadStart = UpdateInitialize,
                    Monitor = { HandleGC = true },
                }),
                (InputThread = new InputThread(null)), //never gets started.
            };

            var path = Path.GetDirectoryName(FullPath);

            if (path != null)
            {
                Environment.CurrentDirectory = path;
            }
        }
예제 #7
0
 protected BasicStorage(string baseName)
 {
     BaseName = FileSafety.FilenameStrip(baseName);
 }
예제 #8
0
 private static string cleanFilename(string path)
 => FileSafety.PathStandardise(path.Trim('\"'));
예제 #9
0
 public override void Delete(string path) => FileSafety.FileDelete(GetFullPath(path));
예제 #10
0
 public override void Delete(string path) => FileSafety.FileDelete(GetUsablePathFor(path));
예제 #11
0
 private string cleanFilename(string path) => FileSafety.PathSanitise(path.Trim('\"'));
예제 #12
0
        private void handleGeneral(string line)
        {
            var pair = SplitKeyVal(line);

            var metadata = beatmap.BeatmapInfo.Metadata;

            switch (pair.Key)
            {
            case @"AudioFilename":
                metadata.AudioFile = FileSafety.PathStandardise(pair.Value);
                break;

            case @"AudioLeadIn":
                beatmap.BeatmapInfo.AudioLeadIn = Parsing.ParseInt(pair.Value);
                break;

            case @"PreviewTime":
                metadata.PreviewTime = getOffsetTime(Parsing.ParseInt(pair.Value));
                break;

            case @"Countdown":
                beatmap.BeatmapInfo.Countdown = Parsing.ParseInt(pair.Value) == 1;
                break;

            case @"SampleSet":
                defaultSampleBank = (LegacySampleBank)Enum.Parse(typeof(LegacySampleBank), pair.Value);
                break;

            case @"SampleVolume":
                defaultSampleVolume = Parsing.ParseInt(pair.Value);
                break;

            case @"StackLeniency":
                beatmap.BeatmapInfo.StackLeniency = Parsing.ParseFloat(pair.Value);
                break;

            case @"Mode":
                beatmap.BeatmapInfo.RulesetID = Parsing.ParseInt(pair.Value);

                switch (beatmap.BeatmapInfo.RulesetID)
                {
                case 0:
                    parser = new Rulesets.Objects.Legacy.Osu.ConvertHitObjectParser(getOffsetTime(), FormatVersion);
                    break;

                case 1:
                    parser = new Rulesets.Objects.Legacy.Taiko.ConvertHitObjectParser(getOffsetTime(), FormatVersion);
                    break;

                case 2:
                    parser = new Rulesets.Objects.Legacy.Catch.ConvertHitObjectParser(getOffsetTime(), FormatVersion);
                    break;

                case 3:
                    parser = new Rulesets.Objects.Legacy.Mania.ConvertHitObjectParser(getOffsetTime(), FormatVersion);
                    break;
                }

                break;

            case @"LetterboxInBreaks":
                beatmap.BeatmapInfo.LetterboxInBreaks = Parsing.ParseInt(pair.Value) == 1;
                break;

            case @"SpecialStyle":
                beatmap.BeatmapInfo.SpecialStyle = Parsing.ParseInt(pair.Value) == 1;
                break;

            case @"WidescreenStoryboard":
                beatmap.BeatmapInfo.WidescreenStoryboard = Parsing.ParseInt(pair.Value) == 1;
                break;
            }
        }
예제 #13
0
        public void BeginUpdaterSync()
        {
            while (true)
            {
                var beatmapSets = _factory.Get().BeatmapSet.Where(x => !x.Disabled)
                                  .Where(
                    x => x.LastChecked != null && ((
                                                       (
                                                           x.RankedStatus == BeatmapSetOnlineStatus.None ||
                                                           x.RankedStatus == BeatmapSetOnlineStatus.Graveyard ||
                                                           x.RankedStatus == BeatmapSetOnlineStatus.Pending ||
                                                           x.RankedStatus == BeatmapSetOnlineStatus.Ranked ||
                                                           x.RankedStatus == BeatmapSetOnlineStatus.Loved
                                                       ) &&
                                                       (x.LastChecked.Value + TimeSpan.FromDays(30))
                                                       .Subtract(DateTime.Now).TotalMilliseconds < 0
                                                       ) ||
                                                   (
                                                       (
                                                           x.RankedStatus == BeatmapSetOnlineStatus.Qualified ||
                                                           x.RankedStatus == BeatmapSetOnlineStatus.WIP
                                                       ) &&
                                                       (x.LastChecked.Value + TimeSpan.FromDays(1))
                                                       .Subtract(DateTime.Now).TotalMilliseconds < 0
                                                   ) ||
                                                   (
                                                       (
                                                           x.RankedStatus == BeatmapSetOnlineStatus.Approved
                                                       ) &&
                                                       (x.LastChecked.Value + TimeSpan.FromDays(90))
                                                       .Subtract(DateTime.Now).TotalMilliseconds < 0
                                                   ))
                    );

                foreach (var bmSet in beatmapSets.ToList())
                {
                    bmSet.ChildrenBeatmaps = _factory.Get().Beatmaps.Where(x => x.ParentSetId == bmSet.SetId).ToList();
                    var setRequest = new GetBeatmapSetRequest(bmSet.SetId);
                    _rl.Limit();
                    setRequest.Perform(_apiAccess);

                    Logger.LogPrint("Updating BeatmapSetId " + bmSet.SetId);

                    var setInfo = setRequest.Result.ToBeatmapSet(_store);
                    var newBm   = BeatmapSet.FromBeatmapSetInfo(setInfo);

                    using var db = _factory.GetForWrite();

                    var hasChanged = false;
                    foreach (var cb in newBm.ChildrenBeatmaps)
                    {
                        var fInfo = _bmDl.Download(cb);
                        var ha    = _cFactory.Get().CacheBeatmaps.Where(b => b.Hash == fInfo.Hash).Select(f => f.FileMd5).FirstOrDefault();
                        cb.FileMd5 = ha;

                        db.Context.Entry(cb).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
                        db.Context.Beatmaps.Update(cb);

                        if (bmSet.ChildrenBeatmaps.Any(x => x.FileMd5 == ha))
                        {
                            continue;
                        }



                        hasChanged = true;
                    }

                    if (newBm.ChildrenBeatmaps.Count > bmSet.ChildrenBeatmaps.Count)
                    {
                        hasChanged = true;
                    }

                    var bmFileId      = newBm.SetId.ToString("x8");
                    var bmFileIdNoVid = newBm.SetId.ToString("x8") + "_novid";

                    if (hasChanged)
                    {
                        _storage.GetStorageForDirectory("cache").Delete(bmFileId);
                        _storage.GetStorageForDirectory("cache").Delete(bmFileIdNoVid);

                        _search.DeleteBeatmap(newBm.SetId);
                        _search.IndexBeatmap(newBm);
                    }

                    db.Context.Entry(newBm).State = Microsoft.EntityFrameworkCore.EntityState.Modified;
                    db.Context.BeatmapSet.Update(newBm);

                    FileSafety.DeleteCleanupDirectory();
                }
            }
        }