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ı

Bir VPS sunucusuna dağıtımla .NET Core'da bir Discord botu oluşturma
Ayrılmak
Botumuzu yazmaya başlamadan önce onu Discord için oluşturmamız gerekiyor. İhtiyacınız var:

  1. Discord hesabına giriş yap по ссылке
  2. “Uygulamalar” sekmesinde “Yeni Uygulama” butonuna tıklayın ve bota bir ad verin
  3. Botunuza giriş yapıp "Ayarlar" listesinde "Bot" sekmesini bularak bir bot jetonu alın
  4. Belirteci bir yere kaydedin

Savaş Oyunları

Ayrıca Wargaming API'sine erişim sağlamak için Wargaming'de bir uygulama oluşturmanız gerekir. Burada da her şey basit:

  1. Wargaming hesabınıza giriş yapın bu bağlantıda
  2. “Uygulamalarım”a gidin ve “Yeni uygulama ekle” butonuna tıklayın, uygulamanın adını verin ve türünü seçin
  3. 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

  1. Proje sekmesine gidin - NuGet Paketlerini Yönetin;
  2. İncelemeye tıklayın ve arama alanına “DSharpPlus” yazın;
  3. Çerçeveyi seçin ve yükleyin;
  4. KAR!

Hazırlık aşaması bitti, bot yazmaya geçebilirsiniz.

Mantık yazma

Bir VPS sunucusuna dağıtımla .NET Core'da bir Discord botu oluşturma

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:

MainTask(args).ConfigureAwait(false).GetAwaiter().GetResult();

Daha sonra botunuzu başlatmanız gerekir:

discord = new DiscordClient(new DiscordConfiguration
{
    Token = token,
    TokenType = TokenType.Bot,
    UseInternalLogHandler = true,
    LogLevel = LogLevel.Debug
});

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

Bir VPS sunucusuna dağıtımla .NET Core'da bir Discord botu oluşturma

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.

Öncelikle botumuzu çalıştıracak .NET Core ile yazılmış gerekli yazılımı kurmanız gerekiyor. Bunun nasıl yapılacağı burada anlatılmaktadır.

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
  • Uygulamayı derleyin: dotnet build name_project.sln -c Release
  • Yerleşik DLL'ye gidin;
  • dotnet name_of_file.dll

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:

  • /etc/init.d dosyasına komut dosyası başlatma ekleyin
  • Başlangıçta başlayacak bir hizmet oluşturun.

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.

Discord sunucusuna bağlantı. Wargaming oyunları oynayanlar için.
Discord botunun bulunduğu depoya bağlantı.
DSharpPlus deposuna bağlantı.
Teşekkürler!

Kaynak: habr.com

Yorum ekle