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'ler de bir kanal nesnesidir ve kendi type değerleri vardır. Forum ve medya kanalları da thread barındıran kanal tipleridir.
| Tip | Değer | Açıklama |
|---|---|---|
ANNOUNCEMENT_THREAD | 10 | Duyuru (GUILD_ANNOUNCEMENT) kanalındaki thread |
PUBLIC_THREAD | 11 | GUILD_TEXT veya GUILD_FORUM kanalındaki herkese açık thread |
PRIVATE_THREAD | 12 | Yalnızca GUILD_TEXT kanalında; sadece davet edilenler ve MANAGE_THREADS iznine sahip olanlar görür |
GUILD_FORUM | 15 | Yalnızca thread içerebilen kanal |
GUILD_MEDIA | 16 | Forum 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.
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.
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:
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ı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.
// 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] : [],
});# 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_idveyaemoji_namealanlarından en fazla biri dolu olabilir. moderateddeğeri true olan bir etiketi yalnızcaMANAGE_THREADSiznine sahip üyeler ekleyip kaldırabilir.- Kanalda
REQUIRE_TAGbayrağı 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

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 |
|---|---|---|
| 60 | 1 saat | ThreadAutoArchiveDuration.OneHour |
| 1440 | 1 gün | ThreadAutoArchiveDuration.OneDay |
| 4320 | 3 gün | ThreadAutoArchiveDuration.ThreeDays |
| 10080 | 7 gün | ThreadAutoArchiveDuration.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.
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.
| İşlem | Belgedeki izin kuralı |
|---|---|
| Thread silmek | MANAGE_THREADS |
name, archived, auto_archive_duration değiştirmek | MANAGE_THREADS veya thread'i açan kullanıcı olmak |
rate_limit_per_user veya locked değiştirmek | MANAGE_THREADS |
| Forum/medya kanalında gönderi açmak | Yalnızca SEND_MESSAGES (CREATE_PUBLIC_THREADS dikkate alınmaz) |
| Herkese açık arşivlenmiş thread'leri listelemek | READ_MESSAGE_HISTORY |
| Özel arşivlenmiş thread'leri listelemek | READ_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_CREATE | threadCreate | Thread oluşturulduğunda veya bot bir thread'e eklendiğinde |
| THREAD_UPDATE | threadUpdate | Ad, arşiv veya kilit durumu değiştiğinde |
| THREAD_DELETE | threadDelete | Thread silindiğinde |
| THREAD_LIST_SYNC | threadListSync | Bot thread içeren bir kanala erişim kazandığında |
| THREAD_MEMBERS_UPDATE | threadMembersUpdate | Thread'e üye eklendiğinde veya çıkarıldığında |
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