N'oluyo · Geliştirici Dokümanları · Son güncelleme: · https://noluyo.net/gelistirici

Özel mesajlar

Bir kişi botunla özel mesaj (DM) açabilir; orada sana yazar, komut çalıştırır ve butonlarına basar, sen de ona yanıt verirsin, ama ilk yazan asla bot olmaz.

Özel mesajlar

Bir kişi botunla özel mesaj (DM) açabilir; orada sana yazar, komut çalıştırır ve butonlarına basar, sen de ona yanıt verirsin, ama ilk yazan asla bot olmaz.

Kişi DM'yi nereden açar

Kişi botunun profilinde ya da sunucunun üye listesinde Mesaj gönder'e basar. Bunun için ikisinin en az bir ortak sunucusu olmalı ve kişi botu engellememiş olmalı. Açılış senin değil kişinin işidir: botun POST /users/@me/channels çağırırsa 403 bot_forbidden alır.

DM açılınca sana bir şey gelmez. Kişi ilk mesajını yazdığında ya da butona bastığında haberin olur.

Bot neden ilk yazamaz

N'oluyo'da bot kimseye kendiliğinden DM atamaz. Böylece kişiler istemedikleri reklamı ya da duyuruyu hiç görmez; bir botla konuşmak her zaman kişinin seçimidir. Bu yüzden "botumu ekleyen herkese hoş geldin mesajı" gibi bir şey yapamazsın. Onun yerine sunucuda bir kanala yaz ya da kişiye "Bana DM'den yaz" de.

Ne zaman yazabilirsin

NeNe zamanKişi kapattıysa ya da engellediyse
Etkileşime yanıt: callback, takip mesajı, @original düzenleme ve silmeToken'ın 15 dakikası boyunca, her zamandm_closed
Kendiliğinden mesaj: POST /channels/{channel_id}/messagesKişinin bu DM'deki son mesajı, komutu, basması ya da form gönderiminden sonraki 24 saat içindedm_closed
Tepki, sabitleme, yazıyor göstergesiKendiliğinden mesajla aynı: 24 saat içindedm_closed
Kendi eski mesajını düzenlemeHer zamandm_closed
Kendi eski mesajını silmeHer zamanHer zaman

Kişi her yazdığında, komut çalıştırdığında ya da bastığında 24 saat baştan başlar. Kişi 24 saattir bir şey yapmadıysa kendiliğinden yazdığın her şey 403 dm_window_closed alır; kişinin yeniden yazmasını bekle.

Kişi DM'yi açtıktan sonra ortak sunucudan ayrılsa da DM sürer: sen yazmaya, o yazmaya devam edebilir.

Kapatma ve engel

Kişi DM'yi kapatırsa ya da botu engellerse botun o DM'ye hiçbir şey yazamaz, etkileşim yanıtı da dahil. İki durumda da aynı yanıtı alırsın; hangisi olduğunu bilemezsin:

{ "code": "dm_closed", "message": "The person closed this DM or blocked the bot." }

Ne yap: dm_closed gelince o kişiye yazmayı bırak ve yeniden deneme. Kişi DM'yi yeniden açınca ya da engeli kaldırınca yazdığında sana yeniden mesaj gelir; o zaman yine yanıt verebilirsin. Senin mesajın kapatılmış DM'yi kişinin listesinde yeniden açmaz.

Kişi botu engellediyse kendisi de o DM'de bota yazamaz ve butonlara basamaz: 403 cannot_dm alır.

DM'yi nasıl tanırsın

DM'den gelen mesajda ve etkileşimde guild_id yoktur. Etkileşimde member yerine user gelir ve app_permissions DM'nin sabit izinleridir.

{
  "id": "111804206284800099",
  "type": 0,
  "channel_id": "21531887403008042",
  "author": { "id": "14631410073600003", "username": "ayse", "display_name": "Ayşe", "avatar": null, "cosmetics": null },
  "content": "Merhaba bot",
  "timestamp": "2026-11-08T12:30:00Z",
  "edited_timestamp": null,
  "attachments": [],
  "mentions": [],
  "mention_roles": [],
  "mention_everyone": false,
  "pinned": false
}

Komutlar DM'de

Global komutların DM'de de çalışır, contexts alanında 1 varsa ve default_member_permissions koymadıysan (DM'de komut). Kişinin komutu, menüsü, basması ve form gönderimi 24 saatlik pencereyi yeniden açar; otomatik tamamlama açmaz, yazmak henüz bir iş değildir. Kişi DM'yi kapattıysa yeniden açana dek komut çalıştıramaz; botu engellediyse komut da bileşen de çalışmaz.

DM'de bir komut çalışınca gelen etkileşim:

{
  "id": "112793931510448128",
  "application_id": "112793931040686080",
  "type": 2,
  "token": "eyJpZCI6IjExMjc5MzkzMTUxMDQ0ODEyOCJ9.1vpG",
  "version": 1,
  "context": 1,
  "channel_id": "112793931443339264",
  "user": { "id": "112793930608672768", "username": "ayse", "display_name": "Ayşe", "avatar": null, "cosmetics": null },
  "app_permissions": "137476034112",
  "locale": "tr",
  "data": { "id": "112793931397201920", "name": "zar", "type": 1, "options": [{ "name": "yuz", "type": 4, "value": 6 }] }
}

Seçeneklerde ve menülerde DM'nin kuralları:

NeDM'de
Kullanıcı seçeneği, kullanıcı menüsüYalnızca DM'nin iki kişisi: kişinin kendisi ya da botun
Rol seçeneğiHer zaman invalid_target
Kanal seçeneğiYalnızca bu DM
Mesaj menüsüBu DM'nin ephemeral olmayan bir mesajı, içeriğiyle
Dosya seçeneğiSunucudaki gibi

Intent ve içerik

DM mesajları için identify'da DIRECT_MESSAGES (1 << 12, 4096) iste. DM'deki tepkiler için DIRECT_MESSAGE_REACTIONS, yazıyor bilgisi için DIRECT_MESSAGE_TYPING gerekir. Etkileşimler intent istemez.

MESSAGE_CONTENT DM'de uygulanmaz: kişinin bota yazdığı mesaj her zaman content ve dosyalarıyla tam gelir. Kişi mesajı sana yazıyor.

Shard

Sunucusu olmayan her şey, DM mesajları ve DM'den gelen etkileşimler, shard 0'a gelir. Birden çok shard açıyorsan DM'leri shard 0 oturumunda dinle. Ayrıntılar Shard'lar sayfasında.

Tam örnek: yankı botu

Node.js 22 veya üstü yeter. Gateway sayfasındaki gateway.mjs ile Örnekler sayfasındaki api.mjs aynı klasörde olmalı. Bot DM'ye gelen her mesajı aynen geri yazar; dm_closed gelirse o DM'ye bir daha yazmaz:

import { connect } from "./gateway.mjs";
import { call } from "./api.mjs";

const DIRECT_MESSAGES = 1 << 12;
let me;
// Kapatılmış ya da engellenmiş DM'ler: bunlara bir daha yazılmaz.
const closed = new Set();

async function echo(d) {
  if (closed.has(d.channel_id) || !d.content) return;
  try {
    await call("POST", `/channels/${d.channel_id}/messages`, {
      content: d.content.slice(0, 2000),
      message_reference: { message_id: d.id },
      allowed_mentions: { parse: [] },
    });
  } catch (err) {
    if (err.message.startsWith("403 dm_closed")) {
      closed.add(d.channel_id);
      return;
    }
    console.error(err.message);
  }
}

await connect({
  intents: DIRECT_MESSAGES,
  onEvent(t, d) {
    if (t === "READY") me = d.user.id;
    // DM'de guild_id yoktur; botun kendi mesajları da gelir.
    if (t !== "MESSAGE_CREATE" || d.guild_id || d.author.id === me) return;
    // Kişi yeniden yazdıysa DM yine açıktır.
    closed.delete(d.channel_id);
    echo(d);
  },
});

Çalıştırmak için:

BOT_TOKEN='kopyaladigin_token' node yanki-botu.mjs

Sonra botunun bulunduğu bir sunucuda botun profilinden Mesaj gönder'e bas ve bir şey yaz. Bot kişiye yalnızca kişi yazdığında yanıt verdiği için 24 saat kuralına hiç takılmaz.

Limitler

AnahtarDeğerSaniyeAnlamı
window86400Kişinin son mesajı, komutu ya da basmasından sonra kendiliğinden yazabileceğin süre
dm_send3010Tüm DM'lerinde toplam kendiliğinden yazma (mesaj, tepki, sabitleme, yazıyor); etkileşim yanıtları sayılmaz
message55Kanal başına mesaj, sunucudaki gibi

dm_send aşılınca X-RateLimit-Scope: bot ile 429 gelir. Diğer sınırlar Hız sınırları sayfasında.

Hatalar

KodNe olduNe yap
dm_closedKişi DM'yi kapattı ya da botu engellediO kişiye yazmayı bırak, yeniden deneme. Kişi yeniden yazarsa yanıt verirsin.
dm_window_closedKişinin son mesajı, komutu ya da basmasından beri 24 saat geçtiKendiliğinden yazma. Kişi yeniden yazana dek bekle.
rate_limitedX-RateLimit-Scope: bot: dm_send dolduretry_after kadar bekle; çok kişiye birden yazıyorsan yavaşla.
bot_forbiddenBot DM açmaya çalıştıDM'yi yalnızca kişi açar. Kişiye sunucuda "Bana DM'den yaz" de.
unknown_channelBu DM'nin alıcısı değilsinYalnızca kişinin seninle açtığı DM'ye yazabilirsin.

Kişinin alabileceği hata sana gelmez:

KodNe oldu
cannot_dmKişi botu engellemiş, ortak sunucu yok ya da bot kapatılmış: DM açılamaz, engelliyken yazılamaz ve basılamaz

Bu sayfayı yapay zekaya verirsen

Kişi ne görür

Botun profilindeki veya üye menüsündeki Mesaj gönder ile konuşmayı aç. Başlıkta BOT etiketi görünür; sesli ve görüntülü arama yoktur. Üstteki sabit bilgi satırı 24 saatlik yanıt kuralını açıklar. Botu engellersen yazı alanının yerini Engeli kaldır düğmesi alır. / komutları ve Uygulamalar menüsü yalnız bu DM için sunulan komutları gösterir.

Sırada ne var

  • Komutlar: contexts: [0, 1] ile DM destekleyen küresel komutlar
  • Etkileşimler: DM içinde buton, menü ve form yanıtları
  • Hatalar: dm_closed, dm_window_closed ve cannot_dm kodları