Discord.js v14 İleri Seviye: Dinamik Webhook Mimarisi Oluşturmak

Discord.js v14 İleri Seviye: Dinamik Webhook Mimarisi Oluşturmak

Dinamik Webhook'lar Neden Gerekli?

Eğer çok sunuculu (multi-guild) büyük bir bot yönetiyorsanız veya CodeMareFi'deki gibi yeni gönderileri kanallara şık bir formatta (farklı profil resimleri ve isimlerle) atmak istiyorsanız, standart bot mesajları yetersiz kalabilir.

Webhook'lar, mesaja farklı bir avatar, farklı bir isim (username) atamanıza olanak tanır. Discord.js v14'te bunu dinamik olarak, o anki kanala özel bir webhook oluşturup (veya var olanı bularak) yapmak mümkündür.

Webhook Yöneticisi Fonksiyonu

Aşağıdaki fonksiyon, belirtilen kanalda botunuza ait bir webhook var mı diye kontrol eder. Eğer yoksa anında yeni bir tane oluşturur ve mesajı bu webhook üzerinden gönderir. Bu işlem, Rate Limit (hız sınırları) sorunlarını azaltmada oldukça etkilidir.

const { EmbedBuilder } = require('discord.js');

async function sendWebhookMessage(channel, contentOptions, webhookOptions) {
  try {
    // 1. Kanaldaki tüm webhook'ları çek
    const webhooks = await channel.fetchWebhooks();
    
    // 2. Botumuza ait bir webhook bul
    let webhook = webhooks.find(wh => wh.owner.id === channel.client.user.id);

    // 3. Yoksa oluştur
    if (!webhook) {
      webhook = await channel.createWebhook({
        name: 'Dinamik Bildirim Sistemi',
        avatar: channel.client.user.displayAvatarURL(),
      });
    }

    // 4. İsteğe özel profil ayarlarıyla mesajı gönder
    await webhook.send({
      content: contentOptions.content || null,
      embeds: contentOptions.embeds || [],
      username: webhookOptions.username || webhook.name,
      avatarURL: webhookOptions.avatarURL || webhook.avatarURL(),
    });
    
    return true;
  } catch (error) {
    console.error('Webhook mesajı gönderilirken hata oluştu:', error);
    return false;
  }
}

Nasıl Kullanılır?

Fonksiyonu tanımladıktan sonra, herhangi bir bot komutunun veya event'in (örneğin bloga yeni yazı eklendiğinde) içerisinde şöyle kullanabilirsiniz:

const embed = new EmbedBuilder()
  .setTitle('Yeni Makale Yayınlandı!')
  .setDescription('Siber punk temalı yeni yazımızı hemen okuyun.')
  .setColor('#e60000');

await sendWebhookMessage(channel, 
  { embeds: [embed] }, 
  { 
    username: 'CodeMareFi Duyuru', 
    avatarURL: 'https://www.codemarefi.com.tr/codemarefi-logo.png' 
  }
);
Performans Notu

Her mesajda fetchWebhooks() yapmak büyük sunucularda küçük bir gecikme yaratabilir. Yüksek trafikli botlarda webhook id'lerini ve token'larını Redis veya PostgreSQL gibi bir veritabanında önbelleğe almak (caching) çok daha performanslıdır.

0 Yorum

YORUM YAPMAK İÇİN SİSTEME SIZMANIZ GEREKİYOR

Lütfen yukarıdaki butonu kullanarak giriş yapın veya kimlik oluşturun.

Yorumlar yükleniyor...