Discord.js ile müzik botu nasıl yapılır.

GhostWins

Katılımcı Üye
29 Şub 2020
538
575
Herkese merhaba değerli Türkhackteam üyeleri. Bu gün sizelere discord.js ile müzik botu nasıl yapılır onu göstereceğim iyi forumlar.

shazam-3-ay-ucretsiz-apple-muzik-aboneligi-hediye-ediyor.png


Discord API, kendi botlarınızı oluşturmanız için size kolay bir bot yapma olanağı tanır.

Bugün, temel bir müzik botunu nasıl oluşturabileceğimize ve onu sunucumuza nasıl ekleyebileceğimize bir göz atacağız. Bot müziği çalabilir, atlayabilir ve durdurabilir ve ayrıca kuyruk işlevini destekleyecektir.


Önkoşullar
Botu oluşturmaya başlamadan önce, gerekli tüm araçları kurduğunuzdan emin olun.

1-Node
2-NPM
3-FFMPEG
Bu yukarıda'ki 3 şeyi kuruyoruz.

Kurulumdan sonra discord botumuzu kurarak devam edebiliriz.

Discord botunu nasıl oluştururuz.

Öncelikle discord geliştirme portalında yeni bir bot oluşturmamız gerekiyor.
unknown.png
sağ üstden New Application'a tıklıyoruz Bundan sonra, botumuza bir isim vermemiz ve create düğmesine tıklamamız gerekiyor.

unknown.png

Bundan sonra bot sekmesini seçip bot ekle'ye tıklamamız gerekiyor.
unknown.png


Artık botumuz oluşturuldu ve onu sunucumuza davet etmeye devam edebiliriz.

Botu sunucunuza eklemek
Botumuzu oluşturduktan sonra, OAuth2 URL kullanarak onu davet edebiliriz.
Bunun için OAuth2 sayfasına gitmemiz ve kapsam dokunuşunda botu seçmemiz gerekiyor.
unknown.png

Bundan sonra, müzik çalmak ve mesajları okumak için gerekli izinleri seçmemiz gerekiyor.
unknown.png

Ardından, oluşturduğumuz URL'yi kopyalayıp tarayıcımıza yapıştırabiliriz.
bot-invite-link.png

Yapıştırdıktan sonra sunucumuzu seçip yetkilendir butonuna tıklayarak sunucumuza ekliyoruz.

Projemizi oluşturmak Artık terminalimizi kullanarak projemizi oluşturmaya başlayabiliriz. İlk önce bir dizin oluşturup içine taşıyoruz. Bunu bu iki komutu kullanarak yapabiliriz.

O zaman içinde çalışacağımız iki dosyayı oluşturmamız gerekiyor.

İlk önce bir dizin oluşturup içine taşıyoruz. Bunu bu iki komutu kullanarak yapabiliriz.

Kod:
mkdir musicbot && cd musicbot

Bundan sonra npm init komutunu kullanarak proje modüllerimizi oluşturabiliriz. Komutu girdikten sonra size bazı sorular sorulacak, sadece cevaplayın ve devam edin.

O zaman içinde çalışacağımız iki dosyayı oluşturmamız gerekiyor.
Kod:
touch index.js && touch config.json

Şimdi projemizi metin editörümüzde açmamız gerekiyor.

Discord JS Temelleri Şimdi, başlayabilmemiz için bazı bağımlılıkları yüklememiz gerekiyor.

Kod:
npm install discord.js ffmpeg fluent-ffmpeg [USER=856248]Discord[/USER]js/opus ytdl-core --save
Kurulum bittikten sonra config.json dosyamızı yazmaya devam edebiliriz. Burada botumuzun jetonunu ve dinlemesi gereken ön eki kaydediyoruz.
Kod:
{
"prefix": "!",
"token": "tokeniniz buraya"
}
Jetonunuzu almak için discord geliştirici portalını tekrar ziyaret etmeniz ve onu bot bölümünden kopyalamanız gerekir.
unknown.png

Copy yapıyoruz.

Config.json dosyamızda yapmamız gereken tek şey bu. Şimdi javascript kodumuzu yazmaya başlayalım.
Öncelikle tüm bağımlılıklarımızı içe aktarmamız gerekiyor.
Kod:
const Discord = require('discord.js');
const {
	prefix,
	token,
} = require('./config.json');
const ytdl = require('ytdl-core');

Bundan sonra, botumuzu oluşturabilir ve jetonumuzu kullanarak giriş yapabiliriz.
Kod:
const client = new Discord.Client();
client.login(token);
Şimdi, yürütüldüklerinde console.log olan bazı temel dinleyicileri ekleyelim.
Kod:
client.once('ready', () => {
 console.log('Ready!');
});
client.once('reconnecting', () => {
 console.log('Reconnecting!');
});
client.once('disconnect', () => {
 console.log('Disconnect!');
});
Bundan sonra, node komutunu kullanarak botumuzu başlatabiliriz ve o discord'da çevrimiçi olmalı ve "Hazır!" konsolda.
Kod:
node index.js
Mesajları okumak Artık botumuz sunucumuzda olduğuna ve çevrimiçi olabileceğine göre, sohbet mesajlarını okumaya ve onlara yanıt vermeye başlayabiliriz. Mesajları okumak için sadece basit bir fonksiyon yazmamız gerekir.
Kod:
client.on('message', async message => {
  
}
Burada mesaj olayı için bir dinleyici oluşturuyoruz ve mesajı alıyoruz ve tetiklenmişse bir mesaj nesnesine kaydediyoruz.
Şimdi mesajın kendi botumuzdan gelip gelmediğini kontrol etmemiz ve eğer öyleyse görmezden gelmemiz gerekiyor.
Kod:
if (message.author.bot) return;
Bu satırda mesajın yazarının botumuz olup olmadığını kontrol ediyor ve varsa geri dönüyoruz. Bundan sonra mesajın daha önce tanımladığımız örnek ile başlayıp başlamadığını kontrol ediyor, yoksa geri dönüyoruz.
Kod:
if (!message.content.startsWith(prefix)) return;
Bundan sonra hangi komutu çalıştırmamız gerektiğini kontrol edebiliriz. Bunu bazı basit if ifadeleri kullanarak yapabiliriz.
Kod:
const serverQueue = queue.get(message.guild.id);

if (message.content.startsWith(`${prefix}play`)) {
    execute(message, serverQueue);
    return;
} else if (message.content.startsWith(`${prefix}skip`)) {
    skip(message, serverQueue);
    return;
} else if (message.content.startsWith(`${prefix}stop`)) {
    stop(message, serverQueue);
    return;
} else {
    message.channel.send("Geçerli bir komut girmeniz gerekiyor
!");
}
Bu kod bloğunda hangi komutun çalıştırılacağını kontrol edip komutu çağırıyoruz. Giriş komutu geçerli değilse, send () işlevini kullanarak sohbete bir hata mesajı yazarız.

Artık hangi komutu çalıştırmamız gerektiğini bildiğimize göre, bu komutları uygulamaya başlayabiliriz.
Şarkılar ekleniyor Play komutunu ekleyerek başlayalım. Bunun için bir şarkıya ve bir loncaya ihtiyacımız var (Bir lonca, izole edilmiş bir kullanıcı ve kanal koleksiyonunu temsil eder ve genellikle sunucu olarak adlandırılır). Daha önce kurduğumuz ytdl kitaplığına da ihtiyacımız var.

Öncelikle sohbette yazdığımız tüm şarkıları kaydettiğimiz kuyruğun adıyla bir harita oluşturmamız gerekiyor.

Kod:
const queue = new Map();

Bundan sonra, execute adında bir eşzamansız işlev oluşturup kullanıcının sesli sohbette olup olmadığını ve botun doğru izne sahip olup olmadığını kontrol ediyoruz. Değilse bir hata mesajı yazıp geri dönüyoruz.

Kod:
async function execute(message, serverQueue) {
  const args = message.content.split(" ");

  const voiceChannel = message.member.voice.channel;
  if (!voiceChannel)
    return message.channel.send(
      "Müzik çalmak için bir ses kanalında olmanız gerekir
!"
    );
  const permissions = voiceChannel.permissionsFor(message.client.user);
  if (!permissions.has("CONNECT") || !permissions.has("SPEAK")) {
    return message.channel.send(
      "Ses kanalınıza katılmak ve konuşmak için izinlere ihtiyacım var
!"
    );
  }
}

Şimdi şarkı bilgilerini almaya ve bir şarkı nesnesine kaydetmeye devam edebiliriz. Bunun için şarkı bilgilerini youtube bağlantısından alan ytdl kitaplığımızı kullanıyoruz.

Kod:
const songInfo = await ytdl.getInfo(args[1]);
const song = {
 title: songInfo.title,
 url: songInfo.video_url,
};

Bu, daha önce kurduğumuz ytdl kitaplığını kullanarak şarkının bilgilerini alacaktır. Ardından ihtiyacımız olan bilgileri bir şarkı nesnesine kaydediyoruz.

Şarkı bilgilerini kaydettikten sonra sıraya ekleyebileceğimiz bir sözleşme oluşturmamız yeterlidir. Bunu yapmak için önce serverQueue'muzun önceden tanımlanmış olup olmadığını kontrol etmemiz gerekir, bu da müziğin zaten çalmakta olduğu anlamına gelir. Öyleyse, şarkıyı mevcut serverQueue'muza eklememiz ve bir başarı mesajı göndermemiz gerekiyor. Değilse, onu oluşturmalı ve ses kanalına katılmaya çalışmalı ve müzik çalmaya başlamalıyız.

Kod:
if (!serverQueue) {

}else {
 serverQueue.songs.push(song);
 console.log(serverQueue.songs);
 return message.channel.send(`${song.title} sıraya eklendi!`);
}

Burada serverQueue'nun boş olup olmadığını kontrol ediyoruz ve değilse şarkıyı ona ekliyoruz. Şimdi sadece serverQueue null ise sözleşmemizi oluşturmamız gerekiyor.

Kod:
// Creating the contract for our queue
const queueContruct = {
 textChannel: message.channel,
 voiceChannel: voiceChannel,
 connection: null,
 songs: [],
 volume: 5,
 playing: true,
};
// Setting the queue using our contract
queue.set(message.guild.id, queueContruct);
// Pushing the song to our songs array
queueContruct.songs.push(song);

try {
 // Here we try to join the voicechat and save our connection into our object.
 var connection = await voiceChannel.join();
 queueContruct.connection = connection;
 // Calling the play function to start a song
 play(message.guild, queueContruct.songs[0]);
} catch (err) {
 // Printing the error message if the bot fails to join the voicechat
 console.log(err);
 queue.delete(message.guild.id);
 return message.channel.send(err);

Bu kod bloğunda bir kontrat oluşturup şarkımızı şarkılar dizisine ekliyoruz. Bundan sonra kullanıcının sesli sohbetine katılmaya çalışıyoruz ve bundan sonra uygulayacağımız play () fonksiyonumuzu çağırıyoruz.

Şarkı çalmak Artık şarkılarımızı kuyruğumuza ekleyebildiğimize ve henüz yoksa bir sözleşme oluşturabileceğimize göre çalma işlevimizi uygulamaya başlayabiliriz.

İlk olarak, iki parametre (lonca ve çalmak istediğimiz şarkı) alan ve şarkının boş olup olmadığını kontrol eden play adında bir işlev oluşturacağız. Öyleyse, ses kanalından çıkıp kuyruğu sileceğiz.
Kod:
function play(guild, song) {
  const serverQueue = queue.get(guild.id);
  if (!song) {
    serverQueue.voiceChannel.leave();
    queue.delete(guild.id);
    return;
  }
}

Bundan sonra, bağlantının play () işlevini kullanarak şarkımızı çalmaya ve şarkımızın URL'sini aktarmaya başlayacağız.

Kod:
const dispatcher = serverQueue.connection
    .play(ytdl(song.url))
    .on("finish", () => {
        serverQueue.songs.shift();
        play(guild, serverQueue.songs[0]);
    })
    .on("error", error => console.error(error));
dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);
serverQueue.textChannel.send(`Start playing: **${song.title}**`);

Burada bir akış oluşturup şarkımızın URL'sini iletiyoruz. Ayrıca, bitiş ve hata olayını işleyen iki dinleyici ekliyoruz.

Not: Bu özyinelemeli bir işlevdir, yani kendisini tekrar tekrar çağırır. Özyinelemeyi kullanıyoruz, böylece şarkı bittiğinde bir sonraki şarkıyı çalıyor.

Artık sohbette! Play URL'sini yazarak bir şarkı çalmaya hazırız.

Şarkıları atlama Şimdi atlama işlevini uygulamaya başlayabiliriz. Bunun için play () fonksiyonumuzda oluşturduğumuz dağıtıcıyı sonlandırmamız gerekiyor, böylece bir sonraki şarkıyı başlatacak.

Kod:
function skip(message, serverQueue) {
  if (!message.member.voice.channel)
    return message.channel.send(
      "Müziği durdurmak için bir ses kanalında olmalısın!"
    );
  if (!serverQueue)
    return message.channel.send("Atlayabileceğim bir şarkı yok!");
  serverQueue.connection.dispatcher.end();

Burada komutu yazan kullanıcının bir ses kanalında olup olmadığını ve atlanacak bir şarkı olup olmadığını kontrol ediyoruz.

Şarkılar durduruluyor Stop () işlevi, botumuzun sırayı silmesi ve sesli sohbeti terk etmesini sağlayacak şarkı dizisini temizlememiz dışında, skip () işleviyle hemen hemen aynıdır.

Kod:
function stop(message, serverQueue) {
  if (!message.member.voice.channel)
    return message.channel.send(
      "Müziği durdurmak için bir ses kanalında olmalısın!"
    );
  serverQueue.songs = [];
  serverQueue.connection.dispatcher.end();
}

botumuz için eksiksiz kaynak kodu:
Kod:
const Discord = require("discord.js");
const { prefix, token } = require("./config.json");
const ytdl = require("ytdl-core");

const client = new Discord.Client();

const queue = new Map();

client.once("ready", () => {
  console.log("Ready!");
});

client.once("reconnecting", () => {
  console.log("Reconnecting!");
});

client.once("disconnect", () => {
  console.log("Disconnect!");
});

client.on("message", async message => {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const serverQueue = queue.get(message.guild.id);

  if (message.content.startsWith(`${prefix}play`)) {
    execute(message, serverQueue);
    return;
  } else if (message.content.startsWith(`${prefix}skip`)) {
    skip(message, serverQueue);
    return;
  } else if (message.content.startsWith(`${prefix}stop`)) {
    stop(message, serverQueue);
    return;
  } else {
    message.channel.send("Geçerli bir komut girmeniz gerekiyor!");
  }
});
async function execute(message, serverQueue) {
  const args = message.content.split(" ");

  const voiceChannel = message.member.voice.channel;
  if (!voiceChannel)
    return message.channel.send(
      "You need to be in a voice channel to play music!"
    );
  const permissions = voiceChannel.permissionsFor(message.client.user);
  if (!permissions.has("CONNECT") || !permissions.has("SPEAK")) {
    return message.channel.send(
      "I need the permissions to join and speak in your voice channel!"
    );
  }

  const songInfo = await ytdl.getInfo(args[1]);
  const song = {
    title: songInfo.title,
    url: songInfo.video_url
  };

  if (!serverQueue) {
    const queueContruct = {
      textChannel: message.channel,
      voiceChannel: voiceChannel,
      connection: null,
      songs: [],
      volume: 5,
      playing: true
    };

    queue.set(message.guild.id, queueContruct);

    queueContruct.songs.push(song);

    try {
      var connection = await voiceChannel.join();
      queueContruct.connection = connection;
      play(message.guild, queueContruct.songs[0]);
    } catch (err) {
      console.log(err);
      queue.delete(message.guild.id);
      return message.channel.send(err);
    }
  } else {
    serverQueue.songs.push(song);
    return message.channel.send(`${song.title} has been added to the queue!`);
  }
}

function skip(message, serverQueue) {
  if (!message.member.voice.channel)
    return message.channel.send(
      "Müziği durdurmak için bir ses kanalında olmalısın!"
    );
  if (!serverQueue)
    return message.channel.send("Atlayabileceğim bir şarkı yok!");
  serverQueue.connection.dispatcher.end();
}

function stop(message, serverQueue) {
  if (!message.member.voice.channel)
    return message.channel.send(
      "You have to be in a voice channel to stop the music!"
    );
  serverQueue.songs = [];
  serverQueue.connection.dispatcher.end();
}

function play(guild, song) {
  const serverQueue = queue.get(guild.id);
  if (!song) {
    serverQueue.voiceChannel.leave();
    queue.delete(guild.id);
    return;
  }

  const dispatcher = serverQueue.connection
    .play(ytdl(song.url))
    .on("finish", () => {
      serverQueue.songs.shift();
      play(guild, serverQueue.songs[0]);
    })
    .on("error", error => console.error(error));
  dispatcher.setVolumeLogarithmic(serverQueue.volume / 5);
  serverQueue.textChannel.send(`Müzik hazır: **${song.title}**`);
}

client.login(token);

7c0fe302b98b05b145682344b3a4ec59.png
 

ZiksthemW

Uzman üye
28 Mar 2020
1,026
113
Oslo
Merhaba,

Elinize sağlık. Kodda bulunan İngilizce kısımları ve yorum satırlarını da Türkçe'ye çevirirseniz kodu test eden kişilerin işine yarayabilir.

Saygılarımla,
ZiksthemW
 

GhostWins

Katılımcı Üye
29 Şub 2020
538
575
Merhaba,

Elinize sağlık. Kodda bulunan İngilizce kısımları ve yorum satırlarını da Türkçe'ye çevirirseniz kodu test eden kişilerin işine yarayabilir.

Saygılarımla,
ZiksthemW

Merhaba, direk kendi botumu kopyaladığım için şuanlık böyle çıktı gün içerisinde halledeceğim. İyi günler dilerim
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.