
Salut, Habrovchani!
Astăzi veți lua cunoștință cu un articol în care se va vorbi despre cum să creați un bot folosind C# pe .NET Core și despre cum să-l deployați pe un server remote.
Articolul va consta în istoricul, etapa pregătitoare, scrierea logicii și transferul bot-ului pe serverul remote.
Sper că acest articol va ajuta mulți începători.
Povestea
Totul a început într-o noapte de toamnă fără somn, pe care o petreceam pe serverul Discord. Deoarece mă alăturasem relativ recent, am început să-l studiez în detaliu. Descoperind canalul text «Locuri de muncă», am fost interesat, l-am deschis și am găsit printre ofertele care nu mă interesau, aceasta:
«Programator (dezvoltator bot)
Cerințe:
- cunoștințe de programare;
- capacitate de autoînvățare.
Cerințe:
- abilitatea de a înțelege codul altora;
- cunoștințe despre funcționalitatea DISCORD.
Sarcini:
- dezvoltarea bot-ului;
- asigurarea suportului și mentenanței bot-ului.
Beneficiul tău:
- Posibilitatea de a susține și influența un proiect care ți-a plăcut;
- Dobândirea experienței de lucru în echipă;
- Posibilitatea de a-ți demonstra și îmbunătăți abilitățile existente.»
Acest lucru m-a interesat imediat. Da, pentru acest lucru nu erau plătiți, dar nu era necesar niciun angajament din partea ta și cu siguranță nu va strica portofoliului tău. Așa că am scris administratorului serverului, iar el mi-a cerut să scriu un bot care să afișeze statistica jucătorului în World of Tanks.
Etapa pregătitoare

Discord
Înainte de a începe să scriem bot-ul nostru, trebuie să-l creăm pentru Discord. Ai nevoie de:
- Conectează-te la contul tău Discord
- În fila „Applications”, apasă pe butonul „New Application” și denumește bot-ul
- Obține token-ul bot-ului, intrând în bot-ul tău și căutând în lista „Settings” fila „Bot”
- Păstrează token-ul undeva
Wargaming
De asemenea, trebuie să creezi o aplicație în Wargaming pentru a obține acces la API-ul Wargaming. Aici e simplu:
- Accesează-ți contul Wargaming
- Mergi la „Aplicațiile mele” și apasă pe butonul „Adaugă o aplicație nouă”, oferindu-i un nume aplicației și alegând tipul acesteia
- Salvează ID-ul aplicației
Software
Aici deja există libertatea de a alege. Unii folosesc Visual Studio, alții Rider, iar alții scriu cod în Vim (cu toate că adevărații programatori folosesc doar tastatura, nu-i așa?). Totuși, pentru a nu implementa API-ul Discord, se poate folosi o bibliotecă neoficială pentru C# numită "DSharpPlus". Aceasta poate fi instalată fie din NuGet, fie prin compilarea surselor din repository.
Pentru cei care nu știu sau au uitat cum se instalează aplicații din NuGet.Instrucțiuni pentru Visual Studio
- Accesați tab-ul Proiect – Administrare pachete NuGet;
- Faceți clic pe 'Browse' și în câmpul de căutare introduceți "DSharpPlus";
- Selectați și instalați framework-ul;
- PROFIT!
Etapa pregătitoare s-a încheiat, putem trece la scrierea bot-ului.
Scrierea logicii

Nu vom analiza toată logica aplicației, ci doar voi arăta cum să lucrați cu interceptarea mesajelor de către bot și cum să lucrați cu API-ul Wargaming.
Interacțiunea cu bot-ul Discord se realizează prin funcția static async Task MainTask(string[] args);
Pentru a apela această funcție, în Main trebuie să scrieți
MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();Apoi, trebuie să inițializați bot-ul vostru:
discord = new DiscordClient(new DiscordConfiguration
{
Token = token,
TokenType = TokenType.Bot,
UseInternalLogHandler = true,
LogLevel = LogLevel.Debug
}); Unde token reprezintă token-ul bot-ului vostru.
Apoi, printr-o lambda, definiți comenzile necesare pe care bot-ul trebuie să le execute:
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync("Hello, " + e.Author.Username);
}
};
Unde e.Author.Username reprezintă obținerea numelui de utilizator.
Astfel, când veți trimite orice mesaj care începe cu &, bot-ul vă va saluta.
La sfârșitul acestei funcții, trebuie să scrieți await discord.ConnectAsync(); și await Task.Delay(-1);
Acest lucru va permite executarea comenzilor în fundal, fără a bloca firul principal.
Acum trebuie să ne ocupăm de API-ul Wargaming. Aici totul este simplu – scrieți cereri CURL, obțineți răspunsul sub formă de JSON – șiruri, extrageți datele necesare de acolo și faceți manipulările dorite.
Exemplu de lucru cu WargamingAPI
public Player FindPlayer(string searchNickname)
{
//https://api.worldoftanks.ru/wot/account/list/?application_id=your_a@@_id_h3r3&search=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("Jucătorul nu a fost găsit");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Este necesară o lungime minimă de trei caractere");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Căutare invalidă");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Nickname gol");
}
else
{
throw new Exception("Ceva a mers prost.");
}
}
return player;
}
Atenție! Este strict nerecomandat să păstrați toate tokenurile și ID-urile aplicațiilor în formă deschisă! Cel puțin – Discord blochează astfel de tokenuri atunci când ajung pe internet, cel mai rău – botul începe să fie utilizat de către atacatori.
Dezvoltare pe VPS – server

După ce ați terminat cu botul, trebuie să îl plasați pe un server care funcționează constant 24/7. Aceasta se datorează faptului că, atunci când aplicația dumneavoastră funcționează, botul de asemenea funcționează. De îndată ce opriți aplicația, botul dumneavoastră va intra în repaus.
Există multe servere VPS în lume, atât pe Windows, cât și pe Linux, însă, în cele mai multe cazuri, pe Linux este mult mai ieftin să găzduiți.
Pe serverul Discord, mi s-a recomandat vscale.io, iar eu imediat am creat un server virtual pe Ubuntu și am încărcat botul. Nu voi descrie cum funcționează acest site, ci voi trece direct la configurarea botului.
În primul rând, trebuie să instalați software-ul necesar care va rula botul nostru, scris pe .NET Core. .
Apoi, trebuie să încărcați botul pe un serviciu Git, precum GitHub și similare, și să-l clonați pe serverul VPS, sau, prin alte metode, să descărcați botul dumneavoastră. Rețineți că veți avea doar consola, interfața grafică nu va fi disponibilă. Deloc.
După ce ați descărcat robotul, trebuie să-l porniți. Pentru asta, trebuie să:
- Restaurați toate dependențele: dotnet restore
- Construiți aplicația: dotnet build name_project.sln -c Release
- Mergeți la DLL-ul construit;
- dotnet name_of_file.dll
Felicitări! Robotul dvs. a fost pornit. Cu toate acestea, robotul, din păcate, ocupă consola, așa că ieșirea din VPS – server nu va fi atât de simplă. De asemenea, în caz de repornire a serverului, va trebui să reporniți robotul. Există câteva soluții pentru această situație. Toate sunt legate de a porni la pornirea serverului:
- Adăugați lansarea scriptului în /etc/init.d
- Creați un serviciu care se va porni la boot.
Nu văd sens să mă opresc prea mult asupra lor, este destul de detaliat explicat pe internet.
Conclusions
Sunt fericit că am acceptat această sarcină. A fost prima mea experiență în dezvoltarea unui robot și sunt bucuros că am dobândit noi cunoștințe despre C# și lucrul cu Linux.
Link către serverul Discord.
Vă mulțumesc pentru atenție!
Sursa: habr.com
