public virtual void Start(ILogger logger)
        {
            Logger = logger;

            OsuMemoryDataProvider.DataProvider.Initalize();
            _memoryReader = OsuMemoryDataProvider.DataProvider.Instance;

            _settings.SettingUpdated += OnSettingsSettingUpdated;

            bool isFallback             = _settings.Get <bool>(_names.OsuFallback);
            bool memoryScannerIsEnabled = _settings.Get <bool>(_names.EnableMemoryScanner);

            MemoryPoolingIsEnabled = _settings.Get <bool>(_names.EnableMemoryPooling);

            if (!memoryScannerIsEnabled)
            {
                return;
            }
            if (isFallback)
            {
                _settings.Add(_names.EnableMemoryScanner.Name, false);
                return;
            }

            lock (_lockingObject)
                _timer = new Timer(TimerCallback, null, 250, Int32.MaxValue);


            _memoryListener              = new MemoryListener(Helpers.GetFullSongsLocation(_settings));
            _memoryListener.NewOsuEvent += (s, args) => NewOsuEvent?.Invoke(this, args);
            _memoryListener.SetHighFrequencyDataHandlers(_highFrequencyDataHandlers);
            _memoryListener.SetSettingsHandle(_settings);

            Started = true;
        }
Пример #2
0
 public Form1(string osuWindowTitleHint)
 {
     _osuWindowTitleHint = osuWindowTitleHint;
     InitializeComponent();
     _reader  = OsuMemoryReader.Instance.GetInstanceForWindowTitleHint(osuWindowTitleHint);
     Shown   += OnShown;
     Closing += OnClosing;
     numericUpDown_readDelay.ValueChanged += NumericUpDownReadDelayOnValueChanged;
 }
Пример #3
0
 public OsuStateWriter(int socketPort)
 {
     _reader          = OsuMemoryReader.Instance.GetInstanceForWindowTitleHint("osu!");
     _webSocketServer = new WebSocketServer(IPAddress.Parse(_webSocketAddress), socketPort);
     _webSocketServer.ReuseAddress = true;
     _webSocketServer.WaitTime     = TimeSpan.FromSeconds(30);
     _webSocketServer.AddWebSocketService("/GifToTheBeatOsuDataFeed", () => new DataSender(_dataContainer));
     _webSocketServer.Start();
 }
Пример #4
0
        public MainForm()
        {
            InitializeComponent();

            nobg = Image.FromFile(nobgpng);

            // init control lists
            dumbLabels = new List <Label>
            {
                hplabel, cslabel, arlabel, odlabel,
                label2, label4, label5
            };
            diffDisplays = new List <TextBox>
            {
                HPDisplay, CSDisplay, ARDisplay, ODDisplay
            };
            diffSliders = new List <OptionSlider>
            {
                HPSlider, CSSlider, ARSlider, ODSlider
            };

            // load user settings
            if (Directory.Exists(Properties.Settings.Default.SongsFolder))
            {
                userSongsFolder = Properties.Settings.Default.SongsFolder;
            }

            // Init object instances
            osuReader = OsuMemoryReader.Instance.GetInstanceForWindowTitleHint("");
            editor    = new BeatmapEditor(this);

            // Add event handlers (observers)
            editor.StateChanged     += ToggleDumbLabels;
            editor.StateChanged     += ToggleGenerateButton;
            editor.StateChanged     += ToggleHpCsArOdDisplay;
            editor.StateChanged     += ToggleDifficultyDisplay;
            editor.StateChanged     += ToggleBpmUpDown;
            editor.StateChanged     += ToggleBpmDisplay;
            editor.BeatmapSwitched  += UpdateSongDisplay;
            editor.BeatmapModified  += UpdateBpmDisplay;
            editor.BeatmapModified  += UpdateHpCsArOdDisplay;
            editor.BeatmapModified  += UpdateDifficultyDisplay;
            editor.BeatmapModified  += ToggleGenerateButton;
            editor.BeatmapModified  += UpdateBpmUpDown;
            editor.ControlsModified += UpdateLockButtons;
            editor.ControlsModified += UpdateScaleButtons;
            editor.ControlsModified += UpdateChanGePitchButton;

            // need controls to show up as initially disabled
            editor.ForceEventStateChanged();
            editor.ForceEventBeatmapSwitched();
            editor.ForceEventControlsModified();

            BeatmapUpdateTimer.Start();
            OsuRunningTimer.Start();
        }
Пример #5
0
        public FirstRunMemoryCalibration(IOsuMemoryReader reader, ISettingsHandler settings)
        {
            memoryReader = reader;
            _settings    = settings;

            InitializeComponent();
            this.pictureBox1.Image = GetStreamCompanionLogo();
            _settings.Add(_names.EnableMemoryScanner.Name, false);
            _settings.Add(_names.EnableMemoryPooling.Name, false);
            CurrentMap = _maps[rnd.Next(0, _maps.Count)];
        }
Пример #6
0
        public Form1(string osuWindowTitleHint)
        {
            _osuWindowTitleHint = osuWindowTitleHint;
            InitializeComponent();
#pragma warning disable CS0618 // Type or member is obsolete
            _reader = OsuMemoryReader.Instance.GetInstanceForWindowTitleHint(osuWindowTitleHint);
#pragma warning restore CS0618 // Type or member is obsolete
            _sreader = StructuredOsuMemoryReader.Instance.GetInstanceForWindowTitleHint(osuWindowTitleHint);
            Shown   += OnShown;
            Closing += OnClosing;
            numericUpDown_readDelay.ValueChanged += NumericUpDownReadDelayOnValueChanged;
        }
Пример #7
0
        public void Tick(IOsuMemoryReader reader, bool sendEvents)
        {
            _currentStatus = reader.GetCurrentStatus(out _);
            if (_lastStatusLog != _currentStatus)
            {
                _lastStatusLog = _currentStatus;
                //Console.WriteLine("status: {0} {1}", _currentStatus, _currentStatus == OsuMemoryStatus.Unknown ? num.ToString() : "");
            }

            if (_currentStatus != OsuMemoryStatus.NotRunning)
            {
                _currentMapId     = reader.GetMapId();
                _currentMapString = reader.GetSongString();
                OsuStatus status           = _currentStatus.Convert();
                var       gameMode         = reader.ReadSongSelectGameMode();
                var       mapHash          = reader.GetMapMd5Safe();
                var       mapSelectionMods = reader.GetMods();
                var       mapHashDiffers   = mapHash != null && _lastMapHash != null && _lastMapHash != mapHash;

                if (sendEvents &&
                    (_lastMapId != _currentMapId ||
                     _lastStatus != _currentStatus ||
                     _currentMapString != _lastMapString ||
                     gameMode != _lastGameMode ||
                     mapSelectionMods != _lastMapSelectionMods ||
                     mapHashDiffers)
                    )
                {
                    _lastMapId            = _currentMapId;
                    _lastStatus           = _currentStatus;
                    _lastMapString        = _currentMapString;
                    _lastGameMode         = gameMode;
                    _lastMapSelectionMods = mapSelectionMods;
                    _lastMapHash          = mapHash;


                    NewOsuEvent?.Invoke(this, new MapSearchArgs("OsuMemory")
                    {
                        MapId    = _currentMapId,
                        Status   = status,
                        Raw      = _currentMapString,
                        MapHash  = mapHash,
                        PlayMode = (PlayMode)gameMode,
                    });
                }

                _memoryDataProcessor.Tick(status, reader);
            }
        }
        public OsuMemoryEventSourceBase(IContextAwareLogger logger, ISettings settings,
                                        IDatabaseController databaseControler, IModParser modParser,
                                        List <IHighFrequencyDataConsumer> highFrequencyDataConsumers, ISaver saver)
        {
            _settings                   = settings;
            _databaseController         = databaseControler;
            _modParser                  = modParser;
            _highFrequencyDataConsumers = highFrequencyDataConsumers;
            Logger          = logger;
            LiveTokenSetter = Tokens.CreateTokenSetter(Name);
            TokenSetter     = Tokens.CreateTokenSetter($"{Name}-Regular");
            _memoryReader   = OsuMemoryReader.Instance;

            _settings.SettingUpdated += OnSettingsSettingUpdated;

            bool isFallback             = _settings.Get <bool>(_names.OsuFallback);
            bool memoryScannerIsEnabled = _settings.Get <bool>(_names.EnableMemoryScanner);

            MemoryPoolingIsEnabled = _settings.Get <bool>(_names.EnableMemoryPooling);

            _poolingMsDelay = _settings.Get <int>(_names.MemoryPoolingFrequency);
            if (!memoryScannerIsEnabled)
            {
                return;
            }
            if (isFallback)
            {
                _settings.Add(_names.EnableMemoryScanner.Name, false);
                return;
            }

            lock (_lockingObject)
                _timer = new Timer(TimerCallback, null, 250, Int32.MaxValue);


            _memoryListener              = new MemoryListener(settings, saver, logger);
            _memoryListener.NewOsuEvent += async(s, args) =>
            {
                while (NewOsuEvent == null)
                {
                    await Task.Delay(5);
                }

                NewOsuEvent.Invoke(this, args);
            };
            _memoryListener.SetHighFrequencyDataHandlers(_highFrequencyDataConsumers);

            Started = true;
        }
Пример #9
0
        public void Tick(OsuStatus status, IOsuMemoryReader reader)
        {
            lock (_lockingObject)
            {
                _tokenCallbackTick.WaitOne();
                if (!ReferenceEquals(_reader, reader))
                {
                    _reader = reader;
                }

                liveTokens["status"].Value = _lastStatus;

                if (status != OsuStatus.Playing)
                {
                    if (_clearLiveTokensAfterResultScreenExit && !_clearedLiveTokens && (status & OsuStatus.ResultsScreen) == 0)
                    {//we're not playing or we haven't just finished playing - clear
                        ResetOutput();
                        ResetTokens();
                        _lastStatus        = status;
                        _clearedLiveTokens = true;
                    }

                    _rawData.PlayTime = reader.ReadPlayTime();
                    PrepareTimeToken();
                    return;
                }

                if (_lastStatus != OsuStatus.Playing)
                {
                    Thread.Sleep(500);//Initial play delay
                }

                _clearedLiveTokens = false;
                _lastStatus        = status;


                reader.GetPlayData(_rawData.Play);
                _rawData.HitErrors = reader.HitErrors() ?? new List <int>();

                _rawData.PlayTime = reader.ReadPlayTime();
                PrepareTimeToken();

                _tokenTick?.Set();
            }
        }
Пример #10
0
        public void Tick(OsuStatus status, IOsuMemoryReader reader)
        {
            _notUpdatingTokens.WaitOne();
            _notUpdatingMemoryValues.Reset();
            lock (_lockingObject)
            {
                if (!ReferenceEquals(_reader, reader))
                {
                    _reader = reader;
                }
                if ((OsuStatus)_liveTokens["status"].Token.Value != status)
                {
                    _liveTokens["status"].Token.Value = status;
                }

                if (status != OsuStatus.Playing && status != OsuStatus.Watching)
                {
                    _rawData.PlayTime = reader.ReadPlayTime();
                    UpdateLiveTokens(status);
                    _lastStatus = status;
                    _notUpdatingMemoryValues.Set();
                    return;
                }

                if (_lastStatus != OsuStatus.Playing && _lastStatus != OsuStatus.Watching)
                {
                    _newPlayStarted.Set();
                    Thread.Sleep(500);//Initial play delay
                }

                reader.GetPlayData(_rawData.Play);
                //TODO: change this on OsuMemoryReader side (read v2 in getPlayData & return 0 as default instead of -1)
                _rawData.Play.Score = Math.Max(0, _reader.ReadScoreV2());

                _rawData.HitErrors = reader.HitErrors() ?? new List <int>();

                _rawData.PlayTime = reader.ReadPlayTime();
                _liveTokens["time"].Update();

                _lastStatus = status;
            }
            _notUpdatingMemoryValues.Set();
        }
        public void Tick(OsuStatus status, IOsuMemoryReader reader)
        {
            lock (_lockingObject)
            {
                PrepareTimeToken(reader.ReadPlayTime());

                if (status != OsuStatus.Playing)
                {
                    if (_clearLiveTokensAfterResultScreenExit && !_clearedLiveTokens && (status & OsuStatus.ResultsScreen) == 0)
                    {//we're not playing or we haven't just finished playing - clear
                        ResetOutput();
                        ResetTokens();
                        _lastStatus        = status;
                        _clearedLiveTokens = true;
                    }


                    return;
                }

                if (_lastStatus != OsuStatus.Playing)
                {
                    Thread.Sleep(500);//Initial play delay
                    //var readGamemode = reader.ReadPlayedGameMode();
                    //var playMode = (PlayMode) (Enum.IsDefined(typeof(PlayMode), readGamemode) ? readGamemode : 0);
                    //_rawData.SetPlayMode(playMode);
                }

                _clearedLiveTokens = false;

                _lastStatus = status;

                reader.GetPlayData(_rawData.Play);

                PrepareLiveTokens();

                SendData();
            }
        }
Пример #12
0
        public void Tick(OsuStatus status, IOsuMemoryReader reader)
        {
            lock (_lockingObject)
            {
                _tokenCallbackTick.WaitOne();
                if (!ReferenceEquals(_reader, reader))
                {
                    _reader = reader;
                }
                if ((OsuStatus)_liveTokens["status"].Token.Value != status)
                {
                    _liveTokens["status"].Token.Value = status;
                }

                if (status != OsuStatus.Playing)
                {
                    _rawData.PlayTime = reader.ReadPlayTime();
                    UpdateLiveTokens(status);
                    _lastStatus = status;
                    return;
                }

                if (_lastStatus != OsuStatus.Playing)
                {
                    Thread.Sleep(500);//Initial play delay
                }

                reader.GetPlayData(_rawData.Play);
                _rawData.HitErrors = reader.HitErrors() ?? new List <int>();

                _rawData.PlayTime = reader.ReadPlayTime();
                _liveTokens["time"].Update();

                _tokenTick?.Set();
                _lastStatus = status;
            }
        }
Пример #13
0
 public OsuDataProvider(ISettings settings, IOsuDataService osuDataService)
 {
     this.settings       = settings;
     this.osuDataService = osuDataService;
     this.reader         = OsuMemoryReader.Instance;
 }
Пример #14
0
        public void Tick(IOsuMemoryReader reader, bool sendEvents)
        {
            _currentStatus = reader.GetCurrentStatus(out _);
            if (_lastStatusLog != _currentStatus)
            {
                _lastStatusLog = _currentStatus;
                //Console.WriteLine("status: {0} {1}", _currentStatus, _currentStatus == OsuMemoryStatus.Unknown ? num.ToString() : "");
            }

            if (_currentStatus != OsuMemoryStatus.NotRunning)
            {
                _currentMapId = reader.GetMapId();
                var       isReplay = reader.IsReplay();
                OsuStatus status   = _currentStatus.Convert();
                status = status == OsuStatus.Playing && isReplay
                    ? OsuStatus.Watching
                    : status;

                var gameMode         = reader.ReadSongSelectGameMode();
                var mapHash          = reader.GetMapMd5Safe();
                var mapSelectionMods = reader.GetMods();
                var playingMods      = status == OsuStatus.Playing || status == OsuStatus.Watching
                    ? reader.GetPlayingMods()
                    : -1;
                var retries     = reader.GetRetrys();
                var currentTime = reader.ReadPlayTime();

                var          mapHashDiffers         = mapHash != null && _lastMapHash != null && _lastMapHash != mapHash;
                var          mapIdDiffers           = _lastMapId != _currentMapId;
                var          memoryStatusDiffers    = _lastStatus != _currentStatus;
                var          gameModeDiffers        = gameMode != _lastGameMode;
                var          mapSelectionModsDiffer = mapSelectionMods != _lastMapSelectionMods;
                var          playingModsDiffer      = (status == OsuStatus.Watching || status == OsuStatus.Playing) && playingMods != _lastPlayingMods;
                OsuEventType?osuEventType           = null;
                //"good enough" replay retry detection.
                if (isReplay && _currentStatus == OsuMemoryStatus.Playing && _lastTime > currentTime && DateTime.UtcNow > _nextReplayRetryAllowedAt)
                {
                    osuEventType = OsuEventType.PlayChange;
                    _nextReplayRetryAllowedAt = DateTime.UtcNow.AddMilliseconds(500);
                }

                _lastTime = currentTime;
                var playInitialized = (status != OsuStatus.Watching && status != OsuStatus.Playing) || playingMods != -1;
                if (sendEvents && playInitialized && (
                        osuEventType.HasValue ||
                        mapIdDiffers || memoryStatusDiffers ||
                        mapHashDiffers || gameModeDiffers ||
                        mapSelectionModsDiffer ||
                        retries != _lastRetries
                        )
                    )
                {
                    if (!osuEventType.HasValue || playingModsDiffer)
                    {
                        osuEventType =
                            mapIdDiffers || mapHashDiffers || gameModeDiffers || mapSelectionModsDiffer || playingModsDiffer ? OsuEventType.MapChange //different mapId/hash/mode/mods(changed stats) = different map
                            : memoryStatusDiffers ? OsuEventType.SceneChange                                                                          //memory scene(status) change = Scene change
                            : _currentStatus == OsuMemoryStatus.Playing ? OsuEventType.PlayChange                                                     // map retry
                            : OsuEventType.MapChange;                                                                                                 //bail
                    }

                    _lastMapId            = _currentMapId;
                    _lastStatus           = _currentStatus;
                    _lastRetries          = retries;
                    _lastGameMode         = gameMode;
                    _lastMapSelectionMods = mapSelectionMods;
                    _lastMapHash          = mapHash;
                    _lastPlayingMods      = playingMods;

                    NewOsuEvent?.Invoke(this, new MapSearchArgs("OsuMemory", osuEventType.Value)
                    {
                        MapId    = _currentMapId,
                        Status   = status,
                        Raw      = reader.GetSongString(),
                        MapHash  = mapHash,
                        PlayMode = (PlayMode)gameMode,
                    });
                }

                _memoryDataProcessor.Tick(status, reader);
            }
        }
Пример #15
0
        public MainForm()
        {
            Directory.SetCurrentDirectory(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
            InitializeComponent();
            Height = 493;

            // init control lists
            dumbLabels = new List <Label>
            {
                hplabel, cslabel, arlabel, odlabel,
                BpmMultiplierLabel, OriginalBpmLabel, NewBpmLabel
            };
            diffDisplays = new List <TextBox>
            {
                HPDisplay, CSDisplay, ARDisplay, ODDisplay
            };
            diffSliders = new List <OptionSlider>
            {
                HPSlider, CSSlider, ARSlider, ODSlider
            };
            checkControls = new List <OsuCheckBox>
            {
                NoSpinnersCheck, HRCheck, ScaleARCheck, ScaleODCheck, ChangePitchCheck, highQualityMp3Check
            };

            ApplyFonts();

            // load user settings
            if (Directory.Exists(Properties.Settings.Default.SongsFolder))
            {
                userSongsFolder = Properties.Settings.Default.SongsFolder;
            }

            // load hotkeys
            Hotkeys = new List <Keys>();
            Hotkeys.Add(Properties.Settings.Default.HotkeyCreateMap);
            Hotkeys.Add(Properties.Settings.Default.HotkeyProfile1);
            Hotkeys.Add(Properties.Settings.Default.HotkeyProfile2);
            Hotkeys.Add(Properties.Settings.Default.HotkeyProfile3);
            Hotkeys.Add(Properties.Settings.Default.HotkeyProfile4);

            // Init object instances
            osuReader = OsuMemoryReader.Instance.GetInstanceForWindowTitleHint("");
            editor    = new BeatmapEditor(this);

            // Add event handlers (observers)
            editor.StateChanged     += ToggleDumbLabels;
            editor.StateChanged     += TogglePrettyButtons;
            editor.StateChanged     += ToggleHpCsArOdDisplay;
            editor.StateChanged     += ToggleBpmInputControls;
            editor.StateChanged     += ToggleBpmDisplay;
            editor.StateChanged     += ToggleLockButtons;
            editor.StateChanged     += UpdateProfiles;
            middlePanel.MaximumSize  = new Size(999, 999);
            BottomPanel.MaximumSize  = new Size(999, 999);
            editor.StateChanged     += RearrangeLayout;
            editor.BeatmapSwitched  += UpdateSongDisplay;
            editor.BeatmapModified  += UpdateBpmDisplay;
            editor.BeatmapModified  += UpdateHpCsArOdDisplay;
            editor.BeatmapModified  += UpdateDifficultyDisplay;
            editor.BeatmapModified  += TogglePrettyButtons;
            editor.BeatmapModified  += UpdateRateInputControls;
            editor.ControlsModified += UpdateLockButtons;
            editor.ControlsModified += UpdateCheckBoxes;
            editor.ControlsModified += UpdateProfiles;

            // Install keyboard hooks
            // Notice: The only purpose of the keyboard hook is for shortcuts. Nothing else!
            ApplyHotkeys();

            // need controls to show up as initially disabled
            editor.ForceEventStateChanged();
            editor.ForceEventBeatmapSwitched();
            editor.ForceEventControlsModified();

            BeatmapUpdateTimer.Start();
            OsuRunningTimer.Start();
            formAnimationTimer.Start();

            Focus();
#if DEBUG
            //spectrogramButton_Click(this, EventArgs.Empty);
#endif
        }
Пример #16
0
        public static string GetMapMd5Safe(this IOsuMemoryReader reader)
        {
            var mapHash = reader.GetMapMd5();

            return(Helpers.IsMD5(mapHash) ? mapHash : null);
        }
Пример #17
0
        //[DllImport("kernel32.dll", SetLastError = true)]
        //[return: MarshalAs(UnmanagedType.Bool)]
        //static extern bool AllocConsole();
        #endregion

        public MainForm()
        {
            InitializeComponent();

            nobg = Image.FromFile(nobgpng);

            // init control lists
            dumbLabels = new List <Label>
            {
                hplabel, cslabel, arlabel, odlabel,
                BpmMultiplierLabel, OriginalBpmLabel, NewBpmLabel
            };
            diffDisplays = new List <TextBox>
            {
                HPDisplay, CSDisplay, ARDisplay, ODDisplay
            };
            diffSliders = new List <OptionSlider>
            {
                HPSlider, CSSlider, ARSlider, ODSlider
            };
            checkControls = new List <OsuCheckBox>
            {
                NoSpinnersCheck, HRCheck, ScaleARCheck, ScaleODCheck, ChangePitchCheck
            };

            ApplyFonts();

            // load user settings
            if (Directory.Exists(Properties.Settings.Default.SongsFolder))
            {
                userSongsFolder = Properties.Settings.Default.SongsFolder;
            }

            // Init object instances
            osuReader = OsuMemoryReader.Instance.GetInstanceForWindowTitleHint("");
            editor    = new BeatmapEditor(this);

            // Add event handlers (observers)
            editor.StateChanged     += ToggleDumbLabels;
            editor.StateChanged     += TogglePrettyButtons;
            editor.StateChanged     += ToggleHpCsArOdDisplay;
            editor.StateChanged     += ToggleDifficultyDisplay;
            editor.StateChanged     += ToggleBpmInputControls;
            editor.StateChanged     += ToggleBpmDisplay;
            editor.StateChanged     += ToggleLockButtons;
            editor.BeatmapSwitched  += UpdateSongDisplay;
            editor.BeatmapModified  += UpdateBpmDisplay;
            editor.BeatmapModified  += UpdateHpCsArOdDisplay;
            editor.BeatmapModified  += UpdateDifficultyDisplay;
            editor.BeatmapModified  += TogglePrettyButtons;
            editor.BeatmapModified  += UpdateRateInputControls;
            editor.ControlsModified += UpdateLockButtons;
            editor.ControlsModified += UpdateChecks;

            // need controls to show up as initially disabled
            editor.ForceEventStateChanged();
            editor.ForceEventBeatmapSwitched();
            editor.ForceEventControlsModified();

            // Install keyboard hooks
            // (note! this is only for the create map hotkey!!)
            kbhook.HookedKeys.Add(Keys.X);
            kbhook.KeyDown += new KeyEventHandler(CreateMapHotkeyHandler);

            BeatmapUpdateTimer.Start();
            OsuRunningTimer.Start();

            this.Focus();
        }