
Pozdrav, Habr zajednico!
Danas ćete se upoznati s člankom koji objašnjava kako stvoriti bota koristeći C# na .NET Coreu, kao i kako ga postaviti na udaljeni poslužitelj.
Članak će se sastojati od pozadine, pripremnog koraka, pisanja logike i prijenosa bota na udaljeni poslužitelj.
Nadam se da će ovaj članak pomoći mnogim početnicima.
Povijest
Sve je počelo jedne besane jesenske noći koju sam proveo na Discord – poslužitelju. Kako sam se relativno nedavno pridružio, odlučio sam ga istražiti u detalje. Otkrijevši tekstualni kanal „Poslovi“, zainteresirao sam se, otvorio ga i među neinteresantnim ponudama pronašao ovo:
„Programer (razvijač bota)
Zahtjevi:
- poznavanje programskih jezika;
- sposobnost samostalnog učenja.
Želje:
- sposobnost razumijevanja tuđeg koda;
- poznavanje funkcionalnosti DISCORD-a.
Zadaci:
- razvijanje bota;
- podrška i održavanje rada bota.
Vaša korist:
- Mogućnost podrške i utjecaja na projekt koji vam se sviđa;
- Stjecanje iskustva rada u timu;
- Mogućnost demonstracije i poboljšanja postojećih vještina."
To me odmah zainteresiralo. Da, za ovaj rad se nije plaćalo, ali od vas nisu tražene nikakve obveze, a niti bi u portfelju bilo suvišno. Zato sam napisao administratoru servera, i on je tražio da napravim bota koji će prikazivati statistiku igrača u World of Tanks.
Pripremna faza

Discord
Prije nego započnemo s pisanjem našeg bota, potrebno ga je stvoriti za Discord. Trebate:
- Prijaviti se na Discord račun
- U kartici “Applications” kliknuti na gumb “New Application” i imenovati bota
- Dobiti token bota, ulaskom u svog bota i pronalaskom kartice “Bot” u popisu “Settings”
- Spremiti token negdje
Wargaming
Također, potrebno je kreirati aplikaciju u Wargamingu kako biste dobili pristup API-ju Wargaminga. Ovdje je također sve jednostavno:
- Prijavite se u Wargaming račun
- Idemo u „Moje aplikacije“ i kliknemo na gumb „Dodaj novu aplikaciju“, imenujemo aplikaciju i odabiremo njen tip
- Spremamo ID aplikacije
Softver
Ovdje već imate slobodu izbora. Neki koriste Visual Studio, neki Rider, a neki koriste moćan editor i pišu kod u Vimu (pravi programeri koriste samo tipkovnicu, zar ne?). Međutim, da ne biste implementirali Discord API, možete koristiti neformalnu biblioteku za C# pod nazivom “DSharpPlus”. Možete je instalirati ili iz NuGet-a ili sami preuzeti izvornu datoteku iz repozitorija.
Za one koji ne znaju, ili su zaboravili kako instalirati aplikacije iz NuGet-a.Upute za Visual Studio
- Idemo na karticu Projekt – Upravljanje NuGet paketima;
- Kliknite na pregled i unesite “DSharpPlus” u polje za pretraživanje;
- Odaberite i instalirajte framework;
- PROFIT!
Pripremna faza je završena, možemo preći na pisanje bota.
Pisanje logike

Nećemo raspravljati o čitavoj logici aplikacije, samo ću pokazati kako raditi s presretanjem poruka od strane bota i kako raditi s Wargaming API-jem.
Rad s Discord botom odvija se putem funkcije static async Task MainTask(string[] args);
Da biste pozvali ovu funkciju, u Main trebate napisati
MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();Nakon toga, potrebno je inicijalizirati svog bota:
discord = new DiscordClient(new DiscordConfiguration
{
Token = token,
TokenType = TokenType.Bot,
UseInternalLogHandler = true,
LogLevel = LogLevel.Debug
}); Gdje je token – token vašeg bota.
Zatim, putem lambda funkcije, definiramo potrebne naredbe koje bot treba izvršiti:
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync(“Hello, ” + e.Author.Username);
}
};
Gdje je e.Author.Username – dobivanje nadimka korisnika.
Tako, kada pošaljete bilo koju poruku koja počinje sa &, bot će vas pozdraviti.
Na kraju ove funkcije, potrebno je napisati await discord.ConnectAsync(); i await Task.Delay(-1);
To će omogućiti izvršavanje naredbi u pozadini bez zauzimanja glavnog toka.
Sada se trebate pozabaviti Wargaming API-jem. Tu je sve jednostavno – pišete CURL zahtjeve, dobivate odgovor u obliku JSON niza, izvučete potrebne podatke i radite s njima.
Primjer rada s 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("Igrač nije pronađen");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Potrebno je najmanje tri znaka");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Neispravno pretraživanje");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Prazno ime igrača");
}
else
{
throw new Exception("Došlo je do greške.");
}
}
return player;
}
Upozorenje! Sve tokene i ID aplikacija strogo se ne preporučuje čuvati u otvorenom obliku! Kao minimum – Discord zabranjuje takve tokene kada dospiju u svjetsku mrežu, kao maksimum – bot počinje koristiti zlonamjernici.
Implementacija na VPS – server

Nakon što završite s botom, potrebno ga je smjestiti na server koji neprekidno radi 24/7. To je povezano s tim da kada radi vaša aplikacija, tada radi i bot. Čim isključite aplikaciju, vaš bot također prestaje raditi.
Postoji mnogo VPS servera na ovom svijetu, kako na Windows, tako i na Linux, ali u većini slučajeva, na Linuxu je znatno jeftinije smjestiti.
Na Discord – serveru preporučili su mi vscale.io, i odmah sam tamo napravio virtualni server na Ubuntu i postavio bota. Neću opisivati kako taj site radi, već ću odmah preći na postavke bota.
Prvo što trebate učiniti je instalirati potreban softver koji će pokretati našeg bota, napisanog na .NET Core. .
Zatim, potrebno je prenijeti bota na Git – servis, poput GitHub-a i slično, i klonirati na VPS – server, ili na neki drugi način preuzeti vašeg bota. Imajte na umu da ćete imati samo konzolu, GUI neće biti. Uopće.
Nakon što preuzmete svog bota, potrebno ga je pokrenuti. Za to je potrebno:
- Obnoviti sve ovisnosti: dotnet restore
- Izgraditi aplikaciju: dotnet build name_project.sln -c Release
- Preći na izgrađenu DLL;
- dotnet name_of_file.dll
Čestitam! Vaš bot je pokrenut. Međutim, bot, nažalost, zauzima konzolu, i izlazak iz VPS-a – servera nije baš jednostavan. Također, u slučaju ponovnog pokretanja servera, bot se mora ponovo pokrenuti. Postoji nekoliko rešenja za ovu situaciju. Sva su vezana uz pokretanje prilikom pokretanja servera:
- Dodati pokretanje skripte u /etc/init.d
- Kreirati servis koji će se pokretati prilikom pokretanja.
Ne vidim smisao u detaljnom objašnjavanju, sve je dovoljno detaljno opisano na internetu.
Zaključci
Drago mi je što sam se prihvatio ovog zadatka. Ovo je bilo moje prvo iskustvo u razvoju bota, i drago mi je da sam stekao nova znanja o C#-u i radu s Linuxom.
Link na Discord – server.
Hvala na pažnji!
Izvor: habr.com
