# Doğrulama

Yeni oluşturduğun bir bot ya da **N'oluyo ile giriş** uygulaması hemen çalışır; geliştirmek, arkadaşlarının sunucularında denemek ve ilk topluluğunu kurmak için hiçbir başvuru yapman gerekmez. Doğrulama yalnızca uygulaman büyüdüğünde devreye girer.

## Doğrulama ne zaman gerekir

Üç sınırdan birine yaklaştığında doğrulama başvurusu yaparsın:

- **100 sunucu sınırı (botlar):** Doğrulanmamış bir bot en çok **100** sunucuya eklenebilir; 101. sunucu `/bot-ekle` ekranında `403 bot_guild_limit` alır.
- **100 sunucu üstünde ayrıcalıklı intent'ler:** Botun 100 sunucunun altındayken portaldan `GUILD_MEMBERS`, `GUILD_PRESENCES` ve `MESSAGE_CONTENT` kutularını serbestçe açabilirsin. 100 sunucuya ulaştığında bu üç ayrıcalıklı intent'in açık kalması için incelemede onaylanmış olmaları (`approved_intents`) gerekir; aksi halde gateway `4014` ile, REST çağrısı `403 intent_approval_required` ile kapanır.
- **100 kullanıcı sınırı (N'oluyo ile giriş):** Doğrulanmamış bir OAuth2 uygulamasına en çok **100** farklı kişi giriş yapabilir (`403 oauth_user_cap`).
- **Bot rehberinde listelenme:** `/kesfet` altındaki **Botlar** dizininde yer almak isteyen her bot önce doğrulanır (`want_listing: true`).

## Başvuru öncesi kontrol listesi

`/gelistirici/uygulamalar` sayfasındaki **Doğrulama** bölümü (`POST /api/v1/applications/{application_id}/review`) başvuruyu göndermeden önce altı önkoşulu denetler. Eksik varsa `400 review_requirements` yanıtının `errors` nesnesinde eksik anahtarlar tek tek döner:

| Anahtar | Koşul | Nasıl tamamlanır |
|---|---|---|
| `public` | Uygulama dışarıya açık olmalı | Bot için `public: true` açılmalı ya da OAuth2 yönlendirme adresi tanımlanmış olmalıdır. |
| `description` | Uygulama açıklaması dolu olmalı | Portalda uygulamanın ne yaptığını anlatan net bir açıklama yaz. |
| `avatar` | Uygulama görseli yüklenmiş olmalı | Uygulamayı tanıtan özgün bir avatar yükle. |
| `privacy_url` | `https://` ile başlayan gizlilik politikası adresi | Hangi verileri sakladığını, ne kadar tuttuğunu ve silme talebinin nasıl iletileceğini anlatan yayındaki sayfanın adresini gir. |
| `support_url` | `https://` ile başlayan destek adresi | Destek sunucunun davet bağlantısını, iletişim sayfanı ya da hata bildirim adresini ekle. |
| `owner_mfa` | Uygulama sahibinin iki aşamalı doğrulaması açık olmalı | Kendi N'oluyo hesabında **Ayarlar → Güvenlik** bölümünden iki aşamalı doğrulamayı (2FA) etkinleştir. |

## İyi bir başvuru metni nasıl yazılır

Başvuru formunda iki metin alanı (`purpose` ve `data_use`), ayrıcalıklı intent bit maskesi (`requested_intents`) ve rehber tercihi (`want_listing`) bulunur. İnceleyen kişi kodunu değil, bu açıklamaları ve uygulamanın gerçek davranışını okur.

**İyi örnek:**

- **Amaç (`purpose`):** *"Sunucu yöneticilerinin `/anket` komutuyla butonlu oylama başlatmasını ve `/hatirlat` komutuyla belirli bir kanala zamanlı duyuru bırakmasını sağlar."*
- **Veri kullanımı (`data_use`):** *"Yalnızca aktif anketlerin kanal kimliğini, mesaj kimliğini, seçenek metinlerini ve oy verenlerin kullanıcı kimliklerini (`user.id`) PostgreSQL tablosunda tutarız. Anket kapandıktan 7 gün sonra oy kayıtları otomatik silinir. Sunucu bottan çıkarıldığında (`GUILD_DELETE`) o sunucuya ait tüm satırlar hemen silinir. Mesaj içerikleri okunmaz ve üçüncü taraflarla paylaşılmaz."*

**Zayıf örnek (reddedilir):**

- *"Çok amaçlı moderasyon ve eğlence botu. Hiçbir veri toplamıyoruz, her şey güvenli."* (Veritabanında sunucu ayarı ya da sayaç tuttuğu halde "hiçbir veri toplamıyoruz" demek ya da ne yaptığını tek cümleyle geçiştirmek başvurunun geri dönmesine yol açar.)

## Ayrıcalıklı intent gerekçesi

`requested_intents` alanında `GUILD_MEMBERS` (`1 << 1`), `GUILD_PRESENCES` (`1 << 8`) veya `MESSAGE_CONTENT` (`1 << 15`) istiyorsan her birinin neden normal komutlarla çözülemediğini açıkça yaz:

- **`MESSAGE_CONTENT`:** Yalnızca `/komut` veya `@bot` etiketleriyle çalışabilen bir bota `MESSAGE_CONTENT` onayı verilmez. Otomatik sözcük süzgeci ya da bağlantı denetimi gibi her mesajı görmek zorunda olan özellikler geçerli gerekçedir.
- **`GUILD_MEMBERS`:** Yeni katılan üyeye karşılama mesajı atmak, otomatik rol vermek ya da üye listesi senkronlamak geçerli gerekçedir.
- **`GUILD_PRESENCES`:** Çevrimiçi/çevrimdışı durum geçişi olmadan çalışmayan somut bir özellik göstermelisin; salt istatistik grafiği toplamak için onaylanmaz.

Onay çıktığında yalnızca uygun görülen intent'ler `approved_intents` alanına işlenir.

## İnceleme süreci ve ret durumunda ne olur

- Aynı uygulama için aynı anda yalnızca **bir** bekleyen başvuru bulunabilir; bekleyen başvuru varken ikinci kez gönderirsen `400 review_pending` döner.
- Başvurular insan gözüyle tek tek incelenir; **sabit bir sonuçlanma süresi sözü verilmez**. Durumu `/gelistirici/uygulamalar` içindeki **Doğrulama** kartından (`GET /api/v1/applications/{application_id}/review`) takip edebilirsin; karar çıktığında hesabının dilinde e-posta da gönderilir.
- **Başvuru reddedilirse (`rejected`):** İnceleyen kişinin yazdığı açıklama (`note`) portalda **Doğrulama** kartında görünür. Eksikleri giderip dilediğin zaman yeni bir başvuru gönderebilirsin.

## Doğrulanmış uygulamanın sorumlulukları ve acil durdurma

Doğrulanmış rozeti kalıcı bir ayrıcalık değil, süregelen bir güven sözüdür:

- `privacy_url` ve `support_url` adresleri yayında ve erişilebilir kalmalıdır.
- Beyan ettiğin `data_use` kapsamının dışına çıkacak yeni bir veri toplamaya başlarsan önce gizlilik metnini güncelle.
- **Acil durdurma:** Bir uygulamanın token'ı sızdırılırsa, kullanıcı gizliliğini ihlal ederse ya da platform sınırlarını kötüye kullanırsa uygulama acil olarak durdurulur. Durdurulan uygulamanın bot token'ı anında geçersiz kılınır (`401 invalid_bot_token`, gateway `4004`), açık tüm gateway ve ses bağlantıları kesilir, OAuth2 token'ları `401` döndürür, `/bot-ekle` kapanır ve bot rehberden düşer. Sorun giderilip uygulama yeniden açılsa bile eski bot token'ı kalıcı olarak geçersizdir; portaldan yeni bir token üretip `.env` dosyanı güncellemen gerekir.

## Bu sayfayı yapay zekaya verirsen

> **İpucu:** Doğrulama metinlerini veya gizlilik politikanı hazırlarken yapay zekadan yardım alıyorsan kodunu birlikte verip şu soruları gerçekçi biçimde yanıtlat:
>
> - Bot veritabanında veya bellekte hangi snowflake kimliklerini ve alanları saklıyor?
> - Bot sunucudan çıkarıldığında (`GUILD_DELETE`) veya kullanıcı verisinin silinmesini istediğinde bu kayıtlar nasıl temizleniyor?
> - Bot `MESSAGE_CONTENT`, `GUILD_MEMBERS` veya `GUILD_PRESENCES` kullanıyorsa bunu hangi özellik için yapıyor; `/komut` ile yapılabilecek bir iş için gereksiz ayrıcalıklı intent açılmış mı?

## Sırada ne var

- [Rehbere girmek](https://noluyo.net/gelistirici/rehbere-girmek.md): doğrulanmış botunu `/kesfet` altındaki Botlar dizininde listeleme
- [Intent'ler](https://noluyo.net/gelistirici/intentler.md): normal ve ayrıcalıklı intent bitlerinin tam tablosu
- [Güvenlik](https://noluyo.net/gelistirici/guvenlik.md): token sızıntılarını önleme ve iki aşamalı doğrulama
