Tworzenie bota Discord na .NET Core z wdrożeniem na serwerze VPS
Witajcie Chabrowicze!
Dzisiaj zobaczycie artykuł, który pokaże wam jak stworzyć bota przy użyciu C# na .NET Core i jak uruchomić go na zdalnym serwerze.
Artykuł będzie składał się z tła, etapu przygotowawczego, pisania logiki i przenoszenia bota na zdalny serwer.
Mam nadzieję, że ten artykuł pomoże wielu początkującym.
prehistoria
Wszystko zaczęło się pewnej bezsennej jesiennej nocy, którą spędziłem na serwerze Discord. Odkąd niedawno do niego dołączyłem, zacząłem go studiować od początku do końca. Po znalezieniu kanału tekstowego „Oferty pracy” zainteresowałem się, otworzyłem go i znalazłem wśród ofert, które mnie nie interesują, są to:
„Programista (programista botów) wymagania:
znajomość języków programowania;
umiejętność samodzielnego uczenia się.
Пожелания:
umiejętność rozumienia kodu innych osób;
znajomość funkcjonalności DISCORD.
Zadania:
rozwój botów;
wsparcie i utrzymanie bota.
Twoja korzyść:
Możliwość wspierania i wpływania na projekt, który Ci się podoba;
Zdobycie doświadczenia w pracy w zespole;
Możliwość zademonstrowania i doskonalenia posiadanych umiejętności.
To mnie natychmiast zainteresowało. Tak, nie zapłacili za tę pracę, ale nie wymagali od ciebie żadnych zobowiązań i nie będzie to zbyteczne w portfolio. Dlatego napisałem do administratora serwera, a on poprosił mnie o napisanie bota, który będzie pokazywał statystyki gracza w World of Tanks.
Faza przygotowawcza
Disrod
Zanim zaczniemy pisać naszego bota, musimy stworzyć go dla Discorda. Potrzebujesz:
Przechodzimy do „Moich aplikacji” i klikamy w przycisk „Dodaj nową aplikację”, podając nazwę aplikacji i wybierając jej typ
Zapisywanie identyfikatora aplikacji
Tworzenie
Istnieje już wolność wyboru. Ktoś używa Visual Studio, ktoś Rider, ktoś ogólnie jest potężny i pisze kod w Vimie (w końcu prawdziwi programiści używają tylko klawiatury, prawda?). Aby jednak nie implementować Discord API, możesz skorzystać z nieoficjalnej biblioteki C# „DSharpPlus”. Możesz zainstalować go z NuGet lub samodzielnie budując źródła z repozytorium.
Dla tych, którzy nie wiedzą lub zapomnieli jak zainstalować aplikacje z NuGet.Instrukcje dla Visual Studio
Przejdź do zakładki Projekt - Zarządzaj pakietami NuGet;
Kliknij recenzję iw polu wyszukiwania wpisz „DSharpPlus”;
Wybierz i zainstaluj framework;
ZYSK!
Etap przygotowawczy dobiegł końca, możesz przystąpić do pisania bota.
Logika pisania
Nie będziemy rozważać całej logiki aplikacji, pokażę tylko jak pracować z przechwytywaniem wiadomości przez bota oraz jak pracować z Wargaming API.
Praca z botem Discord odbywa się poprzez statyczne zadanie asynchroniczne MainTask(string[] args);
Aby wywołać tę funkcję, w Main musisz się zarejestrować
Gdzie token to token twojego bota.
Następnie poprzez lambdę piszemy niezbędne polecenia, które bot powinien wykonać:
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync(“Hello, ” + e.Author.Username);
}
};
Gdzie e.Author.Username pobiera pseudonim użytkownika.
W ten sposób, kiedy wyślesz jakąkolwiek wiadomość zaczynającą się od &, bot cię przywita.
Na końcu tej funkcji musisz napisać await discord.ConnectAsync(); i czekaj na Task.Delay(-1);
Umożliwi to wykonywanie poleceń w tle bez zajmowania głównego wątku.
Teraz musimy zająć się Wargaming API. Tutaj wszystko jest proste - pisz żądania CURL, uzyskaj odpowiedź w postaci ciągu JSON, wyciągnij stamtąd niezbędne dane i wykonuj na nich manipulacje.
Przykład pracy z WargamingAPI
public Player FindPlayer(string searchNickname)
{
//https://api.worldoftanks.ru/wot/account/list/?application_id=y0ur_a@@_id_h3r3search=nickname
urlRequest = resourceMan.GetString("url_find_player") + appID + "&search=" + searchNickname;
Player player = null;
string resultResponse = GetResponse(urlRequest);
dynamic parsed = JsonConvert.DeserializeObject(resultResponse);
string status = parsed.status;
if (status == "ok")
{
int count = parsed.meta.count;
if (count > 0)
{
player = new Player
{
Nickname = parsed.data[0].nickname,
Id = parsed.data[0].account_id
};
}
else
{
throw new PlayerNotFound("Игрок не найден");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Минимум три символа требуется");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Неверный поиск");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Пустой никнейм");
}
else
{
throw new Exception("Something went wrong.");
}
}
return player;
}
Uwaga! Zdecydowanie nie zaleca się przechowywania wszystkich tokenów i identyfikatorów aplikacji w postaci zwykłego tekstu! Discord co najmniej blokuje takie tokeny, gdy wchodzą do światowej sieci, a co najwyżej bot zaczyna być wykorzystywany przez atakujących.
Wdróż na VPS - serwer
Gdy skończysz z botem, musi on być hostowany na serwerze, który stale działa 24 godziny na dobę, 7 dni w tygodniu. Wynika to z faktu, że gdy Twoja aplikacja jest uruchomiona, działa również bot. Gdy tylko wyłączysz aplikację, twój bot też zasypia.
Na świecie istnieje wiele serwerów VPS, zarówno w systemie Windows, jak i Linux, jednak w większości przypadków hostowanie w systemie Linux jest znacznie tańsze.
Na serwerze Discord poradzono mi vscale.io i od razu stworzyłem na nim wirtualny serwer na Ubuntu i wgrałem bota. Nie będę opisywał, jak działa ta strona, ale przejdę od razu do ustawień bota.
Przede wszystkim należy zainstalować niezbędne oprogramowanie, które będzie obsługiwało naszego bota napisane w .NET Core. Jak to zrobić jest opisane tutaj.
Następnie musisz przesłać bota do usługi Git, takiej jak GitHub i tym podobne, i sklonować go na serwer VPS lub pobrać bota w inny sposób. Pamiętaj, że będziesz mieć tylko konsolę, bez GUI. W ogóle.
Po pobraniu bota musisz go uruchomić. Do tego potrzebujesz:
Przywróć wszystkie zależności: przywracanie dotnet
Gratulacje! Twój bot działa. Jednak bot niestety okupuje konsolę i nie jest łatwo wyjść z serwera VPS. Ponadto w przypadku restartu serwera będziesz musiał uruchomić bota w nowy sposób. Wyjść z sytuacji jest kilka. Wszystkie dotyczą uruchamiania przy starcie serwera:
Dodaj skrypt uruchamiania do /etc/init.d
Utwórz usługę, która będzie działać podczas uruchamiania.
Nie widzę sensu szczegółowo się nad nimi rozwodzić, wszystko jest wystarczająco szczegółowo opisane w Internecie.
odkrycia
Cieszę się, że podjęłam się tego zadania. To było moje pierwsze doświadczenie w programowaniu botów i cieszę się, że zdobyłem nową wiedzę na temat C# i pracy z Linuksem.