ChatBot (wymagany)

Aby framework działał poprawnie, musisz dostarczyć trzy kluczowe providery - możesz przekazać je jako klasę bądź instancję klasy, która implementuje wymagany interfejs.

export type Provider<T> = {
    token: string;
    useClass?: new (...args: any[]) => T;
    useValue?: T;
}

type ClassOrValue<T> = Omit<Provider<T>, 'token'>;
ChatBotModule.forRoot({
    listenChannels: ClassOrValue<IListenChannelsProvider>,
    channelOptions: ClassOrValue<IChannelOptionsProvider<any>>,
    tokenRepository: ClassOrValue<TokenRepositoryProvider>
}),

1. ListenChannelsProvider – Definiowanie kanałów do nasłuchiwania

Musisz określić, które kanały Twitcha bot ma monitorować. W tym celu tworzysz własny provider implementujący IListenChannelsProvider

Wymagane metody:

  • getChannelIds() – zwraca listę identyfikatorów kanałów (string[] lub Promise<string[]>)

  • getRefreshInterval() – określa, jak często lista kanałów ma być odświeżana (w milisekundach)

/* Wymagany interfejs */
interface IListenChannelsProvider {
    getChannelIds(): Promise<string[]> | string[];
    getRefreshInterval(): number;
}

💡 Przykład: Jeśli chcesz, aby bot nasłuchiwał dwóch kanałów i odświeżał listę co 60 sekund, Twój provider może wyglądać tak:

Metoda getChannelIds() może korzystać również z zewnętrznych źródeł takich jak: lokalny plik, endpoint, baza danych - jedynym wymogiem jest zwrócenie identyfikatorów użytkowników na platformie twitch.


2. ChannelOptionsProvider – Konfiguracja kanałów

Provider ma domyślnie ustawione pole prefix dla komend bota, ale możesz dodać dodatkowe opcje, np. zapisywanie czasu ostatniej wiadomości. Tworzysz własny provider implementujący IChannelOptionsProvider<Extend>, gdzie Extend zawiera dodatkowe ustawienia dla kanału.

Wymagane metody:

  • getOptions(channelId: string) – pobiera konfigurację dla danego kanału.

  • setOptions(channelId: string, options: TChannelOptions<Extend>) – pozwala zmienić konfigurację kanału.

💡 Przykład: Jeśli chcesz dodać opcję przechowywania czasu ostatniej wiadomości (lastMessageTimestamp):

Identycznie jak w poprzednim przypadku - getOptions oraz setOptions mogą wykorzystywać zewnętrzne źródło danych (np.: odczyt/zapis do/z bazy danych). W powyższym przykładzie konfiguracje przechowuje się w zmiennej changedOptions. Pamiętaj jednak, że getOptions powinno zawsze zwrócić wszystkie wymagane opcje (tutaj: gdy opcje nie zostały nadpisane, zwraca bazowe ustawienie).

Pole prefix będzie później wykorzystywane do wywoływania komend z czatu (każdy czat może mieć inny prefix. Prefix można zmienić w czasie działania programu - patrz: !prefix)


3. TokenRepositoryProvider – Obsługa tokenów autoryzacyjnych

Bot wymaga tokenów dostępu do API Twitcha. Musisz dostarczyć własny provider implementujący ITokenRepositoryProvider, który zarządza przechowywaniem i aktualizacją tokenów.

Wymagane metody:

  • Pobieranie i zapisywanie tokenów aplikacji:

    • getAppToken(): Pozyskanie tokenu dostępu dla aplikacji

    • saveAppToken(token): Zapisanie tokenu dostępu dla aplikacji

    UWAGA!: Gdy getAppToken() zwróci null framework sam wyśle żądanie o ten token oraz zapisze go przy użyciu saveAppToken(token). Nie musisz wysyłać żadnych żądań manualnie o token.

  • Pobieranie, zapisywanie i usuwanie tokenów użytkownika:

    • getUserAccessToken(userId): Pozyskiwanie tokenu dostępu dla konkretnego użytkownika

    • saveUserAccessToken(userId, token): Zapisywanie tokenu dostępu dla konkretnego użytkownika

    • removeUserAccessToken(userId): Usuwanie tokenu dostępu dla konkretnego użytkownika

    UWAGA!: Podobnie jak w powyższym przypadku dla tokenów dostępu dla aplikacji - powyższe metody służą do obsługi "pamięci" - jeżeli getUserAccessToken(userId) zwróci null - wykorzystana zostanie poniższa metoda getUserRefreshToken(userId) w celu pozyskania tokena dostępu dla użytkownika, a następnie saveUserAccessToken(userId, token) w celu zapisania tokena (token dostępu ważny jest przez około 15 minut od wygenerowania, po tym czasie zostanie automatycznie usunięty - metoda removeUserAccessToken(userId)). Jednak jeżeli getUserRefreshToken(userId) zwróci null - pozyskanie tokenu dostępu będzie niemożliwe - żądana akcja (np.: żądanie API, inne działanie wymagające tokenu dostępu tego użytkownika) zakończy się niepowodzeniem.

  • Pobieranie i usuwanie refresh tokenów:

    • getUserRefreshToken(userId): Pozyskiwanie tokenu odświeżającego token dostępowy dla konkretnego użytkownika.

    • removeUserRefreshToken(userId): Usuwanie tokenu odświeżającego token dostępowy dla konkretnego użytkownika.

    UWAGA!: Metoda removeUserRefreshToken(userId) wywoływana jest w momencie, gdy żądanie o token dostępu dla tego użytkownika zakończy się niepowodzeniem (możliwe powody: token jest nieprawidłowy, użytkownik cofnął autoryzacje aplikacji, inne). UWAGA 2!: Metoda getUserRefreshToken(userId) dla userId, które odpowiada userId zdefiniowanemu w dekoratorze @TwitchBot powinien zawsze zwrócić token odświeżający. W innym przypadku większość funkcji bota będzie bezużyteczna.

💡 Przykład: W projekcie została utworzona predefiniowana klasa InMemoryTokenRepository, która implementuje wymagany interfejs i może być użyta, w przypadku gdy będziemy korzystać z interakcji, do których wymagany będzie token dostępowy aplikacji lub token dostępowy użytkownika (zdefiniowanego jako bot - userId).

Aby użyć powyższej klasy w Twoim projekcie musisz utworzyć instancje tej klasy wraz z wymaganymi w konstruktorze argumentami (userRefreshToken powinien być wygenerowany przy użyciu userId). Następnie musisz przekazać instancję w opcjach modułu z użyciem pola useValue

Dla bardziej zaawansowanych przypadków (np.: korzystanie z tokenów odświeżających i dostępowych większej liczby użytkowników) należy zdefiniować tą klasę samemu. Krytycznie ważne metody dla takiego zastosowania to:

  • getUserRefreshToken(userId)

  • removeUserRefreshToken(userId)

Powinny one korzystać z zewnętrznego źródła, gdzie przechowywane są tokeny odświeżające (zapisane po pomyślnej autoryzacji użytkownika dla tej aplikacji).

Identycznie jak w poprzednich przypadkach - wszystkie metody mogą wykorzystywać zewnętrzne źródła danych.

Last updated