cat ~/projects/radar/README
Radar
Automatyczny przegląd darmowych gier, promocji, wydarzeń w grach i konwentów: n8n zbiera i punktuje, aplikacja filtruje, publikuje na Discordzie z limitami i wystawia kalendarz .ics.
Cel
Nie przeglądać ręcznie serwisów z promocjami i wydarzeniami, a jednocześnie nie zaśmiecać kanałów Discorda powtórkami i słabymi okazjami.
Rozwiązanie
n8n pobiera dane ze źródeł i wstępnie je punktuje, a potem wysyła paczki do aplikacji. Cała logika progów, deduplikacji, limitów i wyboru kanału jest w TypeScript. Wynik trafia na kanały Discorda, do skrzynki zadań w Vikunji, na publiczną stronę /radar i do kalendarza .ics.
Architektura
- n8n: pobieranie i wstępny scoring, wysyłka paczek (do 50 pozycji) na wewnętrzny endpoint z walidacją struktury.
- Reguły progów: darmowe gry zawsze, promocje od temperatury 1000 w dozwolonych kategoriach, newsy i wydarzenia od wyniku 70.
- Dyspozytor publikacji wybiera kanał według rodzaju wpisu i gry, pilnuje dziennego limitu na kanał i nie publikuje drugi raz.
- Darmowe gry i konwenty trafiają też jako zadania do Vikunji.
- Widok /radar łączy wpisy z bazy, wydarzenia z Lunety i zadania z Vikunji w koszyki „teraz”, „ten tydzień” i „później”; ten sam zbiór eksportuje się do RFC 5545.
Decyzje techniczne
- n8n zbiera, kod decyduje
- Workflow w n8n jest prosty do zmiany, ale trudny do testowania. Dlatego n8n tylko pobiera i punktuje, a progi, limity i routing są w TypeScript z testami jednostkowymi.
- Bez dublowania z Lunetą
- Wydarzenia Blue Archive i NTE ogłaszają źródła Lunety. Radar pokazuje je na stronie, ale nie wysyła ich drugi raz na Discorda.
- Awaria jednego źródła nie kładzie strony
- Jeśli baza Lunety albo Vikunja nie odpowiada, /radar pokazuje resztę danych, a brakującą sekcję zapisuje w logach jako ostrzeżenie.
Problemy i rozwiązania
- Spam przy ponownym przetwarzaniu paczek
- Dzienny limit postów na kanał (3 albo 5) i maksymalny wiek wpisu 24 godziny. Nadmiar zostaje na stronie /radar, bez wysyłki na Discorda.
- Darmowe gry ogłaszane przed startem promocji
- Wpis z datą rozpoczęcia w przyszłości czeka i trafia na Discorda dopiero po starcie oferty.