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

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

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

Tworzenie bota Discord na .NET Core z wdrożeniem na serwerze VPS
Discord
Przed przystąpieniem do pisania naszego bota, musimy go najpierw stworzyć dla Discorda. Musisz:

  1. Zalogować się na konto Discord pod tym linkiem
  2. W zakładce „Aplikacje” kliknąć przycisk „Nowa aplikacja” i nazwać bota
  3. Otrzymać token bota, logując się do swojego bota i znajdując w liście zakładkę „Bot” w sekcji „Ustawienia”
  4. Zachować token gdzieś indziej

Wargaming

Ponadto, trzeba stworzyć aplikację w Wargaming, aby uzyskać dostęp do API Wargaming. To również jest proste:

  1. Zalogować się na konto Wargaming pod tym linkiem
  2. Przejść do „Moje aplikacje” i kliknąć przycisk „Dodaj nową aplikację”, nadając jej nazwę i wybierając typ
  3. 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

  1. Przechodzimy do zakładki Projekt – Zarządzanie pakietami NuGet;
  2. Klikamy na przegląd i w polu wyszukiwania wpisujemy „DSharpPlus”;
  3. Wybieramy i instalujemy framework;
  4. ZYSK!

Etap przygotowawczy zakończony, można przejść do pisania bota.

Pisanie logiki

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

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

Tworzenie bota Discord na .NET Core z wdrożeniem 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. Jak to zrobić, opisano tutaj.

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. Dla tych, którzy grają w gry Wargaming.
Link do repozytorium, gdzie znajduje się bot Discord.
Link do repozytorium DSharpPlus.
Dziękuję za uwagę!

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster