Tworzenie bota Discord na .NET Core z wdrożeniem na serwerze VPS

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

Tworzenie bota Discord na .NET Core z wdrożeniem na serwerze VPS
Disrod
Zanim zaczniemy pisać naszego bota, musimy stworzyć go dla Discorda. Potrzebujesz:

  1. Zaloguj się do konta Discord по ссылке
  2. W zakładce „Aplikacje” kliknij przycisk „Nowa aplikacja” i nazwij bota
  3. Zdobądź token bota, logując się do swojego bota i znajdując zakładkę „Bot” na liście „Ustawienia”
  4. Zapisz gdzieś token

Wargaming

Ponadto musisz utworzyć aplikację w Wargaming, aby uzyskać dostęp do Wargaming API. Tutaj też wszystko jest proste:

  1. Zaloguj się do swojego konta Wargaming pod tym linkiem
  2. Przechodzimy do „Moich aplikacji” i klikamy w przycisk „Dodaj nową aplikację”, podając nazwę aplikacji i wybierając jej typ
  3. 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

  1. Przejdź do zakładki Projekt - Zarządzaj pakietami NuGet;
  2. Kliknij recenzję iw polu wyszukiwania wpisz „DSharpPlus”;
  3. Wybierz i zainstaluj framework;
  4. ZYSK!

Etap przygotowawczy dobiegł końca, możesz przystąpić do pisania bota.

Logika pisania

Tworzenie bota Discord na .NET Core z wdrożeniem na serwerze VPS

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ć

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 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

Tworzenie bota Discord na .NET Core z wdrożeniem na serwerze VPS

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
  • Kompilacja aplikacji: dotnet build name_project.sln -c Release
  • Przejdź do wbudowanej biblioteki DLL;
  • dotnet nazwa_pliku.dll

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.

Link do serwera Discord. Dla tych, którzy grają w gry Wargaming.
Link do repozytorium, w którym znajduje się bot Discord.
Link do repozytorium DSharpPlus.
Dziękuję za uwagę!

Źródło: www.habr.com

Dodaj komentarz