├── .editorconfig
├── .gitattributes
├── .github
├── FUNDING.yml
└── workflows
│ └── docs.yml
├── .gitignore
├── .gitmodules
├── Directory.Build.props
├── Directory.Packages.props
├── LICENSE
├── PpCalculator
├── CtbCalculator.cs
├── DifficultyAttributesExtensions.cs
├── ManiaCalculator.cs
├── OsuCalculator.cs
├── PerformanceAttributesExtensions.cs
├── PpCalculator.cs
├── PpCalculator.csproj
├── PpCalculatorHelpers.cs
├── ProcessorWorkingBeatmap.cs
└── TaikoCalculator.cs
├── PpCalculatorTests
├── PpCalculatorTests.cs
├── PpCalculatorTests.csproj
├── StarRatingTests.cs
└── cache
│ └── 2462439_cut.osu
├── PpCalculatorTypes
├── BreakPeriod.cs
├── CatchDifficultyAttributes.cs
├── DifficultyAttributes.cs
├── IPpCalculator.cs
├── KiaiPoint.cs
├── ManiaDifficultyAttributes.cs
├── OsuDifficultyAttributes.cs
├── PerformanceAttributes
│ ├── CatchPerformanceAttributes.cs
│ ├── ManiaPerformanceAttributes.cs
│ ├── OsuPerformanceAttributes.cs
│ ├── PerformanceAttributes.cs
│ └── TaikoPerformanceAttributes.cs
├── PpCalculatorTypes.csproj
├── TaikoDifficultyAttributes.cs
└── TimingPoint.cs
├── README.md
├── StreamCompanion.Common
├── CancelableAsyncLazy.cs
├── Configurations
│ └── WebSocketConfiguration.cs
├── Consts.cs
├── Extensions
│ ├── BeatmapExtensions.cs
│ ├── CancellationTokenSourceExtensions.cs
│ ├── MapSearchResultsExtensions.cs
│ ├── MathExtensions.cs
│ ├── PluginExtensions.cs
│ ├── PpCalculatorExtensions.cs
│ ├── ProcessExtensions.cs
│ ├── SettingsExtensions.cs
│ ├── StringExtensions.cs
│ ├── TaskExtensions.cs
│ └── TokensExtensions.cs
├── Helpers
│ ├── OsuScore.cs
│ ├── Retry.cs
│ └── Tokens
│ │ ├── BulkTokenUpdateContext.cs
│ │ ├── BulkTokenUpdateState.cs
│ │ ├── BulkTokenUpdateType.cs
│ │ └── TokensBulkUpdate.cs
├── Models
│ ├── WebOverlay.cs
│ └── WebOverlayRecommendedSettings.cs
├── Properties
│ └── AssemblyInfo.cs
└── StreamCompanion.Common.csproj
├── Updater
├── App.config
├── Program.cs
├── Properties
│ └── AssemblyInfo.cs
├── Updater.csproj
└── compiled.ico
├── VersionControler
├── App.config
├── Program.cs
├── Properties
│ └── AssemblyInfo.cs
└── VersionControler.csproj
├── build
├── msbuild.bat
├── nuget.exe
└── vswhere.exe
├── buildRelease-CI.cmd
├── buildRelease.cmd
├── docs
├── docs
│ ├── .vuepress
│ │ ├── config.ts
│ │ ├── configs
│ │ │ ├── index.ts
│ │ │ └── sidebar.ts
│ │ └── public
│ │ │ ├── browserconfig.xml
│ │ │ ├── favicon.ico
│ │ │ ├── images
│ │ │ ├── guide
│ │ │ │ └── netRuntimeDownload.png
│ │ │ ├── icons
│ │ │ │ ├── android-chrome-192x192.png
│ │ │ │ ├── android-chrome-512x512.png
│ │ │ │ ├── apple-touch-icon.png
│ │ │ │ ├── favicon-16x16.png
│ │ │ │ ├── favicon-32x32.png
│ │ │ │ ├── mstile-144x144.png
│ │ │ │ ├── mstile-150x150.png
│ │ │ │ ├── mstile-310x150.png
│ │ │ │ ├── mstile-310x310.png
│ │ │ │ ├── mstile-70x70.png
│ │ │ │ └── safari-pinned-tab.svg
│ │ │ └── logo.svg
│ │ │ ├── manifest.webmanifest
│ │ │ └── misc
│ │ │ └── PluginProject.zip
│ ├── README.md
│ ├── development
│ │ ├── README.md
│ │ ├── SC
│ │ │ ├── README.md
│ │ │ ├── api.md
│ │ │ ├── apiExamples
│ │ │ │ ├── exampleSCOutput.json
│ │ │ │ ├── minimalWS.js
│ │ │ │ ├── minimalWSpt2.js
│ │ │ │ ├── minimalWSpt3.js
│ │ │ │ ├── minimalWSpt4.js
│ │ │ │ └── plugin
│ │ │ │ │ ├── 1.cs
│ │ │ │ │ ├── 1.csproj
│ │ │ │ │ ├── 2.cs
│ │ │ │ │ ├── 2.csproj
│ │ │ │ │ ├── 3.cs
│ │ │ │ │ ├── 4.cs
│ │ │ │ │ ├── 4.csproj
│ │ │ │ │ └── launchSettings.json
│ │ │ ├── creating-a-plugin.md
│ │ │ ├── event-flow.md
│ │ │ ├── images
│ │ │ │ ├── EventFlow.drawio
│ │ │ │ ├── EventFlow.png
│ │ │ │ └── VSCreateItem.png
│ │ │ ├── linuxSupport.md
│ │ │ └── types-rundown.md
│ │ ├── docs
│ │ │ └── README.md
│ │ └── gettingSource.md
│ └── guide
│ │ ├── README.md
│ │ ├── codeExample
│ │ └── tournamentTokens.js
│ │ ├── configuration.md
│ │ ├── gamma.md
│ │ ├── getting-started.md
│ │ ├── in-game-overlays.md
│ │ └── tournament-mode.md
├── package.json
└── yarn.lock
├── images
├── logo.png
└── webOverlay.jpg
├── innoSetup
├── browserOverlayScript.iss
├── license.txt
├── osuOverlayScript.iss
└── setupScript.iss
├── msbuild.rsp
├── nuget.config
├── osu!StreamCompanion.sln
├── osu!StreamCompanion.sln.DotSettings
├── osu!StreamCompanion
├── App.config
├── Code
│ ├── Core
│ │ ├── DiContainer.cs
│ │ ├── Initializer.cs
│ │ ├── Loggers
│ │ │ ├── ConsoleLogger.cs
│ │ │ ├── EmptyLogger.cs
│ │ │ ├── FileLogger.cs
│ │ │ ├── MainLogger.cs
│ │ │ ├── PluginLogger.cs
│ │ │ └── SentryLogger.cs
│ │ ├── Maps
│ │ │ └── Processing
│ │ │ │ ├── MapDataGetter.cs
│ │ │ │ └── OsuEventHandler.cs
│ │ ├── Plugins
│ │ │ ├── AssemblyLoader.cs
│ │ │ ├── LocalPluginComparer.cs
│ │ │ ├── LocalPluginEntry.cs
│ │ │ ├── LocalPluginManager.cs
│ │ │ ├── PluginEntryUserControl.Designer.cs
│ │ │ ├── PluginEntryUserControl.cs
│ │ │ ├── PluginEntryUserControl.resx
│ │ │ ├── PluginManagerConfiguration.cs
│ │ │ ├── PluginManagerSettings.cs
│ │ │ ├── PluginManagerSettingsUserControl.Designer.cs
│ │ │ ├── PluginManagerSettingsUserControl.cs
│ │ │ └── PluginManagerSettingsUserControl.resx
│ │ ├── Savers
│ │ │ ├── MainSaver.cs
│ │ │ └── TextSaver.cs
│ │ └── Settings.cs
│ ├── Helpers
│ │ ├── AsyncBindingHelper.cs
│ │ ├── Exceptions.cs
│ │ ├── GetDotNetVersion.cs
│ │ ├── Helpers.cs
│ │ ├── ListExtensions.cs
│ │ └── StringExtensions.cs
│ ├── Misc
│ │ ├── FileChecker.cs
│ │ ├── IModule.cs
│ │ ├── ImpatientWebClient.cs
│ │ └── NativeMethods.cs
│ ├── Modules
│ │ ├── AdministratorChecker.cs
│ │ ├── Donation
│ │ │ ├── Donation.cs
│ │ │ ├── DonationSettings.Designer.cs
│ │ │ ├── DonationSettings.cs
│ │ │ └── DonationSettings.resx
│ │ ├── FileSaveLocation
│ │ │ ├── FileSaveLocation.cs
│ │ │ ├── FileSaveLocationSettings.Designer.cs
│ │ │ ├── FileSaveLocationSettings.cs
│ │ │ └── FileSaveLocationSettings.resx
│ │ ├── Logger
│ │ │ ├── LoggerSettings.cs
│ │ │ ├── LoggerSettingsUserControl.Designer.cs
│ │ │ ├── LoggerSettingsUserControl.cs
│ │ │ └── LoggerSettingsUserControl.resx
│ │ ├── MapDataFinders
│ │ │ └── NoData
│ │ │ │ └── NoDataFinder.cs
│ │ ├── MapDataParsers
│ │ │ └── Parser1
│ │ │ │ ├── MapDataParser.cs
│ │ │ │ ├── ParserSettings.Designer.cs
│ │ │ │ ├── ParserSettings.cs
│ │ │ │ ├── ParserSettings.resx
│ │ │ │ ├── PatternEdit.Designer.cs
│ │ │ │ ├── PatternEdit.cs
│ │ │ │ ├── PatternEdit.resx
│ │ │ │ ├── PatternList.Designer.cs
│ │ │ │ ├── PatternList.cs
│ │ │ │ └── PatternList.resx
│ │ ├── MapDataReplacements
│ │ │ └── Map
│ │ │ │ └── MapReplacement.cs
│ │ ├── TokensPreview
│ │ │ ├── DrawingControl.cs
│ │ │ ├── TokensPreview.cs
│ │ │ ├── TokensPreviewSettings.Designer.cs
│ │ │ ├── TokensPreviewSettings.cs
│ │ │ └── TokensPreviewSettings.resx
│ │ ├── Updater
│ │ │ ├── UpdateContainer.cs
│ │ │ ├── UpdateForm.Designer.cs
│ │ │ ├── UpdateForm.cs
│ │ │ ├── UpdateForm.resx
│ │ │ └── Updater.cs
│ │ ├── osuFallbackDetector
│ │ │ └── OsuFallbackDetector.cs
│ │ └── osuPathReslover
│ │ │ ├── osuPathResolver.cs
│ │ │ ├── osuPathResolverSettings.Designer.cs
│ │ │ ├── osuPathResolverSettings.cs
│ │ │ └── osuPathResolverSettings.resx
│ └── Windows
│ │ ├── ErrorFrm.cs
│ │ ├── ErrorFrm.designer.cs
│ │ ├── ErrorFrm.resx
│ │ └── MainWindowEntities.cs
├── Program.cs
├── Properties
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ ├── Resources.resx
│ ├── Settings.Designer.cs
│ ├── Settings.settings
│ └── app.manifest
├── Resources
│ ├── btn_donate_92x26.png
│ ├── compiled.ico
│ └── logo_256x256.png
└── osu!StreamCompanion.csproj
├── plugins
├── BackgroundImageProvider
│ ├── BackgroundImageProvider.csproj
│ ├── BackgroundImageProviderPlugin.cs
│ └── Properties
│ │ └── AssemblyInfo.cs
├── BeatmapPpReplacements
│ ├── BeatmapPpReplacements.csproj
│ ├── PpReplacements.cs
│ └── Properties
│ │ └── AssemblyInfo.cs
├── ClickCounter
│ ├── ClickCounter.cs
│ ├── ClickCounter.csproj
│ ├── ClickCounter.sln
│ ├── ClickCounterFileName.Designer.cs
│ ├── ClickCounterFileName.cs
│ ├── ClickCounterFileName.resx
│ ├── ClickCounterSettings.Designer.cs
│ ├── ClickCounterSettings.cs
│ ├── ClickCounterSettings.resx
│ ├── KeyClickFrm.Designer.cs
│ ├── KeyClickFrm.cs
│ ├── KeyClickFrm.resx
│ ├── KeyboardCounterKeyClick.Designer.cs
│ ├── KeyboardCounterKeyClick.cs
│ ├── KeyboardCounterKeyClick.resx
│ ├── KeyboardCounterMain.Designer.cs
│ ├── KeyboardCounterMain.cs
│ ├── KeyboardCounterMain.resx
│ ├── KeyboardListener.cs
│ ├── KeysPerX.Designer.cs
│ ├── KeysPerX.cs
│ ├── KeysPerX.resx
│ ├── Models
│ │ ├── Configuration.cs
│ │ └── KeyEntry.cs
│ ├── MouseListener.cs
│ ├── MouseMessages.cs
│ └── Properties
│ │ └── AssemblyInfo.cs
├── FileMapDataSender
│ ├── FileMapDataSender.cs
│ ├── FileMapDataSender.csproj
│ ├── FileMapManager.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── packages.config
├── Gamma
│ ├── Gamma.cs
│ ├── Gamma.csproj
│ ├── GammaPlugin.cs
│ ├── GammaSettings.Designer.cs
│ ├── GammaSettings.cs
│ ├── GammaSettings.resx
│ └── Models
│ │ ├── Configuration.cs
│ │ └── GammaRange.cs
├── IngameOverlays
│ ├── BrowserOverlay
│ │ ├── BrowserIngameOverlay.csproj
│ │ ├── BrowserOverlay.cs
│ │ ├── BrowserOverlaySettings.Designer.cs
│ │ ├── BrowserOverlaySettings.cs
│ │ ├── BrowserOverlaySettings.resx
│ │ ├── OverlayDownload.Designer.cs
│ │ ├── OverlayDownload.cs
│ │ └── OverlayDownload.resx
│ ├── Overlay.Common
│ │ ├── Dlls
│ │ │ └── X32ProcessOverlayHelper.exe
│ │ ├── Loader
│ │ │ ├── DllInjectionResult.cs
│ │ │ ├── DllInjector.cs
│ │ │ ├── InjectionResult.cs
│ │ │ ├── KnownOsuModules.cs
│ │ │ ├── Loader.cs
│ │ │ ├── LoaderWatchdog.cs
│ │ │ └── ProcessExtensions.cs
│ │ ├── Overlay.Common.csproj
│ │ ├── OverlayReport.cs
│ │ └── ReportType.cs
│ └── TextOverlay
│ │ ├── Dlls
│ │ ├── freetype.dll
│ │ └── textOverlay.dll
│ │ ├── Properties
│ │ └── AssemblyInfo.cs
│ │ ├── TextIngameOverlay.csproj
│ │ ├── TextOverlay.cs
│ │ ├── TextOverlaySettings.Designer.cs
│ │ ├── TextOverlaySettings.cs
│ │ ├── TextOverlaySettings.resx
│ │ ├── osuOverlayPlugin.sln
│ │ └── packages.config
├── LiveVisualizer
│ ├── Chart.xaml
│ ├── Chart.xaml.cs
│ ├── ColorHelpers.cs
│ ├── ColorPickerWithPreview.Designer.cs
│ ├── ColorPickerWithPreview.cs
│ ├── ColorPickerWithPreview.resx
│ ├── ConfigEntrys.cs
│ ├── FodyWeavers.xml
│ ├── FodyWeavers.xsd
│ ├── LiveVisualizer.csproj
│ ├── LiveVisualizerPlugin.cs
│ ├── LiveVisualizerPluginBase.cs
│ ├── LiveVisualizerSettings.Designer.cs
│ ├── LiveVisualizerSettings.cs
│ ├── LiveVisualizerSettings.resx
│ ├── MainWindow.xaml
│ ├── MainWindow.xaml.cs
│ ├── Models
│ │ ├── DataPlotBinding.cs
│ │ ├── Interfaces
│ │ │ ├── IVisualizerConfiguration.cs
│ │ │ ├── IVisualizerDisplayData.cs
│ │ │ └── IWpfVisualizerData.cs
│ │ ├── VisualizerConfiguration.cs
│ │ ├── VisualizerDataModel.cs
│ │ └── VisualizerDisplayData.cs
│ ├── Properties
│ │ ├── Annotations.cs
│ │ ├── Resources.Designer.cs
│ │ └── Resources.resx
│ └── packages.config
├── MSNEventSource
│ ├── FirstRunMsn.Designer.cs
│ ├── FirstRunMsn.cs
│ ├── FirstRunMsn.resx
│ ├── MSNEventSource.csproj
│ ├── Msn.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── packages.config
├── ModImageGenerator
│ ├── API
│ │ ├── ImageDeployer.cs
│ │ └── ImageGenerator.cs
│ ├── Images
│ │ ├── DT.png
│ │ ├── HD.png
│ │ ├── HR.png
│ │ ├── HT.png
│ │ ├── K4.png
│ │ ├── K5.png
│ │ ├── K6.png
│ │ ├── K7.png
│ │ ├── K8.png
│ │ ├── NC.png
│ │ ├── NF.png
│ │ ├── PF.png
│ │ ├── RN.png
│ │ ├── RX.png
│ │ ├── RX2.png
│ │ ├── SD.png
│ │ ├── SO.png
│ │ └── TP.png
│ ├── ModImageGenerator.cs
│ ├── ModImageGenerator.csproj
│ ├── ModImageGeneratorSettings.Designer.cs
│ ├── ModImageGeneratorSettings.cs
│ ├── ModImageGeneratorSettings.resx
│ ├── Properties
│ │ ├── Resources.Designer.cs
│ │ └── Resources.resx
│ └── packages.config
├── ModsHandler
│ ├── DifficultyCalculator.cs
│ ├── ModParser.cs
│ ├── ModParserSettings.Designer.cs
│ ├── ModParserSettings.cs
│ ├── ModParserSettings.resx
│ ├── ModsHandler.cs
│ ├── ModsHandler.csproj
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── packages.config
├── ModsHandlerTests
│ ├── DifficultyCalculatorTests.cs
│ └── ModsHandlerTests.csproj
├── OBS
│ ├── data
│ │ └── obs-plugins
│ │ │ └── obs-text-sc
│ │ │ └── locale
│ │ │ ├── ar-SA.ini
│ │ │ ├── az-AZ.ini
│ │ │ ├── ba-RU.ini
│ │ │ ├── bg-BG.ini
│ │ │ ├── bn-BD.ini
│ │ │ ├── ca-ES.ini
│ │ │ ├── cs-CZ.ini
│ │ │ ├── da-DK.ini
│ │ │ ├── de-DE.ini
│ │ │ ├── el-GR.ini
│ │ │ ├── en-GB.ini
│ │ │ ├── en-US.ini
│ │ │ ├── es-ES.ini
│ │ │ ├── et-EE.ini
│ │ │ ├── eu-ES.ini
│ │ │ ├── fa-IR.ini
│ │ │ ├── fi-FI.ini
│ │ │ ├── fil-PH.ini
│ │ │ ├── fr-FR.ini
│ │ │ ├── gd-GB.ini
│ │ │ ├── gl-ES.ini
│ │ │ ├── he-IL.ini
│ │ │ ├── hi-IN.ini
│ │ │ ├── hr-HR.ini
│ │ │ ├── hu-HU.ini
│ │ │ ├── id-ID.ini
│ │ │ ├── it-IT.ini
│ │ │ ├── ja-JP.ini
│ │ │ ├── ka-GE.ini
│ │ │ ├── kab-KAB.ini
│ │ │ ├── kmr-TR.ini
│ │ │ ├── ko-KR.ini
│ │ │ ├── lo-LA.ini
│ │ │ ├── mn-MN.ini
│ │ │ ├── ms-MY.ini
│ │ │ ├── nb-NO.ini
│ │ │ ├── nl-NL.ini
│ │ │ ├── nn-NO.ini
│ │ │ ├── pl-PL.ini
│ │ │ ├── pt-BR.ini
│ │ │ ├── pt-PT.ini
│ │ │ ├── ro-RO.ini
│ │ │ ├── ru-RU.ini
│ │ │ ├── sk-SK.ini
│ │ │ ├── sl-SI.ini
│ │ │ ├── sr-CS.ini
│ │ │ ├── sr-SP.ini
│ │ │ ├── sv-SE.ini
│ │ │ ├── ta-IN.ini
│ │ │ ├── tl-PH.ini
│ │ │ ├── tr-TR.ini
│ │ │ ├── uk-UA.ini
│ │ │ ├── vi-VN.ini
│ │ │ ├── zh-CN.ini
│ │ │ └── zh-TW.ini
│ ├── obs-plugins
│ │ ├── 32bit
│ │ │ └── obs-text-sc.dll
│ │ └── 64bit
│ │ │ └── obs-text-sc.dll
│ └── obs-text-sc.cpp
├── OsuMapLoader
│ ├── BeatmapLoadFailedException.cs
│ ├── LazerMapLoader.cs
│ ├── LazerNullReferenceException.cs
│ ├── OsuMapLoader.csproj
│ ├── OsuMapLoaderPlugin.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── packages.config
├── OsuMemoryEventSource
│ ├── Extensions
│ │ ├── PlayerScoreExtensions.cs
│ │ └── ScPlayerScore.cs
│ ├── FirstRunMemoryCalibration.Designer.cs
│ ├── FirstRunMemoryCalibration.cs
│ ├── FirstRunMemoryCalibration.resx
│ ├── Helpers.cs
│ ├── InterpolatedValue.cs
│ ├── LivePerformanceCalculator.cs
│ ├── LiveTokens
│ │ ├── BaseLiveToken.cs
│ │ ├── LazyLiveToken.cs
│ │ └── LiveToken.cs
│ ├── MemoryDataFinderSettings.Designer.cs
│ ├── MemoryDataFinderSettings.cs
│ ├── MemoryDataFinderSettings.resx
│ ├── MemoryDataProcessor.cs
│ ├── MemoryListener.cs
│ ├── OsuMemoryEventSource.cs
│ ├── OsuMemoryEventSource.csproj
│ ├── OsuMemoryEventSourceBase.cs
│ ├── PatternsDispatcher.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── packages.config
├── PlaysReplacements
│ ├── PlaysReplacements.cs
│ ├── PlaysReplacements.csproj
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ └── packages.config
├── ScGui
│ ├── AboutForm.Designer.cs
│ ├── AboutForm.cs
│ ├── AboutForm.resx
│ ├── AsyncBindingHelper.cs
│ ├── Comfortaa.ttf
│ ├── Helpers.cs
│ ├── MainWindow.xaml
│ ├── MainWindow.xaml.cs
│ ├── MainWindowPlugin.cs
│ ├── Properties
│ │ ├── AssemblyInfo.cs
│ │ ├── Resources.Designer.cs
│ │ └── Resources.resx
│ ├── Resources
│ │ └── btn_donate_92x26.png
│ ├── ScGui.csproj
│ ├── ScGui.sln
│ ├── ScGuiSettings.Designer.cs
│ ├── ScGuiSettings.cs
│ ├── ScGuiSettings.resx
│ ├── SettingsForm.Designer.cs
│ ├── SettingsForm.cs
│ ├── SettingsForm.resx
│ ├── WindowsTheme.cs
│ ├── app.config
│ ├── packages.config
│ └── themes
│ │ ├── dark.xaml
│ │ └── light.xaml
├── TcpSocketDataSender
│ ├── BinaryRetryBlocker.cs
│ ├── BlockedTcpSocketManager.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── RetryBlocker.cs
│ ├── TcpSocketDataGetter.cs
│ ├── TcpSocketDataSender.csproj
│ ├── TcpSocketManager.cs
│ ├── TcpSocketSettings.Designer.cs
│ ├── TcpSocketSettings.cs
│ ├── TcpSocketSettings.resx
│ └── packages.config
├── TestPlugin
│ ├── GlobalUsings.cs
│ ├── TestPlugin.cs
│ └── TestPlugin.csproj
├── WebSocketDataSender
│ ├── HttpServer.cs
│ ├── ISCWebModule.cs
│ ├── ImageExtensions.cs
│ ├── LockingQueue.cs
│ ├── MapStatsModule.cs
│ ├── NetExtensions.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── WebOverlay
│ │ ├── ColorHelpers.cs
│ │ ├── ColorPickerWithPreview.Designer.cs
│ │ ├── ColorPickerWithPreview.cs
│ │ ├── ColorPickerWithPreview.resx
│ │ ├── MathExtensions.cs
│ │ ├── Models
│ │ │ ├── IOverlayConfiguration.cs
│ │ │ └── OverlayConfiguration.cs
│ │ ├── WebOverlay.cs
│ │ ├── WebOverlaySettings.Designer.cs
│ │ ├── WebOverlaySettings.cs
│ │ └── WebOverlaySettings.resx
│ ├── WebSocketDataGetter.cs
│ ├── WebSocketDataSender.csproj
│ ├── WebSocketKeyValueEndpoint.cs
│ ├── WebSocketOutputPatternsEndpoint.cs
│ ├── WebSocketTokenEndpoint.cs
│ └── packages.config
├── X32ProcessHelper
│ ├── Directory.Packages.props
│ ├── X32ProcessHelper.vcxproj
│ ├── X32ProcessHelper.vcxproj.filters
│ └── main.cpp
└── osuPost
│ ├── Properties
│ └── AssemblyInfo.cs
│ ├── osuPost.cs
│ ├── osuPost.csproj
│ ├── osuPost.sln
│ ├── osuPostApi.cs
│ ├── osuPostSettings.Designer.cs
│ ├── osuPostSettings.cs
│ ├── osuPostSettings.resx
│ └── packages.config
└── submodules
└── Directory.Packages.props
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.cs]
2 |
3 | # CA1416: Validate platform compatibility
4 | dotnet_diagnostic.CA1416.severity = none
5 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: https://www.buymeacoffee.com/Piotrekol # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.github/workflows/docs.yml:
--------------------------------------------------------------------------------
1 | name: GitHub Pages
2 |
3 | on:
4 | push:
5 | branches:
6 | - master
7 | paths:
8 | - "docs/**"
9 | - .github/workflows/docs.yml
10 |
11 | jobs:
12 | deploy:
13 | runs-on: ubuntu-20.04
14 | concurrency:
15 | group: ${{ github.workflow }}-${{ github.ref }}
16 | steps:
17 | - uses: actions/checkout@v2
18 |
19 | - name: Setup Node
20 | uses: actions/setup-node@v2
21 | with:
22 | node-version: '20'
23 |
24 | - name: Get yarn cache
25 | id: yarn-cache
26 | run: echo "::set-output name=dir::$(yarn cache dir)"
27 |
28 | - name: Cache dependencies
29 | uses: actions/cache@v2
30 | with:
31 | path: ${{ steps.yarn-cache.outputs.dir }}
32 | key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
33 | restore-keys: |
34 | ${{ runner.os }}-yarn-
35 |
36 | - run: cd docs && yarn install --frozen-lockfile
37 | - run: cd docs && yarn docs:build
38 |
39 | - name: Deploy
40 | uses: peaceiris/actions-gh-pages@v3
41 | if: ${{ github.ref == 'refs/heads/master' }}
42 | with:
43 | github_token: ${{ secrets.GITHUB_TOKEN }}
44 | publish_dir: ./docs/docs/.vuepress/dist
45 | commit_message: ${{ github.event.head_commit.message }}
46 | keep_files: true
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "submodules/osu"]
2 | path = submodules/osu
3 | url = https://github.com/Piotrekol/osu
4 | [submodule "webOverlay"]
5 | path = webOverlay
6 | url = https://github.com/Piotrekol/StreamCompanion-overlays
--------------------------------------------------------------------------------
/Directory.Build.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2018 Piotr Partyka (Piotrekol)
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/PpCalculator/PpCalculator.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | net8.0
4 | Library
5 | true
6 | 11.0
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/PpCalculatorTests/PpCalculatorTests.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | net8.0-windows
4 | enable
5 | enable
6 |
7 | false
8 | true
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | PreserveNewest
22 |
23 |
24 |
--------------------------------------------------------------------------------
/PpCalculatorTypes/BreakPeriod.cs:
--------------------------------------------------------------------------------
1 | using Newtonsoft.Json;
2 |
3 | namespace PpCalculatorTypes
4 | {
5 | public class BreakPeriod
6 | {
7 | [JsonProperty("startTime")]
8 | public double StartTime { get; }
9 | [JsonProperty("endTime")]
10 | public double EndTime { get; }
11 | [JsonProperty("hasEffect")]
12 | public bool HasEffect { get; }
13 |
14 | public BreakPeriod(double startTime, double endTime, bool hasEffect)
15 | {
16 | StartTime = startTime;
17 | EndTime = endTime;
18 | HasEffect = hasEffect;
19 | }
20 |
21 | }
22 | }
--------------------------------------------------------------------------------
/PpCalculatorTypes/CatchDifficultyAttributes.cs:
--------------------------------------------------------------------------------
1 | namespace PpCalculatorTypes
2 | {
3 | public class CatchDifficultyAttributes : DifficultyAttributes
4 | {
5 | public int FruitCount;
6 | public int JuiceStreamCount;
7 | public int BananaShowerCount;
8 |
9 | public CatchDifficultyAttributes(double starRating, int maxCombo) : base(starRating, maxCombo)
10 | {
11 | }
12 | }
13 | }
--------------------------------------------------------------------------------
/PpCalculatorTypes/DifficultyAttributes.cs:
--------------------------------------------------------------------------------
1 | namespace PpCalculatorTypes
2 | {
3 | public class DifficultyAttributes
4 | {
5 | public double StarRating;
6 | public int MaxCombo;
7 |
8 | public DifficultyAttributes(double starRating, int maxCombo)
9 | {
10 | StarRating = starRating;
11 | MaxCombo = maxCombo;
12 | }
13 | }
14 | }
--------------------------------------------------------------------------------
/PpCalculatorTypes/KiaiPoint.cs:
--------------------------------------------------------------------------------
1 | using Newtonsoft.Json;
2 |
3 | namespace PpCalculatorTypes
4 | {
5 | public class KiaiPoint
6 | {
7 | public KiaiPoint(double startTime,double duration)
8 | {
9 | StartTime = startTime;
10 | Duration = duration;
11 | }
12 |
13 | [JsonProperty("startTime")]
14 | public double StartTime { get; }
15 | [JsonProperty("duration")]
16 | public double Duration { get; }
17 | }
18 | }
--------------------------------------------------------------------------------
/PpCalculatorTypes/ManiaDifficultyAttributes.cs:
--------------------------------------------------------------------------------
1 | namespace PpCalculatorTypes
2 | {
3 | public class ManiaDifficultyAttributes : DifficultyAttributes
4 | {
5 | public int NoteCount;
6 | public int HoldNoteCount;
7 |
8 | public ManiaDifficultyAttributes(double starRating, int maxCombo) : base(starRating, maxCombo)
9 | {
10 | }
11 | }
12 | }
--------------------------------------------------------------------------------
/PpCalculatorTypes/OsuDifficultyAttributes.cs:
--------------------------------------------------------------------------------
1 | namespace PpCalculatorTypes
2 | {
3 | public class OsuDifficultyAttributes : DifficultyAttributes
4 | {
5 | public double AimStrain;
6 | public double SpeedStrain;
7 | public int HitCircleCount;
8 | public int SpinnerCount;
9 | public int SliderCount;
10 |
11 | public OsuDifficultyAttributes(double starRating, int maxCombo) : base(starRating, maxCombo)
12 | {
13 | }
14 | }
15 | }
--------------------------------------------------------------------------------
/PpCalculatorTypes/PerformanceAttributes/CatchPerformanceAttributes.cs:
--------------------------------------------------------------------------------
1 | namespace PpCalculatorTypes
2 | {
3 | public class CatchPerformanceAttributes : PerformanceAttributes
4 | {
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/PpCalculatorTypes/PerformanceAttributes/ManiaPerformanceAttributes.cs:
--------------------------------------------------------------------------------
1 | namespace PpCalculatorTypes
2 | {
3 | public class ManiaPerformanceAttributes : PerformanceAttributes
4 | {
5 | public double Difficulty { get; set; }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/PpCalculatorTypes/PerformanceAttributes/OsuPerformanceAttributes.cs:
--------------------------------------------------------------------------------
1 | namespace PpCalculatorTypes
2 | {
3 | public class OsuPerformanceAttributes : PerformanceAttributes
4 | {
5 | public double Aim { get; set; }
6 |
7 | public double Speed { get; set; }
8 |
9 | public double Accuracy { get; set; }
10 |
11 | public double Flashlight { get; set; }
12 |
13 | public double EffectiveMissCount { get; set; }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/PpCalculatorTypes/PerformanceAttributes/PerformanceAttributes.cs:
--------------------------------------------------------------------------------
1 | namespace PpCalculatorTypes
2 | {
3 | public class PerformanceAttributes
4 | {
5 | public double Total { get; set; }
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/PpCalculatorTypes/PerformanceAttributes/TaikoPerformanceAttributes.cs:
--------------------------------------------------------------------------------
1 | namespace PpCalculatorTypes
2 | {
3 | public class TaikoPerformanceAttributes : PerformanceAttributes
4 | {
5 | public double Difficulty { get; set; }
6 |
7 | public double Accuracy { get; set; }
8 |
9 | public double EffectiveMissCount { get; set; }
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/PpCalculatorTypes/PpCalculatorTypes.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | net8.0
4 | 11.0
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/PpCalculatorTypes/TaikoDifficultyAttributes.cs:
--------------------------------------------------------------------------------
1 | namespace PpCalculatorTypes
2 | {
3 | public class TaikoDifficultyAttributes : DifficultyAttributes
4 | {
5 | public int HitCount;
6 | public int DrumRollCount;
7 | public int SwellCount;
8 |
9 | public TaikoDifficultyAttributes(double starRating, int maxCombo) : base(starRating, maxCombo)
10 | {
11 | }
12 | }
13 | }
--------------------------------------------------------------------------------
/PpCalculatorTypes/TimingPoint.cs:
--------------------------------------------------------------------------------
1 | using Newtonsoft.Json;
2 |
3 | namespace PpCalculatorTypes
4 | {
5 | public class TimingPoint
6 | {
7 | public TimingPoint(double startTime, double bpm, double beatLength)
8 | {
9 | StartTime = startTime;
10 | BPM = bpm;
11 | BeatLength = beatLength;
12 | }
13 |
14 | [JsonProperty("startTime")]
15 | public double StartTime { get; }
16 | [JsonProperty("bpm")]
17 | public double BPM { get; }
18 | [JsonProperty("beatLength")]
19 | public double BeatLength { get; }
20 | }
21 | }
--------------------------------------------------------------------------------
/StreamCompanion.Common/Consts.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace StreamCompanion.Common
3 | {
4 | public static class Consts
5 | {
6 | public const string SCPLUGIN_TYPENAME = "StreamCompanion";
7 | public const string SCPLUGIN_AUTHOR = "StreamCompanion";
8 | public const string SCPLUGIN_BASEURL = "https://github.com/Piotrekol/StreamCompanion/tree/master/plugins/";
9 | public const string SCPLUGIN_NAME = "StreamCompanion";
10 | public const string SC_BASE_REPO_URL = "https://github.com/Piotrekol/StreamCompanion";
11 |
12 | public const string SCPLUGIN_GUIDE_INGAMEOVERLAYURL = "https://piotrekol.github.io/StreamCompanion/guide/in-game-overlays.html";
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/StreamCompanion.Common/Extensions/CancellationTokenSourceExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Text;
4 | using System.Threading;
5 |
6 | namespace StreamCompanion.Common.Extensions
7 | {
8 | public static class CancellationTokenSourceExtensions
9 | {
10 | public static bool TryCancel(this CancellationTokenSource cancellationTokenSource)
11 | {
12 | try
13 | {
14 | cancellationTokenSource.Cancel();
15 | return true;
16 | }
17 | catch (ObjectDisposedException)
18 | {
19 | return false;
20 | }
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/StreamCompanion.Common/Extensions/MapSearchResultsExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using System.Threading;
4 | using System.Threading.Tasks;
5 | using PpCalculatorTypes;
6 | using StreamCompanionTypes.DataTypes;
7 |
8 | namespace StreamCompanion.Common
9 | {
10 | public static class MapSearchResultsExtensions
11 | {
12 | public static async Task GetPpCalculator(this IMapSearchResult mapSearchResult, CancellationToken cancellationToken)
13 | {
14 | if (!(mapSearchResult.SharedObjects.FirstOrDefault(o => o is CancelableAsyncLazy) is CancelableAsyncLazy ppCalculatorLazy))
15 | return null;
16 |
17 | var ppCalculator = await ppCalculatorLazy.GetValueAsync(cancellationToken);
18 |
19 | if (ppCalculator == null)
20 | return null;
21 |
22 | ppCalculator = (IPpCalculator)ppCalculator.Clone();
23 | return ppCalculator;
24 | }
25 | }
26 | }
--------------------------------------------------------------------------------
/StreamCompanion.Common/Extensions/MathExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace StreamCompanion.Common
4 | {
5 | public static class MathExtensions
6 | {
7 | public static T Clamp(this T val, T min, T max) where T : IComparable
8 | {
9 | if (val.CompareTo(min) < 0) return min;
10 | else if (val.CompareTo(max) > 0) return max;
11 | else return val;
12 | }
13 | }
14 | }
--------------------------------------------------------------------------------
/StreamCompanion.Common/Extensions/PluginExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Concurrent;
3 | using System.Reflection;
4 | using StreamCompanionTypes.Attributes;
5 | using StreamCompanionTypes.Interfaces;
6 |
7 | namespace StreamCompanion.Common
8 | {
9 | public static class PluginExtensions
10 | {
11 | private static ConcurrentDictionary PluginMetadataCache = new();
12 | public static IPluginMetadata GetPluginMetadata(this IPlugin plugin)
13 | => plugin.GetType().GetPluginMetadata();
14 |
15 | public static IPluginMetadata GetPluginMetadata(this Type pluginType)
16 | => PluginMetadataCache.GetOrAdd(pluginType, type => type.GetCustomAttribute());
17 | }
18 | }
--------------------------------------------------------------------------------
/StreamCompanion.Common/Extensions/ProcessExtensions.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics;
2 |
3 | namespace StreamCompanion.Common
4 | {
5 | public static class ProcessExt
6 | {
7 | public static Process OpenUrl(string url)
8 | {
9 | var psi = new ProcessStartInfo
10 | {
11 | FileName = url,
12 | UseShellExecute = true
13 | };
14 | return Process.Start(psi);
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/StreamCompanion.Common/Extensions/StringExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace StreamCompanion.Common
4 | {
5 | public static class StringExtensions
6 | {
7 | public static string RemoveWhitespace(this string str)
8 | {
9 | return string.Join("", str.Split(default(string[]), StringSplitOptions.RemoveEmptyEntries));
10 | }
11 | }
12 | }
--------------------------------------------------------------------------------
/StreamCompanion.Common/Extensions/TaskExtensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading;
3 | using System.Threading.Tasks;
4 |
5 | namespace StreamCompanion.Common
6 | {
7 | public static class TaskExtensions
8 | {
9 | public static Action GlobalExceptionHandler { get; set; }
10 |
11 | public static Task HandleExceptions(this Task task)
12 | {
13 | return task.ContinueWith((task, state) =>
14 | {
15 | GlobalExceptionHandler(task.Exception);
16 | }, null, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted,TaskScheduler.Default);
17 | }
18 | }
19 | }
--------------------------------------------------------------------------------
/StreamCompanion.Common/Extensions/TokensExtensions.cs:
--------------------------------------------------------------------------------
1 | using StreamCompanionTypes.DataTypes;
2 | using System;
3 | using System.Threading;
4 | using System.Threading.Tasks;
5 | using StreamCompanionTypes.Enums;
6 |
7 | namespace StreamCompanion.Common
8 | {
9 | public static class TokensExtensions
10 | {
11 | public static Action> LiveTokenSetter { private get; set; }
12 |
13 | ///
14 | /// Adds token to existing live token update loop, which is synced with internal osu! memory data updates.
15 | ///
16 | /// Configured live token
17 | /// Value generator for the token
18 | public static async Task ConvertToLiveToken(this IToken token, Func