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[]lubPromise<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 aplikacjisaveAppToken(token): Zapisanie tokenu dostępu dla aplikacji
UWAGA!: Gdy
getAppToken()zwrócinullframework sam wyśle żądanie o ten token oraz zapisze go przy użyciusaveAppToken(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żytkownikasaveUserAccessToken(userId, token): Zapisywanie tokenu dostępu dla konkretnego użytkownikaremoveUserAccessToken(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ócinull- wykorzystana zostanie poniższa metodagetUserRefreshToken(userId)w celu pozyskania tokena dostępu dla użytkownika, a następniesaveUserAccessToken(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 - metodaremoveUserAccessToken(userId)). Jednak jeżeligetUserRefreshToken(userId)zwrócinull- 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!: MetodagetUserRefreshToken(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