Skapa en Discord-bot på .NET Core med distribution till en VPS-server

Skapa en Discord-bot på .NET Core med distribution till en VPS-server

Hej Khabrovites!

Idag kommer du att se en artikel som visar dig hur du skapar en bot med C# på .NET Core och hur du kör den på en fjärrserver.

Artikeln kommer att bestå av en bakgrund, ett förberedande skede, skrivlogik och överföring av boten till en fjärrserver.

Jag hoppas att den här artikeln kommer att hjälpa många nybörjare.

förhistoria

Det hela började på en sömnlös höstnatt som jag tillbringade på Discord-servern. Eftersom jag nyligen gick med honom började jag studera honom upp och ner. Efter att ha hittat textkanalen "Lediga jobb" blev jag intresserad, öppnade den och hittade bland de erbjudanden som inte intresserade mig, dessa är:

"Programmerare (botutvecklare)
krav:

  • kunskap om programmeringsspråk;
  • förmåga till självinlärning.

Пожелания:

  • förmåga att förstå andras kod;
  • kunskap om DISCORD-funktionalitet.

mål:

  • utveckling av bot;
  • support och underhåll av boten.

Din fördel:

  • Möjlighet att stötta och påverka det projekt du gillar;
  • Få erfarenhet av att arbeta i ett team;
  • Möjlighet att visa och förbättra befintliga färdigheter.


Detta intresserade mig omedelbart. Ja, de betalade inte för det här arbetet, men de krävde inga skyldigheter från dig, och det kommer inte att vara överflödigt i portföljen. Därför skrev jag till serveradministratören, och han bad mig skriva en bot som kommer att visa spelarens statistik i World of Tanks.

Den förberedande fasen

Skapa en Discord-bot på .NET Core med distribution till en VPS-server
Discrod
Innan vi börjar skriva vår bot måste vi skapa den för Discord. Du behöver:

  1. Logga in på Discord-kontot по ссылке
  2. På fliken "Applikationer", klicka på knappen "Ny applikation" och namnge boten
  3. Få en bot-token genom att logga in på din bot och hitta fliken "Bot" i listan "Inställningar"
  4. Spara token någonstans

Wargaming

Du måste också skapa en applikation i Wargaming för att få tillgång till Wargaming API. Även här är allt enkelt:

  1. Logga in på ditt Wargaming-konto genom denna länk
  2. Vi går till "Mina applikationer" och klickar på knappen "Lägg till en ny applikation", anger namnet på applikationen och väljer dess typ
  3. Sparar applikations-ID

Mjukvara

Det finns redan valfrihet. Någon använder Visual Studio, någon Rider, någon är generellt kraftfull och skriver kod i Vim (riktiga programmerare använder trots allt bara tangentbordet, eller hur?). Men för att inte implementera Discord API kan du använda det inofficiella C#-biblioteket "DSharpPlus". Du kan installera det antingen från NuGet eller genom att bygga källorna själv från förvaret.

För dig som inte vet eller har glömt hur man installerar applikationer från NuGet.Instruktioner för Visual Studio

  1. Gå till fliken Projekt - Hantera NuGet-paket;
  2. Klicka på recensionen och skriv in "DSharpPlus" i sökfältet;
  3. Välj och installera ramverk;
  4. VINST!

Det förberedande skedet är över, du kan fortsätta med att skriva boten.

Skrivlogik

Skapa en Discord-bot på .NET Core med distribution till en VPS-server

Vi kommer inte att överväga hela logiken i applikationen, jag kommer bara att visa hur man arbetar med avlyssning av meddelanden av boten och hur man arbetar med Wargaming API.

Att arbeta med Discord-boten sker genom den statiska asynkrona Task MainTask(string[] args);
För att anropa denna funktion måste du registrera dig i Main

MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();

Därefter måste du initiera din bot:

discord = new DiscordClient(new DiscordConfiguration
{
    Token = token,
    TokenType = TokenType.Bot,
    UseInternalLogHandler = true,
    LogLevel = LogLevel.Debug
});

Där token är din bots token.
Sedan, genom lambdan, skriver vi de nödvändiga kommandona som boten ska köra:

discord.MessageCreated += async e =>
{
    string message = e.Message.Content;
    if (message.StartsWith("&"))
    {
        await e.Message.RespondAsync(“Hello, ” + e.Author.Username);
    }
};

Där e.Author.Username får användarens smeknamn.

På detta sätt, när du skickar ett meddelande som börjar med &, kommer boten att hälsa dig välkommen.

I slutet av denna funktion måste du skriva await discord.ConnectAsync(); och invänta Task.Delay(-1);

Detta gör att du kan utföra kommandon i bakgrunden utan att ta upp huvudtråden.

Nu måste vi ta itu med Wargaming API. Allt är enkelt här - skriv CURL-förfrågningar, få ett svar i form av en JSON-sträng, dra ut nödvändig data därifrån och utför manipulationer på dem.

Ett exempel på att arbeta med 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;
        }

Uppmärksamhet! Det rekommenderas absolut inte att lagra alla tokens och applikations-ID:n i klartext! Som ett minimum förbjuder Discord sådana tokens när de går in i det världsomspännande nätverket, och som ett maximum börjar boten användas av angripare.

Distribuera till VPS - server

Skapa en Discord-bot på .NET Core med distribution till en VPS-server

När du är klar med boten måste den finnas på en server som ständigt körs 24/7. Detta beror på det faktum att när din applikation körs körs även boten. Så fort du stänger av programmet somnar din bot också.

Många VPS-servrar finns i den här världen, både på Windows och på Linux, men i de flesta fall är det mycket billigare att hosta på Linux.

På Discord-servern fick jag råd om vscale.io, och jag skapade omedelbart en virtuell server på Ubuntu på den och laddade upp boten. Jag kommer inte att beskriva hur den här sidan fungerar, utan går direkt till botinställningarna.

Först och främst måste du installera den nödvändiga programvaran som kommer att köra vår bot skriven i .NET Core. Hur man gör beskrivs här.

Därefter måste du ladda upp boten till en Git-tjänst, som GitHub och liknande, och klona den till en VPS-server, eller ladda ner din bot på andra sätt. Observera att du bara kommer att ha en konsol, inget GUI. Alls.

När du har laddat ner din bot måste du köra den. För detta behöver du:

  • Återställ alla beroenden: dotnet återställning
  • Bygg applikation: dotnet build namn_projekt.sln -c Release
  • Gå till byggd DLL;
  • dotnet namn_på_fil.dll

Grattis! Din bot körs. Men boten upptar tyvärr konsolen och det är inte lätt att lämna VPS-servern. Dessutom, i händelse av en omstart av servern, måste du starta boten på ett nytt sätt. Det finns ett par vägar ut ur situationen. Alla är relaterade till lanseringen vid serverstart:

  • Lägg till körskript till /etc/init.d
  • Skapa en tjänst som körs vid start.

Jag ser inte poängen med att uppehålla mig i dem i detalj, allt beskrivs tillräckligt detaljerat på Internet.

Resultat

Jag är glad att jag tog mig an denna uppgift. Detta var min första erfarenhet av botutveckling, och jag är glad att jag fick ny kunskap i C # och att arbeta med Linux.

Länk till Discord-server. För dig som spelar Wargaming-spel.
Länk till arkivet där Discord-boten finns.
Länk till DSharpPlus-förvaret.
Tack för din uppmärksamhet!

Källa: will.com

Lägg en kommentar