diff --git a/osu.Desktop/OsuGameDesktop.cs b/osu.Desktop/OsuGameDesktop.cs
index c563201f0a..45ed66bad2 100644
--- a/osu.Desktop/OsuGameDesktop.cs
+++ b/osu.Desktop/OsuGameDesktop.cs
@@ -115,21 +115,7 @@ namespace osu.Desktop
if (filePaths.Any(f => Path.GetExtension(f) != firstExtension)) return;
- switch (firstExtension)
- {
- case ".osz":
- Task.Factory.StartNew(() => BeatmapManager.Import(filePaths), TaskCreationOptions.LongRunning);
- return;
- case ".osr":
- Task.Run(() =>
- {
- var score = ScoreStore.ReadReplayFile(filePaths.First());
- Schedule(() => LoadScore(score));
- });
- return;
- }
+ Task.Factory.StartNew(() => Import(filePaths), TaskCreationOptions.LongRunning);
}
-
- private static readonly string[] allowed_extensions = { @".osz", @".osr" };
}
}
diff --git a/osu.Game/Database/ArchiveModelManager.cs b/osu.Game/Database/ArchiveModelManager.cs
index 31eab79127..1b37e7e76c 100644
--- a/osu.Game/Database/ArchiveModelManager.cs
+++ b/osu.Game/Database/ArchiveModelManager.cs
@@ -20,7 +20,7 @@ namespace osu.Game.Database
///
/// The model type.
/// The associated file join type.
- public abstract class ArchiveModelManager : ICanImportArchives
+ public abstract class ArchiveModelManager : ICanAcceptFiles
where TModel : class, IHasFiles, IHasPrimaryKey, ISoftDelete
where TFileModel : INamedFileInfo, new()
{
diff --git a/osu.Game/Database/ICanImportArchives.cs b/osu.Game/Database/ICanAcceptFiles.cs
similarity index 73%
rename from osu.Game/Database/ICanImportArchives.cs
rename to osu.Game/Database/ICanAcceptFiles.cs
index 0f863f3044..d09000525d 100644
--- a/osu.Game/Database/ICanImportArchives.cs
+++ b/osu.Game/Database/ICanAcceptFiles.cs
@@ -1,6 +1,6 @@
namespace osu.Game.Database
{
- public interface ICanImportArchives
+ public interface ICanAcceptFiles
{
void Import(params string[] paths);
diff --git a/osu.Game/IPC/ArchiveImportIPCChannel.cs b/osu.Game/IPC/ArchiveImportIPCChannel.cs
index 6e9787ca5a..9d7bf17c77 100644
--- a/osu.Game/IPC/ArchiveImportIPCChannel.cs
+++ b/osu.Game/IPC/ArchiveImportIPCChannel.cs
@@ -12,9 +12,9 @@ namespace osu.Game.IPC
{
public class ArchiveImportIPCChannel : IpcChannel
{
- private readonly ICanImportArchives importer;
+ private readonly ICanAcceptFiles importer;
- public ArchiveImportIPCChannel(IIpcHost host, ICanImportArchives importer = null)
+ public ArchiveImportIPCChannel(IIpcHost host, ICanAcceptFiles importer = null)
: base(host)
{
this.importer = importer;
diff --git a/osu.Game/OsuGame.cs b/osu.Game/OsuGame.cs
index 624179cfe1..14bc31aecf 100644
--- a/osu.Game/OsuGame.cs
+++ b/osu.Game/OsuGame.cs
@@ -105,6 +105,8 @@ namespace osu.Game
{
this.frameworkConfig = frameworkConfig;
+ ScoreStore.ScoreImported += score => Schedule(() => LoadScore(score));
+
if (!Host.IsPrimaryInstance)
{
Logger.Log(@"osu! does not support multiple running instances.", LoggingTarget.Runtime, LogLevel.Error);
@@ -114,7 +116,8 @@ namespace osu.Game
if (args?.Length > 0)
{
var paths = args.Where(a => !a.StartsWith(@"-"));
- Task.Run(() => BeatmapManager.Import(paths.ToArray()));
+
+ Task.Run(() => Import(paths.ToArray()));
}
dependencies.CacheAs(this);
diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs
index ce50f160f7..dba0250007 100644
--- a/osu.Game/OsuGameBase.cs
+++ b/osu.Game/OsuGameBase.cs
@@ -2,7 +2,10 @@
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
using System;
+using System.Collections.Generic;
using System.Diagnostics;
+using System.IO;
+using System.Linq;
using System.Reflection;
using osu.Framework.Allocation;
using osu.Framework.Audio;
@@ -30,7 +33,7 @@ using osu.Game.Rulesets.Scoring;
namespace osu.Game
{
- public class OsuGameBase : Framework.Game, IOnlineComponent
+ public class OsuGameBase : Framework.Game, IOnlineComponent, ICanAcceptFiles
{
protected OsuConfigManager LocalConfig;
@@ -114,6 +117,8 @@ namespace osu.Game
dependencies.Cache(SettingsStore = new SettingsStore(contextFactory));
dependencies.Cache(new OsuColour());
+ fileImporters.Add(BeatmapManager);
+
//this completely overrides the framework default. will need to change once we make a proper FontStore.
dependencies.Cache(Fonts = new FontStore { ScaleAdjust = 100 });
@@ -257,5 +262,17 @@ namespace osu.Game
base.Dispose(isDisposing);
}
+
+ private readonly List fileImporters = new List();
+
+ public void Import(params string[] paths)
+ {
+ var extension = Path.GetExtension(paths.First());
+
+ foreach (var importer in fileImporters)
+ if (importer.HandledExtensions.Contains(extension)) importer.Import(paths);
+ }
+
+ public string[] HandledExtensions => fileImporters.SelectMany(i => i.HandledExtensions).ToArray();
}
}
diff --git a/osu.Game/Rulesets/Scoring/ScoreStore.cs b/osu.Game/Rulesets/Scoring/ScoreStore.cs
index 8bde2747a2..7abee0b04f 100644
--- a/osu.Game/Rulesets/Scoring/ScoreStore.cs
+++ b/osu.Game/Rulesets/Scoring/ScoreStore.cs
@@ -1,6 +1,7 @@
// Copyright (c) 2007-2018 ppy Pty Ltd .
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
+using System;
using System.Collections.Generic;
using System.IO;
using osu.Framework.Platform;
@@ -14,7 +15,7 @@ using SharpCompress.Compressors.LZMA;
namespace osu.Game.Rulesets.Scoring
{
- public class ScoreStore : DatabaseBackedStore
+ public class ScoreStore : DatabaseBackedStore, ICanAcceptFiles
{
private readonly Storage storage;
@@ -23,6 +24,8 @@ namespace osu.Game.Rulesets.Scoring
private const string replay_folder = @"replays";
+ public event Action ScoreImported;
+
// ReSharper disable once NotAccessedField.Local (we should keep a reference to this so it is not finalised)
private ScoreIPCChannel ipc;
@@ -36,6 +39,18 @@ namespace osu.Game.Rulesets.Scoring
ipc = new ScoreIPCChannel(importHost, this);
}
+ public string[] HandledExtensions => new[] { ".osr" };
+
+ public void Import(params string[] paths)
+ {
+ foreach (var path in paths)
+ {
+ var score = ReadReplayFile(path);
+ if (score != null)
+ ScoreImported?.Invoke(score);
+ }
+ }
+
public Score ReadReplayFile(string replayFilename)
{
Score score;
@@ -159,5 +174,6 @@ namespace osu.Game.Rulesets.Scoring
return new Replay { Frames = frames };
}
+
}
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 91aaf9c092..bfe7ec1821 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -277,7 +277,7 @@
-
+