
Hej, Habr-folk!
I dag vil du blive introduceret til en artikel, der beskriver, hvordan man opretter en bot ved hjÊlp af C# pÄ .NET Core, og hvordan man fÄr den til at kÞre pÄ en remote server.
Artiklen vil bestÄ af en baghistorie, forberedelsesfase, skrivning af logik og overfÞrsel af botten til den remote server.
Jeg hÄber, at denne artikel vil vÊre til hjÊlp for mange begyndere.
Background
Det hele begyndte en sÞvnlÞs efterÄrsnat, som jeg tilbragte pÄ Discord-serveren. Da jeg relativt nyligt var tilsluttet, begyndte jeg at udforske den grundigt. Jeg opdagede tekstkanalen "Jobopslag", blev interesseret, Äbnede den og fandt blandt de uinteressante forslag dette:
"Programmerer (botudvikler)
Krav:
- kendskab til programmeringssprog;
- evne til selvstudium.
Ănsker:
- evne til at forstÄ andres kode;
- kendskab til DISCORD-funktionaliteter.
Opgaver:
- udvikling af bot;
- vedligeholdelse og support af botten.
Din fordel:
- Mulighed for at stÞtte og pÄvirke et interessant projekt;
- Erhvervelse af erfaring med teamwork;
- Mulighed for at demonstrere og forbedre eksisterende fĂŠrdigheder."
Dette fangede straks min interesse. Ja, der blev ikke betalt for dette arbejde, men der blev ikke krĂŠvet nogen forpligtelser fra dig, og det vil ikke vĂŠre skadelig for portfolioet. SĂ„ jeg skrev til serveradministratoren, og han bad mig om at skrive en bot, der ville vise statistikken for spillere i World of Tanks.
Forberedelsesfase

Discord
FĂžr vi kan begynde at skrive vores bot, skal vi oprette den til Discord. Du skal:
- Logge ind pÄ din Discord-konto
- I fanen "Applications" klikke pÄ knappen "New Application" og navngive botten
- FÄ bot-tokenet ved at logge ind pÄ din bot og finde fanen "Bot" under "Settings"
- Gem tokenet et sted
Wargaming
Derudover skal vi oprette en applikation i Wargaming for at fÄ adgang til Wargaming API. Dette er ogsÄ enkelt:
- Log ind pÄ Wargaming-kontoen
- GÄ til "Mine applikationer" og klik pÄ knappen "TilfÞj ny applikation", giv applikationen et navn, og vÊlg dens type
- Gem applikationens ID
Software
Her har du allerede frihed til at vĂŠlge. Nogle bruger Visual Studio, andre Rider, og nogle er virkelig hardcore og skriver kode i Vim (rigtige programmĂžrer bruger kun tastaturet, ikke sandt?). Men for at undgĂ„ at implementere Discord API kan du bruge et uofficielt bibliotek til C# kaldet âDSharpPlusâ. Det kan installeres enten fra NuGet eller ved selv at kompilere kildekoden fra depotet.
For dem, der ikke ved, eller har glemt, hvordan man installerer applikationer fra NuGet.Instruktion til Visual Studio
- GĂ„ til fanen Projekt â Administrer NuGet-pakker;
- Klik pĂ„ Gennemse, og i sĂžgefeltet indtast âDSharpPlusâ;
- VÊlg og installér framework;
- PROFIT!
Forberedelsesfasen er slut, nu kan vi gÄ videre til at skrive botten.
Skrivning af logik

Vi vil ikke dĂŠkke hele logikken i applikationen, jeg vil kun vise, hvordan man arbejder med meddelelser, der fanges af botten, og hvordan man arbejder med Wargaming API.
Arbejdet med Discord-botten foregÄr gennem funktionen static async Task MainTask(string[] args);
For at kalde denne funktion skal du skrive i Main
MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();Derefter skal du initialisere din bot:
discord = new DiscordClient(new DiscordConfiguration
{
Token = token,
TokenType = TokenType.Bot,
UseInternalLogHandler = true,
LogLevel = LogLevel.Debug
}); Hvor token er tokenet for din bot.
Derefter skriver vi nĂždvendige kommandoer, som botten skal udfĂžre, gennem en lambda:
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync(âHej, â + e.Author.Username);
}
};
Hvor e.Author.Username er brugernavnet pÄ brugeren.
SÄ nÄr du sender en hvilken som helst besked, der begynder med &, vil botten hilse pÄ dig.
I slutningen af denne funktion skal du skrive await discord.ConnectAsync(); og await Task.Delay(-1);
Dette vil tillade, at kommandoer kÞrer i baggrunden uden at blokere hovedtrÄden.
Nu skal vi se pĂ„ Wargaming API. Her er det enkelt â skriv CURL-anmodninger, modtag svar i form af JSON-strenge, udtrĂŠk de nĂždvendige data derfra og manipulĂ©r dem.
Eksempel pÄ arbejde 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("Spiller ikke fundet");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Minimum tre tegn krĂŠves");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Ugyldig sĂžgning");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Tom brugernavn");
}
else
{
throw new Exception("Noget gik galt.");
}
}
return player;
}
Advarsel! Det anbefales pÄ det kraftigste ikke at opbevare alle tokens og app-ID'er i Äbent format! I det mindste vil Discord blockere sÄdanne tokens, nÄr de kommer ud pÄ internettet, og i vÊrste fald kan botten blive udnyttet af svindlere.
Deployment pĂ„ VPS â server

NÄr du er fÊrdig med botten, skal den placeres pÄ en server, der kÞrer dÞgnet rundt 24/7. Dette skyldes, at nÄr din applikation kÞrer, kÞrer botten ogsÄ. SÄ snart du slukker for applikationen, gÄr din bot ogsÄ i dvale.
Der er mange VPS-servere derude, bÄde pÄ Windows og pÄ Linux, men i de fleste tilfÊlde er det langt billigere at hoste pÄ Linux.
PÄ Discord-serveren anbefalede de vscale.io til mig, sÄ jeg oprettede straks en virtuel server pÄ Ubuntu og uploadede botten. Jeg vil ikke beskrive, hvordan denne hjemmeside fungerer, men gÄr direkte til indstillingerne for botten.
FĂžrst skal du installere den nĂždvendige software, som skal kĂžre vores bot, der er skrevet i .NET Core. .
DernĂŠst skal du uploade botten til Git â en service som GitHub og lignende, og klone den pĂ„ VPS-serveren, eller pĂ„ anden mĂ„de downloade din bot. VĂŠr opmĂŠrksom pĂ„, at du kun vil have en konsol, der vil ikke vĂŠre nogen GUI. Overhovedet.
NÄr du har downloaded din bot, skal du starte den. For dette skal du:
- Gendanne alle afhĂŠngigheder: dotnet restore
- Bygge applikationen: dotnet build name_project.sln -c Release
- GĂ„ til den byggede DLL;
- dotnet name_of_file.dll
Tillykke! Din bot er startet. DesvÊrre optager botten konsollen, og det er ikke sÄ let at lukke VPS-serveren. Derudover, hvis serveren genstartes, skal botten startes igen. Der er et par lÞsninger pÄ dette problem. Alle er relateret til at starte ved serverstart:
- TilfĂžje scriptstart til /etc/init.d
- Oprette en tjeneste, der starter ved opstart.
Jeg ser ikke nogen grund til at gÄ i dybden med dem; alt er tilstrÊkkeligt godt beskrevet pÄ internettet.
Konklusioner
Jeg er glad for, at jeg tog dette opdrag. Det var min fÞrste erfaring med at udvikle en bot, og jeg er glad for, at jeg har fÄet ny viden om C# og arbejde med Linux.
Link til Discord-serveren.
Tak for din opmĂŠrksomhed!
Kilde: habr.com
