W tej sekcji skupię się na opisie swoich zmagań i doświadczeń z nauki języka Dart, który docelowo ma mi posłużyć do napisania bota. Założenia projektu są dosyć proste - bot powinien obsługiwać kilka komend dla użytkownika o odpowiednich uprawnieniach dzięki czemu taki użytkownik będzie mógł swobodnie administrować serwerem.
Serwer ten to proces Java, który jest uruchomiony na VPSie a który nie posiada zbyt prostych mechanizmów do komunikacji. Proces ten to serwer gry Project Zomboid, który uruchomiony jest w tle za pomocą skryptu bash i komendy tmux. Komunikacja odbywa się poprzez wysyłanie do konsoli serwera komend za pomocą tmux. Dodatkowo w tle bota uruchomiona jest pętla eventów, która odpowiada między innymi za monitorowanie Steam Workshop w poszukiwaniu modów i zmian w tych modach. Trzeba nadmienić, że serwer Zomboida aktualizuje mody w momencie startu, a więc jeżeli zdarzy się sytuacja, że serwer jest uruchomiony a jednocześnie autor moda wyda jego nowszą wersję, to klient (gracz) uruchamiając Steam automatycznie zaktualizuje sobie lokalnie mody natomiast w momencie próby zalogowania na serwer otrzyma komunikat, że jego wersja modów jest niezgodna z tą na serwerze. Aby to rozwiązać co 10 minut bot będzie wykonywał zapytanie do API Steam Workshop i pobierał informacje o modach dostępnych na serwerze. Tak na prawdę interesuje nas jedynie timestamp ostatniej aktualizacji, gdyż będziemy porównywać go z timestampem modów na serwerze. W przypadku różnicy bot wyśle sekwencję komend do serwera gry aby go zresetować.
Obecnie podobne rozwiązanie zacząłem tworzyć w JavaScript z wykorzystaniem Node.js. Działa to w miarę poprawnie, jednak nie byłem do końca zadowolony, ponieważ komendy bota musiały być poprzedzone pewnym prefixem. Chciałem natomiast wykorzystać tzw. slash commands, czyli dosyć rozbudowane API do wbudowanych komend Discorda, dostępnych dla danego serwera/gildii. W przypadku JSa jest ogólnodostępna biblioteka Discord.js, która świetnie radzi sobie z komendami prefixowymi, natomiast tzw. interakcje (w tym slash commands) muszą być programowane w oparciu o zapytania POST bezpośrednio do serwera (gateway) Discorda. Postanowiłem więc rozeznać się w możliwościach i wpadłem na pomysł aby połączyć dwie rzeczy : chęć nauki Darta oraz możliwość zbudowania bota.
Dart jest niezbędny aby tworzyć we Flutterze, który od dawna jest na mojej liście do nauczenia. Będzie to ciekawe wyzwanie, oby udało mi się mu sprostać.
Aby serwer Zomboida działał prawidłowo niezbędne było zakupić VPSa z co najmniej 6 GB ramu. Udało mi się znaleźć takową ofertę za 35 złotych miesięcznie. Cena w miarę atrakcyjna jak na początek moich wyzwań.
VPS działa na najnowszej wersji Debiana, jednak nie wszystko było od razu dostępne i wymagało ode mnie wielu kroków w celu poprawnej konfiguracji. Instalując serwer Zomboida kierowałem się jednym z tutoriali dostępnych w sieci. Nie było z tym większych problemów dlatego nie będę skupiał się na detalach. Efektem tego kroku był działający serwer Zomboida. Aby zapewnić ciągłość pracy napisałem też prosty skrypt w Pythonie który monitoruje mody oraz wrzuciłem go w CRON joba co 10 minut. Nic szczególnego.
Jeżeli chodzi o środowisko programistyczne to wykorzystam edytor VS Code z dodatkami takimi jak Dart. SDK Darta też mam skonfigurowane. Właściwie jestem gotowy do pisania swoich pierwszych linii kodu... no może nie do końca przygotowany. Nie znam zbyt dobrze tego języka programowania.
Tak więc swoją przygodę zacząłem od nauki języka, tutaj pomocny okazał się Youtube oraz megakurs Darta.
Dodatkowo skonfigurowałem to wszystko na maszynie lokalnej z WSLem aby można w prosty sposób zająć się developmentem. Dzięki temu na Windowsa wrzuciłem dystrybucję linuxa Ubuntu (niestety inną niż mam na VPSie). Odtworzyłem serwer Zomboida lokalnie dzięki czemu na VPS wrzucam jedynie działające rozwiązania i jest to moja "produkcja".
Tutaj sprawa była prosta, ponieważ bot był już wykorzystywany w innym projekcie JSowym (o którym wspominałem wyżej - link do mojego projektu bota w Node.js).
Bot był gotowy, klucze zapisałem w zmiennych środowiskowych aby mieć do nich łatwy dostęp. Zacząłem poszukiwania biblioteki do interakcji z Discordem pod Dartem. Długo szukać nie musiałem i znalazłem Nyxx. Wydaje się być idealnym rozwiązaniem, posiada też przykładową implementację kompletnego bota, na której zamierzam się wzorować.
Założenia co do komend to standardowe : /server start|stop|restart|backup|mods oraz działające w tle joby od aktualizacji modów. Muszę jeszcze przemyśleć ten temat, gdyż użycie CRON joba może być dużo prostsze. Jedyna rzecz która przemawia za napisaniem własnego rozwiązania to chęć nauki. Asynchroniczna kolejka, brzmi ciekawie. Temat pewnie jeszcze wróci na warsztat.
Na tą chwilę mam skonfigurowanego bota, serwer produkcyjny (VPS), środowisko lokalne, IDE oraz SDK. Mam wybrany stack technologiczny oraz wstępne założenia. Czas zacząć budować konkretne zadania... Zalatuje Scrumem ;)