Przejdź do treści

Jak działa konfiguracja

Szerokie możliwości konfiguracyjne to jeden z naszych priorytetów.
Poza funkcjonalnościami takimi jak konfigurowalne komendy czy konfigurowalne odpowiedzi bota, ważne są też konfigurowalne... wszystkie inne elementy.

Tutaj skupimy się na tym jak działa konfiguracja w miejscach, które nie mają swojej dedykowanej konfiguracji.
Jako dedykowaną konfigurację rozumiem przykładowo to, co się dzieje przy konfigurowalnych odpowiedziach.

ConfigurationItems i MappedConfiguration\<T>

Bazowym obiektem jest są tutaj tak zwane ConfigurationItems, czyli pojedyncze obiekty, trzymające wartości konfiguracji.
Każdy z tych obiektów trzyma wartość która ma ściśle określony typ - przykładowo MinAverageMessagesPerWeek trzyma wartość int, więc do czasu kiedy tego nie zmienimy, nie będzie się dało wrzucić tam innego typu danych.

Każdy z obiektów dziedziczy po klasie MappedConfiguration<T>, gdzie T to wspomniany typ danych, jaki trzyma obiekt konfiguracyjny.

    public abstract class MappedConfiguration<T> : IMappedConfiguration
    {
        public abstract T Value { get; set; }
        public ulong ServerId { get; }
        public string Name { get; }

        public MappedConfiguration(ulong serverId)
        {
            this.Name = this.GetType().Name;
            this.ServerId = serverId;
        }
    }

Przez dziedziczenie, każdy z obiektów posiada również ServerId - oznacza to, że tak jak w przypadku m.in konfigurowalnych odpowiedzi, występuje tu podział na wartości domyślne i wartości nadpisane przez konkretny serwer (jeśli serwer czegoś nie nadpisał, używane są wartości domyślne).

Obsługa konfiguracji

Dzięki serwisowi ConfigurationService obsługa konfiguracji jest bardzo prosta i wygodna - ponieważ robi on wszystko czego potrzebujemy pod spodem, razem z obsługą pamięci podręcznej (cache).

Udostępnia on takie metody jak

public async Task SaveNewConfiguration(IMappedConfiguration changedConfiguration)

Do zapisu konfiguracji - system na podstawie danych w obiekcie domyśli się co do za obiekt i do którego serwera należy.

public IEnumerable<IMappedConfiguration> GetConfigurationItems(ulong serverId)

Do pobrania wszystkich konfiguracji dla określonego serwera.

public T GetConfigurationItem<T>(ulong serverId) where T : IMappedConfiguration

Do pobrania konkretnej konfiguracji z określonego serwera.

Jeszcze raz przypomnę - jeśli serwer nie nadpisał jednej z konfigurowalnych opcji, system zwróci domyślną wartość.