mirror of
https://github.com/osukey/osukey.git
synced 2025-05-29 17:37:23 +09:00
Make importing work properly.
Moves import code to BeatmapDatabase.
This commit is contained in:
parent
0c9e26e546
commit
d3a857edb9
@ -6,8 +6,10 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Framework;
|
using osu.Framework;
|
||||||
using osu.Framework.Desktop;
|
using osu.Framework.Desktop;
|
||||||
|
using osu.Framework.Desktop.Platform;
|
||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
using osu.Game;
|
using osu.Game;
|
||||||
|
using osu.Game.IPC;
|
||||||
|
|
||||||
namespace osu.Desktop
|
namespace osu.Desktop
|
||||||
{
|
{
|
||||||
@ -16,19 +18,24 @@ namespace osu.Desktop
|
|||||||
[STAThread]
|
[STAThread]
|
||||||
public static int Main(string[] args)
|
public static int Main(string[] args)
|
||||||
{
|
{
|
||||||
BasicGameHost host = Host.GetSuitableHost(@"osu");
|
DesktopGameHost host = Host.GetSuitableHost(@"osu", true);
|
||||||
BaseGame osuGame = new OsuGame();
|
|
||||||
if (args.Length != 0 && args.All(File.Exists))
|
if (!host.IsPrimaryInstance)
|
||||||
{
|
{
|
||||||
host.Load(osuGame);
|
var importer = new BeatmapImporter(host);
|
||||||
var beatmapIPC = new IpcChannel<OsuGame.ImportBeatmap>(host);
|
|
||||||
foreach (var file in args)
|
foreach (var file in args)
|
||||||
beatmapIPC.SendMessage(new OsuGame.ImportBeatmap { Path = file }).Wait();
|
if (importer.Import(file).Wait(1000))
|
||||||
Console.WriteLine(@"Sent file to running instance");
|
throw new TimeoutException(@"IPC took too long to send");
|
||||||
return 0;
|
Console.WriteLine(@"Sent import requests to running instance");
|
||||||
}
|
}
|
||||||
host.Add(osuGame);
|
else
|
||||||
host.Run();
|
{
|
||||||
|
BaseGame osu = new OsuGame(args);
|
||||||
|
host.Add(osu);
|
||||||
|
host.Run();
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
109
osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
Normal file
109
osu.Game.Tests/Beatmaps/IO/ImportBeatmapTest.cs
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using osu.Framework.Desktop.Platform;
|
||||||
|
using osu.Framework.Platform;
|
||||||
|
using osu.Game.Database;
|
||||||
|
using osu.Game.IPC;
|
||||||
|
|
||||||
|
namespace osu.Game.Tests.Beatmaps.IO
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class ImportBeatmapTest
|
||||||
|
{
|
||||||
|
const string osz_path = @"../../../osu-resources/osu.Game.Resources/Beatmaps/241526 Soleily - Renatus.osz";
|
||||||
|
|
||||||
|
[TestFixtureSetUp]
|
||||||
|
public void SetUp()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestImportWhenClosed()
|
||||||
|
{
|
||||||
|
//unfortunately for the time being we need to reference osu.Framework.Desktop for a game host here.
|
||||||
|
HeadlessGameHost host = new HeadlessGameHost();
|
||||||
|
|
||||||
|
var osu = loadOsu(host);
|
||||||
|
osu.Beatmaps.Import(osz_path);
|
||||||
|
ensureLoaded(osu);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestImportOverIPC()
|
||||||
|
{
|
||||||
|
HeadlessGameHost host = new HeadlessGameHost(true);
|
||||||
|
HeadlessGameHost client = new HeadlessGameHost(true);
|
||||||
|
|
||||||
|
Assert.IsTrue(host.IsPrimaryInstance);
|
||||||
|
Assert.IsTrue(!client.IsPrimaryInstance);
|
||||||
|
|
||||||
|
var osu = loadOsu(host);
|
||||||
|
|
||||||
|
var importer = new BeatmapImporter(client);
|
||||||
|
if (!importer.Import(osz_path).Wait(1000))
|
||||||
|
Assert.Fail(@"IPC took too long to send");
|
||||||
|
|
||||||
|
ensureLoaded(osu, 10000);
|
||||||
|
}
|
||||||
|
|
||||||
|
private OsuGameBase loadOsu(BasicGameHost host)
|
||||||
|
{
|
||||||
|
var osu = new OsuGameBase();
|
||||||
|
host.Add(osu);
|
||||||
|
|
||||||
|
//reset beatmap database (sqlite and storage backing)
|
||||||
|
osu.Beatmaps.Reset();
|
||||||
|
|
||||||
|
return osu;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ensureLoaded(OsuGameBase osu, int timeout = 100)
|
||||||
|
{
|
||||||
|
IEnumerable<BeatmapSetInfo> resultSets = null;
|
||||||
|
|
||||||
|
Action waitAction = () =>
|
||||||
|
{
|
||||||
|
while ((resultSets = osu.Beatmaps.Query<BeatmapSetInfo>().Where(s => s.BeatmapSetID == 241526)).Count() != 1)
|
||||||
|
Thread.Sleep(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
Assert.IsTrue(waitAction.BeginInvoke(null, null).AsyncWaitHandle.WaitOne(timeout),
|
||||||
|
@"BeatmapSet did not import to the database");
|
||||||
|
|
||||||
|
//ensure we were stored to beatmap database backing...
|
||||||
|
|
||||||
|
Assert.IsTrue(resultSets.Count() == 1);
|
||||||
|
|
||||||
|
IEnumerable<BeatmapInfo> resultBeatmaps = null;
|
||||||
|
|
||||||
|
//if we don't re-check here, the set will be inserted but the beatmaps won't be present yet.
|
||||||
|
waitAction = () =>
|
||||||
|
{
|
||||||
|
while ((resultBeatmaps = osu.Beatmaps.Query<BeatmapInfo>().Where(s => s.BeatmapSetID == 241526 && s.BaseDifficultyID > 0)).Count() != 12)
|
||||||
|
Thread.Sleep(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
Assert.IsTrue(waitAction.BeginInvoke(null, null).AsyncWaitHandle.WaitOne(timeout),
|
||||||
|
@"Beatmaps did not import to the database");
|
||||||
|
|
||||||
|
//fetch children and check we can load from the post-storage path...
|
||||||
|
var set = osu.Beatmaps.GetChildren(resultSets.First());
|
||||||
|
|
||||||
|
Assert.IsTrue(set.Beatmaps.Count == resultBeatmaps.Count());
|
||||||
|
|
||||||
|
foreach (BeatmapInfo b in resultBeatmaps)
|
||||||
|
Assert.IsTrue(set.Beatmaps.Any(c => c.BeatmapID == b.BeatmapID));
|
||||||
|
|
||||||
|
Assert.IsTrue(set.Beatmaps.Count > 0);
|
||||||
|
|
||||||
|
var beatmap = osu.Beatmaps.GetBeatmap(set.Beatmaps[0]);
|
||||||
|
|
||||||
|
Assert.IsTrue(beatmap.HitObjects.Count > 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
11
osu.Game.Tests/app.config
Normal file
11
osu.Game.Tests/app.config
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<runtime>
|
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
</assemblyBinding>
|
||||||
|
</runtime>
|
||||||
|
</configuration>
|
@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
@ -30,6 +30,21 @@
|
|||||||
<Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
<Reference Include="nunit.framework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll</HintPath>
|
<HintPath>..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
|
<Reference Include="SQLite.Net, Version=3.0.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\SQLite.Net-PCL.3.0.5\lib\net40\SQLite.Net.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="SQLite.Net.Platform.Generic, Version=3.0.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\SQLite.Net-PCL.3.0.5\lib\net40\SQLite.Net.Platform.Generic.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="SQLite.Net.Platform.Win32, Version=3.0.5.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\SQLite.Net-PCL.3.0.5\lib\net4\SQLite.Net.Platform.Win32.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="nunit.framework">
|
||||||
|
<HintPath>$(SolutionDir)\packages\NUnit.2.6.4\lib\nunit.framework.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="OpenTK, Version=2.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
<Reference Include="OpenTK, Version=2.0.0.0, Culture=neutral, PublicKeyToken=bad199fe84eb3df4, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\ppy.OpenTK.2.0.50727.1337\lib\net20\OpenTK.dll</HintPath>
|
<HintPath>..\packages\ppy.OpenTK.2.0.50727.1337\lib\net20\OpenTK.dll</HintPath>
|
||||||
@ -40,10 +55,19 @@
|
|||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include="app.config" />
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
<None Include="OpenTK.dll.config" />
|
<None Include="OpenTK.dll.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\osu-framework\osu.Framework.Desktop\osu.Framework.Desktop.csproj">
|
||||||
|
<Project>{65DC628F-A640-4111-AB35-3A5652BC1E17}</Project>
|
||||||
|
<Name>osu.Framework.Desktop</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\osu-framework\osu.Framework\osu.Framework.csproj">
|
||||||
|
<Project>{c76bf5b3-985e-4d39-95fe-97c9c879b83a}</Project>
|
||||||
|
<Name>osu.Framework</Name>
|
||||||
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
<ProjectReference Include="..\osu.Game\osu.Game.csproj">
|
||||||
<Project>{0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}</Project>
|
<Project>{0D3FBF8A-7464-4CF7-8C90-3E7886DF2D4D}</Project>
|
||||||
<Name>osu.Game</Name>
|
<Name>osu.Game</Name>
|
||||||
@ -53,14 +77,10 @@
|
|||||||
<Name>osu.Game.Resources</Name>
|
<Name>osu.Game.Resources</Name>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup />
|
||||||
<Folder Include="Resources\" />
|
|
||||||
<Folder Include="Beatmaps\" />
|
|
||||||
<Folder Include="Beatmaps\IO\" />
|
|
||||||
<Folder Include="Beatmaps\Formats\" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Beatmaps\IO\OszArchiveReaderTest.cs" />
|
<Compile Include="Beatmaps\IO\OszArchiveReaderTest.cs" />
|
||||||
|
<Compile Include="Beatmaps\IO\ImportBeatmapTest.cs" />
|
||||||
<Compile Include="Resources\Resource.cs" />
|
<Compile Include="Resources\Resource.cs" />
|
||||||
<Compile Include="Beatmaps\Formats\OsuLegacyDecoderTest.cs" />
|
<Compile Include="Beatmaps\Formats\OsuLegacyDecoderTest.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -2,4 +2,5 @@
|
|||||||
<packages>
|
<packages>
|
||||||
<package id="NUnit" version="3.5.0" targetFramework="net45" />
|
<package id="NUnit" version="3.5.0" targetFramework="net45" />
|
||||||
<package id="ppy.OpenTK" version="2.0.50727.1337" targetFramework="net45" />
|
<package id="ppy.OpenTK" version="2.0.50727.1337" targetFramework="net45" />
|
||||||
</packages>
|
<package id="SQLite.Net-PCL" version="3.0.5" targetFramework="net45" />
|
||||||
|
</packages>
|
||||||
|
@ -9,6 +9,7 @@ using osu.Framework.Platform;
|
|||||||
using osu.Game.Beatmaps;
|
using osu.Game.Beatmaps;
|
||||||
using osu.Game.Beatmaps.Formats;
|
using osu.Game.Beatmaps.Formats;
|
||||||
using osu.Game.Beatmaps.IO;
|
using osu.Game.Beatmaps.IO;
|
||||||
|
using osu.Game.IPC;
|
||||||
using SQLite.Net;
|
using SQLite.Net;
|
||||||
using SQLiteNetExtensions.Extensions;
|
using SQLiteNetExtensions.Extensions;
|
||||||
|
|
||||||
@ -19,10 +20,15 @@ namespace osu.Game.Database
|
|||||||
private static SQLiteConnection connection { get; set; }
|
private static SQLiteConnection connection { get; set; }
|
||||||
private BasicStorage storage;
|
private BasicStorage storage;
|
||||||
public event Action<BeatmapSetInfo> BeatmapSetAdded;
|
public event Action<BeatmapSetInfo> BeatmapSetAdded;
|
||||||
|
|
||||||
public BeatmapDatabase(BasicStorage storage)
|
private BeatmapImporter ipc;
|
||||||
|
|
||||||
|
public BeatmapDatabase(BasicGameHost host)
|
||||||
{
|
{
|
||||||
this.storage = storage;
|
this.storage = host.Storage;
|
||||||
|
|
||||||
|
ipc = new BeatmapImporter(host, this);
|
||||||
|
|
||||||
if (connection == null)
|
if (connection == null)
|
||||||
{
|
{
|
||||||
connection = storage.GetDatabase(@"beatmaps");
|
connection = storage.GetDatabase(@"beatmaps");
|
||||||
@ -44,58 +50,63 @@ namespace osu.Game.Database
|
|||||||
connection.DeleteAll<BeatmapInfo>();
|
connection.DeleteAll<BeatmapInfo>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Import(string path)
|
public void Import(params string[] paths)
|
||||||
{
|
{
|
||||||
string hash = null;
|
foreach (string p in paths)
|
||||||
BeatmapMetadata metadata;
|
|
||||||
|
|
||||||
using (var reader = ArchiveReader.GetReader(storage, path))
|
|
||||||
metadata = reader.ReadMetadata();
|
|
||||||
|
|
||||||
if (connection.Table<BeatmapSetInfo>().Count(b => b.BeatmapSetID == metadata.BeatmapSetID) != 0)
|
|
||||||
return; // TODO: Update this beatmap instead
|
|
||||||
|
|
||||||
if (File.Exists(path)) // Not always the case, i.e. for LegacyFilesystemReader
|
|
||||||
{
|
{
|
||||||
using (var md5 = MD5.Create())
|
var path = p;
|
||||||
using (var input = storage.GetStream(path))
|
string hash = null;
|
||||||
|
|
||||||
|
BeatmapMetadata metadata;
|
||||||
|
|
||||||
|
using (var reader = ArchiveReader.GetReader(storage, path))
|
||||||
|
metadata = reader.ReadMetadata();
|
||||||
|
|
||||||
|
if (connection.Table<BeatmapSetInfo>().Count(b => b.BeatmapSetID == metadata.BeatmapSetID) != 0)
|
||||||
|
return; // TODO: Update this beatmap instead
|
||||||
|
|
||||||
|
if (File.Exists(path)) // Not always the case, i.e. for LegacyFilesystemReader
|
||||||
{
|
{
|
||||||
hash = BitConverter.ToString(md5.ComputeHash(input)).Replace("-", "").ToLowerInvariant();
|
using (var md5 = MD5.Create())
|
||||||
input.Seek(0, SeekOrigin.Begin);
|
using (var input = storage.GetStream(path))
|
||||||
path = Path.Combine(@"beatmaps", hash.Remove(1), hash.Remove(2), hash);
|
|
||||||
using (var output = storage.GetStream(path, FileAccess.Write))
|
|
||||||
input.CopyTo(output);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var beatmapSet = new BeatmapSetInfo
|
|
||||||
{
|
|
||||||
BeatmapSetID = metadata.BeatmapSetID,
|
|
||||||
Beatmaps = new List<BeatmapInfo>(),
|
|
||||||
Path = path,
|
|
||||||
Hash = hash,
|
|
||||||
Metadata = metadata
|
|
||||||
};
|
|
||||||
|
|
||||||
using (var reader = ArchiveReader.GetReader(storage, path))
|
|
||||||
{
|
|
||||||
string[] mapNames = reader.ReadBeatmaps();
|
|
||||||
foreach (var name in mapNames)
|
|
||||||
{
|
|
||||||
using (var stream = new StreamReader(reader.ReadFile(name)))
|
|
||||||
{
|
{
|
||||||
var decoder = BeatmapDecoder.GetDecoder(stream);
|
hash = BitConverter.ToString(md5.ComputeHash(input)).Replace("-", "").ToLowerInvariant();
|
||||||
Beatmap beatmap = decoder.Decode(stream);
|
input.Seek(0, SeekOrigin.Begin);
|
||||||
beatmap.BeatmapInfo.Path = name;
|
path = Path.Combine(@"beatmaps", hash.Remove(1), hash.Remove(2), hash);
|
||||||
|
using (var output = storage.GetStream(path, FileAccess.Write))
|
||||||
// TODO: Diff beatmap metadata with set metadata and leave it here if necessary
|
input.CopyTo(output);
|
||||||
beatmap.BeatmapInfo.Metadata = null;
|
|
||||||
|
|
||||||
beatmapSet.Beatmaps.Add(beatmap.BeatmapInfo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var beatmapSet = new BeatmapSetInfo
|
||||||
|
{
|
||||||
|
BeatmapSetID = metadata.BeatmapSetID,
|
||||||
|
Beatmaps = new List<BeatmapInfo>(),
|
||||||
|
Path = path,
|
||||||
|
Hash = hash,
|
||||||
|
Metadata = metadata
|
||||||
|
};
|
||||||
|
|
||||||
|
using (var reader = ArchiveReader.GetReader(storage, path))
|
||||||
|
{
|
||||||
|
string[] mapNames = reader.ReadBeatmaps();
|
||||||
|
foreach (var name in mapNames)
|
||||||
|
{
|
||||||
|
using (var stream = new StreamReader(reader.ReadFile(name)))
|
||||||
|
{
|
||||||
|
var decoder = BeatmapDecoder.GetDecoder(stream);
|
||||||
|
Beatmap beatmap = decoder.Decode(stream);
|
||||||
|
beatmap.BeatmapInfo.Path = name;
|
||||||
|
|
||||||
|
// TODO: Diff beatmap metadata with set metadata and leave it here if necessary
|
||||||
|
beatmap.BeatmapInfo.Metadata = null;
|
||||||
|
|
||||||
|
beatmapSet.Beatmaps.Add(beatmap.BeatmapInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
connection.InsertWithChildren(beatmapSet, true);
|
||||||
|
BeatmapSetAdded?.Invoke(beatmapSet);
|
||||||
}
|
}
|
||||||
connection.InsertWithChildren(beatmapSet, true);
|
|
||||||
BeatmapSetAdded?.Invoke(beatmapSet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArchiveReader GetReader(BeatmapSetInfo beatmapSet)
|
public ArchiveReader GetReader(BeatmapSetInfo beatmapSet)
|
||||||
@ -154,7 +165,7 @@ namespace osu.Game.Database
|
|||||||
typeof(BeatmapMetadata),
|
typeof(BeatmapMetadata),
|
||||||
typeof(BaseDifficulty),
|
typeof(BaseDifficulty),
|
||||||
};
|
};
|
||||||
|
|
||||||
public void Update<T>(T record, bool cascade = true) where T : class
|
public void Update<T>(T record, bool cascade = true) where T : class
|
||||||
{
|
{
|
||||||
if (!validTypes.Any(t => t == typeof(T)))
|
if (!validTypes.Any(t => t == typeof(T)))
|
||||||
|
46
osu.Game/IPC/BeatmapImporter.cs
Normal file
46
osu.Game/IPC/BeatmapImporter.cs
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
//Copyright (c) 2007-2016 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
//Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using osu.Framework.Platform;
|
||||||
|
using osu.Game.Database;
|
||||||
|
|
||||||
|
namespace osu.Game.IPC
|
||||||
|
{
|
||||||
|
public class BeatmapImporter
|
||||||
|
{
|
||||||
|
private IpcChannel<BeatmapImportMessage> channel;
|
||||||
|
private BeatmapDatabase beatmaps;
|
||||||
|
|
||||||
|
public BeatmapImporter(BasicGameHost host, BeatmapDatabase beatmaps = null)
|
||||||
|
{
|
||||||
|
this.beatmaps = beatmaps;
|
||||||
|
|
||||||
|
channel = new IpcChannel<BeatmapImportMessage>(host);
|
||||||
|
channel.MessageReceived += messageReceived;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Import(string path)
|
||||||
|
{
|
||||||
|
if (beatmaps != null)
|
||||||
|
beatmaps.Import(path);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await channel.SendMessage(new BeatmapImportMessage { Path = path });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void messageReceived(BeatmapImportMessage msg)
|
||||||
|
{
|
||||||
|
Debug.Assert(beatmaps != null);
|
||||||
|
|
||||||
|
Import(msg.Path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class BeatmapImportMessage
|
||||||
|
{
|
||||||
|
public string Path;
|
||||||
|
}
|
||||||
|
}
|
@ -9,38 +9,33 @@ using osu.Game.GameModes.Menu;
|
|||||||
using OpenTK;
|
using OpenTK;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Sprites;
|
|
||||||
using osu.Framework.Platform;
|
using osu.Framework.Platform;
|
||||||
using osu.Game.GameModes;
|
|
||||||
using osu.Game.Graphics.Background;
|
|
||||||
using osu.Game.GameModes.Play;
|
using osu.Game.GameModes.Play;
|
||||||
using osu.Game.Graphics.Containers;
|
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
using osu.Framework;
|
using osu.Framework;
|
||||||
using osu.Framework.Input;
|
using osu.Framework.Input;
|
||||||
using osu.Game.Input;
|
using osu.Game.Input;
|
||||||
using OpenTK.Input;
|
using OpenTK.Input;
|
||||||
using System.IO;
|
|
||||||
using osu.Game.Beatmaps.IO;
|
|
||||||
using osu.Framework.Logging;
|
using osu.Framework.Logging;
|
||||||
|
|
||||||
namespace osu.Game
|
namespace osu.Game
|
||||||
{
|
{
|
||||||
public class OsuGame : OsuGameBase
|
public class OsuGame : OsuGameBase
|
||||||
{
|
{
|
||||||
public class ImportBeatmap
|
|
||||||
{
|
|
||||||
public string Path;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Toolbar Toolbar;
|
public Toolbar Toolbar;
|
||||||
public ChatConsole Chat;
|
public ChatConsole Chat;
|
||||||
public MainMenu MainMenu => intro?.ChildGameMode as MainMenu;
|
public MainMenu MainMenu => intro?.ChildGameMode as MainMenu;
|
||||||
private Intro intro;
|
private Intro intro;
|
||||||
private IpcChannel<ImportBeatmap> BeatmapIPC;
|
|
||||||
|
|
||||||
public Bindable<PlayMode> PlayMode;
|
public Bindable<PlayMode> PlayMode;
|
||||||
|
|
||||||
|
string[] args;
|
||||||
|
|
||||||
|
public OsuGame(string[] args = null)
|
||||||
|
{
|
||||||
|
this.args = args;
|
||||||
|
}
|
||||||
|
|
||||||
public override void SetHost(BasicGameHost host)
|
public override void SetHost(BasicGameHost host)
|
||||||
{
|
{
|
||||||
base.SetHost(host);
|
base.SetHost(host);
|
||||||
@ -50,30 +45,17 @@ namespace osu.Game
|
|||||||
|
|
||||||
public override void Load(BaseGame game)
|
public override void Load(BaseGame game)
|
||||||
{
|
{
|
||||||
BeatmapIPC = new IpcChannel<ImportBeatmap>(Host);
|
|
||||||
|
|
||||||
if (!Host.IsPrimaryInstance)
|
if (!Host.IsPrimaryInstance)
|
||||||
{
|
{
|
||||||
Logger.Log(@"osu! does not support multiple running instances.", LoggingTarget.Runtime, LogLevel.Error);
|
Logger.Log(@"osu! does not support multiple running instances.", LoggingTarget.Runtime, LogLevel.Error);
|
||||||
Environment.Exit(0);
|
Environment.Exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
BeatmapIPC.MessageReceived += message =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Beatmaps.ImportBeatmap(message.Path);
|
|
||||||
// TODO: Switch to beatmap list and select the new song
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
// TODO: Show the user some info?
|
|
||||||
Logger.Log($@"Failed to import beatmap: {ex}", LoggingTarget.Runtime, LogLevel.Error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
base.Load(game);
|
base.Load(game);
|
||||||
|
|
||||||
|
if (args?.Length > 0)
|
||||||
|
Schedule(delegate { Beatmaps.Import(args); });
|
||||||
|
|
||||||
//attach our bindables to the audio subsystem.
|
//attach our bindables to the audio subsystem.
|
||||||
Audio.Volume.Weld(Config.GetBindable<double>(OsuConfig.VolumeGlobal));
|
Audio.Volume.Weld(Config.GetBindable<double>(OsuConfig.VolumeGlobal));
|
||||||
Audio.VolumeSample.Weld(Config.GetBindable<double>(OsuConfig.VolumeEffect));
|
Audio.VolumeSample.Weld(Config.GetBindable<double>(OsuConfig.VolumeEffect));
|
||||||
|
@ -10,6 +10,7 @@ using osu.Game.Configuration;
|
|||||||
using osu.Game.Database;
|
using osu.Game.Database;
|
||||||
using osu.Game.Graphics.Cursor;
|
using osu.Game.Graphics.Cursor;
|
||||||
using osu.Game.Graphics.Processing;
|
using osu.Game.Graphics.Processing;
|
||||||
|
using osu.Game.IPC;
|
||||||
using osu.Game.Online.API;
|
using osu.Game.Online.API;
|
||||||
using osu.Game.Overlays;
|
using osu.Game.Overlays;
|
||||||
|
|
||||||
@ -18,7 +19,7 @@ namespace osu.Game
|
|||||||
public class OsuGameBase : BaseGame
|
public class OsuGameBase : BaseGame
|
||||||
{
|
{
|
||||||
internal OsuConfigManager Config = new OsuConfigManager();
|
internal OsuConfigManager Config = new OsuConfigManager();
|
||||||
internal BeatmapDatabase Beatmaps { get; private set; }
|
public BeatmapDatabase Beatmaps { get; private set; }
|
||||||
|
|
||||||
protected override string MainResourceFile => @"osu.Game.Resources.dll";
|
protected override string MainResourceFile => @"osu.Game.Resources.dll";
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ namespace osu.Game
|
|||||||
base.Load(game);
|
base.Load(game);
|
||||||
|
|
||||||
OszArchiveReader.Register();
|
OszArchiveReader.Register();
|
||||||
Beatmaps = new BeatmapDatabase(Host.Storage);
|
Beatmaps = new BeatmapDatabase(Host);
|
||||||
|
|
||||||
//this completely overrides the framework default. will need to change once we make a proper FontStore.
|
//this completely overrides the framework default. will need to change once we make a proper FontStore.
|
||||||
Fonts = new TextureStore() { ScaleAdjust = 0.01f };
|
Fonts = new TextureStore() { ScaleAdjust = 0.01f };
|
||||||
|
@ -156,6 +156,7 @@
|
|||||||
<Compile Include="GameModes\Play\Catch\CatchComboCounter.cs" />
|
<Compile Include="GameModes\Play\Catch\CatchComboCounter.cs" />
|
||||||
<Compile Include="GameModes\Play\Osu\OsuComboCounter.cs" />
|
<Compile Include="GameModes\Play\Osu\OsuComboCounter.cs" />
|
||||||
<Compile Include="Graphics\UserInterface\StarCounter.cs" />
|
<Compile Include="Graphics\UserInterface\StarCounter.cs" />
|
||||||
|
<Compile Include="IPC\BeatmapImporter.cs" />
|
||||||
<Compile Include="Online\API\APIAccess.cs" />
|
<Compile Include="Online\API\APIAccess.cs" />
|
||||||
<Compile Include="Online\API\APIRequest.cs" />
|
<Compile Include="Online\API\APIRequest.cs" />
|
||||||
<Compile Include="Online\API\OAuth.cs" />
|
<Compile Include="Online\API\OAuth.cs" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user