- Katılım
- 9 Şub 2024
- Mesajlar
- 925
- Tepkime puanı
- 1,765
- Puanları
- 93
jhaeger
Discord Botunda Hoş Geldin, Otomatik Rol ve Log Sistemi Yapımı
discord.js v14 ile tek dosyada üç temel sunucu özelliği
discord.js v14 ile tek dosyada üç temel sunucu özelliği
Bu rehberde ne yapacağız?
- Hoş geldin sistemi: Yeni üye girince belirlediğiniz kanala embed mesaj atılır
- Otomatik rol: Giren üyeye (ve ayrı olarak botlara) otomatik rol verilir
- Log sistemi: Üye çıkışı, mesaj silme, mesaj düzenleme ve ban olayları log kanalına yazılır
Gerekenler
- Node.js 18 veya üstü ve discord.js v14 (
npm i discord.js) - Developer Portal > Bot sekmesinde şu intent'ler açık olmalı: Server Members Intent ve Message Content Intent
- Botun yetkileri: Rolleri Yönet, Mesaj Gönder, Bağlantı Yerleştir (Embed Links), ban logu için Denetim Kaydını Görüntüle
- Hoş geldin kanalı, log kanalı ve verilecek rollerin ID'leri (Discord'da Geliştirici Modu'nu açıp sağ tık > ID'yi Kopyala)
Kod
JavaScript:
require('dotenv').config();
const {
Client, GatewayIntentBits, Partials, EmbedBuilder, Events
} = require('discord.js');
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMembers,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.GuildModeration,
GatewayIntentBits.MessageContent
],
partials: [Partials.Message, Partials.Channel]
});
const config = {
welcomeChannelId: 'HOSGELDIN_KANAL_ID',
logChannelId: 'LOG_KANAL_ID',
autoRoleId: 'UYE_ROL_ID',
botRoleId: 'BOT_ROL_ID'
};
// Log kanalına embed gönderen yardımcı fonksiyon
async function sendLog(guild, embed) {
const channel = guild.channels.cache.get(config.logChannelId);
if (channel) channel.send({ embeds: [embed] }).catch(console.error);
}
client.once(Events.ClientReady, () => {
console.log(`${client.user.tag} aktif!`);
});
/* ---------- 1) HOŞ GELDİN + 2) OTOMATİK ROL ---------- */
client.on(Events.GuildMemberAdd, async (member) => {
// Otomatik rol (botlara ayrı, üyelere ayrı)
const roleId = member.user.bot ? config.botRoleId : config.autoRoleId;
const role = member.guild.roles.cache.get(roleId);
if (role) {
await member.roles.add(role).catch((e) =>
console.log('Rol verilemedi (bot rolü, verilecek rolün üstünde mi?):', e.message)
);
}
// Hoş geldin mesajı
const channel = member.guild.channels.cache.get(config.welcomeChannelId);
if (channel) {
const created = Math.floor(member.user.createdTimestamp / 1000);
const embed = new EmbedBuilder()
.setColor(0x57f287)
.setTitle(`${member.guild.name} sunucusuna hoş geldin!`)
.setDescription(
`${member}, aramıza katıldığın için mutluyuz.\n` +
`Seninle birlikte **${member.guild.memberCount}** kişiyiz.\n\n` +
`Hesap oluşturma: <t:${created}:R>`
)
.setThumbnail(member.user.displayAvatarURL({ size: 256 }))
.setTimestamp();
channel.send({ content: `${member}`, embeds: [embed] }).catch(console.error);
}
// Giriş logu
sendLog(member.guild, new EmbedBuilder()
.setColor(0x57f287)
.setTitle('Üye Katıldı')
.setDescription(`${member} (${member.user.tag})\nID: ${member.id}`)
.setTimestamp());
});
/* ---------- 3) LOG SİSTEMİ ---------- */
// Üye ayrıldı
client.on(Events.GuildMemberRemove, (member) => {
sendLog(member.guild, new EmbedBuilder()
.setColor(0xed4245)
.setTitle('Üye Ayrıldı')
.setDescription(`${member.user.tag}\nID: ${member.id}`)
.setTimestamp());
});
// Mesaj silindi
client.on(Events.MessageDelete, (message) => {
if (!message.guild || message.author?.bot) return;
const content = message.content
? message.content.slice(0, 1000)
: '*İçerik alınamadı (bot açılmadan önce yazılmış olabilir)*';
sendLog(message.guild, new EmbedBuilder()
.setColor(0xfee75c)
.setTitle('Mesaj Silindi')
.addFields(
{ name: 'Yazan', value: message.author ? `${message.author}` : 'Bilinmiyor', inline: true },
{ name: 'Kanal', value: `${message.channel}`, inline: true },
{ name: 'Mesaj', value: content }
)
.setTimestamp());
});
// Mesaj düzenlendi
client.on(Events.MessageUpdate, (oldMsg, newMsg) => {
if (!newMsg.guild || newMsg.author?.bot) return;
if (oldMsg.content === newMsg.content) return;
sendLog(newMsg.guild, new EmbedBuilder()
.setColor(0x5865f2)
.setTitle('Mesaj Düzenlendi')
.addFields(
{ name: 'Yazan', value: `${newMsg.author}`, inline: true },
{ name: 'Kanal', value: `${newMsg.channel}`, inline: true },
{ name: 'Eski', value: oldMsg.content?.slice(0, 1000) || '*Alınamadı*' },
{ name: 'Yeni', value: newMsg.content?.slice(0, 1000) || '*Alınamadı*' }
)
.setURL(newMsg.url)
.setTimestamp());
});
// Ban atıldı
client.on(Events.GuildBanAdd, (ban) => {
sendLog(ban.guild, new EmbedBuilder()
.setColor(0x992d22)
.setTitle('Üye Banlandı')
.setDescription(`${ban.user.tag}\nID: ${ban.user.id}\nSebep: ${ban.reason ?? 'Belirtilmemiş'}`)
.setTimestamp());
});
client.login(process.env.TOKEN);
Nasıl kullanılır?
- Kodu
index.jsolarak kaydedin, token'ı.envdosyasına yazın. configbölümündeki ID'leri kendi sunucunuza göre doldurun.node index.jsile botu başlatın.- Test için ikinci bir hesapla veya davet linkiyle sunucuya girin, mesaj silip düzenleyin.
Sık yapılan hatalar
- Rol verilmiyor ("Missing Permissions"): Botun rolü, vereceği rolün üstünde olmalı. Sunucu Ayarları > Roller bölümünde botun rolünü yukarı sürükleyin ve Rolleri Yönet yetkisini verin.
- Hoş geldin mesajı hiç gelmiyor: Server Members Intent kapalıdır veya kanal ID'si yanlıştır.
- Silinen mesajın içeriği boş geliyor: Message Content Intent kapalıdır ya da mesaj bot açılmadan önce yazılmıştır, Discord eski mesajı botun hafızasına vermez.
- Embed gönderilmiyor: Botun log kanalında "Bağlantı Yerleştir" ve "Mesaj Gönder" yetkisi olmalıdır.
- Ban logu gelmiyor:
GuildModerationintent'i eksiktir. v14'te eski adıGuildBansidi. - Gizlilik: Mesaj logları kullanıcı mesajlarını kaydettiği için sunucu kurallarında bunu belirtmeniz iyi olur.
Geliştirme fikirleri
- Hoş geldin mesajına resimli kart eklemek (canvas ile)
- Girişte kullanıcıya DM ile kurallar göndermek
- Butonla rol alma (reaction/button roles)
- Log kanallarını ayırmak (giriş-çıkış, mesaj, moderasyon)
- Kanal ve rol ID'lerini her sunucu için veritabanında tutup
/ayarlakomutuyla değiştirtmek: "Discord Botunda Veritabanı Kullanmak" rehberine bakabilirsiniz - Davet eden kişiyi hoş geldin mesajında göstermek: "Davet Takip Sistemi" rehberini inceleyebilirsiniz
Sorusu olan veya hata alan olursa konunun altına yazsın, birlikte çözelim.
NOT: Diğer Discord hakkında paylaştığım konulardan kendi geniş çaplı handler botunuzu yapabilirsiniz.
Son düzenleme:




