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'
}
);
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.
