# Intent'ler

Bot, sunucularında olan biten her şeyi duymak zorunda değil. Yalnızca `!ping`'e yanıt veren bir botun, kimin hangi ses kanalına girdiğini bilmesine gerek yok. **Intent**, botun hangi olay gruplarını almak istediğini söylediği seçimdir. İstemediğin olaylar sana hiç gönderilmez, programın da onlarla boşuna uğraşmaz.

Intent'leri [identify](https://noluyo.net/gelistirici/gateway.md) çerçevesinde bir sayı olarak gönderirsin. Bu alan zorunludur.

## Intent'ler ve değerleri

| Intent | Bit | Değer | Ne açar | Ayrıcalıklı |
|---|---|---|---|---|
| `GUILDS` | 0 | 1 | Sunucular, roller, kanallar, sabitlemeler | |
| `GUILD_MEMBERS` | 1 | 2 | Üye katılma, değişme, ayrılma; `op 8` ve `GET /guilds/{guild_id}/members` ile tam liste | Evet |
| `GUILD_MODERATION` | 2 | 4 | Yasaklar | |
| `GUILD_EXPRESSIONS` | 3 | 8 | Emoji, çıkartma, ses paneli | |
| `GUILD_WEBHOOKS` | 5 | 32 | Webhook değişiklikleri | |
| `GUILD_INVITES` | 6 | 64 | Davetler | |
| `GUILD_VOICE_STATES` | 7 | 128 | Seste kimlerin olduğu, orada çalınan sesler | |
| `GUILD_PRESENCES` | 8 | 256 | Üyelerin çevrimiçi durumu ve etkinlikleri | Evet |
| `GUILD_MESSAGES` | 9 | 512 | Sunucu kanallarındaki mesajlar | |
| `GUILD_MESSAGE_REACTIONS` | 10 | 1024 | Sunucu kanallarındaki tepkiler | |
| `GUILD_MESSAGE_TYPING` | 11 | 2048 | Sunucu kanallarında yazıyor bilgisi | |
| `DIRECT_MESSAGES` | 12 | 4096 | Kişilerin botunla açtığı [DM'lerdeki](https://noluyo.net/gelistirici/ozel-mesajlar.md) mesajlar; içerik `MESSAGE_CONTENT` olmadan da tam gelir | |
| `DIRECT_MESSAGE_REACTIONS` | 13 | 8192 | DM'lerdeki tepkiler | |
| `DIRECT_MESSAGE_TYPING` | 14 | 16384 | DM'lerde yazıyor bilgisi | |
| `MESSAGE_CONTENT` | 15 | 32768 | Mesajların içeriği | Evet |
| `GUILD_SCHEDULED_EVENTS` | 16 | 65536 | Zamanlanmış etkinlikler | |
| `AUTO_MODERATION_CONFIGURATION` | 20 | 1048576 | Otomatik moderasyon kuralları | |

Hangi olayın hangi intent'e bağlı olduğu [Olaylar](https://noluyo.net/gelistirici/olaylar.md#events) sayfasında, her olayın altında yazar.

Bazı olaylar intent istemez, her oturuma gider: `READY`, `RESUMED`, `RATE_LIMITED`, `GUILD_MEMBERS_CHUNK` ve botun kendi profilini anlatan `USER_UPDATE`. Botun kendi üyeliğiyle ilgili üye olayları da `GUILD_MEMBERS` olmadan gelir.

## Değeri hesaplamak

İstediğin intent'lerin değerlerini topla ya da bitlerini `|` ile birleştir:

```js
const GUILDS = 1 << 0;
const GUILD_MESSAGES = 1 << 9;
const MESSAGE_CONTENT = 1 << 15;

const intents = GUILDS | GUILD_MESSAGES | MESSAGE_CONTENT; // 33281
```

Değer sayı olarak gönderilir, metin olarak değil. Yoksa, sayı değilse ya da listede olmayan bir bit içeriyorsa bağlantı `4013` ile kapanır. `0` geçerlidir: bot o zaman yalnızca intent istemeyen olayları alır.

## Ayrıcalıklı intent'ler

Üç intent hassas veri açar: `GUILD_MEMBERS`, `GUILD_PRESENCES` ve `MESSAGE_CONTENT`. Bunları istemeden önce [portalda](https://noluyo.net/gelistirici/uygulamalar) uygulama sayfasının **Ayrıcalıklı intent'ler** bölümünden açman gerekir. Portaldaki adları **Sunucu üyeleri**, **Presence** ve **Mesaj içeriği**'dir.

Açmadığın bir ayrıcalıklı intent'i identify'da istersen bağlantı `4014` ile kapanır.

**REST'te üye listesi.** `GET /guilds/{guild_id}/members` aynı kurala uyar; bir bağlantı olmadığı için portalın o anki haline bakar. `GUILD_MEMBERS` yoksa `403 member_list_intent_required` döner. Tek üye istemek, `GET /guilds/{guild_id}/members/{user_id}`, intent istemez.

**100 sınırı.** Bot 100'den az sunucudaysa bu seçim senindir, açman yeter. Bot 100 ya da daha çok sunucudaysa yalnızca onaylanmış ayrıcalıklı intent'ler geçerlidir: açık ama onaysız bir intent'i istersen yine `4014` gelir, onaysız yeni bir intent'i açmak ise `400 intent_approval_required` döner. Onay başvurusu ve gerekçe örnekleri [Doğrulama](https://noluyo.net/gelistirici/dogrulama.md) sayfasındadır.

**Açık bir oturum, identify ettiği intent'lerle sürer.** Portaldaki değişiklik canlı oturumu şöyle etkiler:

- **Bir intent'i açarsan** çalışan oturum bunu kendiliğinden kazanmaz. Yeni intent'i kullanmak için programını yeniden başlat ve yeniden identify et; resume yetmez, çünkü resume aynı oturumu sürdürür.
- **Bir intent'i kapatırsan** botun bağlantıları hemen düşer ve oturumlar sürdürülemez. Kapattığın intent'i artık istemeden yeniden identify et, yoksa `4014` alırsın.

## Mesaj içeriği kuralı

`GUILD_MESSAGES`, mesajların yazıldığını haber verir. Ne yazdığını okumak ise ayrı bir intent ister: `MESSAGE_CONTENT`. Bu intent olmayan bir bot `MESSAGE_CREATE` ve `MESSAGE_UPDATE` olaylarını yine alır, ama içeriği süzülmüş olarak.

İki istisnada mesaj tam gelir:

- Mesajı botun kendisi yazdıysa.
- Mesaj botu adıyla etiketliyorsa, yani bot mesajın `mentions` listesindeyse. Rol etiketi ve `@everyone` bu sayılmaz.

Süzülmüş bir mesajda `content` boş metin, `attachments` boş liste olur. Şu alanlar kalır, diğerlerinin hepsi çıkarılır:

`id`, `type`, `channel_id`, `guild_id`, `author`, `timestamp`, `edited_timestamp`, `mentions`, `mention_roles`, `mention_everyone`, `message_reference`, `pinned`, `nonce`, `webhook_id`, `reactions`, `activity`

Çıkarılanlar arasında çıkartmalar (`sticker_items`), anketler (`poll`), iletilen mesajlar (`forward`) ve mesajın başka tüm içerik alanları vardır. Boş `content` hata değildir: "içerik görme iznin yok" demektir.

> **İpucu:** Yalnızca komut dinleyen bir botun bu intent'e ihtiyacı olmayabilir. Kullanıcılar botu etiketleyerek yazarsa (`@bot !ping`) mesaj zaten tam gelir.

### REST okumaları da aynı kurala uyar

Gateway'de kapalı olan içeriği REST'ten okuyamazsın. Sunucu kanallarında [mesaj listesi](https://noluyo.net/gelistirici/api-messages.md#listMessages), [tek mesaj](https://noluyo.net/gelistirici/api-messages.md#getMessage) ve [sabitlenenler](https://noluyo.net/gelistirici/api-pins.md#listPins) aynı süzmeyi uygular, aynı iki istisnayla.

Tek fark şudur: REST isteğinde intent göndermezsin, bu yüzden uygulamanın portaldaki ayarına bakılır, oturumun identify ettiği intent'lere değil. Yani **Mesaj içeriği** açıksa (ve bot 100 ya da daha çok sunucudaysa onaylıysa) REST tam içerik döner; identify'da `MESSAGE_CONTENT` istememiş olsan bile.

### İletme de aynı kurala uyar

Okuyamadığın mesajı iletemezsin, yoksa iletilen kopyayı okuyarak kuralı aşmış olurdun. **Mesaj içeriği** kapalı bir bot, kendisinin yazmadığı ve kendisini etiketlemeyen bir mesajı `forward` ile göndermeye çalışırsa `400 validation_failed` alır: `{"forward":"invalid"}`.

## Etkileşim intent istemez

`INTERACTION_CREATE` hiçbir intent'e bağlı değildir: bir kişi botunun bileşenine bastıysa bot bunu `intents: 0` ile de alır. Olayın taşıdığı `message` botun kendi mesajı olduğu için `MESSAGE_CONTENT` kuralına da takılmaz, seçilen üye `GUILD_MEMBERS` olmadan da `resolved` içinde gelir. Ayrıntı [Bileşenler](https://noluyo.net/gelistirici/bilesenler.md) sayfasında.

## Bu sayfayı yapay zekaya verirsen

> **İpucu:** Yapay zekaya olay dinleyen bir bot yazdırırken şunları belirt:
>
> - Yalnızca eğik çizgi komutu ve buton kullanan bir botun `intents: 0` göndermesi yeterlidir.
> - `GUILD_MEMBERS`, `GUILD_PRESENCES` ve `MESSAGE_CONTENT` kodda istenmeden önce portalda açılmış olmalıdır; aksi halde gateway `4014` ile kapanır.

## Sırada ne var

- Bağlantının tamamı: [Gateway](https://noluyo.net/gelistirici/gateway.md)
- Olayların alanları ve örnekleri: [Olaylar](https://noluyo.net/gelistirici/olaylar.md)
- Çok sunuculu botlar: [Shard'lar](https://noluyo.net/gelistirici/shardlar.md)
