giriiş
Discord, dünya çapında milyonlarca kullanıcının lonca veya sunucu adı verilen topluluklarda çevrimiçi mesajlaşmasına ve sesli sohbet etmesine olanak tanıyan bir sohbet uygulamasıdır. Discord ayrıca, geliştiricilerin güçlü Discord botları oluşturmak için kullanabilecekleri kapsamlı bir API sunar. Botlar, sunuculara mesaj gönderme, kullanıcılara DM gönderme, sunucuları yönetme ve sesli sohbetlerde ses çalma gibi çeşitli eylemler gerçekleştirebilir. Bu, geliştiricilerin moderasyon araçları veya oyunlar gibi gelişmiş ve karmaşık özelliklere sahip güçlü botlar oluşturmasına olanak tanır. Örneğin, Dyno Tool botu milyonlarca topluluğa hizmet verir ve spam koruması, müzik çalar ve diğer kullanışlı işlevler gibi kullanışlı özelliklere sahiptir. Discord botları oluşturmayı öğrenmek, her gün binlerce kişinin etkileşim kurabileceği çok çeşitli özellikleri uygulamanıza olanak tanır.
Bu eğitimde, kullanıcıların Discord API ile doğrudan etkileşim kurmasını sağlayan Node.js ve Discord.js kütüphanesini kullanarak sıfırdan bir Discord botu oluşturacaksınız. Bir Discord botu için bir profil oluşturacak, bot için kimlik doğrulama belirteçleri alacak ve botu kullanıcı argümanlarıyla komutları işleyecek şekilde programlayacaksınız.
Ön koşullar
Başlamadan önce şunlara ihtiyacınız olacak:
- Geliştirme makinenize Node.js kuruludur.
- Visual Studio Code, Atom, Sublime veya Nano gibi tercih ettiğiniz herhangi bir metin düzenleyicisi.
- Doğrulanmış bir e-posta hesabına sahip ücretsiz bir Discord hesabı ve Discord botunuzu test etmek için kullanacağınız ücretsiz bir Discord sunucusu.
Adım 1 – Discord botunu kurma
Bu adımda, Discord geliştirici grafiksel kullanıcı arayüzünü (GUI) kullanarak Discord botunu başlatır ve bot belirtecini elde eder, bunu da uygulamanıza iletirsin.
Discord platformuna bir bot kaydetmek için Discord uygulama panosunu kullanın. Geliştiriciler, Discord botları da dahil olmak üzere Discord uygulamaları burada oluşturabilirler.
Başlamak için Yeni Uygulama'ya tıklayın. Discord, yeni uygulamanız için bir ad girmenizi isteyecektir. Ardından uygulamayı oluşturmak için Oluştur'a tıklayın.
Not: Uygulamanızın adı botun adından bağımsızdır ve botun uygulamanın adı olması gerekmez.
Şimdi uygulama panonuzu açın. Uygulamanıza bir bot eklemek için sol gezinme çubuğundaki Bot sekmesine gidin.
Uygulamaya bir bot eklemek için "Bot Ekle" düğmesine tıklayın. Onaylamanız istendiğinde "Evet, yap!"a tıklayın. Ardından, bot adı, kimlik doğrulama belirteci ve profil resminizin ayrıntılarını içeren bir panoya yönlendirileceksiniz.
Bot adınızı veya profil resminizi buradan, kontrol panelinden değiştirebilirsiniz. Ayrıca, "Jetonu Göstermek İçin Tıkla" seçeneğine tıklayıp görünen jetonu kopyalayarak bot kimlik doğrulama jetonunu da kopyalamanız gerekecektir.
Uyarı: Bot tokenınızı asla paylaşmayın veya yüklemeyin, çünkü bu herkesin botunuza giriş yapmasına olanak tanır.
Şimdi botu Discord topluluğuna eklemek ve test etmek için bir davet oluşturmanız gerekiyor. İlk olarak, uygulama panosunun OAuth2 sekmesi altındaki URL Oluşturucu sayfasına gidin. Davetiye oluşturmak için aşağı kaydırın ve Kapsamlar bölümünden botu seçin. Ayrıca, botunuzun topluluklarda gerçekleştirebileceği eylemleri kontrol etmek için izinleri ayarlamanız gerekecek. Bu eğitim için, botunuzun Lonca'daki neredeyse tüm eylemleri gerçekleştirmesine izin verecek olan Yönetici'yi seçin. Bağlantıyı Kopyala düğmesiyle kopyalayın.
Ardından botu sunucuya ekleyin. Oluşturduğunuz davet bağlantısını takip edin. Botu sahip olduğunuz herhangi bir sunucuya ekleyebilir veya açılır menüden yönetici izinlerine sahip olabilirsiniz.
Şimdi Devam'a tıklayın. Yönetici'nin yanındaki kutuyu işaretlediğinizden emin olun; bu, bota yönetici izinleri verecektir. Ardından Yetkilendir'e tıklayın. Discord, botun sunucuya katılabilmesi için bir CAPTCHA çözmenizi isteyecektir. Artık Discord botu, eklediğiniz sunucunun üye listesinde çevrimdışı olarak görünecektir.
Başarılı bir Discord botu oluşturdunuz ve sunucunuza eklediniz. Şimdi, bota giriş yapmak için bir program yazacaksınız.
Adım 2 – Projenizi oluşturun
Bu adımda, botunuzu oluşturacağınız ve bota programatik olarak gireceğiniz ilk kodlama ortamını kurarsınız.
Öncelikle robotunuz için bir proje klasörü ve gerekli proje dosyalarını oluşturmanız gerekiyor.
Proje klasörünüzü oluşturun:
mkdir discord-bot
Oluşturduğunuz proje klasörüne gidin:
cd discord-bot
Daha sonra, botunuzun kimlik doğrulama parolasını saklamak için config.json adlı bir dosya oluşturmak üzere metin düzenleyicinizi kullanın:
nano config.json
Daha sonra yapılandırma dosyasına aşağıdaki kodu ekleyin ve vurgulanan metni botunuzun kimlik doğrulama belirteciyle değiştirin:
{
"BOT_TOKEN": "YOUR BOT TOKEN"
}
Dosyayı kaydedip çıkın.
Ardından, projenizin ayrıntılarını ve proje için kullandığınız bağımlılıklar hakkındaki bilgileri depolayan bir package.json dosyası oluşturacaksınız. Aşağıdaki npm komutunu çalıştırarak bir package.json dosyası oluşturacaksınız:
npm init
npm sizden projeniz hakkında çeşitli detaylar isteyecektir.
Şimdi, Discord API ile etkileşim kurmak için kullanacağınız discord.js paketini kuracaksınız. discord.js'yi npm üzerinden aşağıdaki komutla kurabilirsiniz:
npm install discord.js
Yapılandırma dosyasını oluşturup gerekli bağımlılıkları yüklediğinize göre, artık botunuzu oluşturmaya başlayabilirsiniz. Gerçek bir uygulamada, büyük bir bot birçok dosyaya bölünürdü, ancak bu eğitimde bot kodunuz tek bir dosyada olacak.
Öncelikle discord-bot klasöründe kod için index.js adında bir dosya oluşturun:
nano index.js
Discord.js bağımlılığını ve bot belirtecini içeren bir yapılandırma dosyasını gerektirerek botu kodlamaya başlayın:
const Discord = require("discord.js");
const config = require("./config.json");Bundan sonra şu iki satır kodu ekleyin:
...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.login(config.BOT_TOKEN);Dosyanızı kaydedip çıkın.
Kodun ilk satırı yeni bir Discord istemcisi oluşturur ve onu sabit istemciye atar. Bu istemci, Discord API'siyle etkileşim kurmanızı ve Discord'un yeni mesajlar gibi olaylardan haberdar olmasını sağlar. İstemci aslında Discord botunu temsil eder. İstemci oluşturucusuna iletilen nesne, botunuzun ağ geçidi amaçlarını belirtir. Bu, botunuzun hangi WebSocket olaylarını dinleyeceğini belirtir. Burada, botun forumlardaki mesaj olaylarını alabilmesi için GUILDS ve GUILD_MESSAGES'ı belirttiniz.
Kodun ikinci satırı, oluşturduğunuz Discord botuna giriş yapmak için istemci tarafı oturum açma yöntemini kullanır ve config.json dosyasındaki parolayı kullanır. Bu belirteç, Discord API'sine uygulamanın hangi bot için olduğunu ve botu kullanmak için kimlik doğrulamanızın yapıldığını bildirir.
Şimdi index.js dosyasını Node kullanarak çalıştırın:
node index.js
Botunuzun durumu eklediğiniz Discord sunucusunda çevrimiçi olarak değişecektir.
Kodlama ortamını başarıyla kurdunuz ve Discord botunuza giriş yapmak için temel kodu oluşturdunuz. Şimdi, kullanıcı komutlarını yönetecek ve botunuzun mesaj gönderme gibi işlemleri gerçekleştirmesini sağlayacaksınız.
Adım 3 – Kullanıcının ilk komutunun işlenmesi
Bu adımda, kullanıcı komutlarını işleyebilen bir bot oluşturacaksınız. İlk ping komutunuzu çalıştırıp, "ping" ile yanıt verecek ve komuta yanıt verme süresini belirteceksiniz.
Öncelikle, herhangi bir komutu işleyebilmeniz için kullanıcıların gönderdiği mesajları tespit edip almanız gerekir. Discord istemcisindeki on metodunu kullanarak, Discord size yeni olaylar hakkında bir bildirim gönderir. on metodu iki argüman alır: beklenecek olayın adı ve bu olay her gerçekleştiğinde çalıştırılacak bir fonksiyon. Bu metotla, olay mesajını bekleyebilirsiniz; bu, botun mesajları görüntüleme iznine sahip olduğu bir foruma her mesaj gönderildiğinde gerçekleşir. Böylece, komutları işlemek için her mesaj gönderildiğinde çalıştırılacak bir fonksiyon oluşturacaksınız.
Öncelikle dosyanızı açın:
nano index.js
Aşağıdaki kodu dosyanıza ekleyin:
...
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
client.on("messageCreate", function(message) {
});
client.login(config.BOT_TOKEN);messageCreate olayında çalışan bu fonksiyon, mesajı parametre olarak alır. Mesaj, gönderilen mesaj hakkında bilgi ve botun yanıt vermesine yardımcı olacak yöntemler içeren bir Discord.js mesaj örneği olacaktır.
Şimdi komut kontrol fonksiyonunuza aşağıdaki kod satırını ekleyin:
...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
});
...Bu satır, mesajın yazarının bir bot olup olmadığını kontrol eder ve eğer öyleyse, komutun işlenmesini durdurur. Bu önemlidir çünkü genellikle bot mesajlarını işlemek veya yanıtlamak istemezsiniz. Botların genellikle diğer botlardan gelen bilgileri kullanmasına gerek yoktur, bu nedenle mesajlarını görmezden gelmek işlem gücünden tasarruf sağlar ve rastgele yanıtları önler.
Şimdi bir kontrol komutu yazacaksınız. Bunu yapmak için, bir Discord komutunun tipik formatını anlamak iyi bir fikirdir. Genellikle bir Discord komutunun yapısı şu sırayla üç bölümden oluşur: bir önek, bir komut adı ve (bazen) komut argümanları.
- Önek: Önek herhangi bir şey olabilir, ancak genellikle bir mesajın başında bulunmayan bir noktalama işareti veya soyut bir ifadedir. Bu, bir mesajın başına ön ek girdiğinizde, bot'un bu komutun bir bot tarafından işlenmesi gerektiğini anladığı anlamına gelir.
- Komut adı: Kullanıcının kullanmak istediği komutun adı. Bu, botun farklı işlevlere sahip birden fazla komutu destekleyebileceği ve kullanıcıların farklı bir komut adı sağlayarak bunlar arasında seçim yapmasına olanak tanıyabileceği anlamına gelir.
- Argümanlar: Bazen komut kullanıcıdan ek bilgi gerektiriyorsa veya kullanıyorsa, kullanıcı komut adından sonra, her argüman bir boşlukla ayrılmış şekilde argümanlar sağlayabilir.
Not: Zorunlu bir komut yapısı yoktur ve botlar komutları istedikleri gibi işleyebilirler, ancak burada sunulan yapı botların büyük çoğunluğunun kullandığı işlevsel bir yapıdır.
Bu formatı işleyen bir komut ayrıştırıcısı oluşturmaya başlamak için, ileti işleyici işlevine aşağıdaki kod satırlarını ekleyin:
...
const prefix = "!";
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
});
...Robot öneki olarak kullanacağınız sabit önekine “!” değerine ilk satır kodu ekleyin.
Ekleyeceğiniz ikinci kod satırı, botun işlediği mesajın içeriğinin sizin belirlediğiniz önekle başlayıp başlamadığını kontrol eder ve eğer başlamazsa mesajın işlenmesini durdurur.
Şimdi mesajın geri kalanını komut adına ve mesajdaki tüm argümanlara dönüştürmeniz gerekiyor. Aşağıdaki vurgulanan satırları ekleyin:
...
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
});
...Burada ilk satırı, mesaj içeriğinden öneki kaldırmak ve sonucu sabit komut gövdesine atamak için kullanıyorsunuz. Bu, ayrıştırılmış komut adına öneki eklemek istemediğiniz için gereklidir.
İkinci satır, öneki kaldırılmış mesajı alır ve ayırıcı olarak bir boşluk kullanarak bölme yöntemini kullanır. Bu yöntem, mesajı alt dizelerden oluşan bir diziye böler ve boşluk bulunan her yerde bölme işlemi gerçekleşir. Bu, komut adını ve ardından mesaja dahil edilmişse tüm argümanları içeren bir diziyle sonuçlanır. Bu diziyi args sabitine atarsınız.
Üçüncü satır, args dizisindeki ilk öğeyi (sağlanan komutun adı olacak) kaldırır, küçük harfe dönüştürür ve ardından sabit komuta atar. Bu, komut adını izole etmenize ve dizide yalnızca argümanları bırakmanıza olanak tanır. Ayrıca, Discord botlarında komutlar genellikle büyük/küçük harfe duyarlı olmadığı için toLowerCase yöntemini de kullanırsınız.
Bir komut ayrıştırıcısı oluşturmayı, gerekli öneki uygulamayı ve komut adını ve mesajlardan gelen tüm argümanları almayı tamamladınız. Şimdi belirli komutlar için kodu uygulayıp üreteceksiniz.
Ping komutunu başlatmak için aşağıdaki kodu ekleyin:
...
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === "ping") {
}
});
...Bu if ifadesi, ayrıştırdığınız (sabit komuta atanan) komut adının "ping" ile eşleşip eşleşmediğini kontrol eder. Eşleşiyorsa, kullanıcının "ping" komutunu kullanmak istediğini gösterir. Belirli komut kodunu if ifadesi bloğuna koyarsınız. Bu kalıbı, yürütmek istediğiniz diğer komutlar için tekrarlarsınız.
Artık “ping” komut kodunu uygulayabilirsiniz:
...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}
...Dosyanızı kaydedip çıkın.
Date nesnesindeki yeni yöntem kullanılarak bulunan geçerli saat ile oluşturulan mesajın zaman damgası arasındaki farkı milisaniye cinsinden hesaplayan bir "ping" komut bloğu eklersiniz. Bu hesaplama, mesajın işlenip bota "ping" atılmasının ne kadar sürdüğünü hesaplar.
İkinci satır, mesaj sabitindeki yanıt yöntemini kullanarak kullanıcının komutuna yanıt verir. Yanıt yöntemi, komutu çağıran kullanıcıya ping gönderir (bu komut kullanıcıyı bilgilendirir ve belirtilen kullanıcı için mesajı vurgular), ardından yöntemin ilk argümanı olarak sağlanan içeriği izler. Yanıt yönteminin kullanacağı yanıt olarak bir mesaj ve hesaplanan ping'i içeren bir sabit kalıp sağlarsınız.
Bu, “ping” komutunun yürütülmesini sonlandırır.
Aşağıdaki komutu kullanarak botunuzu çalıştırın (index.js ile aynı klasörde):
node index.js
Artık botun görebildiği ve mesaj gönderebildiği her kanalda “!ping” komutunu kullanabilir ve bunun sonucunda bir yanıt alabilirsiniz.
Kullanıcı komutlarını işleyebilen bir bot oluşturdunuz ve ilk komutunuzu çalıştırdınız. Ardından, sum komutunu çalıştırarak botunuzu geliştirmeye devam edeceksiniz.
Adım 4 – Sum komutunu yürütün
Şimdi "!sum" komutunu çalıştırarak programınızı genişleteceksiniz. Bu komut, istediğiniz sayıda argümanı alıp toplar ve ardından tüm argümanların toplamını kullanıcıya döndürür.
Eğer Discord botunuz hala çalışıyorsa CTRL + C ile işlemini durdurabilirsiniz.
index.js dosyanızı yeniden açın:
nano index.js
"!sum" komutunu çalıştırmaya başlamak için bir else-if bloğu kullanırsınız. ping komut adını kontrol ettikten sonra, komut adının "sum" ile aynı olup olmadığını kontrol eder. Else-if bloğunu kullanacaksınız çünkü aynı anda yalnızca bir komut işlenir, bu nedenle program "ping" komut adıyla eşleşirse, "sum" komutunu kontrol etmesine gerek kalmaz. Aşağıdaki vurgulanan satırları dosyanıza ekleyin:
...
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
}
else if (command === "sum") {
}
});
..."Sum" ifadesi kodunu çalıştırmaya başlayabilirsiniz. "Sum" ifadesi kodu, az önce oluşturduğunuz else-if bloğunun içine yerleştirilir. Şimdi aşağıdaki kodu ekleyin:
...
else if (command === "sum") {
const numArgs = args.map(x => parseFloat(x));
const sum = numArgs.reduce((counter, x) => counter += x);
message.reply(`The sum of all the arguments you provided is ${sum}!`);
}
...Argüman listesindeki map metodunu kullanarak, args dizisindeki her öğe için parseFloat fonksiyonunu kullanarak yeni bir liste oluşturursunuz. Bu, tüm öğelerin dizeler yerine sayılardan oluştuğu yeni bir dizi (numArgs sabitine atanmış) oluşturur. Bu, daha sonra sayıları toplayarak toplamını başarıyla bulabileceğiniz anlamına gelir.
İkinci satır, listedeki tüm öğeleri toplayan bir işlev sağlayan numArgs sabiti üzerinde reduce yöntemini kullanır. numArgs içindeki tüm öğelerin toplamını sabit sum'a atarsınız.
Daha sonra, kullanıcının komutuna, kullanıcının bota gönderdiği tüm argümanların toplamını içeren gerçek bir desenle yanıt vermek için mesaj nesnesindeki yanıt yöntemini kullanırsınız.
"sum" komutunun yürütülmesi bu şekilde sona erer. Şimdi botu aşağıdaki komutu kullanarak çalıştırın (aynı index.js klasöründe):
node index.js
Artık botun görüntüleyebildiği ve mesaj gönderebildiği her kanalda “!sum” komutunu kullanabilirsiniz.
Aşağıda index.js bot scriptinin tam versiyonu yer almaktadır:
const Discord = require("discord.js");
const config = require("./config.json");
const client = new Discord.Client({intents: ["GUILDS", "GUILD_MESSAGES"]});
const prefix = "!";
client.on("messageCreate", function(message) {
if (message.author.bot) return;
if (!message.content.startsWith(prefix)) return;
const commandBody = message.content.slice(prefix.length);
const args = commandBody.split(' ');
const command = args.shift().toLowerCase();
if (command === "ping") {
const timeTaken = Date.now() - message.createdTimestamp;
message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
}
else if (command === "sum") {
const numArgs = args.map(x => parseFloat(x));
const sum = numArgs.reduce((counter, x) => counter += x);
message.reply(`The sum of all the arguments you provided is ${sum}!`);
}
});
client.login(config.BOT_TOKEN);Bu noktada sum komutunu çalıştırarak Discord botunuzu geliştirmiş olacaksınız.
Sonuç
Birkaç farklı kullanıcı komutunu ve komut argümanını işleyebilen bir Discord botunu başarıyla uyguladınız. Botunuzu genişletmek isterseniz, güçlü bir Discord botu oluşturmak için daha fazla komut çalıştırabilir veya Discord API'sinin daha fazla bölümünü deneyebilirsiniz.




















