
Cześć, Habrze!
Dziś zapoznacie się z artykułem, w którym opiszemy, jak stworzyć bota przy użyciu C# na .NET Core oraz jak uruchomić go na zdalnym serwerze.
Artykuł składa się z części wprowadzającej, etapu przygotowawczego, napisania logiki oraz przeniesienia bota na zdalny serwer.
Mam nadzieję, że ten artykuł pomoże wielu początkującym.
Tło
Wszystko zaczęło się w jedną bezsenną, jesienną noc, kiedy spędzałem czas na serwerze Discord. Ponieważ dołączyłem do niego stosunkowo niedawno, postanowiłem go dokładnie zbadać. Odkrywszy kanał tekstowy "Oferty pracy", zainteresowałem się nim, otworzyłem go i znalazłem wśród nieinteresujących mnie propozycji to:
„Programista (twórca bota)
Wymagania:
- znajomość języków programowania;
- zdolność do samodzielnej nauki.
Wymagania:
- umiejętność rozumienia cudzych kodów;
- znajomość funkcjonalności DISCORD.
Zadania:
- rozwój bota;
- wsparcie i utrzymanie bota.
Twoje korzyści:
- Możliwość wspierania i wpływania na interesujący projekt;
- Zdobycie doświadczenia w pracy w zespole;
- Możliwość zaprezentowania i poprawy swoich umiejętności.”
To natychmiast mnie zainteresowało. Tak, za tę pracę nie płacono, ale nie zobowiązywano do niczego, a dodatkowe doświadczenie w portfolio na pewno się przyda. Dlatego napisałem do administratora serwera, a on poprosił o stworzenie bota, który będzie pokazywał statystyki gracza w World of Tanks.
Etap przygotowawczy

Discord
Przed przystąpieniem do pisania naszego bota, musimy go najpierw stworzyć dla Discorda. Musisz:
- Zalogować się na konto Discord
- W zakładce „Aplikacje” kliknąć przycisk „Nowa aplikacja” i nazwać bota
- Otrzymać token bota, logując się do swojego bota i znajdując w liście zakładkę „Bot” w sekcji „Ustawienia”
- Zachować token gdzieś indziej
Wargaming
Ponadto, trzeba stworzyć aplikację w Wargaming, aby uzyskać dostęp do API Wargaming. To również jest proste:
- Zalogować się na konto Wargaming
- Przejść do „Moje aplikacje” i kliknąć przycisk „Dodaj nową aplikację”, nadając jej nazwę i wybierając typ
- Zachować ID aplikacji
Oprogramowanie
Tutaj już jest swoboda wyboru. Niektórzy używają Visual Studio, niektórzy Ridera, a niektórzy w ogóle mocnych i piszą kod w Vim (prawdziwi programiści używają tylko klawiatury, prawda?). Jednak, aby nie implementować Discord API, można użyć nieoficjalnej biblioteki C# „DSharpPlus”. Można ją zainstalować albo z NuGet, albo samodzielnie zbierając źródła z repozytorium.
Dla tych, którzy nie wiedzą lub zapomnieli, jak instalować aplikacje z NuGet.Instrukcja dla Visual Studio
- Przechodzimy do zakładki Projekt – Zarządzanie pakietami NuGet;
- Klikamy na przegląd i w polu wyszukiwania wpisujemy „DSharpPlus”;
- Wybieramy i instalujemy framework;
- ZYSK!
Etap przygotowawczy zakończony, można przejść do pisania bota.
Pisanie logiki

Nie będziemy omawiać 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ę za pomocą funkcji static async Task MainTask(string[] args);
Aby wywołać tę funkcję, w Main należy wpisać
MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();Następnie musisz zainicjować swojego bota:
discord = new DiscordClient(new DiscordConfiguration
{
Token = token,
TokenType = TokenType.Bot,
UseInternalLogHandler = true,
LogLevel = LogLevel.Debug
}); Gdzie token – token twojego bota.
Potem, za pomocą lambdy, wpisujemy wymagane komendy, które ma wykonywać bot:
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync("Cześć, " + e.Author.Username);
}
};
Gdzie e.Author.Username – to pobieranie nicku użytkownika.
W ten sposób, kiedy wyślesz jakąkolwiek wiadomość, która zaczyna się od &, bot cię przywita.
Na końcu tej funkcji należy wpisać await discord.ConnectAsync(); i await Task.Delay(-1);
Pozwoli to na wykonywanie komend w tle, nie zajmując głównego wątku.
Teraz musisz zrozumieć Wargaming API. Tutaj wszystko jest proste – piszesz zapytania CURL, otrzymujesz odpowiedź w postaci JSON – ciągu, wyciągasz z niego potrzebne dane i wykonujesz na nich operacje.
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("Gracz nie został znaleziony");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Wymagane są co najmniej trzy znaki");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Nieprawidłowe wyszukiwanie");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Pusty pseudonim");
}
else
{
throw new Exception("Coś poszło nie tak.");
}
}
return player;
}
Uwaga! Przechowywanie wszystkich tokenów i ID aplikacji w otwartej formie jest zdecydowanie niewskazane! Co najmniej – Discord blokuje takie tokeny, kiedy trafiają do sieci, a w najgorszym przypadku – bot zostaje przejęty przez hakerów.
Wdrożenie na serwerze VPS

Po zakończeniu pracy z botem należy umieścić go na serwerze, który działa non-stop 24/7. Jest to związane z tym, że kiedy działa aplikacja, działa także bot. Gdy wyłączysz aplikację, twój bot również przestanie działać.
Na świecie istnieje wiele serwerów VPS, zarówno na Windows, jak i na Linux, jednak w większości przypadków, hosting na Linux jest znacznie tańszy.
Na serwerze Discord polecono mi vscale.io, więc od razu stworzyłem tam wirtualny serwer na Ubuntu i wgrałem bota. Nie będę opisywał, jak działa ta strona, od razu przejdę do konfiguracji bota.
Najpierw musisz zainstalować niezbędne oprogramowanie, które uruchomi naszego bota napisanego w .NET Core. .
Następnie musisz umieścić bota na Git – serwisie, takim jak GitHub i podobne, i sklonować go na serwerze VPS, lub innymi sposobami pobrać swojego bota. Pamiętaj, że będziesz mieć tylko konsolę, GUI nie będzie. Wcale.
Po pobraniu bota należy go uruchomić. W tym celu należy:
- Odzyskać wszystkie zależności: dotnet restore
- Zbudować aplikację: dotnet build name_project.sln -c Release
- Przejdź do zbudowanego DLL;
- dotnet name_of_file.dll
Gratulacje! Twój bot jest uruchomiony. Jednak bot, niestety, zajmuje konsolę, a wyjście z serwera VPS nie jest takie proste. Dodatkowo, w przypadku ponownego uruchomienia serwera, bot będzie musiał zostać uruchomiony ponownie. Istnieje kilka rozwiązań tej sytuacji. Wszystkie są związane z uruchomieniem przy starcie serwera:
- Dodaj uruchomienie skryptu do /etc/init.d
- Utwórz usługę, która będzie uruchamiana przy starcie.
Nie widzę sensu, aby szczegółowo się nad nimi rozwodzić, wszystko jest wystarczająco dobrze opisane w internecie.
Wnioski
Cieszę się, że podjąłem się tego zadania. To było moje pierwsze doświadczenie w tworzeniu bota, i cieszę się, że zdobyłem nową wiedzę z C# i pracy z Linuksem.
Link do serwera Discord.
Dziękuję za uwagę!
Źródło: habr.com
