Skapa en Discord-bot med .NET Core och distribuera den pÄ en VPS-server

Skapa en Discord-bot med .NET Core och distribuera den pÄ en VPS-server

Hej, Habr-anhÀngare!

Idag kommer du att bekanta dig med en artikel som förklarar hur man skapar en bot med C# pÄ .NET Core och hur man fÄr den att fungera pÄ en fjÀrrserver.

Artikeln kommer att bestÄ av en bakgrund, förberedelser, skrivande av logik och överföring av boten till en fjÀrrserver.

Jag hoppas att denna artikel kommer att hjÀlpa mÄnga nybörjare.

Bakgrund

Allt började en sömnlös höstnatt som jag tillbringade pÄ en Discord-server. Eftersom jag ganska nyligen anslöt mig till den, började jag utforska den grundligt. Jag upptÀckte textkanalen "Jobbannonser" och blev intresserad, sÄ jag öppnade den och hittade bland de erbjudanden som inte intresserade mig detta:

"Programmerare (botutvecklare)
Krav:

  • kunskaper i programmeringssprĂ„k;
  • förmĂ„ga att lĂ€ra sig sjĂ€lv.

ÖnskemĂ„l:

  • förmĂ„ga att förstĂ„ andras kod;
  • kunskap om DISCORD:s funktionalitet.

Uppgifter:

  • utveckling av boten;
  • underhĂ„ll och support av botens funktion.

Din fördel:

  • Möjlighet att stödja och pĂ„verka ett intressant projekt;
  • Erfarenhet av att arbeta i team;
  • Möjlighet att visa och förbĂ€ttra befintliga fĂ€rdigheter."


Det hÀr fascinerade mig omedelbart. Ja, för detta arbete betalades det inte, men inga förpliktelser krÀvdes av dig, och dessutom kommer det att vara en bra tillÀgg till portföljen. SÄ jag skrev till serveradministratören, och han bad mig att skriva en bot som skulle visa spelarens statistik i World of Tanks.

Förberedelsefasen

Skapa en Discord-bot med .NET Core och distribuera den pÄ en VPS-server
Discord
Innan vi pÄbörjar skrivandet av vÄr bot mÄste vi skapa en för Discord. Du behöver:

  1. Logga in pÄ Discord-kontot via lÀnken
  2. Klicka pÄ knappen "New Application" i fliken "Applications" och namnge boten
  3. HÀmta botens token genom att logga in pÄ din bot och hitta "Bot"-fliken under "Settings" i listan
  4. Spara token nÄgonstans

Wargaming

Dessutom behöver du skapa en applikation i Wargaming för att fÄ tillgÄng till Wargamings API. Det Àr ocksÄ enkelt:

  1. Logga in pÄ Wargaming-kontot via denna lÀnk
  2. GÄ till "Mina applikationer" och klicka pÄ knappen "LÀgg till ny applikation", ge applikationen ett namn och vÀlj dess typ
  3. Spara applikationens ID

Programvara

HÀr finns det redan frihet att vÀlja. Vissa anvÀnder Visual Studio, andra Rider, och vissa skriver kod i Vim (verkliga programmerare anvÀnder ju bara tangentbord, eller hur?). Men för att slippa implementera Discord API kan man anvÀnda det inofficiella biblioteket för C# "DSharpPlus". Det kan installeras antingen frÄn NuGet eller genom att bygga kÀllkoden frÄn repositoryt sjÀlv.

För dem som inte vet, eller har glömt, hur man installerar applikationer frÄn NuGet.Instruktion för Visual Studio

  1. Vi gĂ„r till fliken Projekt – Hantera NuGet-paket;
  2. Klicka pÄ BlÀddra och skriv "DSharpPlus" i sökfÀltet;
  3. VĂ€lj och installera ramverket;
  4. VINST!

Förberedelsefasen Àr avslutad, nu kan vi börja skriva boten.

Skriva logik

Skapa en Discord-bot med .NET Core och distribuera den pÄ en VPS-server

Vi kommer inte att gÄ igenom all logik i applikationen, jag ska bara visa hur man arbetar med meddelandefÄngst av boten och hur man jobbar med Wargaming API.

Arbetet med Discord-boten sker genom funktionen static async Task MainTask(string[] args);
För att anropa denna funktion mÄste du ange 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 en lambda, anger vi de nödvÀndiga kommandona som boten ska utfö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 Àr hÀmtningen av anvÀndarnamnet.

SÄ nÀr du skickar ett meddelande som börjar med &, kommer boten att hÀlsa dig.

I slutet av denna funktion mÄste du ange await discord.ConnectAsync(); och await Task.Delay(-1);

Detta gör att kommandon kan köras i bakgrunden utan att blockera huvudtrÄden.

Nu mĂ„ste vi förstĂ„ Wargaming API. HĂ€r Ă€r allt enkelt – du skriver CURL-förfrĂ„gningar, fĂ„r svar i form av JSON-strĂ€ngar, extraherar de nödvĂ€ndiga uppgifterna och manipulerar med dem.

Exempel pÄ arbete 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("Spelaren hittades inte");
                }
            }
            else
            {
                string error = parsed.error.message;
                if (error == "NOT_ENOUGH_SEARCH_LENGTH")
                {
                    throw new PlayerNotFound("Minst tre tecken krÀvs");
                }
                else if (error == "INVALID_SEARCH")
                {
                    throw new PlayerNotFound("Ogiltig sökning");
                }
                else if (error == "SEARCH_NOT_SPECIFIED")
                {
                    throw new PlayerNotFound("Tomt smeknamn");
                }
                else
                {
                    throw new Exception("NÄgot gick fel.");
                }
            }

            return player;
        }

Observera! Det rekommenderas starkt att inte lagra tokens och app-ID:n i öppen form! Minst av allt – Discord blockerar sĂ„dana tokens nĂ€r de kommer ut pĂ„ nĂ€tet, och i vĂ€rsta fall – kan botten börja anvĂ€ndas av illasinnade.

Distribuera pĂ„ VPS – server

Skapa en Discord-bot med .NET Core och distribuera den pÄ en VPS-server

NÀr du har avslutat botten, mÄste den placeras pÄ en server som alltid Àr igÄng 24/7. Detta beror pÄ att nÀr din applikation körs, körs ocksÄ botten. SÄ snart du stÀnger av applikationen, gÄr Àven din bot i vila.

Det finns mÄnga VPS-servrar i vÀrlden, bÄde pÄ Windows och Linux, men i de flesta fall Àr det betydligt billigare att hosta pÄ Linux.

PÄ Discord-servern rekommenderade de vscale.io, och jag skapade omedelbart en virtuell server dÀr pÄ Ubuntu och laddade upp botten. Jag kommer inte att gÄ in pÄ hur den hÀr webbplatsen fungerar, utan gÄ direkt till instÀllningarna för botten.

Först och frÀmst behöver du installera nödvÀndig programvara som kommer att köra vÄr bot skriven pÄ .NET Core. SÄ hÀr gör du, beskrivs hÀr.

DĂ€refter behöver du ladda upp botten till en Git-tjĂ€nst, som GitHub eller liknande, och klona den pĂ„ VPS-servern, eller pĂ„ andra sĂ€tt ladda ner din bot. Observera att du endast kommer att ha en konsol, GUI kommer inte att finnas. Överhuvudtaget.

NÀr du har laddat ner din bot, behöver du starta den. För att göra detta behöver du:

  • ÅterstĂ€lla alla beroenden: dotnet restore
  • Bygga applikationen: dotnet build name_project.sln -c Release
  • GĂ„ till den byggda DLL-filen;
  • dotnet name_of_file.dll

Grattis! Din bot Àr igÄng. TyvÀrr upptar boten konsolen, och det Àr inte sÄ enkelt att lÀmna VPS-servern. Om servern startas om, mÄste boten startas igen. Det finns nÄgra lösningar pÄ detta. Alla Àr relaterade till att starta vid serverstart:

  • LĂ€gg till skriptstart i /etc/init.d
  • Skapa en tjĂ€nst som startas vid uppstart.

Jag ser ingen mening i att gÄ in pÄ detaljer, allt Àr tillrÀckligt vÀl beskrivet pÄ internet.

Slutsatser

Jag Àr glad att jag tog mig an den hÀr uppgiften. Det var min första erfarenhet av att utveckla en bot, och jag Àr glad att jag fick nya kunskaper om C# och att arbeta med Linux.

LÀnk till Discord-servern. För dem som spelar Wargaming-spel.
LÀnk till repositoriet dÀr Discord-boten finns.
LĂ€nk till repositoriet DSharpPlus.
Tack för uppmÀrksamheten!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster