
Pozdravljeni, Habravljani!
Danes se boste seznanili s člankom, v katerem bo opisano, kako ustvariti bota z uporabo C# na .NET Core ter kako ga namestiti na oddaljeni strežnik.
Članek bo sestavljen iz predzgodbe, pripravljalne faze, pisanja logike ter prenosa bota na oddaljeni strežnik.
Upam, da vam bo ta članek pomagal mnogim začetnikom.
Pozadina
Vse se je začelo v eni brezspalni jesenski noči, ki sem jo preživel na Discord strežniku. Ker sem se šele nedavno pridružil, sem ga začel raziskovati. Ko sem naletel na besedilni kanal 'Zaposlitve', sem bil navdušen, odprl sem ga in med neprivlačnimi ponudbami našel to:
Programer (razvijalec bota)
Zahteve:
- poznavanje programskih jezikov;
- sposobnost samoučenja.
Želje:
- sposobnost razumevanja tujega kode;
- poznavanje funkcionalnosti DISCORD.
Naloge:
- razvoj bota;
- podpora in vzdrževanje delovanja bota.
Vaša korist:
- Možnost podpreti in vplivati na vam všečen projekt;
- Pridobitev izkušenj pri delu v skupini;
- Možnost demonstracije in izboljšanja obstoječih veščin.
To me je takoj pritegnilo. Da, za to delo niso plačali, vendar nisi imel obveznosti, pa tudi v portfelju ne bo odveč. Zato sem napisal administratorju strežnika, ki me je prosil, naj napišem bota, ki bo prikazoval statistiko igralca v World of Tanks.
Pripravljalna faza

Discord
Preden se lotimo pisanja našega bota, ga je potrebno ustvariti za Discord. Potrebujete:
- Prijavite se v račun Discord
- Na zavihku 'Applications' kliknite na gumb 'New Application' in poimenujte bota
- Pridobite token bota, tako da vstopite v svojega bota in najdete zavihek 'Bot' v seznamu 'Settings'
- Shrani token nekam
Wargaming
Poleg tega je potrebno ustvariti aplikacijo v Wargamingu, da pridobite dostop do Wargaming API. Tudi tukaj je vse preprosto:
- Prijavite se v svoj Wargaming račun
- Pojdite v 'Moje aplikacije' in kliknite na gumb 'Dodaj novo aplikacijo', ji dajte ime in izberite njen tip
- Shrani ID aplikacije
Software
Tuk je že svoboda izbire. Nekateri uporabljajo Visual Studio, nekateri Rider, nekateri pa celo zmogljivega in pišejo kodo v Vim (pravi programerji uporabljajo samo tipkovnico, kajne?). Vendar pa, da ne bi morali implementirati Discord API-ja, lahko uporabite neformalno knjižnico za C# “DSharpPlus”. To lahko namestite bodisi iz NuGet-a bodisi tako, da sami sestavite izvorno kodo iz repozitorija.
Za tiste, ki ne vedo ali so pozabili, kako namestiti aplikacije iz NuGet-a.Navodila za Visual Studio
- Pojdite na zavihek Projekt – Upravljanje NuGet paketov;
- Kliknite na pregled in v iskalno polje vpišite “DSharpPlus”;
- Izberite in namestite framework;
- PROFIT!
Pripravljalna faza je zaključena, lahko preidemo k pisanju bota.
Pisanje logike

Celotne logike aplikacije ne bomo obravnavali, pokazal bom le, kako delati s prestrezanjem sporočil z botom in kako delati z Wargaming API.
Izvajanje Discord bota poteka preko funkcije static async Task MainTask(string[] args);
Da bi poklicali to funkcijo, morate v Main zapisati
MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();Nato morate inicializirati svojega bota:
discord = new DiscordClient(new DiscordConfiguration
{
Token = token,
TokenType = TokenType.Bot,
UseInternalLogHandler = true,
LogLevel = LogLevel.Debug
}); Kjer je token – token vašega bota.
Nato preko lambda funkcije zapišemo potrebne ukaze, ki jih mora bot izvajati:
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync(“Hello, ” + e.Author.Username);
}
};
Kjer e.Author.Username – pridobitev vzdevka uporabnika.
Tako bo bot pozdravil vas, ko pošljete katerokoli sporočilo, ki se začne s &.
Na koncu te funkcije je potrebno zapisati await discord.ConnectAsync(); in await Task.Delay(-1);
To omogoča izvajanje ukazov v ozadju, ne da bi zavzeli glavni tok.
Zdaj se je treba spoprijeti z Wargaming API. Tukaj je vse preprosto – pišete CURL poizvedbe, prejmete odgovor v obliki JSON-niza, izvlečete potrebne podatke in delate manipulacije nad njimi.
Primer dela 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("Igralec ni bil najden");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Minimumn tri znake sta potrebne");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Napačno iskanje");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Prazno uporabniško ime");
}
else
{
throw new Exception("Nekaj je šlo narobe.");
}
}
return player;
}
Pozor! Vse žetone in ID aplikacij je strogo odsvetovano hraniti v odprti obliki! Vsaj – Discord blokira tovrstne žetone, ko ti pridejo v svetovni splet, v najslabšem primeru – bot začne izkoriščati zlorabniki.
Implementacija na VPS – strežnik

Ko končate z botom, ga je treba namestiti na strežnik, ki deluje nenehno 24/7. To je povezano s tem, da, ko vaše aplikacijo deluje, deluje tudi bot. Takoj, ko izklopite aplikacijo, zaspi tudi vaš bot.
Obstaja veliko VPS strežnikov na svetu, tako na Windows kot na Linux, vendar je v večini primerov na Linuxu veliko ceneje namestiti.
Na Discord strežniku so mi priporočili vscale.io, zato sem takoj ustvaril virtualni strežnik na Ubuntuju in naložil bota. Ne bom opisoval, kako deluje ta spletna stran, takoj preidem na nastavitev bota.
Najprej morate namestiti potrebno programsko opremo, ki bo zagnala našega bota, napisanega v .NET Core. .
Nato morate bota naložiti na Git – storitev, kot je GitHub in podobne, ter klonirati na VPS – strežnik ali pa na drugačen način prenesti vašega bota. Upoštevajte, da boste imeli samo konzolo, GUI ne bo. Sploh.
Ko ste prenesli svojega bota, ga morate zagnati. Za to potrebujete:
- Obnoviti vse odvisnosti: dotnet restore
- Zgraditi aplikacijo: dotnet build name_project.sln -c Release
- Preiti k zgrajeni DLL;
- dotnet name_of_file.dll
Čestitam! Vaš bot je zagnan. Vendar pa bot, na žalost, zaseda konzolo, in iz VPS serverja ni enostavno izstopiti. Prav tako, v primeru ponovnega zagona strežnika, bo potrebno znova zagnati bota. Tu je nekaj rešitev za situacijo. Vse so povezane z zagonom ob zagonu strežnika:
- Dodati zagon skripte v /etc/init.d
- Ustvariti storitev, ki se bo zagnala ob zagonu.
Podrobneje se ne bom ustavljal, vse je dovolj podrobno opisano na spletu.
Zaključki
Vesel sem, da sem se lotil tega naloge. To je bila moja prva izkušnja z razvojem bota in vesel sem, da sem pridobil nova znanja o C# in delu z Linuxom.
Povezava do Discord strežnika.
Hvala za pozornost!
Izvor: habr.com
