ProHoster > Blog > yönetim > Bir VPS sunucusuna dağıtımla .NET Core'da bir Discord botu oluşturma
Bir VPS sunucusuna dağıtımla .NET Core'da bir Discord botu oluşturma
Merhaba Habrovsk sakinleri!
Bugün size .NET Core üzerinde C# kullanarak nasıl bot oluşturulacağını ve uzak sunucuda nasıl çalıştırılacağını anlatacak bir makale okuyacaksınız.
Makale arka plan, hazırlık aşaması, mantık yazma ve botun uzak bir sunucuya aktarılmasından oluşacaktır.
Bu makalenin yeni başlayan birçok kişiye yardımcı olacağını umuyorum.
tarih öncesi
Her şey Discord sunucusunda geçirdiğim uykusuz bir sonbahar gecesinde başladı. Nispeten yakın zamanda katıldığım için, onu içeriden ve dışarıdan incelemeye başladım. “Boş Pozisyonlar” metin kanalını keşfettikten sonra ilgilenmeye başladım, açtım ve ilgimi çekmeyen teklifler arasında şunu buldum:
“Programcı (bot geliştiricisi) Gereksinimler:
programlama dilleri bilgisi;
kendi kendine öğrenme yeteneği.
Dilekler:
başkalarının kodunu anlama yeteneği;
DISCORD işlevselliği hakkında bilgi.
Amaç:
bot geliştirme;
botun desteği ve bakımı.
Avantajınız:
Beğendiğiniz projeyi destekleme ve etkileme fırsatı;
Bir ekipte çalışma deneyimi kazanmak;
Mevcut becerileri gösterme ve geliştirme fırsatı.”
Bu anında ilgimi çekti. Evet, bu iş için ödeme yapmadılar ama sizden herhangi bir yükümlülük talep etmediler ve portföyünüzde gereksiz olmayacak. Sunucu yöneticisine yazdım ve benden World of Tanks'taki oyuncu istatistiklerini gösterecek bir bot yazmamı istedi.
Hazırlık aşaması
Ayrılmak
Botumuzu yazmaya başlamadan önce onu Discord için oluşturmamız gerekiyor. İhtiyacınız var:
“Uygulamalarım”a gidin ve “Yeni uygulama ekle” butonuna tıklayın, uygulamanın adını verin ve türünü seçin
Uygulama kimliğini kaydetme
Yazılım
Zaten seçme özgürlüğü var. Bazıları Visual Studio'yu kullanıyor, bazıları Rider, bazıları ise genel olarak güçlü ve Vim'de kod yazıyor (sonuçta, gerçek programcılar yalnızca klavyeyi kullanıyor, değil mi?). Ancak Discord API'sini uygulamaktan kaçınmak için resmi olmayan C# kütüphanesi "DSharpPlus"ı kullanabilirsiniz. Bunu NuGet'ten veya kaynakları depodan kendiniz toplayarak yükleyebilirsiniz.
NuGet'ten uygulamaların nasıl yükleneceğini bilmeyen veya unutmuş olanlar için.Visual Studio için talimatlar
Proje sekmesine gidin - NuGet Paketlerini Yönetin;
İncelemeye tıklayın ve arama alanına “DSharpPlus” yazın;
Çerçeveyi seçin ve yükleyin;
KAR!
Hazırlık aşaması bitti, bot yazmaya geçebilirsiniz.
Mantık yazma
Uygulama mantığının tamamına bakmayacağız; size sadece mesajların bot tarafından ele geçirilmesiyle nasıl çalışılacağını ve Wargaming API ile nasıl çalışılacağını göstereceğim.
Discord botuyla çalışmak, statik eşzamansız Task MainTask(string[] args); aracılığıyla gerçekleşir;
Bu işlevi çağırmak için Ana'da şunu yazmanız gerekir:
Jetonun botunuzun jetonu olduğu yer.
Daha sonra lambda kullanarak botun yürütmesi gereken gerekli komutları yazıyoruz:
discord.MessageCreated += async e =>
{
string message = e.Message.Content;
if (message.StartsWith("&"))
{
await e.Message.RespondAsync(“Hello, ” + e.Author.Username);
}
};
Nerede e.Author.Username – kullanıcının takma adını alır.
Bu sayede & ile başlayan herhangi bir mesaj gönderdiğinizde bot sizi karşılayacaktır.
Bu fonksiyonun sonunda wait discord.ConnectAsync(); yazmanız gerekmektedir. ve Task.Delay(-1)'i bekleyin;
Bu, komutların ana iş parçacığını meşgul etmeden arka planda yürütülmesine olanak tanır.
Artık Wargaming API'sini anlamanız gerekiyor. Burada her şey basit - CURL isteklerini yazın, JSON dizesi biçiminde bir yanıt alın, gerekli verileri oradan çıkarın ve değiştirin.
WargamingAPI ile çalışmaya bir örnek
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;
}
Dikkat! Tüm belirteçlerin ve uygulama kimliklerinin açık metin olarak saklanması kesinlikle önerilmez! Discord, en azından bu tür tokenların World Wide Web'e girmelerini yasaklıyor; en fazla ise bot, saldırganlar tarafından kullanılmaya başlıyor.
VPS sunucusuna dağıtın
Botla işiniz bittiğinde 24/7 sürekli çalışan bir sunucuda barındırılması gerekiyor. Bunun nedeni, uygulamanız çalışırken botun da çalışıyor olmasıdır. Uygulamayı kapattığınız anda botunuz uyku moduna geçer.
Bu dünyada hem Windows'ta hem de Linux'ta çok sayıda VPS sunucusu var, ancak çoğu durumda Linux'ta barındırmak çok daha ucuz.
Discord sunucusunda bana vscale.io'yu önerdiler, ben de hemen Ubuntu üzerinde sanal sunucu oluşturup botu yükledim. Bu sitenin nasıl çalıştığını anlatmayacağım, ancak hemen botun kurulumuna geçeceğim.
Daha sonra, botu GitHub ve benzeri bir hizmet olan Git'e yüklemeniz ve onu bir VPS sunucusuna kopyalamanız veya başka yollarla botunuzu indirmeniz gerekir. Lütfen yalnızca bir konsola sahip olacağınızı, GUI'nizin olmayacağını unutmayın. Kesinlikle.
Botunuzu indirdikten sonra başlatmanız gerekir. Bunu yapmak için şunlara ihtiyacınız vardır:
Tüm bağımlılıkları geri yükleyin: dotnet geri yükleme
Tebrikler! Botunuz çalışıyor. Ancak bot maalesef konsolu kaplıyor ve VPS sunucusundan ayrılmak o kadar kolay değil. Ayrıca sunucu yeniden başlatılırsa botu yeniden başlatmanız gerekecektir. Durumdan çıkmanın birkaç yolu var. Hepsi sunucu başlangıcında başlatmayla ilgilidir:
Bunların üzerinde ayrıntılı olarak durmanın bir anlamı görmüyorum, internette her şey yeterince ayrıntılı olarak anlatılıyor.
Bulgular
Bu görevi üstlendiğim için mutluyum. Bu benim ilk bot geliştirme deneyimimdi ve C# ve Linux ile çalışma konusunda yeni bilgiler edindiğim için mutluyum.