Rehber - Discord Bot Hataları ve Çözümleri: “Missing Permissions”, “Unknown Interaction”, “Used disallowed intents” | SroCave - SRO Destek Forumu

Rehber Discord Bot Hataları ve Çözümleri: “Missing Permissions”, “Unknown Interaction”, “Used disallowed intents”

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

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 Bot Hataları ve Çözümleri
Missing Permissions, Unknown Interaction ve Used disallowed intents hatası nasıl düzelir?​

Bot yazarken en sık karşılaşılan üç hatayı, nedenlerini ve kesin çözümlerini tek yerde topladım. Hata mesajını konunun altına yapıştırırsanız birlikte bakarız.

Hata okumanın püf noktası
Discord hataları genelde şu formatta gelir:
Kod:
DiscordAPIError[50013]: Missing Permissions
Köşeli parantezdeki sayı hata kodudur, Google'da aratırken çok işe yarar. Konsolda hatanın hangi dosya ve satırdan geldiği de stack çıktısında yazar, ilk önce oraya bakın.

1) Missing Permissions (50013)

Anlamı:
Bot, yapmaya çalıştığı işlem için gereken yetkiye sahip değil.

En sık nedenleri:
  1. Rol sıralaması: Botun rolü, işlem yapacağı kişinin veya rolün altında. Rol verme, kick, ban ve takma ad değiştirmede bu şarttır.
  2. Botta ilgili yetki yok (Rolleri Yönet, Üyeleri At, Üyeleri Yasakla, Mesaj Gönder, Bağlantı Yerleştir vb.)
  3. Kanal izni: Sunucuda yetki var ama o kanalın izinlerinde bot veya rolü engellenmiş.
  4. Sunucu sahibine veya botun üstündeki yöneticilere işlem yapılmaya çalışılıyor. Sunucu sahibi üzerinde hiçbir bot işlem yapamaz.

Çözüm:
  1. Sunucu Ayarları > Roller bölümünde botun rolünü, yönettiği rollerin üstüne sürükleyin.
  2. Botun rolünde gerekli yetkilerin açık olduğunu kontrol edin.
  3. Sorunlu kanalda Kanalı Düzenle > İzinler bölümüne bakıp botun engellenmediğinden emin olun.

Kodda önceden kontrol edin (hata almadan uyarı verin):
JavaScript:
const { PermissionFlagsBits } = require('discord.js');

// Botun sunucu yetkisi var mı?
const me = interaction.guild.members.me;
if (!me.permissions.has(PermissionFlagsBits.BanMembers)) {
  return interaction.reply({ content: 'Benim "Üyeleri Yasakla" yetkim yok.', ephemeral: true });
}

// Hedef üyeyi banlayabilir miyim? (rol sıralaması dahil kontrol eder)
if (!member.bannable) {
  return interaction.reply({ content: 'Bu kullanıcıyı banlayamıyorum (rolü benden yüksek olabilir).', ephemeral: true });
}

// Rol verilebilir mi?
if (!role.editable) {
  return interaction.reply({ content: 'Bu rolü veremem, rolüm bu rolün altında.', ephemeral: true });
}

// Kanalda mesaj atma yetkim var mı?
const perms = channel.permissionsFor(me);
if (!perms.has(PermissionFlagsBits.SendMessages)) return;
Aynı mantıkla member.kickable ve member.manageable da kullanılabilir.

Benzer hata: Missing Access (50001) hatası, botun kanalı göremediği anlamına gelir. Kanalda botun "Kanalı Görüntüle" yetkisi olmalı.

2) Unknown Interaction (10062)

Anlamı:
Slash komutu, buton veya menüye 3 saniye içinde cevap verilmedi ya da etkileşim artık geçersiz.

En sık nedenleri:
  1. Komut içinde veritabanı, API isteği gibi uzun süren işlem yapılıp cevap geciktirilmiş
  2. Bot iki kez açık. Bir örnek cevap verir, diğeri geç kalıp bu hatayı alır. Bilgisayarda ve sunucuda aynı anda çalışıyor olabilir, PM2'de iki kopya olabilir.
  3. Aynı etkileşime iki kez reply atılmış (Interaction has already been acknowledged hatası ile birlikte gelir)
  4. Etkileşimin üzerinden 15 dakikadan fazla geçmiş (follow-up süresi dolmuş)

Çözüm: Uzun sürecek işlerde önce deferReply() ile Discord'a "bekle" deyin, işi bitirince editReply() ile cevap verin.
JavaScript:
const { Events, MessageFlags } = require('discord.js');

client.on(Events.InteractionCreate, async (interaction) => {
  if (!interaction.isChatInputCommand()) return;

  try {
    await interaction.deferReply();               // 3 saniye süresi uzar
    const sonuc = await uzunSurenIs();            // veritabanı, API vb.
    await interaction.editReply(`Sonuç: ${sonuc}`);
  } catch (err) {
    console.error(err);
    const mesaj = { content: 'Bir hata oluştu.', flags: MessageFlags.Ephemeral };
    if (interaction.deferred || interaction.replied) {
      await interaction.followUp(mesaj).catch(() => {});
    } else {
      await interaction.reply(mesaj).catch(() => {});
    }
  }
});

Kontrol listesi:
  • Aynı bot tokeniyle başka bir yerde (PC, ikinci hosting, eski VPS) çalışan kopya var mı? Hepsini kapatıp tek örnek bırakın.
  • Her komutta tek bir reply veya deferReply kullanıldığından emin olun. Sonraki mesajlar için followUp veya editReply kullanın.
  • Etkileşim olayını (InteractionCreate) kodda yanlışlıkla iki kez dinlemediğinizi kontrol edin.

3) Used disallowed intents (DisallowedIntents)

Anlamı:
Kodda "ayrıcalıklı" (privileged) bir intent istediniz ama Developer Portal'da açmadınız. Konsolda genelde şu çıkar:
Kod:
Error [DisallowedIntents]: Privileged intent provided is not enabled or whitelisted.

Ayrıcalıklı intent'ler:
  • GuildMembers: Server Members Intent (üye giriş/çıkış, üye listesi)
  • GuildPresences: Presence Intent (çevrimiçi durumu)
  • MessageContent: Message Content Intent (mesaj içeriğini okuma)

Çözüm:
  1. discord.com/developers/applications adresinden botunuzu seçin
  2. Sol menüden Bot sekmesine gidin
  3. "Privileged Gateway Intents" bölümünde kodda kullandığınız intent'lerin anahtarını açın
  4. Değişiklikleri kaydedip botu yeniden başlatın
Kodda kullanmadığınız ayrıcalıklı intent'i istemeyin, gereksiz yere hata alırsınız.

Önemli: Bot 100 sunucuya ulaşınca bu intent'leri kullanmaya devam etmek için Discord'dan bot doğrulaması ve intent onayı almanız gerekir. Bunu önceden planlayın.

Benzer hata: Invalid intent (4013) hatası, intent sayısının veya değerinin geçersiz verilmesi demektir. GatewayIntentBits kullandığınızdan ve yazım hatası olmadığından emin olun.

Bonus: Diğer sık görülen hatalar
  • An invalid token was provided: Token yanlış, boşluklu veya Reset Token ile değişmiş. Token rehberine bakın.
  • Cannot send messages to this user (50007): Kullanıcının DM'leri kapalı. .catch(() => {}) ile yakalayıp kanala bilgi mesajı atın.
  • Unknown Message (10008) / Unknown Channel (10003): Mesaj veya kanal silinmiş. İşlemden önce var olup olmadığını kontrol edin.
  • Invalid Form Body (50035): Embed alanı 1024 karakteri aşıyor, başlık boş veya bir alan eksik. Metinleri .slice(0, 1000) ile kısaltın.
  • Cannot send an empty message (50006): Mesajın içeriği ve embed'i boş. Gönderilecek değişkeni kontrol edin.

Botun çökmesini engelleyin
Yakalanmayan tek bir hata botu komple kapatabilir. Dosyanın en üstüne şu satırları ekleyin, hatalar loglansın ama bot ayakta kalsın:
JavaScript:
process.on('unhandledRejection', (err) => console.error('Yakalanmayan hata:', err));
process.on('uncaughtException', (err) => console.error('Beklenmeyen hata:', err));
Bunlar bir güvenlik ağıdır, hatayı çözmez. Konsolu takip edip asıl nedeni düzeltmeye devam edin.

Hata ayıklarken işe yarayanlar
  • Hatanın tamamını okuyun, çoğu zaman çözüm mesajın içinde yazıyor
  • console.log(error.code, error.message) ile kodu ve mesajı ayrı yazdırın
  • Sorunu küçük bir komuta indirip tek başına deneyin
  • discord.js'i güncelleyin: npm i discord.js@latest (yedek almayı unutmayın)
  • Forumda yardım isterken token'ı silip hata mesajını ve ilgili kodu paylaşın

Başka bir hata mı aldınız? Hata mesajını ve kodunuzu konunun altına yazın, birlikte çözelim.
 
Etiketler Etiketler
#bot #botmaker #gifty #guardcommunity #jhaeger #mmoelite

Geri
Üst Alt