From 8059d38cde81d1c735942fc576e891d258d270b4 Mon Sep 17 00:00:00 2001 From: Deliay Date: Wed, 22 Jul 2020 19:48:31 +0800 Subject: [PATCH 1/2] A little refactor and create PpCalculator project --- EmberTools.sln | 14 +++ src/EmberKernel/EmberKernel.csproj | 43 +++---- .../EventHandlers/MemoryReaderHandler.cs | 17 ++- .../ExamplePlugin/ExamplePlugin.csproj | 1 + .../Models/EventSubscription/BeatmapInfo.cs | 17 --- .../EventSubscription/GameStatusInfo.cs | 15 --- .../MultiplayerBeatmapIdInfo.cs | 14 --- .../Models/EventSubscription/PlayingInfo.cs | 59 --------- src/plugins/ExamplePlugin/MyPlugin.cs | 115 +++++++++--------- .../BeatmapDownloader.csproj | 1 + .../BeatmapDownloaderPlugin.cs | 3 +- .../Models/MultiplayerBeatmapIdInfo.cs | 14 --- .../Models/OsuProcessMatchedEvent.cs | 16 --- .../Services/BeatmapDownloadService.cs | 2 +- .../Services/MultiplayerDownloadService.cs | 2 +- .../Data/Beatmap.cs | 6 +- .../Data/BeatmapInfo.cs | 4 +- .../Data/GameMode.cs | 51 ++++++++ .../Data/GameModeInfo.cs | 30 +++++ .../Data/GameStatus.cs | 4 +- .../Data/GameStatusInfo.cs | 2 +- .../Data/MultiplayerBeatmapId.cs | 6 +- .../Data/MultiplayerBeatmapIdInfo.cs | 4 +- .../Data/Playing.cs | 4 +- .../Data/PlayingInfo.cs | 3 +- .../Data/StringPatternHelper.cs | 7 +- .../EmberMemoryReader.Abstract.csproj | 11 ++ .../Event}/OsuProcessMatchedEvent.cs | 9 +- .../Event/OsuProcessTerminatedEvent.cs | 8 ++ .../Osu/Listener/OsuProcessPredicator.cs | 3 +- .../Osu/Listener/OsuProcessTracker.cs | 4 +- .../Osu/OsuDataCollectorBuilderExtenstion.cs | 6 +- .../Components/Osu/OsuMemoryDataCollector.cs | 7 +- .../Osu/OsuProcessTerminatedEvent.cs | 12 -- .../EmberMemoryReader.csproj | 1 + .../osu/EmberMemoryReader/MemoryReader.cs | 5 +- .../Component/DatabaseSynchronizer.cs | 3 +- .../EmberSqliteSynchronizer.cs | 3 +- .../EmberSqliteSynchronizer.csproj | 1 + .../Models/OsuProcessMatchedEvent.cs | 16 --- .../Models/OsuProcessTerminatedEvent.cs | 11 -- .../osu/PpCalculator/PpCalculator.csproj | 11 ++ .../osu/PpCalculator/PpCalculatorPlugin.cs | 27 ++++ .../osu/PpCalculator/PpCalculatorService.cs | 11 ++ 44 files changed, 280 insertions(+), 323 deletions(-) delete mode 100644 src/plugins/ExamplePlugin/Models/EventSubscription/BeatmapInfo.cs delete mode 100644 src/plugins/ExamplePlugin/Models/EventSubscription/GameStatusInfo.cs delete mode 100644 src/plugins/ExamplePlugin/Models/EventSubscription/MultiplayerBeatmapIdInfo.cs delete mode 100644 src/plugins/ExamplePlugin/Models/EventSubscription/PlayingInfo.cs delete mode 100644 src/plugins/osu/BeatmapDownloader/Models/MultiplayerBeatmapIdInfo.cs delete mode 100644 src/plugins/osu/BeatmapDownloader/Models/OsuProcessMatchedEvent.cs rename src/plugins/osu/{EmberMemoryReader/Components/Osu => EmberMemoryReader.Abstract}/Data/Beatmap.cs (96%) rename src/plugins/osu/{EmberMemoryReader/Components/Osu => EmberMemoryReader.Abstract}/Data/BeatmapInfo.cs (87%) create mode 100644 src/plugins/osu/EmberMemoryReader.Abstract/Data/GameMode.cs create mode 100644 src/plugins/osu/EmberMemoryReader.Abstract/Data/GameModeInfo.cs rename src/plugins/osu/{EmberMemoryReader/Components/Osu => EmberMemoryReader.Abstract}/Data/GameStatus.cs (94%) rename src/plugins/osu/{EmberMemoryReader/Components/Osu => EmberMemoryReader.Abstract}/Data/GameStatusInfo.cs (96%) rename src/plugins/osu/{EmberMemoryReader/Components/Osu => EmberMemoryReader.Abstract}/Data/MultiplayerBeatmapId.cs (91%) rename src/plugins/osu/{EmberMemoryReader/Components/Osu => EmberMemoryReader.Abstract}/Data/MultiplayerBeatmapIdInfo.cs (86%) rename src/plugins/osu/{EmberMemoryReader/Components/Osu => EmberMemoryReader.Abstract}/Data/Playing.cs (98%) rename src/plugins/osu/{EmberMemoryReader/Components/Osu => EmberMemoryReader.Abstract}/Data/PlayingInfo.cs (96%) rename src/plugins/osu/{EmberMemoryReader/Components/Osu => EmberMemoryReader.Abstract}/Data/StringPatternHelper.cs (82%) create mode 100644 src/plugins/osu/EmberMemoryReader.Abstract/EmberMemoryReader.Abstract.csproj rename src/plugins/osu/{EmberMemoryReader/Components/Osu => EmberMemoryReader.Abstract/Event}/OsuProcessMatchedEvent.cs (59%) create mode 100644 src/plugins/osu/EmberMemoryReader.Abstract/Event/OsuProcessTerminatedEvent.cs delete mode 100644 src/plugins/osu/EmberMemoryReader/Components/Osu/OsuProcessTerminatedEvent.cs delete mode 100644 src/plugins/osu/EmberSqliteSynchronizer/Models/OsuProcessMatchedEvent.cs delete mode 100644 src/plugins/osu/EmberSqliteSynchronizer/Models/OsuProcessTerminatedEvent.cs create mode 100644 src/plugins/osu/PpCalculator/PpCalculator.csproj create mode 100644 src/plugins/osu/PpCalculator/PpCalculatorPlugin.cs create mode 100644 src/plugins/osu/PpCalculator/PpCalculatorService.cs diff --git a/EmberTools.sln b/EmberTools.sln index cd5c1a6..fefc8cc 100644 --- a/EmberTools.sln +++ b/EmberTools.sln @@ -39,6 +39,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "osu", "osu", "{9AECDFA1-D8A EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "osu", "osu", "{9D36F2F2-FD54-4E5F-9C56-C478ADB3F288}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PpCalculator", "src\plugins\osu\PpCalculator\PpCalculator.csproj", "{1C20F8C2-30D7-4F7C-9DD2-4DF0C88970ED}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmberMemoryReader.Abstract", "src\plugins\osu\EmberMemoryReader.Abstract\EmberMemoryReader.Abstract.csproj", "{91E9252C-FFBB-498A-83E3-BAB9D0C8D485}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -101,6 +105,14 @@ Global {2A3B9BD0-A7B4-4CF2-8725-448606D2C0E7}.Debug|Any CPU.Build.0 = Debug|Any CPU {2A3B9BD0-A7B4-4CF2-8725-448606D2C0E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A3B9BD0-A7B4-4CF2-8725-448606D2C0E7}.Release|Any CPU.Build.0 = Release|Any CPU + {1C20F8C2-30D7-4F7C-9DD2-4DF0C88970ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1C20F8C2-30D7-4F7C-9DD2-4DF0C88970ED}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C20F8C2-30D7-4F7C-9DD2-4DF0C88970ED}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1C20F8C2-30D7-4F7C-9DD2-4DF0C88970ED}.Release|Any CPU.Build.0 = Release|Any CPU + {91E9252C-FFBB-498A-83E3-BAB9D0C8D485}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91E9252C-FFBB-498A-83E3-BAB9D0C8D485}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91E9252C-FFBB-498A-83E3-BAB9D0C8D485}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91E9252C-FFBB-498A-83E3-BAB9D0C8D485}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -119,6 +131,8 @@ Global {2A3B9BD0-A7B4-4CF2-8725-448606D2C0E7} = {9AECDFA1-D8A9-4189-A390-625ADB7D06E8} {9AECDFA1-D8A9-4189-A390-625ADB7D06E8} = {B93D5B77-B8CA-4B7A-B5BE-ABD27EB57D27} {9D36F2F2-FD54-4E5F-9C56-C478ADB3F288} = {239B3BE6-770D-4BAD-AA11-FD91A2D62D02} + {1C20F8C2-30D7-4F7C-9DD2-4DF0C88970ED} = {9AECDFA1-D8A9-4189-A390-625ADB7D06E8} + {91E9252C-FFBB-498A-83E3-BAB9D0C8D485} = {9AECDFA1-D8A9-4189-A390-625ADB7D06E8} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {57B800AC-CFE3-4081-8EC4-9BD1C74869B0} diff --git a/src/EmberKernel/EmberKernel.csproj b/src/EmberKernel/EmberKernel.csproj index 2f2062c..3473778 100644 --- a/src/EmberKernel/EmberKernel.csproj +++ b/src/EmberKernel/EmberKernel.csproj @@ -1,24 +1,19 @@ - - - - netstandard2.1 - 8.0 - - - - - - - - - - - - - - - - - - - + + + + netstandard2.1 + 8.0 + + + + + + + + + + + + + + diff --git a/src/plugins/ExamplePlugin/EventHandlers/MemoryReaderHandler.cs b/src/plugins/ExamplePlugin/EventHandlers/MemoryReaderHandler.cs index ff5d9eb..513117b 100644 --- a/src/plugins/ExamplePlugin/EventHandlers/MemoryReaderHandler.cs +++ b/src/plugins/ExamplePlugin/EventHandlers/MemoryReaderHandler.cs @@ -1,11 +1,8 @@ using EmberKernel.Services.Configuration; using EmberKernel.Services.EventBus.Handlers; +using EmberMemoryReader.Abstract.Data; using ExamplePlugin.Models; -using ExamplePlugin.Models.EventSubscription; using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Text; using System.Threading.Tasks; namespace ExamplePlugin.EventHandlers @@ -14,7 +11,8 @@ public class MemoryReaderHandler : IEventHandler, IEventHandler, IEventHandler, - IEventHandler + IEventHandler, + IEventHandler { private readonly ILogger _logger; private readonly IPluginOptions _pluginOptions; @@ -73,5 +71,14 @@ public ValueTask Handle(MultiplayerBeatmapIdInfo @event) } return default; } + + public ValueTask Handle(GameModeInfo @event) + { + if (@event.HasValue) + { + _logger.LogInformation($"[Event] Current GameMode = {@event.Mode}"); + } + return default; + } } } diff --git a/src/plugins/ExamplePlugin/ExamplePlugin.csproj b/src/plugins/ExamplePlugin/ExamplePlugin.csproj index c1cc319..eb895dd 100644 --- a/src/plugins/ExamplePlugin/ExamplePlugin.csproj +++ b/src/plugins/ExamplePlugin/ExamplePlugin.csproj @@ -21,6 +21,7 @@ false false + diff --git a/src/plugins/ExamplePlugin/Models/EventSubscription/BeatmapInfo.cs b/src/plugins/ExamplePlugin/Models/EventSubscription/BeatmapInfo.cs deleted file mode 100644 index 5719047..0000000 --- a/src/plugins/ExamplePlugin/Models/EventSubscription/BeatmapInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -using EmberKernel.Services.EventBus; -using System; -using System.Collections.Generic; -using System.Text; - -namespace ExamplePlugin.Models.EventSubscription -{ - [EventNamespace("MemoryReader")] - public class BeatmapInfo : Event - { - public bool HasValue { get; set; } - public int BeatmapId { get; set; } - public int SetId { get; set; } - public string BeatmapFile { get; set; } - public string BeatmapFolder { get; set; } - } -} diff --git a/src/plugins/ExamplePlugin/Models/EventSubscription/GameStatusInfo.cs b/src/plugins/ExamplePlugin/Models/EventSubscription/GameStatusInfo.cs deleted file mode 100644 index e74b846..0000000 --- a/src/plugins/ExamplePlugin/Models/EventSubscription/GameStatusInfo.cs +++ /dev/null @@ -1,15 +0,0 @@ -using EmberKernel.Services.EventBus; -using System; -using System.Collections.Generic; -using System.Text; - -namespace ExamplePlugin.Models.EventSubscription -{ - [EventNamespace("MemoryReader")] - public class GameStatusInfo : Event - { - public bool HasValue { get; set; } - public int Status { get; set; } - public string StringStatus { get; set; } - } -} diff --git a/src/plugins/ExamplePlugin/Models/EventSubscription/MultiplayerBeatmapIdInfo.cs b/src/plugins/ExamplePlugin/Models/EventSubscription/MultiplayerBeatmapIdInfo.cs deleted file mode 100644 index e6a1125..0000000 --- a/src/plugins/ExamplePlugin/Models/EventSubscription/MultiplayerBeatmapIdInfo.cs +++ /dev/null @@ -1,14 +0,0 @@ -using EmberKernel.Services.EventBus; -using System; -using System.Collections.Generic; -using System.Text; - -namespace ExamplePlugin.Models.EventSubscription -{ - [EventNamespace("MemoryReader")] - public class MultiplayerBeatmapIdInfo : Event - { - public bool HasValue { get; set; } - public int BeatmapId { get; set; } - } -} diff --git a/src/plugins/ExamplePlugin/Models/EventSubscription/PlayingInfo.cs b/src/plugins/ExamplePlugin/Models/EventSubscription/PlayingInfo.cs deleted file mode 100644 index e01af4e..0000000 --- a/src/plugins/ExamplePlugin/Models/EventSubscription/PlayingInfo.cs +++ /dev/null @@ -1,59 +0,0 @@ -using EmberKernel.Services.EventBus; -using System; -using System.Collections.Generic; -using System.Text; - -namespace ExamplePlugin.Models.EventSubscription -{ - public class GameStatistic - { - - public double Accuracy { get; set; } - public double HP { get; set; } - /// - /// Current score - /// - public int Score { get; set; } - /// - /// Current combo - /// - public int Combo { get; set; } - /// - /// miss - /// - public int Missing { get; set; } - /// - /// 300 - /// - public int Best { get; set; } - /// - /// 100 - /// - public int Good { get; set; } - /// - /// 50 - /// - public int Bad { get; set; } - /// - /// geki(osu!)/ 300g(mania) - /// - public int Geki { get; set; } - /// - /// katu(osu!)/ 200(mania) - /// - public int Katu { get; set; } - } - - [EventNamespace("MemoryReader")] - public class PlayingInfo : Event - { - public bool HasValue { get; set; } - public int RawModInfo { get; set; } - public int RawListeningModInfo { get; set; } - public string CurrentPlayerName { get; set; } - public int PlayingTime { get; set; } - public List RawUnstableRate { get; set; } - public GameStatistic GameStatistic { get; set; } - } - -} diff --git a/src/plugins/ExamplePlugin/MyPlugin.cs b/src/plugins/ExamplePlugin/MyPlugin.cs index 98b35d4..ca79fe8 100644 --- a/src/plugins/ExamplePlugin/MyPlugin.cs +++ b/src/plugins/ExamplePlugin/MyPlugin.cs @@ -1,60 +1,55 @@ -using Autofac; -using EmberKernel.Services.Command; -using EmberKernel.Services.Command.Attributes; -using EmberKernel.Services.Command.Components; -using EmberKernel; -using EmberKernel.Plugins; -using EmberKernel.Plugins.Attributes; -using EmberKernel.Plugins.Components; -using ExamplePlugin.Commands; -using ExamplePlugin.Components; -using ExamplePlugin.EventHandlers; -using Microsoft.Extensions.Logging; -using System; -using System.Threading; -using System.Threading.Tasks; -using ExamplePlugin.Models.EventSubscription; -using ExamplePlugin.Models; -using EmberKernel.Services.UI.Mvvm.ViewModel.Configuration.Extension; - -namespace ExamplePlugin -{ - - [EmberPlugin(Author = "ZeroAsh", Name = "ExamplePlugin", Version = "1.0")] - public class MyPlugin : Plugin - { - public override ValueTask Initialize(ILifetimeScope scope) - { - scope.UseCommandContainer(); - scope.Subscription(); - scope.Subscription(); - scope.Subscription(); - scope.Subscription(); - scope.Subscription(); - scope.RegisterUIModel(); - return default; - } - - public override ValueTask Uninitialize(ILifetimeScope scope) - { - scope.RemoveCommandContainer(); - scope.Unsubscription(); - scope.Unsubscription(); - scope.Unsubscription(); - scope.Unsubscription(); - scope.Unsubscription(); - scope.UnregisterUIModel(); - return default; - } - - public override void BuildComponents(IComponentBuilder builder) - { - builder.UsePluginOptionsModel(); - builder.ConfigureUIModel(); - builder.ConfigureCommandContainer(); - builder.ConfigureStaticEventHandler(); - builder.ConfigureEventHandler(); - } - - } -} +using Autofac; +using EmberKernel; +using EmberKernel.Plugins; +using EmberKernel.Plugins.Attributes; +using EmberKernel.Plugins.Components; +using EmberKernel.Services.UI.Mvvm.ViewModel.Configuration.Extension; +using EmberMemoryReader.Abstract.Data; +using ExamplePlugin.Components; +using ExamplePlugin.EventHandlers; +using ExamplePlugin.Models; +using ExamplePlugin.Models.EventSubscription; +using System.Threading.Tasks; + +namespace ExamplePlugin +{ + + [EmberPlugin(Author = "ZeroAsh", Name = "ExamplePlugin", Version = "1.0")] + public class MyPlugin : Plugin + { + public override ValueTask Initialize(ILifetimeScope scope) + { + scope.UseCommandContainer(); + scope.Subscription(); + scope.Subscription(); + scope.Subscription(); + scope.Subscription(); + scope.Subscription(); + scope.Subscription(); + scope.RegisterUIModel(); + return default; + } + + public override ValueTask Uninitialize(ILifetimeScope scope) + { + scope.RemoveCommandContainer(); + scope.Unsubscription(); + scope.Unsubscription(); + scope.Unsubscription(); + scope.Unsubscription(); + scope.Unsubscription(); + scope.UnregisterUIModel(); + return default; + } + + public override void BuildComponents(IComponentBuilder builder) + { + builder.UsePluginOptionsModel(); + builder.ConfigureUIModel(); + builder.ConfigureCommandContainer(); + builder.ConfigureStaticEventHandler(); + builder.ConfigureEventHandler(); + } + + } +} diff --git a/src/plugins/osu/BeatmapDownloader/BeatmapDownloader.csproj b/src/plugins/osu/BeatmapDownloader/BeatmapDownloader.csproj index 345cbae..f72a1bd 100644 --- a/src/plugins/osu/BeatmapDownloader/BeatmapDownloader.csproj +++ b/src/plugins/osu/BeatmapDownloader/BeatmapDownloader.csproj @@ -22,6 +22,7 @@ + diff --git a/src/plugins/osu/BeatmapDownloader/BeatmapDownloaderPlugin.cs b/src/plugins/osu/BeatmapDownloader/BeatmapDownloaderPlugin.cs index 7d6fd36..bd31f3d 100644 --- a/src/plugins/osu/BeatmapDownloader/BeatmapDownloaderPlugin.cs +++ b/src/plugins/osu/BeatmapDownloader/BeatmapDownloaderPlugin.cs @@ -4,12 +4,13 @@ using BeatmapDownloader.Abstract.Services.DownloadProvider; using BeatmapDownloader.Database.Database; using BeatmapDownloader.Extension; -using BeatmapDownloader.Models; using BeatmapDownloader.Services; using EmberKernel; using EmberKernel.Plugins; using EmberKernel.Plugins.Attributes; using EmberKernel.Plugins.Components; +using EmberMemoryReader.Abstract.Data; +using EmberMemoryReader.Abstract.Events; using OsuSqliteDatabase.Database; using System.Threading.Tasks; diff --git a/src/plugins/osu/BeatmapDownloader/Models/MultiplayerBeatmapIdInfo.cs b/src/plugins/osu/BeatmapDownloader/Models/MultiplayerBeatmapIdInfo.cs deleted file mode 100644 index 095b055..0000000 --- a/src/plugins/osu/BeatmapDownloader/Models/MultiplayerBeatmapIdInfo.cs +++ /dev/null @@ -1,14 +0,0 @@ -using EmberKernel.Services.EventBus; -using System; -using System.Collections.Generic; -using System.Text; - -namespace BeatmapDownloader.Models -{ - [EventNamespace("MemoryReader")] - public class MultiplayerBeatmapIdInfo : Event - { - public bool HasValue { get; set; } - public int BeatmapId { get; set; } - } -} diff --git a/src/plugins/osu/BeatmapDownloader/Models/OsuProcessMatchedEvent.cs b/src/plugins/osu/BeatmapDownloader/Models/OsuProcessMatchedEvent.cs deleted file mode 100644 index 677dd5a..0000000 --- a/src/plugins/osu/BeatmapDownloader/Models/OsuProcessMatchedEvent.cs +++ /dev/null @@ -1,16 +0,0 @@ -using EmberKernel.Services.EventBus; -using System; -using System.Collections.Generic; -using System.Text; - -namespace BeatmapDownloader.Models -{ - public class OsuProcessMatchedEvent : Event - { - public string BeatmapDirectory { get; set; } - public string LatestVersion { get; set; } - public string UserName { get; set; } - public string GameDirectory { get; set; } - public int ProcessId { get; set; } - } -} diff --git a/src/plugins/osu/BeatmapDownloader/Services/BeatmapDownloadService.cs b/src/plugins/osu/BeatmapDownloader/Services/BeatmapDownloadService.cs index a230b91..d74902a 100644 --- a/src/plugins/osu/BeatmapDownloader/Services/BeatmapDownloadService.cs +++ b/src/plugins/osu/BeatmapDownloader/Services/BeatmapDownloadService.cs @@ -5,11 +5,11 @@ using BeatmapDownloader.Database.Database; using BeatmapDownloader.Database.Model; using BeatmapDownloader.Extension; -using BeatmapDownloader.Models; using EmberKernel.Plugins.Components; using EmberKernel.Services.Configuration; using EmberKernel.Services.EventBus; using EmberKernel.Services.EventBus.Handlers; +using EmberMemoryReader.Abstract.Events; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.Extensions.Logging; diff --git a/src/plugins/osu/BeatmapDownloader/Services/MultiplayerDownloadService.cs b/src/plugins/osu/BeatmapDownloader/Services/MultiplayerDownloadService.cs index 000474c..6ae9791 100644 --- a/src/plugins/osu/BeatmapDownloader/Services/MultiplayerDownloadService.cs +++ b/src/plugins/osu/BeatmapDownloader/Services/MultiplayerDownloadService.cs @@ -1,10 +1,10 @@ using BeatmapDownloader.Abstract.Models; using BeatmapDownloader.Abstract.Models.Events; -using BeatmapDownloader.Models; using EmberKernel.Plugins.Components; using EmberKernel.Services.Configuration; using EmberKernel.Services.EventBus; using EmberKernel.Services.EventBus.Handlers; +using EmberMemoryReader.Abstract.Data; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using OsuSqliteDatabase.Database; diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/Beatmap.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/Beatmap.cs similarity index 96% rename from src/plugins/osu/EmberMemoryReader/Components/Osu/Data/Beatmap.cs rename to src/plugins/osu/EmberMemoryReader.Abstract/Data/Beatmap.cs index 1545ee3..6b07865 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/Beatmap.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/Beatmap.cs @@ -1,12 +1,10 @@ using EmberKernel.Services.EventBus; using EmberMemory.Components.Collector; using EmberMemory.Readers; +using EmberMemoryReader.Abstract.Events; using System; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Text; -namespace EmberMemoryReader.Components.Osu.Data +namespace EmberMemoryReader.Abstract.Data { public class Beatmap : IComparableCollector { diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/BeatmapInfo.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/BeatmapInfo.cs similarity index 87% rename from src/plugins/osu/EmberMemoryReader/Components/Osu/Data/BeatmapInfo.cs rename to src/plugins/osu/EmberMemoryReader.Abstract/Data/BeatmapInfo.cs index 795d3d2..03f326a 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/BeatmapInfo.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/BeatmapInfo.cs @@ -1,10 +1,8 @@ using EmberKernel.Services.EventBus; using System; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Text; -namespace EmberMemoryReader.Components.Osu.Data +namespace EmberMemoryReader.Abstract.Data { [EventNamespace("MemoryReader")] public class BeatmapInfo : Event, IComparable, IEquatable diff --git a/src/plugins/osu/EmberMemoryReader.Abstract/Data/GameMode.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GameMode.cs new file mode 100644 index 0000000..d60d6b4 --- /dev/null +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GameMode.cs @@ -0,0 +1,51 @@ +using EmberKernel.Services.EventBus; +using EmberMemory.Components.Collector; +using EmberMemory.Readers; +using System; + +namespace EmberMemoryReader.Abstract.Data +{ + public class GameMode : IComparableCollector + { + public int ReadInterval { get; set; } = 3000; + public int RetryLimit { get; set; } = int.MaxValue; + + private const string ModePattern = "\x85\xff\x74\x57\xa1\x0\x0\x0\x0\x89\x45\xe4"; + private const string ModeMask = "xxxxx????xxx"; + private IntPtr ModeAddress; + private DirectMemoryReader Reader { get; set; } + public GameMode(DirectMemoryReader reader) + { + this.Reader = reader; + } + public bool TryInitialize() + { + try + { + Reader.Reload(); + if (!Reader.TryFindPattern(ModePattern.ToBytes(), ModeMask, 5, out ModeAddress)) + return false; + if (!Reader.TryReadIntPtr(ModeAddress, out ModeAddress)) + return false; + if (ModeAddress == IntPtr.Zero) + return false; + return true; + } + finally + { + Reader.ResetRegion(); + } + } + + public bool TryRead(out Event result) + { + if (!Reader.TryReadInt(ModeAddress, out var value)) + { + result = new GameModeInfo() { HasValue = false }; + return true; + } + result = new GameModeInfo() { HasValue = true, Mode = (OsuMode)value }; + return true; + } + } +} diff --git a/src/plugins/osu/EmberMemoryReader.Abstract/Data/GameModeInfo.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GameModeInfo.cs new file mode 100644 index 0000000..b35f2d1 --- /dev/null +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GameModeInfo.cs @@ -0,0 +1,30 @@ +using EmberKernel.Services.EventBus; +using System; + +namespace EmberMemoryReader.Abstract.Data +{ + public enum OsuMode + { + Osu = 0, + Taiko = 1, + CatchTheBeat = 2, + Mania = 3, + Unknown = -1 + } + + [EventNamespace("MemoryReader")] + public class GameModeInfo : Event, IComparable, IEquatable + { + public bool HasValue { get; set; } + public OsuMode Mode { get; set; } + public int CompareTo(GameModeInfo other) + { + return (int)Mode - (int)other.Mode; + } + + public bool Equals(GameModeInfo other) + { + return Mode == other.Mode; + } + } +} diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/GameStatus.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GameStatus.cs similarity index 94% rename from src/plugins/osu/EmberMemoryReader/Components/Osu/Data/GameStatus.cs rename to src/plugins/osu/EmberMemoryReader.Abstract/Data/GameStatus.cs index dd3c32e..faa8cff 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/GameStatus.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GameStatus.cs @@ -2,10 +2,8 @@ using EmberMemory.Components.Collector; using EmberMemory.Readers; using System; -using System.Collections.Generic; -using System.Text; -namespace EmberMemoryReader.Components.Osu.Data +namespace EmberMemoryReader.Abstract.Data { public class GameStatus : IComparableCollector { diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/GameStatusInfo.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GameStatusInfo.cs similarity index 96% rename from src/plugins/osu/EmberMemoryReader/Components/Osu/Data/GameStatusInfo.cs rename to src/plugins/osu/EmberMemoryReader.Abstract/Data/GameStatusInfo.cs index 4af9aff..ca3b45d 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/GameStatusInfo.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GameStatusInfo.cs @@ -2,7 +2,7 @@ using System; using System.Diagnostics.CodeAnalysis; -namespace EmberMemoryReader.Components.Osu.Data +namespace EmberMemoryReader.Abstract.Data { public enum OsuInternalStatus { diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/MultiplayerBeatmapId.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/MultiplayerBeatmapId.cs similarity index 91% rename from src/plugins/osu/EmberMemoryReader/Components/Osu/Data/MultiplayerBeatmapId.cs rename to src/plugins/osu/EmberMemoryReader.Abstract/Data/MultiplayerBeatmapId.cs index 51266b1..6d1ffbc 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/MultiplayerBeatmapId.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/MultiplayerBeatmapId.cs @@ -2,12 +2,10 @@ using EmberMemory.Components.Collector; using EmberMemory.Readers; using System; -using System.Collections.Generic; -using System.Text; -namespace EmberMemoryReader.Components.Osu.Data +namespace EmberMemoryReader.Abstract.Data { - class MultiplayerBeatmapId : IComparableCollector + public class MultiplayerBeatmapId : IComparableCollector { public int ReadInterval { get; set; } = 1500; public int RetryLimit { get; set; } = int.MaxValue; diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/MultiplayerBeatmapIdInfo.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/MultiplayerBeatmapIdInfo.cs similarity index 86% rename from src/plugins/osu/EmberMemoryReader/Components/Osu/Data/MultiplayerBeatmapIdInfo.cs rename to src/plugins/osu/EmberMemoryReader.Abstract/Data/MultiplayerBeatmapIdInfo.cs index de58787..b8f3b9b 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/MultiplayerBeatmapIdInfo.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/MultiplayerBeatmapIdInfo.cs @@ -1,10 +1,8 @@ using EmberKernel.Services.EventBus; using System; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Text; -namespace EmberMemoryReader.Components.Osu.Data +namespace EmberMemoryReader.Abstract.Data { [EventNamespace("MemoryReader")] public class MultiplayerBeatmapIdInfo : Event, IComparable, IEquatable diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/Playing.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/Playing.cs similarity index 98% rename from src/plugins/osu/EmberMemoryReader/Components/Osu/Data/Playing.cs rename to src/plugins/osu/EmberMemoryReader.Abstract/Data/Playing.cs index 564e4c3..84c475c 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/Playing.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/Playing.cs @@ -2,10 +2,8 @@ using EmberMemory.Components.Collector; using EmberMemory.Readers; using System; -using System.Collections.Generic; -using System.Text; -namespace EmberMemoryReader.Components.Osu.Data +namespace EmberMemoryReader.Abstract.Data { public class Playing : IComparableCollector { diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/PlayingInfo.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/PlayingInfo.cs similarity index 96% rename from src/plugins/osu/EmberMemoryReader/Components/Osu/Data/PlayingInfo.cs rename to src/plugins/osu/EmberMemoryReader.Abstract/Data/PlayingInfo.cs index bd3336b..34378b9 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/PlayingInfo.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/PlayingInfo.cs @@ -2,9 +2,8 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -using System.Text; -namespace EmberMemoryReader.Components.Osu.Data +namespace EmberMemoryReader.Abstract.Data { public class GameStatistic { diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/StringPatternHelper.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/StringPatternHelper.cs similarity index 82% rename from src/plugins/osu/EmberMemoryReader/Components/Osu/Data/StringPatternHelper.cs rename to src/plugins/osu/EmberMemoryReader.Abstract/Data/StringPatternHelper.cs index 98b9575..3445fe0 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Data/StringPatternHelper.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/StringPatternHelper.cs @@ -1,10 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; +using System.Globalization; using System.Text.RegularExpressions; -namespace EmberMemoryReader.Components.Osu.Data +namespace EmberMemoryReader.Abstract.Data { public static class StringPatternHelper { diff --git a/src/plugins/osu/EmberMemoryReader.Abstract/EmberMemoryReader.Abstract.csproj b/src/plugins/osu/EmberMemoryReader.Abstract/EmberMemoryReader.Abstract.csproj new file mode 100644 index 0000000..523156a --- /dev/null +++ b/src/plugins/osu/EmberMemoryReader.Abstract/EmberMemoryReader.Abstract.csproj @@ -0,0 +1,11 @@ + + + + netstandard2.1 + + + + + + + diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuProcessMatchedEvent.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Event/OsuProcessMatchedEvent.cs similarity index 59% rename from src/plugins/osu/EmberMemoryReader/Components/Osu/OsuProcessMatchedEvent.cs rename to src/plugins/osu/EmberMemoryReader.Abstract/Event/OsuProcessMatchedEvent.cs index 6cd7e8e..9b8800a 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuProcessMatchedEvent.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Event/OsuProcessMatchedEvent.cs @@ -1,11 +1,6 @@ -using EmberKernel.Services.EventBus; -using EmberMemory.Components; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Text; +using EmberMemory.Components; -namespace EmberMemoryReader.Components.Osu +namespace EmberMemoryReader.Abstract.Events { public class OsuProcessMatchedEvent : ProcessMatchedEvent { diff --git a/src/plugins/osu/EmberMemoryReader.Abstract/Event/OsuProcessTerminatedEvent.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Event/OsuProcessTerminatedEvent.cs new file mode 100644 index 0000000..a5bd84b --- /dev/null +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Event/OsuProcessTerminatedEvent.cs @@ -0,0 +1,8 @@ +using EmberMemory.Components; + +namespace EmberMemoryReader.Abstract.Events +{ + public class OsuProcessTerminatedEvent : ProcessTerminatedEvent + { + } +} diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Listener/OsuProcessPredicator.cs b/src/plugins/osu/EmberMemoryReader/Components/Osu/Listener/OsuProcessPredicator.cs index 3fc1940..dd89e33 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Listener/OsuProcessPredicator.cs +++ b/src/plugins/osu/EmberMemoryReader/Components/Osu/Listener/OsuProcessPredicator.cs @@ -1,12 +1,11 @@ using EmberMemory.Listener; +using EmberMemoryReader.Abstract.Events; using Microsoft.Extensions.Logging; using OsuUtils.Configuration; using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text; -using System.Threading.Tasks; namespace EmberMemoryReader.Components.Osu.Listener { diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/Listener/OsuProcessTracker.cs b/src/plugins/osu/EmberMemoryReader/Components/Osu/Listener/OsuProcessTracker.cs index 3e40041..6d8ab9d 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/Listener/OsuProcessTracker.cs +++ b/src/plugins/osu/EmberMemoryReader/Components/Osu/Listener/OsuProcessTracker.cs @@ -1,8 +1,6 @@ using EmberMemory.Listener; -using System; -using System.Collections.Generic; +using EmberMemoryReader.Abstract.Events; using System.Diagnostics; -using System.Text; namespace EmberMemoryReader.Components.Osu.Listener { diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuDataCollectorBuilderExtenstion.cs b/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuDataCollectorBuilderExtenstion.cs index ac72fe2..483667e 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuDataCollectorBuilderExtenstion.cs +++ b/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuDataCollectorBuilderExtenstion.cs @@ -1,12 +1,8 @@ using Autofac; -using EmberKernel; -using EmberKernel.Plugins.Components; -using EmberMemory.Components; using EmberMemory.Components.Collector; +using EmberMemoryReader.Abstract.Events; using System; -using System.Collections.Generic; using System.Diagnostics; -using System.Text; namespace EmberMemoryReader.Components.Osu { diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuMemoryDataCollector.cs b/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuMemoryDataCollector.cs index bdfe9af..c95bbc6 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuMemoryDataCollector.cs +++ b/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuMemoryDataCollector.cs @@ -2,10 +2,8 @@ using EmberMemory.Components.Collector; using EmberMemory.Readers; using EmberMemory.Readers.Windows; -using EmberMemoryReader.Components.Osu.Data; -using System; -using System.Collections.Generic; -using System.Text; +using EmberMemoryReader.Abstract.Data; +using EmberMemoryReader.Abstract.Events; namespace EmberMemoryReader.Components.Osu { @@ -21,6 +19,7 @@ protected override bool BuildCollectScope(CollectorBuilder builder, OsuProcessMa .UseOsuProcessEvent(@event) .UseCollectorManager(manager => manager .Collect() + .Collect() .Collect() .Collect() .Collect() diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuProcessTerminatedEvent.cs b/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuProcessTerminatedEvent.cs deleted file mode 100644 index 150c964..0000000 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuProcessTerminatedEvent.cs +++ /dev/null @@ -1,12 +0,0 @@ -using EmberKernel.Services.EventBus; -using EmberMemory.Components; -using System; -using System.Collections.Generic; -using System.Text; - -namespace EmberMemoryReader.Components.Osu -{ - public class OsuProcessTerminatedEvent : ProcessTerminatedEvent - { - } -} diff --git a/src/plugins/osu/EmberMemoryReader/EmberMemoryReader.csproj b/src/plugins/osu/EmberMemoryReader/EmberMemoryReader.csproj index 048e040..53f8be2 100644 --- a/src/plugins/osu/EmberMemoryReader/EmberMemoryReader.csproj +++ b/src/plugins/osu/EmberMemoryReader/EmberMemoryReader.csproj @@ -25,6 +25,7 @@ true + diff --git a/src/plugins/osu/EmberMemoryReader/MemoryReader.cs b/src/plugins/osu/EmberMemoryReader/MemoryReader.cs index 262bd1b..1851f18 100644 --- a/src/plugins/osu/EmberMemoryReader/MemoryReader.cs +++ b/src/plugins/osu/EmberMemoryReader/MemoryReader.cs @@ -4,14 +4,11 @@ using EmberKernel.Plugins.Attributes; using EmberKernel.Plugins.Components; using EmberKernel.Plugins.Models; -using EmberKernel.Services.EventBus.Handlers; using EmberMemory.Components.Collector; using EmberMemory.Listener; -using EmberMemoryReader.Components; +using EmberMemoryReader.Abstract.Events; using EmberMemoryReader.Components.Osu; using EmberMemoryReader.Components.Osu.Listener; -using System; -using System.Threading; using System.Threading.Tasks; namespace EmberMemoryReader diff --git a/src/plugins/osu/EmberSqliteSynchronizer/Component/DatabaseSynchronizer.cs b/src/plugins/osu/EmberSqliteSynchronizer/Component/DatabaseSynchronizer.cs index eadb056..31098b5 100644 --- a/src/plugins/osu/EmberSqliteSynchronizer/Component/DatabaseSynchronizer.cs +++ b/src/plugins/osu/EmberSqliteSynchronizer/Component/DatabaseSynchronizer.cs @@ -1,6 +1,6 @@ using EmberKernel.Plugins.Components; using EmberKernel.Services.EventBus.Handlers; -using EmberSqliteSynchronizer.Models; +using EmberMemoryReader.Abstract.Events; using EmberSqliteSynchronizer.Utils; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; @@ -11,7 +11,6 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; diff --git a/src/plugins/osu/EmberSqliteSynchronizer/EmberSqliteSynchronizer.cs b/src/plugins/osu/EmberSqliteSynchronizer/EmberSqliteSynchronizer.cs index 4b587a6..48c9d42 100644 --- a/src/plugins/osu/EmberSqliteSynchronizer/EmberSqliteSynchronizer.cs +++ b/src/plugins/osu/EmberSqliteSynchronizer/EmberSqliteSynchronizer.cs @@ -3,10 +3,9 @@ using EmberKernel.Plugins; using EmberKernel.Plugins.Attributes; using EmberKernel.Plugins.Components; +using EmberMemoryReader.Abstract.Events; using EmberSqliteSynchronizer.Component; -using EmberSqliteSynchronizer.Models; using OsuSqliteDatabase.Database; -using System; using System.Threading.Tasks; namespace EmberSqliteSynchronizer diff --git a/src/plugins/osu/EmberSqliteSynchronizer/EmberSqliteSynchronizer.csproj b/src/plugins/osu/EmberSqliteSynchronizer/EmberSqliteSynchronizer.csproj index 588f5e1..be9bd34 100644 --- a/src/plugins/osu/EmberSqliteSynchronizer/EmberSqliteSynchronizer.csproj +++ b/src/plugins/osu/EmberSqliteSynchronizer/EmberSqliteSynchronizer.csproj @@ -17,6 +17,7 @@ false false + diff --git a/src/plugins/osu/EmberSqliteSynchronizer/Models/OsuProcessMatchedEvent.cs b/src/plugins/osu/EmberSqliteSynchronizer/Models/OsuProcessMatchedEvent.cs deleted file mode 100644 index fb9c1d4..0000000 --- a/src/plugins/osu/EmberSqliteSynchronizer/Models/OsuProcessMatchedEvent.cs +++ /dev/null @@ -1,16 +0,0 @@ -using EmberKernel.Services.EventBus; -using System; -using System.Collections.Generic; -using System.Text; - -namespace EmberSqliteSynchronizer.Models -{ - public class OsuProcessMatchedEvent : Event - { - public string BeatmapDirectory { get; set; } - public string LatestVersion { get; set; } - public string UserName { get; set; } - public string GameDirectory { get; set; } - public int ProcessId { get; set; } - } -} diff --git a/src/plugins/osu/EmberSqliteSynchronizer/Models/OsuProcessTerminatedEvent.cs b/src/plugins/osu/EmberSqliteSynchronizer/Models/OsuProcessTerminatedEvent.cs deleted file mode 100644 index f3784b7..0000000 --- a/src/plugins/osu/EmberSqliteSynchronizer/Models/OsuProcessTerminatedEvent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using EmberKernel.Services.EventBus; -using System; -using System.Collections.Generic; -using System.Text; - -namespace EmberSqliteSynchronizer.Models -{ - public class OsuProcessTerminatedEvent : Event - { - } -} diff --git a/src/plugins/osu/PpCalculator/PpCalculator.csproj b/src/plugins/osu/PpCalculator/PpCalculator.csproj new file mode 100644 index 0000000..af00878 --- /dev/null +++ b/src/plugins/osu/PpCalculator/PpCalculator.csproj @@ -0,0 +1,11 @@ + + + + netstandard2.1 + + + + + + + diff --git a/src/plugins/osu/PpCalculator/PpCalculatorPlugin.cs b/src/plugins/osu/PpCalculator/PpCalculatorPlugin.cs new file mode 100644 index 0000000..953d3c7 --- /dev/null +++ b/src/plugins/osu/PpCalculator/PpCalculatorPlugin.cs @@ -0,0 +1,27 @@ +using Autofac; +using EmberKernel.Plugins; +using EmberKernel.Plugins.Attributes; +using EmberKernel.Plugins.Components; +using System.Threading.Tasks; + +namespace PpCalculator +{ + [EmberPlugin(Author = "ZeroAsh", Name = "PpCalculator", Version = "0.1")] + public class PpCalculatorPlugin : Plugin + { + public override void BuildComponents(IComponentBuilder builder) + { + throw new System.NotImplementedException(); + } + + public override ValueTask Initialize(ILifetimeScope scope) + { + throw new System.NotImplementedException(); + } + + public override ValueTask Uninitialize(ILifetimeScope scope) + { + throw new System.NotImplementedException(); + } + } +} diff --git a/src/plugins/osu/PpCalculator/PpCalculatorService.cs b/src/plugins/osu/PpCalculator/PpCalculatorService.cs new file mode 100644 index 0000000..ef8eb42 --- /dev/null +++ b/src/plugins/osu/PpCalculator/PpCalculatorService.cs @@ -0,0 +1,11 @@ +using EmberKernel.Plugins.Components; + +namespace PpCalculator +{ + public class PpCalculatorService : IComponent + { + public void Dispose() + { + } + } +} From 411c9cd6f9ad674f3f8324d940e11cbb17e4bb72 Mon Sep 17 00:00:00 2001 From: Deliay Date: Thu, 23 Jul 2020 21:20:47 +0800 Subject: [PATCH 2/2] stage --- .../EventHandlers/MemoryReaderHandler.cs | 9 +- src/plugins/ExamplePlugin/MyPlugin.cs | 3 + .../Data/GlobalGameModerator.cs | 50 +++++ .../Data/GlobalGameModeratorInfo.cs | 19 ++ .../Data/Playing.cs | 25 +-- .../Components/Osu/OsuMemoryDataCollector.cs | 1 + .../osu/PpCalculator/PpCalculator.csproj | 15 +- .../osu/PpCalculator/PpCalculatorPlugin.cs | 23 ++- .../osu/PpCalculator/PpCalculatorService.cs | 180 +++++++++++++++++- 9 files changed, 300 insertions(+), 25 deletions(-) create mode 100644 src/plugins/osu/EmberMemoryReader.Abstract/Data/GlobalGameModerator.cs create mode 100644 src/plugins/osu/EmberMemoryReader.Abstract/Data/GlobalGameModeratorInfo.cs diff --git a/src/plugins/ExamplePlugin/EventHandlers/MemoryReaderHandler.cs b/src/plugins/ExamplePlugin/EventHandlers/MemoryReaderHandler.cs index 513117b..12a424e 100644 --- a/src/plugins/ExamplePlugin/EventHandlers/MemoryReaderHandler.cs +++ b/src/plugins/ExamplePlugin/EventHandlers/MemoryReaderHandler.cs @@ -12,7 +12,8 @@ public class MemoryReaderHandler : IEventHandler, IEventHandler, IEventHandler, - IEventHandler + IEventHandler, + IEventHandler { private readonly ILogger _logger; private readonly IPluginOptions _pluginOptions; @@ -80,5 +81,11 @@ public ValueTask Handle(GameModeInfo @event) } return default; } + + public ValueTask Handle(GlobalGameModeratorInfo @event) + { + _logger.LogInformation($"[Event] Current Moderator = {@event.GlobalRawModerator}"); + return default; + } } } diff --git a/src/plugins/ExamplePlugin/MyPlugin.cs b/src/plugins/ExamplePlugin/MyPlugin.cs index ca79fe8..bc82283 100644 --- a/src/plugins/ExamplePlugin/MyPlugin.cs +++ b/src/plugins/ExamplePlugin/MyPlugin.cs @@ -26,6 +26,7 @@ public override ValueTask Initialize(ILifetimeScope scope) scope.Subscription(); scope.Subscription(); scope.Subscription(); + scope.Subscription(); scope.RegisterUIModel(); return default; } @@ -38,6 +39,8 @@ public override ValueTask Uninitialize(ILifetimeScope scope) scope.Unsubscription(); scope.Unsubscription(); scope.Unsubscription(); + scope.Unsubscription(); + scope.Unsubscription(); scope.UnregisterUIModel(); return default; } diff --git a/src/plugins/osu/EmberMemoryReader.Abstract/Data/GlobalGameModerator.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GlobalGameModerator.cs new file mode 100644 index 0000000..d8abd94 --- /dev/null +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GlobalGameModerator.cs @@ -0,0 +1,50 @@ +using EmberKernel.Services.EventBus; +using EmberMemory.Components.Collector; +using EmberMemory.Readers; +using System; + +namespace EmberMemoryReader.Abstract.Data +{ + public class GlobalGameModerator : IComparableCollector + { + + private static readonly string GlobalModsPattern = "\x8B\xF1\xA1\x00\x00\x00\x00\x25\x00\x00\x40\x00\x85\xC0"; + private static readonly string GlobalModsMask = "xxx????xxxxxxx"; + + public int ReadInterval { get; set; } = 500; + public int RetryLimit { get; set; } = int.MaxValue; + + private DirectMemoryReader Reader { get; } + public GlobalGameModerator(DirectMemoryReader reader) + { + Reader = reader; + } + + private IntPtr ModAddress; + public bool TryInitialize() + { + try + { + Reader.Reload(); + Reader.TryFindPattern(GlobalModsPattern.ToBytes(), GlobalModsMask, 3, out ModAddress); + if (!Reader.TryReadIntPtr(ModAddress, out ModAddress)) return false; + return true; + } + finally + { + Reader.ResetRegion(); + } + } + + public bool TryRead(out Event result) + { + if (Reader.TryReadInt(ModAddress, out var listeningMods)) + { + result = new GlobalGameModeratorInfo() { GlobalRawModerator = listeningMods }; + return true; + } + result = null; + return false; + } + } +} diff --git a/src/plugins/osu/EmberMemoryReader.Abstract/Data/GlobalGameModeratorInfo.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GlobalGameModeratorInfo.cs new file mode 100644 index 0000000..cc05bcc --- /dev/null +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/GlobalGameModeratorInfo.cs @@ -0,0 +1,19 @@ +using EmberKernel.Services.EventBus; +using System; + +namespace EmberMemoryReader.Abstract.Data +{ + public class GlobalGameModeratorInfo : Event, IComparable, IEquatable + { + public int GlobalRawModerator { get; set; } + public int CompareTo(GlobalGameModeratorInfo other) + { + return GlobalRawModerator - other.GlobalRawModerator; + } + + public bool Equals(GlobalGameModeratorInfo other) + { + return GlobalRawModerator == other.GlobalRawModerator; + } + } +} diff --git a/src/plugins/osu/EmberMemoryReader.Abstract/Data/Playing.cs b/src/plugins/osu/EmberMemoryReader.Abstract/Data/Playing.cs index 84c475c..d3b4eef 100644 --- a/src/plugins/osu/EmberMemoryReader.Abstract/Data/Playing.cs +++ b/src/plugins/osu/EmberMemoryReader.Abstract/Data/Playing.cs @@ -19,16 +19,12 @@ public class Playing : IComparableCollector private static readonly string TimePattern = "\x5e\x5f\x5d\xc3\xa1\x0\x0\x0\x0\x89\x0\x04"; private static readonly string TimeMask = "xxxxx????x?x"; - private static readonly string GlobalModsPattern = "\x8B\xF1\xA1\x00\x00\x00\x00\x25\x00\x00\x40\x00\x85\xC0"; - private static readonly string GlobalModsMask = "xxx????xxxxxxx"; - public int ReadInterval { get; set; } = 120; public int RetryLimit { get; set; } = int.MaxValue; private IntPtr AccuracyAddress; private IntPtr TimeAddress; - private IntPtr ModAddress; private DirectMemoryReader Reader { get; } public Playing(DirectMemoryReader reader) @@ -39,9 +35,6 @@ public Playing(DirectMemoryReader reader) public bool TryInitialize() { Reader.Reload(); - Reader.TryFindPattern(GlobalModsPattern.ToBytes(), GlobalModsMask, 3, out ModAddress); - if (!Reader.TryReadIntPtr(ModAddress, out ModAddress)) return false; - Reader.TryFindPattern(AccuracyPattern.ToBytes(), AccuracyMask, 1, out AccuracyAddress); if (!Reader.TryReadIntPtr(AccuracyAddress, out AccuracyAddress)) { @@ -81,10 +74,6 @@ public bool TryRead(out Event result) { info.RawModInfo = mods ^ modSalt; } - if (Reader.TryReadInt(ModAddress, out var listeningMods)) - { - info.RawListeningModInfo = listeningMods; - } if (Reader.TryReadString(scoreAddress + 0x28, out var playerName)) { info.CurrentPlayerName = playerName; @@ -93,31 +82,31 @@ public bool TryRead(out Event result) //{ // info.RawUnstableRate = rawUnstableList; //} - if (Reader.TryReadShort(scoreAddress + 0x8c, out var katu)) + if (Reader.TryReadShort(scoreAddress + 0x90, out var katu)) { info.GameStatistic.Katu = katu; } - if (Reader.TryReadShort(scoreAddress + 0x8a, out var geki)) + if (Reader.TryReadShort(scoreAddress + 0x8e, out var geki)) { info.GameStatistic.Geki = geki; } - if (Reader.TryReadShort(scoreAddress + 0x88, out var bad)) + if (Reader.TryReadShort(scoreAddress + 0x8c, out var bad)) { info.GameStatistic.Bad = bad; } - if (Reader.TryReadShort(scoreAddress + 0x84, out var good)) + if (Reader.TryReadShort(scoreAddress + 0x88, out var good)) { info.GameStatistic.Good = good; } - if (Reader.TryReadShort(scoreAddress + 0x86, out var best)) + if (Reader.TryReadShort(scoreAddress + 0x8a, out var best)) { info.GameStatistic.Best = best; } - if (Reader.TryReadShort(scoreAddress + 0x8e, out var missing)) + if (Reader.TryReadShort(scoreAddress + 0x92, out var missing)) { info.GameStatistic.Missing = missing; } - if (Reader.TryReadShort(scoreAddress + 0x90, out var combo)) + if (Reader.TryReadShort(scoreAddress + 0x94, out var combo)) { info.GameStatistic.Combo = combo; } diff --git a/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuMemoryDataCollector.cs b/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuMemoryDataCollector.cs index c95bbc6..d4aacf4 100644 --- a/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuMemoryDataCollector.cs +++ b/src/plugins/osu/EmberMemoryReader/Components/Osu/OsuMemoryDataCollector.cs @@ -21,6 +21,7 @@ protected override bool BuildCollectScope(CollectorBuilder builder, OsuProcessMa .Collect() .Collect() .Collect() + .Collect() .Collect() .Collect() ) diff --git a/src/plugins/osu/PpCalculator/PpCalculator.csproj b/src/plugins/osu/PpCalculator/PpCalculator.csproj index af00878..7053ab8 100644 --- a/src/plugins/osu/PpCalculator/PpCalculator.csproj +++ b/src/plugins/osu/PpCalculator/PpCalculator.csproj @@ -4,8 +4,19 @@ netstandard2.1 - - + + + + + false + false + + + + + + + diff --git a/src/plugins/osu/PpCalculator/PpCalculatorPlugin.cs b/src/plugins/osu/PpCalculator/PpCalculatorPlugin.cs index 953d3c7..bd05352 100644 --- a/src/plugins/osu/PpCalculator/PpCalculatorPlugin.cs +++ b/src/plugins/osu/PpCalculator/PpCalculatorPlugin.cs @@ -1,7 +1,10 @@ using Autofac; +using EmberKernel; using EmberKernel.Plugins; using EmberKernel.Plugins.Attributes; using EmberKernel.Plugins.Components; +using EmberMemoryReader.Abstract.Data; +using EmberMemoryReader.Abstract.Events; using System.Threading.Tasks; namespace PpCalculator @@ -11,17 +14,31 @@ public class PpCalculatorPlugin : Plugin { public override void BuildComponents(IComponentBuilder builder) { - throw new System.NotImplementedException(); + builder.ConfigureComponent().SingleInstance(); } public override ValueTask Initialize(ILifetimeScope scope) { - throw new System.NotImplementedException(); + scope.Subscription(); + scope.Subscription(); + scope.Subscription(); + scope.Subscription(); + scope.Subscription(); + scope.Subscription(); + + return default; } public override ValueTask Uninitialize(ILifetimeScope scope) { - throw new System.NotImplementedException(); + scope.Unsubscription(); + scope.Unsubscription(); + scope.Unsubscription(); + scope.Unsubscription(); + scope.Unsubscription(); + scope.Unsubscription(); + + return default; } } } diff --git a/src/plugins/osu/PpCalculator/PpCalculatorService.cs b/src/plugins/osu/PpCalculator/PpCalculatorService.cs index ef8eb42..9219223 100644 --- a/src/plugins/osu/PpCalculator/PpCalculatorService.cs +++ b/src/plugins/osu/PpCalculator/PpCalculatorService.cs @@ -1,11 +1,189 @@ using EmberKernel.Plugins.Components; +using EmberKernel.Services.EventBus; +using EmberKernel.Services.EventBus.Handlers; +using EmberMemoryReader.Abstract.Data; +using EmberMemoryReader.Abstract.Events; +using Microsoft.Extensions.Logging; +using SimpleOsuPerformanceCalculator.Calculator; +using System.IO; +using System.Threading.Tasks; namespace PpCalculator { - public class PpCalculatorService : IComponent + public class PpCalculatorService : IComponent, + IEventHandler, + IEventHandler, + IEventHandler, + IEventHandler, + IEventHandler, + IEventHandler { + private SimplePerformanceCalculator Calculator { get; set; } + private OsuMode LatestGameMode { get; set; } + private string CurrentBeatmapPath { get; set; } + private string OsuBeatmapPath { get; set; } = null; + private PlayingInfo CurrentPlayingInfo { get; set; } + private int LatestGameModerator { get; set; } + private int PlayingModerator { get; set; } + private int CurrentMaxCombo { get; set; } + + private IEventBus EventBus { get; } + private ILogger Logger { get; } + public PpCalculatorService(IEventBus eventBus, ILogger logger) + { + EventBus = eventBus; + Logger = logger; + } public void Dispose() { } + + private void RegenerateCalculator() + { + if (Calculator != null) + Calculator.PerformanceChanged -= Calculator_PerformanceChanged; + Calculator = new SimplePerformanceCalculator((SupportModes)LatestGameMode, CurrentBeatmapPath); + CurrentMaxCombo = 0; + Calculator.UpdateModerator(LatestGameModerator); + Calculator.PerformanceChanged += Calculator_PerformanceChanged; + DoScoreUpdate(ignoreCurrentStatistic: true); + } + + private void Calculator_PerformanceChanged(double pp) + { + Logger.LogInformation($"Current PP {pp}"); + } + + private void DoScoreUpdate(bool ignoreCurrentStatistic = false) + { + if (OsuBeatmapPath == null || Calculator == null) return; + if (ignoreCurrentStatistic || !CurrentPlayingInfo.HasValue) + { + Calculator.SetCurrentOffset(int.MaxValue); + switch (LatestGameMode) + { + case OsuMode.Osu: + Calculator.UpdateOsuScore(Calculator.Max300, 0, 0, 0, 1, Calculator.MaxCombo); + break; + case OsuMode.Taiko: + Calculator.UpdateTaikoScore(Calculator.Max300, 0, 0, 0); + break; + // unsupported now + //case OsuMode.CatchTheBeat: + // Calculator.UpdateCatchScore(Calculator.Max300, 0, 0, 0, 1, Calculator.MaxCombo); + // break; + case OsuMode.Mania: + Calculator.UpdateManiaScore(1000000, Calculator.Max300, 0, 0, 0, 0, 0, 1, Calculator.MaxCombo); + break; + default: + break; + } + return; + } + else + { + Calculator.SetCurrentOffset(CurrentPlayingInfo.PlayingTime); + if (PlayingModerator != CurrentPlayingInfo.RawModInfo) + { + PlayingModerator = CurrentPlayingInfo.RawModInfo; + Calculator.UpdateModerator(PlayingModerator); + } + var statistic = CurrentPlayingInfo.GameStatistic; + if (statistic.Combo > CurrentMaxCombo) + { + CurrentMaxCombo = statistic.Combo; + } + switch (LatestGameMode) + { + case OsuMode.Osu: + Calculator.UpdateOsuScore( + statistic.Best, + statistic.Good, + statistic.Bad, + statistic.Missing, + statistic.Accuracy / 100, + CurrentMaxCombo); + break; + case OsuMode.Taiko: + Calculator.UpdateTaikoScore( + statistic.Best, + statistic.Good, + statistic.Bad, + statistic.Missing); + break; + // unsupported now + //case OsuMode.CatchTheBeat: + // Calculator.UpdateCatchScore(Calculator.Max300, 0, 0, 0, 1, Calculator.MaxCombo); + // break; + case OsuMode.Mania: + Calculator.UpdateManiaScore( + statistic.Score, + statistic.Best, + statistic.Geki, + statistic.Good, + statistic.Katu, + statistic.Bad, + statistic.Missing, + statistic.Accuracy, + statistic.Combo); + break; + default: + break; + } + return; + } + } + + public ValueTask Handle(GameStatusInfo @event) + { + if (@event.HasValue) + { + if (@event.Status != OsuInternalStatus.Play || @event.Status != OsuInternalStatus.Rank) + { + DoScoreUpdate(ignoreCurrentStatistic: true); + } + } + return default; + } + + public ValueTask Handle(PlayingInfo @event) + { + CurrentPlayingInfo = @event; + DoScoreUpdate(); + return default; + } + + public ValueTask Handle(GameModeInfo @event) + { + if (@event.HasValue) + { + LatestGameMode = @event.Mode; + } + return default; + } + + public ValueTask Handle(BeatmapInfo @event) + { + if (@event.HasValue) + { + CurrentBeatmapPath = Path.Combine(OsuBeatmapPath, @event.BeatmapFolder, @event.BeatmapFile); + RegenerateCalculator(); + } + return default; + } + + public ValueTask Handle(OsuProcessMatchedEvent @event) + { + this.OsuBeatmapPath = Path.Combine(@event.GameDirectory, @event.BeatmapDirectory); + return default; + } + + public ValueTask Handle(GlobalGameModeratorInfo @event) + { + LatestGameModerator = @event.GlobalRawModerator; + if (OsuBeatmapPath == null || Calculator == null) return default; + Calculator.UpdateModerator(LatestGameModerator); + return default; + } } }