Rehber - Discord Botunda Hoş Geldin Mesajı, Otomatik Rol ve Log Sistemi Yapımı | SroCave - SRO Destek Forumu

Rehber Discord Botunda Hoş Geldin Mesajı, Otomatik Rol ve Log Sistemi Yapımı

  • Konbuyu başlatan Konbuyu başlatan Jhaeger
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 3

Jhaeger

King of the Underworld
Ayın En Aktif Üyesi
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​

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?
  1. Kodu index.js olarak kaydedin, token'ı .env dosyasına yazın.
  2. config bölümündeki ID'leri kendi sunucunuza göre doldurun.
  3. node index.js ile botu başlatın.
  4. 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: GuildModeration intent'i eksiktir. v14'te eski adı GuildBans idi.
  • 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 /ayarla komutuyla 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:
Etiketler Etiketler
#bot #botmaker #gifty #guardcommunity #jhaeger #mmoelite

Geri
Üst Alt