Kalabalık bir sohbet kanalında konuları ayırmanın en düzenli yolu thread (alt başlık / ileti dizisi) kullanmaktır. Discord belgeleri thread'i var olan bir kanalın içindeki geçici alt kanal olarak tanımlar. Forum kanalları ise bir adım ötesidir: bu kanallara doğrudan mesaj yazılamaz, her gönderi aslında bir thread'dir.

Destek talebi açan, her duyuruya otomatik tartışma başlığı oluşturan ya da forum gönderilerine etiket atayan bir bot yazmak istiyorsanız thread tiplerini, arşivleme kurallarını, gereken izinleri ve gateway olaylarını bilmeniz gerekir. Bu rehberde hepsini resmî belgelere dayanarak, discord.js ve discord.py örnekleriyle anlatıyoruz.

Thread tipleri ve hangi kanalda oluşur?

Thread tipleri ve hangi kanalda oluşur? ANNOUNCEMENT_THREAD, PUBLIC_THREAD, PRIVATE_THREAD, GUILD_FORUM

Thread'ler de bir kanal nesnesidir ve kendi type değerleri vardır. Forum ve medya kanalları da thread barındıran kanal tipleridir.

TipDeğerAçıklama
ANNOUNCEMENT_THREAD10Duyuru (GUILD_ANNOUNCEMENT) kanalındaki thread
PUBLIC_THREAD11GUILD_TEXT veya GUILD_FORUM kanalındaki herkese açık thread
PRIVATE_THREAD12Yalnızca GUILD_TEXT kanalında; sadece davet edilenler ve MANAGE_THREADS iznine sahip olanlar görür
GUILD_FORUM15Yalnızca thread içerebilen kanal
GUILD_MEDIA16Forum kanalına benzer, yalnızca thread içerebilir (belgede beta olarak işaretli)

Herkese açık thread'ler üst kanalı görebilen herkes tarafından görülebilir. Özel thread'ler sunucu içindeki grup DM'lere benzer: görmek için davet edilmiş olmanız ya da MANAGE_THREADS iznine sahip bir moderatör olmanız gerekir.

Mesajdan thread başlatmak

Belgeye göre bir mesajdan thread başlatma uç noktası GUILD_TEXT kanalda PUBLIC_THREAD, duyuru kanalında ANNOUNCEMENT_THREAD oluşturur. Forum ve medya kanallarında çalışmaz. Oluşan thread'in ID'si kaynak mesajın ID'si ile aynıdır; bu yüzden bir mesajdan yalnızca bir thread açılabilir. Kaynak mesaj silinirse thread silinmez, "sahipsiz" (orphaned) kalır.

javascript
const { ThreadAutoArchiveDuration } = require('discord.js');

const thread = await message.startThread({
  name: 'tartisma',
  autoArchiveDuration: ThreadAutoArchiveDuration.OneDay,
  reason: 'Duyuru için tartışma başlığı',
});
await thread.send('Bu duyuruyla ilgili sorularınızı buraya yazabilirsiniz.');

Thread adı 1 ile 100 karakter arasında olmalıdır. rate_limit_per_user ile thread içinde yavaş mod (0 ile 21600 saniye) da ayarlanabilir.

Mesaj olmadan thread açmak (özel thread dahil)

Bir kanalda mesaja bağlı olmayan thread açmak için kanalın thread yöneticisini kullanırsınız. Belgedeki önemli bir ayrıntı: bu uç noktada type belirtilmezse varsayılan değer şu an PRIVATE_THREAD'dir ve gelecekteki bir API sürümünde zorunlu alan olacağı belirtilmiştir. Bu yüzden tipi her zaman açıkça yazmanızı öneririz. discord.js'te varsayılan herkese açık thread'dir; özel thread için tipi açıkça verirsiniz.

javascript
const { ChannelType, ThreadAutoArchiveDuration } = require('discord.js');

const destek = await channel.threads.create({
  name: `destek-${interaction.user.username}`,
  type: ChannelType.PrivateThread,
  invitable: false,
  autoArchiveDuration: ThreadAutoArchiveDuration.ThreeDays,
  reason: 'Destek talebi',
});
await destek.members.add(interaction.user.id);

invitable yalnızca özel thread'lerde geçerlidir ve moderatör olmayanların başka kullanıcıları thread'e ekleyip ekleyemeyeceğini belirler. Özel thread'ler mevcut bir mesajdan oluşturulamaz.

discord.py tarafında karşılığı şöyledir:

python
thread = await channel.create_thread(
    name='destek-talebi',
    type=discord.ChannelType.private_thread,
    auto_archive_duration=4320,
)
await thread.add_user(interaction.user)

Forum kanalına gönderi açmak ve etiket (tag) kullanmak

Forum kanalına gönderi açmak ve etiket (tag) kullanmak: Bir forum veya medya kanalında tanımlanabilecek etiket (available_tags) sayısı..., Bir gönderiye uygulanabilecek etiket...

Forum kanalında thread oluştururken aynı anda ilk mesajı da göndermeniz gerekir; belgeye göre bu istek hem thread hem mesaj parametreleri alır ve oluşan thread tipi her zaman PUBLIC_THREAD'dir. İlk mesajda content, embeds, sticker_ids, components veya dosyalardan en az biri bulunmalıdır.

javascript
// forumKanali: ChannelType.GuildForum tipinde bir kanal
const etiket = forumKanali.availableTags.find((t) => t.name === 'Hata');

const gonderi = await forumKanali.threads.create({
  name: 'Giriş yapamıyorum',
  message: { content: 'Sorunun ayrıntıları burada.' },
  appliedTags: etiket ? [etiket.id] : [],
});
python
# discord.py: ForumChannel.create_thread thread ve ilk mesajı birlikte döndürür
sonuc = await forum.create_thread(name='Giriş yapamıyorum', content='Sorunun ayrıntıları burada.')
print(sonuc.thread.id, sonuc.message.id)

Etiketlerle ilgili kurallar

  • Bir forum veya medya kanalında tanımlanabilecek etiket (available_tags) sayısı en fazla 20'dir.
  • Bir gönderiye uygulanabilecek etiket (applied_tags) sayısı en fazla 5'tir.
  • Etiket adı 0 ile 20 karakter arasındadır; bir etiketin emoji_id veya emoji_name alanlarından en fazla biri dolu olabilir.
  • moderated değeri true olan bir etiketi yalnızca MANAGE_THREADS iznine sahip üyeler ekleyip kaldırabilir.
  • Kanalda REQUIRE_TAG bayrağı açıksa gönderi oluştururken en az bir etiket vermeniz gerekir.

Var olan bir gönderinin etiketlerini değiştirmek için discord.js'te thread.setAppliedTags([...]) kullanılabilir. Forum kanalının topic alanı istemcide "Guidelines" bölümünde görünür. Sabitlenmiş (pinned) bir forum gönderisi otomatik arşivlenmez.

Arşivleme, kilitleme ve auto_archive_duration

Arşivleme, kilitleme ve auto_archive_duration: 1 saat, 1440, 4320, 10080

Her thread ya aktiftir ya da arşivlenmiştir. Belgeye göre sunucuların aktif thread sayısı sınırlıdır ve yalnızca aktif thread'ler üzerinde işlem yapılabilir: arşivlenmiş bir thread'de mesaj düzenlenemez, tepki eklenemez, uygulama komutu kullanılamaz ve thread'e katılınamaz. Arşivlenmiş bir thread'e mesaj göndermek, moderatör tarafından kilitlenmemişse onu otomatik olarak yeniden aktif hâle getirir.

auto_archive_duration (dakika)Karşılığıdiscord.js sabiti
601 saatThreadAutoArchiveDuration.OneHour
14401 günThreadAutoArchiveDuration.OneDay
43203 günThreadAutoArchiveDuration.ThreeDays
100807 günThreadAutoArchiveDuration.OneWeek

Burada ince bir nokta var: belgeye göre auto_archive_duration artık thread'in kanal listesinde ne kadar süre görüneceğini kontrol ediyor. Thread'ler hareketsizlikten sonra otomatik arşivlenir ve sunucu thread sınırına yaklaştıkça bu süre kısalabilir; çok yoğun kanallarda 7 güne ayarlı thread'ler daha erken arşivlenebilir. "Hareket" mesaj göndermek, arşivden çıkarmak veya arşivleme süresini değiştirmek olarak tanımlanır.

javascript
await thread.setArchived(true);   // arşivle
await thread.setArchived(false);  // arşivden çıkar
await thread.setLocked(true);     // kilitle (MANAGE_THREADS gerekir)

Kilitli bir thread'i yalnızca MANAGE_THREADS iznine sahip biri arşivden çıkarabilir. Kilitli thread'lerde bu izne sahip olmayan kullanıcılar ve botlar mesaj gönderemez, mesaj güncelleyemez ve başlık ya da etiket değiştiremez.

Gereken izinler

Thread'ler izinlerini genellikle üst kanaldan devralır. Bunun yanında thread'e özel üç izin biti vardır: CREATE_PUBLIC_THREADS, CREATE_PRIVATE_THREADS ve SEND_MESSAGES_IN_THREADS.

İşlemBelgedeki izin kuralı
Thread silmekMANAGE_THREADS
name, archived, auto_archive_duration değiştirmekMANAGE_THREADS veya thread'i açan kullanıcı olmak
rate_limit_per_user veya locked değiştirmekMANAGE_THREADS
Forum/medya kanalında gönderi açmakYalnızca SEND_MESSAGES (CREATE_PUBLIC_THREADS dikkate alınmaz)
Herkese açık arşivlenmiş thread'leri listelemekREAD_MESSAGE_HISTORY
Özel arşivlenmiş thread'leri listelemekREAD_MESSAGE_HISTORY ve MANAGE_THREADS

İzin hesaplaması ve rol sıralaması hakkında daha fazlası için Discord bot izinleri ve rol hiyerarşisi yazısına bakın.

Thread gateway olayları ve intent ayarları

Thread olaylarının neredeyse tamamı GUILDS intent'i ile gelir: THREAD_CREATE, THREAD_UPDATE, THREAD_DELETE, THREAD_LIST_SYNC, THREAD_MEMBER_UPDATE ve THREAD_MEMBERS_UPDATE. Diğer kullanıcıların thread'e eklenip çıkarılmasını takip etmek ise GUILD_MEMBERS intent'ini gerektirir; bu ayrıcalıklı (privileged) bir intent'tir. Thread içindeki mesajları okumak için de GUILD_MESSAGES ve içerik için Message Content intent'i gerekir. Intent konusunun tamamı Discord intent nedir yazısında.

Gateway olayıdiscord.js olayıNe zaman gelir
THREAD_CREATEthreadCreateThread oluşturulduğunda veya bot bir thread'e eklendiğinde
THREAD_UPDATEthreadUpdateAd, arşiv veya kilit durumu değiştiğinde
THREAD_DELETEthreadDeleteThread silindiğinde
THREAD_LIST_SYNCthreadListSyncBot thread içeren bir kanala erişim kazandığında
THREAD_MEMBERS_UPDATEthreadMembersUpdateThread'e üye eklendiğinde veya çıkarıldığında
javascript
const { Client, Events, GatewayIntentBits } = require('discord.js');

const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.on(Events.ThreadCreate, async (thread, newlyCreated) => {
  if (!newlyCreated) return; // bot sadece eklendiyse atla
  if (thread.joinable) await thread.join();
  await thread.send('Merhaba! Gönderiniz alındı.');
});

client.login(process.env.DISCORD_TOKEN);

Webhook ile bir thread'e mesaj göndermek de mümkündür: webhook isteğine thread_id sorgu parametresi eklenir, discord.js'te ise webhook.send({ threadId }) kullanılır. Webhook temelleri için Discord webhook ve bot entegrasyonu yazısına göz atabilirsiniz.

Sık Sorulan Sorular

Botum thread'e neden mesaj gönderemiyor?

En sık neden SEND_MESSAGES_IN_THREADS izninin eksik olmasıdır; SEND_MESSAGES thread içinde işe yaramaz. Thread kilitliyse bot ayrıca MANAGE_THREADS iznine ihtiyaç duyar. Özel thread'lerde botun thread üyesi olması da gerekir.

Mesajdan özel thread açabilir miyim?

Hayır. Mesajdan başlatılan thread'ler herkese açıktır (veya duyuru kanalında duyuru thread'idir). Özel thread'ler yalnızca mesaj olmadan ve yalnızca GUILD_TEXT kanallarda açılabilir.

Thread ne zaman otomatik arşivlenir?

Hareketsizlikten sonra. Seçebileceğiniz süreler 60, 1440, 4320 ve 10080 dakikadır. Sunucu aktif thread sınırına yaklaşırsa bu süre kısalabilir. Sabitlenmiş forum gönderileri otomatik arşivlenmez.

Forum gönderisine kaç etiket ekleyebilirim?

Bir gönderiye en fazla 5 etiket uygulanabilir; kanal başına tanımlanabilecek etiket sayısı ise en fazla 20'dir.

Thread oluşturmak için hangi intent gerekir?

Thread oluşturmak bir REST isteğidir ve intent gerektirmez. Thread olaylarını dinlemek için GUILDS intent'i yeterlidir; başka kullanıcıların thread üyelik değişikliklerini almak için GUILD_MEMBERS gerekir.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Bot izinleri ve rol hiyerarşisi · Discord intent nedir · Slash komut oluşturma · AutoMod ve moderasyon botu · Embed mesaj oluşturma · Discord webhook ve bot entegrasyonu