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

Komut izinleri

Komut izinleri, botunun komutlarını bir sunucuda kimin görüp çalıştırabileceğini ve hangi kanallarda kullanılabileceğini söyleyen kurallardır: kuralları sunucunun yöneticileri koyar, botun okur.

Komut izinleri

Komut izinleri, botunun komutlarını bir sunucuda kimin görüp çalıştırabileceğini ve hangi kanallarda kullanılabileceğini söyleyen kurallardır: kuralları sunucunun yöneticileri koyar, botun okur.

Kimin işi

KişiNe yapar
Sunucu yöneticisiKuralları koyar, değiştirir ve kaldırır. ManageGuild ve ManageRoles izinlerinin ikisi de gerekir.
Geliştiricidefault_member_permissions ile komutun varsayılanını seçer, kuralları okur ve değişince olay alır. Kural yazamaz.

Kuralı sunucu uygular: kişinin kullanamayacağı komut ona listede gösterilmez ve çalıştırılırsa botuna hiç ulaşmaz.

Sunucu yöneticisi için

Nereden açılır

  1. Sunucunun adına tıkla ve Sunucu ayarları'nı aç.
  2. Soldaki Bot komutları sekmesine gir. Sekme yalnız ManageGuild ile ManageRoles izinlerinin ikisi birden sende varsa görünür.
  3. Bot kutusundan bir bot seç. Altındaki Komut izinleri kartında önce Tüm komutlar satırı gelir: botun bütün komutlarına uyan kurallar. Altında her komut kendi satırındadır; satırda komutun açıklaması, kural yokken kimin kullanabildiği (default_member_permissions) ve bugünkü kuralların özeti yazar.
  4. Satırdaki Düzenle'ye bas. Rol, Üye ya da Kanal seç, hedefi seç (aramak için yazabilirsin), Kural ekle'ye bas. Yeni kural İzin ver olarak eklenir; yanındaki kutudan Engelle'ye çevirebilirsin. Varsayılan ya da çöp kutusu kuralı kaldırır: o hedef için komutun varsayılanı geçerli olur.
  5. Kaydet'e bas. Kaydetmeden önce kuralların özeti çıkar ("İzin ver: @Moderatör · Engelle: @herkes, #genel" gibi); onaylayınca kaydedilir. Kişilerin uygulamaları değişikliği en geç 60 saniyede görür: komut listelerinden kaybolur ve çalıştırılamaz.

Listeyi okuyan rota ManageGuild ister, kural değiştirmek ManageGuild ile ManageRoles'ü birlikte ister; sekme ikisi birden olmadan görünmez. Komutun istediği bir izin sende yoksa kaydederken "Bu izin sende olmadığı için bu komutu açamazsın." yazar (aşağıda Sende olmayan yetkiyi açamazsın). Her değişiklik denetim kaydına "Komut izni güncelleme" olarak düşer: kimin, hangi komutta, eski ve yeni kuralları.

Kural türleri

typeHedefid
1RolSunucunun bir rolünün ID'si; sunucunun kendi ID'si @everyone demektir
2ÜyeSunucunun bir üyesinin kullanıcı ID'si
3KanalSunucunun bir kanalının ID'si; 0 tüm kanallar demektir

Bir komutta ve Tüm komutlar satırında ayrı ayrı en çok 100 kural olur. Aynı hedef bir listede iki kez geçemez. Başka sunucunun rolü ya da kanalı, üye olmayan bir kişi 400 validation_failed döner.

Hangi kural kazanır

Sunucu, kişi bir komutu açınca ve çalıştırınca bu sırayla bakar:

  1. Sunucunun sahibi ve Administrator izni olanlar her komutu her kanalda kullanır. Hiçbir kural onları durdurmaz.
  2. Kişinin o kanalda UseApplicationCommands izni yoksa ya da zaman aşımındaysa orada hiçbir komutu kullanamaz.
  3. Kanal kuralı: önce komutun kendi kuralları, orada kanal kuralı yoksa Tüm komutlar kuralları. İçlerinde önce o kanalın kuralı, yoksa "tüm kanallar" (0). Bulunan kural engelse komut o kanalda kullanılamaz. Hiç kanal kuralı yoksa her kanal açıktır.
  4. Kişi kuralı: önce komutun kendi kuralları, sonra Tüm komutlar kuralları. Her birinde önce kişinin kendi kuralı, sonra rolleri (rollerinden biri izin veriyorsa izin, hepsi engelliyorsa engel), sonra @everyone. İlk bulunan karar verir. Bir istisna: Tüm komutlar'daki bir izin, default_member_permissions değeri olan komutu açmaz; o komutta 5. adıma geçilir. Tüm komutlar'daki engel ise her komutta geçerlidir.
  5. Hiç kişi kuralı yoksa komutun default_member_permissions değeri karar verir.

Komutun kendi kuralı Tüm komutlar kuralını ezer. Örneğin Tüm komutlar'da @everyone engelli ama /yardım'da @everyone izinliyse, herkes /yardım'ı kullanır, botun diğer komutlarını kullanamaz.

Dört örnek

İstekNereyeKurallar
Herkes kullansın ama #genel'de olmasınKomuta ya da Tüm komutlar'aKanal #genel: Engelle
Yalnız ModeratörKomuta@everyone: Engelle; rol Moderatör: İzin ver
Bir kişi hariçKomutaO üye: Engelle
Yalnız yöneticiKomuta@everyone: Engelle. Sahip ve Administrator zaten geçer

"Bir kişi hariç" kişi kuralı olduğu için rolden önce gelir: o kişinin Moderatör rolü olsa bile engellenir. "Yalnız Moderatör"de Moderatör olmayan herkes @everyone kuralına düşer.

Komutları bir kanalda tamamen kapatmak

UseApplicationCommands artık denetlenir. Kanalın izin ayarlarında bir rolden bu izni kaldırırsan o roldeki kişiler o kanalda hiçbir botun hiçbir komutunu görmez ve çalıştıramaz. Bütün sunucuda kapatmak için Roller'de @everyone rolünden kaldır. Yeni sunucularda @everyone bu izinle başlar.

Sende olmayan yetkiyi açamazsın

Bir komutun default_member_permissions değeri varsa, örneğin BanMembers, o komutun kurallarını değiştirmek için bu izinlere senin de sahip olman gerekir; yoksa 403 command_permission_escalation alırsın. Değeri "0" olan komutun kurallarını yalnızca sahip ve Administrator değiştirir. Tüm komutlar satırında bu, botun bütün komutlarının izinleri demektir. Sebep: aksi halde yalnızca ManageGuild izni olan biri /ban'ı herkese açabilirdi. Aynı sebeple Tüm komutlar kuralı yalnızca varsayılan izni olmayan komutları açar; bot sonradan BanMembers isteyen bir komut eklese de o komut kendiliğinden açılmaz. Yetki isteyen bir komutu bir role açmak için kuralı o komutun kendisine koy.

Geliştirici için

Varsayılan: default_member_permissions

Sunucu bir kural koyana dek komutu kimin kullanacağını Komutlar sayfasındaki default_member_permissions söyler. Bir kişi kuralı varsayılanın önüne geçer: yönetici /ban'ı bir role açabilir, herkese açık bir komutu bir role kapatabilir. Varsayılanı yetki isteyen komutlar için doğru seç; ama tek güvencen o olmasın.

Bot neden kural yazamaz

Kim neyi kullanır, sunucunun kararıdır. Bot kendi komutunu herkese açabilseydi sunucu bu kararı kaybederdi. Bu yüzden kural yazma rotası yalnızca kişinin oturumuyla çalışır; bot token'ıyla 403 bot_forbidden döner. Botun kuralları okur ve değişince olay alır.

Kuralları okumak

curl "https://noluyo.net/api/v1/applications/$APPLICATION_ID/guilds/$GUILD_ID/commands/permissions" \
  -H "Authorization: Bot $BOT_TOKEN"

Yanıt, kuralı olan her komut için bir kayıttır. id uygulamanın ID'siyse kayıt Tüm komutlar kurallarıdır:

[
  {
    "id": "111540000000000000",
    "application_id": "111540000000000000",
    "guild_id": "111500000000000000",
    "permissions": [{ "type": 1, "id": "111500000000000000", "allow": false }]
  },
  {
    "id": "111560000000000000",
    "application_id": "111540000000000000",
    "guild_id": "111500000000000000",
    "permissions": [
      { "type": 1, "id": "111520000000000000", "allow": true },
      { "type": 3, "id": "0", "allow": false }
    ]
  }
]
RotaNe döner
GET .../guilds/{guild_id}/commands/permissionsBotun o sunucudaki bütün kuralları; kuralı olmayan komut listede yok
GET .../guilds/{guild_id}/commands/{command_id}/permissionsBir komutun kuralları, yoksa boş liste; Tüm komutlar kuralları burada yok

İkisi de read sınıfındadır. Bot o sunucunun üyesi değilse 403 missing_access döner.

Alanlar

AlanTürAnlamı
idIDKomut; Tüm komutlar kurallarında uygulamanın ID'si
application_idIDUygulaman
guild_idIDSunucu
permissions[].typetam sayı1 rol, 2 üye, 3 kanal
permissions[].idIDHedef; rol olarak sunucunun ID'si @everyone, kanal olarak 0 tüm kanallar
permissions[].allowevet/hayırtrue izin verir, false engeller

Değişince: APPLICATION_COMMAND_PERMISSIONS_UPDATE

Bir yönetici kuralları değiştirince botuna APPLICATION_COMMAND_PERMISSIONS_UPDATE gelir. Gövdesi yukarıdaki kayıtlardan biridir ve kümenin tamamını taşır; boş permissions kuralların kaldırıldığını söyler. Intent istemez, yalnızca botuna gider. Kuralları sunucu zaten uygular; olayı yalnızca bilgi için kullan, örneğin bir kayıt kanalına yazmak için.

Tam örnek: kuralları okuyan betik

Node.js 22 veya üstü yeter, ek paket gerekmez. Betik bir sunucudaki kuralları okur ve okunur biçimde yazar:

const API = "https://noluyo.net/api/v1";
const { BOT_TOKEN, APPLICATION_ID, GUILD_ID } = process.env;
if (!BOT_TOKEN || !APPLICATION_ID || !GUILD_ID) throw new Error("BOT_TOKEN, APPLICATION_ID ve GUILD_ID tanımlı olmalı");

const headers = { Authorization: `Bot ${BOT_TOKEN}` };
const get = async (path) => {
  for (;;) {
    const res = await fetch(API + path, { headers });
    const data = await res.json();
    if (res.status === 429) {
      await new Promise((done) => setTimeout(done, data.retry_after * 1000));
      continue;
    }
    if (!res.ok) throw new Error(`${res.status} ${data.code}: ${data.message}`);
    return data;
  }
};

const names = new Map();
for (const c of await get(`/applications/${APPLICATION_ID}/commands`)) names.set(c.id, c.name);
for (const c of await get(`/applications/${APPLICATION_ID}/guilds/${GUILD_ID}/commands`)) names.set(c.id, c.name);

const kinds = { 1: "rol", 2: "üye", 3: "kanal" };
for (const entry of await get(`/applications/${APPLICATION_ID}/guilds/${GUILD_ID}/commands/permissions`)) {
  const title = entry.id === APPLICATION_ID ? "Tüm komutlar" : `/${names.get(entry.id) ?? entry.id}`;
  console.log(title);
  for (const p of entry.permissions) {
    let target = `${kinds[p.type]} ${p.id}`;
    if (p.type === 1 && p.id === GUILD_ID) target = "@everyone";
    if (p.type === 3 && p.id === "0") target = "tüm kanallar";
    console.log(`  ${target}: ${p.allow ? "izin" : "engel"}`);
  }
}

Çalıştırmak için:

BOT_TOKEN='kopyaladigin_token' APPLICATION_ID='uygulama id degeri' GUILD_ID='sunucu id degeri' node kurallar.mjs

Limitler

KonuDeğer
KuralKomut başına 100; Tüm komutlar için ayrıca 100
Kural yazmaKişi ve sunucu başına dakikada 10
Kural okumaread sınıfı: 5 saniyede 30 istek
YayılmaKişilerin uygulamaları en geç 60 saniyede

Hatalar

KodNe olduNe yap
missing_permissionsKural değiştiren kişide ManageGuild ve ManageRoles birlikte yokKişiye iki izni de veren bir rol ver.
command_permission_escalationKişi komutun default_member_permissions bitlerine sahip değilKuralı o izinlere sahip biri, sahip ya da bir Administrator değiştirsin.
validation_failed, permissions[0].id: invalidHedef bu sunucunun değil, iki kez geçiyor ya da ID geçersizBu sunucunun rolünü, kanalını ya da üyesini seç; tüm kanallar için 0.
validation_failed, permissions: too_long100'den çok kuralKişi kuralları yerine rol kullan.
unknown_applicationBot bu sunucuda değil ya da kapatılmışBotu sunucuya ekle.
unknown_commandKomut yok ya da başka sunucunun komutuGlobal komutu ya da bu sunucunun komutunu seç.
bot_forbiddenBot kural yazmaya çalıştıBot yazamaz; sunucunun yöneticisinden iste.
missing_accessOkuyan bot o sunucunun üyesi değilBotu sunucuya ekle.
rate_limitedDakikada 10 değişikliği aştınretry_after kadar bekle.

Bu sayfayı yapay zekaya verirsen

Sırada ne var

  • Komutlar: default_member_permissions alanı ve komut tanımları
  • İzinler: izin bitlerinin tam listesi ve rol hiyerarşisi
  • Hatalar: command_forbidden ve command_permission_escalation yanıtları