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;
        }
        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;
        }
Esempio n. 3
0
        public OsuMemoryEventSourceBase(IContextAwareLogger logger, ISettings settings,
                                        IDatabaseController databaseControler, IModParser modParser,
                                        List <Lazy <IHighFrequencyDataConsumer> > highFrequencyDataConsumers, ISaver saver, Delegates.Exit exiter)
        {
            _settings                   = settings;
            _databaseController         = databaseControler;
            _modParser                  = modParser;
            _highFrequencyDataConsumers = highFrequencyDataConsumers;
            Logger          = logger;
            LiveTokenSetter = Tokens.CreateTokenSetter(Name);
            TokenSetter     = Tokens.CreateTokenSetter($"{Name}-Regular");
            var clientCount = _settings.Get <bool>(TourneyMode)
                ? _settings.Get <int>(ClientCount)
                : 1;

            if (_settings.Get <bool>(TourneyMode))
            {
                string exitReason = null;
                if (clientCount < 2)
                {
                    exitReason = $"{ClientCount.Name} setting value is invalid. Set value equal or bigger than 2";
                }

                if (_settings.Get <int>(DataClientId) > clientCount - 1)
                {
                    exitReason = $"{DataClientId.Name} can't be bigger than {ClientCount.Name}. Client ids are 0-indexed";
                }

                if (!string.IsNullOrWhiteSpace(exitReason))
                {
                    Logger.Log(exitReason, LogLevel.Warning);
                    MessageBox.Show(exitReason, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    exiter(exitReason);
                    return;
                }

                _clientMemoryReaders.AddRange(Enumerable.Range(0, clientCount)
                                              .Select(i =>
                {
                    var instance = StructuredOsuMemoryReader.Instance.GetInstanceForWindowTitleHint(
                        $" Tournament Client {i}");
                    instance.OsuMemoryAddresses.GeneralData.KeyOverlay = null;
                    return(instance);
                }));

                //TODO: provide tournament-manager specific data via tokens
                var _tournamentManagerMemoryReader = OsuMemoryReader.Instance.GetInstanceForWindowTitleHint("Tournament Manager");

                Logger.Log($"{_clientMemoryReaders.Count} client readers prepared", LogLevel.Information);
            }
            else
            {
                _clientMemoryReaders.Add(StructuredOsuMemoryReader.Instance);
                StructuredOsuMemoryReader.Instance.OsuMemoryAddresses.GeneralData.KeyOverlay = null;
                StructuredOsuMemoryReader.Instance.InvalidRead += OnInvalidMemoryRead;
            }

            _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;
            }

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

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

            MemoryWorkerTask = Task.Run(MemoryWorker, cts.Token).HandleExceptions();

            Started = true;
        }