# İzinler

İzinler bir bit alanıdır. Her iznin bir biti vardır ve API değeri **ondalık metin** olarak taşır: `"68672"`. Metin yerine sayı göndermek veya tanımlı olmayan bir bit kullanmak `400 invalid_body` verir.

## Değeri hesaplamak

Portaldaki **Ekleme bağlantısı** bölümünde izinleri seçtiğinde değer senin için hesaplanır ve bağlantıdaki `izin` olur.

Kendin hesaplamak istersen izinlerin değerlerini topla (veya bitlerini `OR` ile birleştir). Bazı izinler 32 bitin üstünde olduğu için JavaScript'te `BigInt` kullan:

```js
const VIEW_CHANNEL = 1n << 10n;
const SEND_MESSAGES = 1n << 11n;
const value = VIEW_CHANNEL | SEND_MESSAGES;
console.log(value.toString()); // "3072"
```

Başlangıç rehberindeki `68608` şu toplamdır: `ViewChannel` (1024) + `SendMessages` (2048) + `ReadMessageHistory` (65536). Ses kanalına girip yayın yapan bir bot için `3146752` (`ViewChannel` + `Connect` + `Speak`) gerekir; ayrıntılar [Ses](https://noluyo.net/gelistirici/ses.md) sayfasında.

Ekleme bağlantısı bölümü **Tepki ekle** (`AddReactions`, 64) ve **@herkes ve rolleri etiketle** (`MentionEveryone`, 131072) izinlerini de sunar; bot bunları diğer izinler gibi isteyebilir.

## İzin listesi

| Bit | Değer | Ad | Anlamı |
|---|---|---|---|
| 0 | 1 | `CreateInstantInvite` | Davet oluşturma |
| 1 | 2 | `KickMembers` | Üyeyi sunucudan çıkarma |
| 2 | 4 | `BanMembers` | Üye yasaklama |
| 3 | 8 | `Administrator` | Tüm izinler; kanal ayarlarından etkilenmez |
| 4 | 16 | `ManageChannels` | Kanal yönetme |
| 5 | 32 | `ManageGuild` | Sunucu yönetme, bot ekleme |
| 6 | 64 | `AddReactions` | Mesaja yeni emoji ile tepki verme |
| 7 | 128 | `ViewAuditLog` | Denetim kaydını görme |
| 8 | 256 | `PrioritySpeaker` | Öncelikli konuşmacı |
| 9 | 512 | `Stream` | Yayın açma |
| 10 | 1024 | `ViewChannel` | Kanalı görme |
| 11 | 2048 | `SendMessages` | Mesaj gönderme |
| 12 | 4096 | `SendTTSMessages` | Sesli okunan mesaj gönderme |
| 13 | 8192 | `ManageMessages` | Başkalarının mesajlarını silme, sabitleme, tepki temizleme |
| 14 | 16384 | `EmbedLinks` | Bağlantı önizlemesi; botun embed'i için gerekmez, `SendMessages` yeter |
| 15 | 32768 | `AttachFiles` | Dosya gönderme |
| 16 | 65536 | `ReadMessageHistory` | Geçmiş mesajları okuma |
| 17 | 131072 | `MentionEveryone` | Herkesi ve her rolü etiketleme |
| 18 | 262144 | `UseExternalEmojis` | Başka sunucuların emojilerini kullanma |
| 19 | 524288 | `ViewGuildInsights` | Sunucu istatistiklerini görme |
| 20 | 1048576 | `Connect` | Ses kanalına bağlanma |
| 21 | 2097152 | `Speak` | Seste konuşma |
| 22 | 4194304 | `MuteMembers` | Üyeyi sunucuda susturma |
| 23 | 8388608 | `DeafenMembers` | Üyenin sesini kapatma |
| 24 | 16777216 | `MoveMembers` | Üyeyi ses kanalları arasında taşıma |
| 25 | 33554432 | `UseVAD` | Ses algılamayla konuşma |
| 26 | 67108864 | `ChangeNickname` | Kendi takma adını değiştirme |
| 27 | 134217728 | `ManageNicknames` | Başkalarının takma adını değiştirme |
| 28 | 268435456 | `ManageRoles` | Rol yönetme ve verme |
| 29 | 536870912 | `ManageWebhooks` | Webhook yönetme |
| 30 | 1073741824 | `ManageGuildExpressions` | Emoji, çıkartma ve ses yönetme |
| 31 | 2147483648 | `UseApplicationCommands` | Uygulama komutlarını kullanma; kanalda yoksa kişi orada hiçbir komutu görmez ve çalıştıramaz, bkz. [Komut izinleri](https://noluyo.net/gelistirici/komut-izinleri.md) |
| 32 | 4294967296 | `RequestToSpeak` | Konuşma isteme |
| 33 | 8589934592 | `ManageEvents` | Etkinlik yönetme |
| 34 | 17179869184 | `ManageThreads` | Alt başlık yönetme |
| 35 | 34359738368 | `CreatePublicThreads` | Herkese açık alt başlık oluşturma |
| 36 | 68719476736 | `CreatePrivateThreads` | Özel alt başlık oluşturma |
| 37 | 137438953472 | `UseExternalStickers` | Başka sunucuların çıkartmalarını kullanma |
| 38 | 274877906944 | `SendMessagesInThreads` | Alt başlıklarda mesaj gönderme |
| 39 | 549755813888 | `UseEmbeddedActivities` | Gömülü etkinlikleri kullanma |
| 40 | 1099511627776 | `ModerateMembers` | Üyeyi zamanlı susturma |

Bu aşamadaki bot rotalarının kullandığı izinler, [REST referansında](https://noluyo.net/gelistirici/api.md) her rotanın altında yazar. Listedeki bazı izinlerin bu aşamada bota açık bir rotası yoktur.

## Bir üyenin izinleri nasıl hesaplanır

Bot da diğer üyeler gibi hesaplanır.

**Sunucu düzeyinde:**

1. Sunucunun sahibi tüm izinlere sahiptir.
2. Diğer üyeler için `@everyone` rolünün izinleri ile üyenin tüm rollerinin izinleri birleştirilir.
3. Sonuçta `Administrator` varsa üye tüm izinlere sahiptir.

`@everyone` rolünün ID'si sunucunun ID'siyle aynıdır. Üyenin `roles` listesinde yer almaz, ama izinleri her zaman sayılır.

Bir rolün ID'sini sunucu ayarlarında **Roller** sekmesinden rolü açıp **Kopyala** ile alırsın (Android ve iOS'ta **Rol ID'sini kopyala**). Bir bot aynı kimlikleri `GET /guilds/{id}/roles` ile de listeleyebilir.

**Kanalda.** `Administrator` olanlar kanal ayarlarından etkilenmez. Diğerleri için kanalın izin geçersiz kılmaları (`permission_overwrites`) şu sırayla uygulanır; her adımda önce `deny` bitleri çıkarılır, sonra `allow` bitleri eklenir:

1. `@everyone` için olan geçersiz kılma
2. Üyenin rolleri için olanlar, birleştirilerek
3. Üyenin kendisi için olan

**Bağımlı izinler.** Kanalda `ViewChannel` yoksa hiçbir izin kalmaz. `SendMessages` yoksa `SendTTSMessages`, `MentionEveryone`, `AttachFiles` ve `EmbedLinks` de geçersiz olur. `Connect` yoksa `Speak`, `Stream`, `MuteMembers`, `DeafenMembers`, `MoveMembers`, `UseVAD`, `PrioritySpeaker` ve `RequestToSpeak` de geçersiz olur.

**Susturma.** Zamanlı susturma sürerken üyede yalnızca `ViewChannel` ve `ReadMessageHistory` kalır. Bu, susturulan bot için de geçerlidir. Sahip ve yöneticiler susturulamaz.

Bir izin geçersiz kılmasının türü (`type`) rol için `0`, üye için `1`'dir.

## Rol sıralaması

Her rolün bir `position` değeri vardır, büyük olan daha üsttedir. Üyenin rütbesi, en yüksek rolünün konumudur. Sunucu sahibi herkesten üsttedir.

- Bir üyeyi çıkarmak, yasaklamak, susturmak veya takma adını değiştirmek için rütben hedefin rütbesinden **büyük** olmalıdır. Eşitlik yetmez; aksi halde `403 role_hierarchy` döner.
- Bir rolü düzenlemek, silmek, vermek veya almak için rütben o rolün konumundan büyük olmalıdır.
- Rolün `position` değerini kendi rütbenden küçük bir değere ayarlayabilirsin; en küçük değer 1'dir.
- Sahip olmadığın bir izni kimseye veremezsin (`403 missing_permissions`). Kanal geçersiz kılmaları için de aynısı geçerlidir.

**Botun için bunun anlamı:** Bot sunucuya eklenince rolü doğrudan `@everyone`'ın üstüne konur. Bu haliyle yalnızca rolü olmayan üyeler üzerinde işlem yapabilir. Moderasyon yapacak botun rolünü, bir sunucu yöneticisi **Sunucu ayarları** içindeki **Roller** listesinde sürükleyerek işlem yapacağı rollerin üstüne taşımalıdır.

Bot kendi rolünü değiştiremez, çünkü rütbesi o rolün konumundan büyük değildir; daha yüksek bir rol verilmişse değiştirebilir.

## Sık görülen durumlar

| Bot şunu alıyor | Muhtemel neden |
|---|---|
| Kanalı okurken boş liste | `ReadMessageHistory` yok. Liste rotaları bu durumda hata vermez. |
| `403 missing_access` | Kanalda `ViewChannel` yok. |
| `403 missing_permissions` | Gereken izin yok ya da bot susturulmuş. |
| `403 role_hierarchy` | Hedefin rolü botun rolünden aşağıda değil. |
| `404 unknown_guild` | Bot o sunucunun üyesi değil. |

## Bu sayfayı yapay zekaya verirsen

> **İpucu:** Yapay zekadan ekleme bağlantısı veya komut tanımlamasını isterken şu kuralları ekle:
>
> - İzin bitleri 64 bit tam sayı olduğu için JSON içinde metin dizgisi (`"permissions": "3072"`), JavaScript hesabında `BigInt` (`1n << 40n`) kullanılır.
> - Kolaya kaçıp `Administrator` (`8`) istemek yerine yalnızca kullanılan rotaların gerektirdiği en küçük izin bitleri toplanır ve rol işlemlerinde bot rolünün hedef rolden yukarıda olması gerektiği (`role_hierarchy`) unutulmaz.

## Sırada ne var

- [Komut izinleri](https://noluyo.net/gelistirici/komut-izinleri.md): komutların hangi rol ve kanalda çalışacağını yönetmek
- [Uygulamalar ve botlar](https://noluyo.net/gelistirici/bot-uygulamalari.md): `/bot-ekle` bağlantısı ve yönetilen bot rolü
- [Sık hatalar](https://noluyo.net/gelistirici/sik-hatalar.md): `missing_access`, `missing_permissions` ve `role_hierarchy` farkı
