Discord roboto kūrimas .NET Core su diegimu VPS serveryje
Sveiki chabrovitai!
Šiandien pamatysite straipsnį, kuriame bus parodyta, kaip sukurti robotą naudojant C# .NET Core ir kaip jį paleisti nuotoliniame serveryje.
Straipsnį sudarys fonas, paruošiamasis etapas, logikos rašymas ir boto perkėlimas į nuotolinį serverį.
Tikiuosi, kad šis straipsnis padės daugeliui pradedančiųjų.
priešistorė
Viskas prasidėjo vieną bemiegę rudens naktį, kurią praleidau Discord serveryje. Kadangi neseniai prisijungiau prie jo, pradėjau jį tyrinėti aukštyn ir žemyn. Radęs tekstinį kanalą „Laisvos darbo vietos“ susidomėjau, atsidariau jį ir tarp manęs nedominančių pasiūlymų radau štai tokius:
"Programuotojas (botų kūrėjas) reikalavimai:
programavimo kalbų išmanymas;
gebėjimas mokytis savarankiškai.
Пожелания:
gebėjimas suprasti kitų žmonių kodą;
DISCORD funkcionalumo išmanymas.
Užduotys:
botų kūrimas;
boto palaikymas ir priežiūra.
Jūsų nauda:
Galimybę palaikyti ir daryti įtaką jums patinkančiam projektui;
Įgyti patirties dirbant komandoje;
Galimybę pademonstruoti ir tobulinti turimus įgūdžius.
Tai mane iškart sudomino. Taip, jie nemokėjo už šį darbą, bet nereikalavo iš jūsų jokių įsipareigojimų ir portfelyje tai nebus nereikalinga. Todėl parašiau serverio administratoriui, o jis paprašė parašyti botą, kuris rodytų žaidėjo statistiką World of Tanks.
Parengiamasis etapas
Discrod
Prieš pradėdami rašyti savo robotą, turime jį sukurti „Discord“. Tau reikia:
Einame į „Mano programos“ ir spustelėkite mygtuką „Pridėti naują programą“, nurodydami programos pavadinimą ir pasirinkdami jos tipą.
Išsaugomas programos ID
programinė įranga
Jau yra pasirinkimo laisvė. Kažkas naudoja Visual Studio, kažkas Rider, kažkas paprastai yra galingas ir rašo kodą Vim (juk tikri programuotojai naudoja tik klaviatūrą, tiesa?). Tačiau norėdami neįdiegti „Discord“ API, galite naudoti neoficialią C# biblioteką „DSharpPlus“. Jį galite įdiegti iš „NuGet“ arba patys kurdami šaltinius iš saugyklos.
Tiems, kurie nežino arba pamiršo, kaip įdiegti programas iš NuGet.„Visual Studio“ instrukcijos
Eikite į skirtuką Projektas - Tvarkyti „NuGet“ paketus;
Spustelėkite apžvalgą ir paieškos laukelyje įveskite „DSharpPlus“;
Pasirinkti ir įdiegti karkasą;
Pelnas!
Parengiamasis etapas baigėsi, galite pereiti prie roboto rašymo.
Rašymo logika
Mes nenagrinėsime visos programos logikos, aš tik parodysiu, kaip dirbti su žinučių perėmimu botu ir kaip dirbti su Wargaming API.
Darbas su „Discord“ botu vyksta naudojant statinį asinchronizavimą Task MainTask(string[] args);
Norėdami iškviesti šią funkciją, pagrindiniame puslapyje turite užsiregistruoti
Kur yra jūsų roboto prieigos raktas.
Tada per lambda parašome reikiamas komandas, kurias robotas turėtų vykdyti:
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync(“Hello, ” + e.Author.Username);
}
};
Kur e.Author.Username gauna vartotojo slapyvardį.
Tokiu būdu, kai siunčiate bet kokį pranešimą, prasidedantį &, robotas jus pasveikins.
Šios funkcijos pabaigoje turite parašyti await discord.ConnectAsync(); ir laukti Task.Delay(-1);
Tai leis jums vykdyti komandas fone, neužimant pagrindinės gijos.
Dabar turime susidoroti su Wargaming API. Čia viskas paprasta – parašykite CURL užklausas, gaukite atsakymą JSON eilutės forma, ištraukite iš ten reikiamus duomenis ir atlikite jais manipuliacijas.
Darbo su WargamingAPI pavyzdys
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("Игрок не найден");
}
}
else
{
string error = parsed.error.message;
if (error == "NOT_ENOUGH_SEARCH_LENGTH")
{
throw new PlayerNotFound("Минимум три символа требуется");
}
else if (error == "INVALID_SEARCH")
{
throw new PlayerNotFound("Неверный поиск");
}
else if (error == "SEARCH_NOT_SPECIFIED")
{
throw new PlayerNotFound("Пустой никнейм");
}
else
{
throw new Exception("Something went wrong.");
}
}
return player;
}
Dėmesio! Griežtai nerekomenduojama visų žetonų ir programų ID saugoti aiškiu tekstu! Mažiausiai „Discord“ uždraudžia tokius žetonus, kai jie patenka į pasaulinį tinklą, o maksimaliai – robotą pradeda naudoti užpuolikai.
Įdiegti į VPS – serverį
Baigę naudoti robotą, jis turi būti talpinamas serveryje, kuris nuolat veikia 24 valandas per parą, 7 dienas per savaitę. Taip yra dėl to, kad kai veikia jūsų programa, veikia ir robotas. Kai tik išjungiate programą, jūsų robotas taip pat užmiega.
Šiame pasaulyje yra daug VPS serverių, tiek sistemoje „Windows“, tiek „Linux“, tačiau daugeliu atvejų juos laikyti „Linux“ yra daug pigiau.
Discord serveryje man patarė vscale.io ir aš iš karto sukūriau virtualų serverį Ubuntu ir įkėliau robotą. Neapibūdinsiu, kaip ši svetainė veikia, bet eisiu tiesiai į boto nustatymus.
Pirmiausia turite įdiegti reikiamą programinę įrangą, kuri paleis mūsų robotą, parašytą .NET Core. Kaip tai padaryti, aprašyta čia.
Tada turite įkelti robotą į „Git“ paslaugą, pvz., „GitHub“ ir panašiai, ir klonuoti jį į VPS serverį arba atsisiųsti robotą kitais būdais. Atminkite, kad turėsite tik konsolę, be GUI. Iš viso.
Atsisiuntę robotą, turite jį paleisti. Tam jums reikia:
Atkurti visas priklausomybes: dotnet atkūrimas
Sukurti programą: dotnet build name_project.sln -c leidimas
Eikite į pastatytą DLL;
taškinio tinklo_failo_pavadinimas.dll
Sveikiname! Jūsų robotas veikia. Tačiau, deja, robotas užima konsolę ir nėra lengva išeiti iš VPS serverio. Be to, jei serveris bus paleistas iš naujo, robotą turėsite paleisti nauju būdu. Yra keletas išeičių iš padėties. Visi jie yra susiję su paleidimu paleidžiant serverį:
Pridėkite vykdymo scenarijų į /etc/init.d
Sukurkite paslaugą, kuri veiks paleidžiant.
Nematau prasmės prie jų detaliai pasilikti, viskas pakankamai išsamiai aprašyta internete.
išvados
Džiaugiuosi, kad ėmiau šios užduoties. Tai buvo mano pirmoji robotų kūrimo patirtis ir džiaugiuosi, kad įgijau naujų žinių apie C # ir darbą su Linux.