Bir Discord sunucusu büyüdükçe spam, küfür, toplu etiketleme ve kural ihlalleri elle takip edilemez hâle gelir. Discord bu yükün büyük kısmını AutoMod (Auto Moderation) ile sunucu tarafında çözer: kurallar Discord'un kendisinde çalışır, mesaj daha kanala düşmeden engellenebilir. Botunuz bu kuralları API üzerinden oluşturabilir, tetiklendiklerinde haber alabilir ve kalan işleri (timeout, kick, ban, kayıt tutma) üstlenebilir.
Bu rehber pratik bir moderasyon botunun yapı taşlarını anlatıyor: AutoMod tetikleyici ve aksiyon tipleri ile sınırları, communication_disabled_until ile timeout, X-Audit-Log-Reason başlığıyla gerekçeli kick ve ban, denetim kaydını (audit log) okumak ve her adımın gerektirdiği izinler. Tüm rakamlar Discord'un resmî belgelerinden alınmıştır.
AutoMod kuralı nelerden oluşur?

Bir AutoMod kuralı; bir olay tipi (event_type), bir tetikleyici tipi (trigger_type), tetikleyici ayarları (trigger_metadata), bir veya daha fazla aksiyon (actions) ve muafiyet listelerinden oluşur. Muaf tutulabilecek rol sayısı en fazla 20, kanal sayısı en fazla 50'dir. Yeni oluşturulan kural, enabled gönderilmezse varsayılan olarak kapalıdır.
Olay tipleri
| Olay tipi | Değer | Ne zaman kontrol edilir |
|---|---|---|
MESSAGE_SEND | 1 | Üye mesaj gönderdiğinde veya düzenlediğinde |
MEMBER_UPDATE | 2 | Üye profilini düzenlediğinde |
Tetikleyici tipleri ve sunucu başına sınırlar
| Tetikleyici | Değer | Ne yakalar | Sunucu başına en fazla |
|---|---|---|---|
KEYWORD | 1 | Sizin tanımladığınız anahtar kelimeler | 6 |
SPAM | 3 | Genel spam içerik | 1 |
KEYWORD_PRESET | 4 | Discord'un hazır kelime setleri | 1 |
MENTION_SPAM | 5 | İzin verilenden fazla benzersiz etiket | 1 |
MEMBER_PROFILE | 6 | Üye profilinde tanımlı kelimeler | 1 |
Hazır kelime setleri (presets) üç tanedir: PROFANITY (1, küfür), SEXUAL_CONTENT (2, cinsel içerik) ve SLURS (3, hakaret ve nefret söylemi).
Tetikleyici ayarlarının sınırları
| Alan | Tetikleyici | En fazla öğe | Öğe başına karakter |
|---|---|---|---|
keyword_filter | KEYWORD, MEMBER_PROFILE | 1000 | 60 |
regex_patterns | KEYWORD, MEMBER_PROFILE | 10 | 260 |
allow_list | KEYWORD, MEMBER_PROFILE | 100 | 60 |
allow_list | KEYWORD_PRESET | 1000 | 60 |
mention_total_limit | MENTION_SPAM | En fazla 50 (sayı) | - |
Regex için şu an yalnızca Rust sözdizimi desteklenir. Anahtar kelimeler büyük/küçük harfe duyarsızdır ve * joker karakteriyle eşleşme biçimi seçilir: kedi* kelimenin başını, *kedi sonunu, *kedi* herhangi bir yerini yakalar; yıldızsız kedi yalnızca tam kelimeyle eşleşir.
AutoMod aksiyonları
| Aksiyon | Değer | Ne yapar | Metadata |
|---|---|---|---|
BLOCK_MESSAGE | 1 | Mesajı engeller, gönderilmesini önler | custom_message (en fazla 150 karakter, isteğe bağlı) |
SEND_ALERT_MESSAGE | 2 | İçeriği belirtilen kanala kaydeder | channel_id |
TIMEOUT | 3 | Kullanıcıyı belirli süre susturur | duration_seconds (en fazla 2419200 saniye, yani 4 hafta) |
BLOCK_MEMBER_INTERACTION | 4 | Üyenin metin, ses ve diğer etkileşimleri kullanmasını engeller | - |
discord.js ile AutoMod kuralı oluşturmak

Aşağıdaki örnek, tanımlı kelimeleri içeren mesajı engelleyen, içeriği bir log kanalına düşüren ve kullanıcıyı 60 saniye susturan bir kural kurar. discord.js'te kurallar guild.autoModerationRules yöneticisiyle oluşturulur; enum değerleri discord.js üzerinden içe aktarılır.
const {
AutoModerationRuleEventType,
AutoModerationRuleTriggerType,
AutoModerationActionType,
} = require('discord.js');
const kural = await guild.autoModerationRules.create({
name: 'Yasaklı kelimeler',
eventType: AutoModerationRuleEventType.MessageSend,
triggerType: AutoModerationRuleTriggerType.Keyword,
triggerMetadata: {
keywordFilter: ['reklam*', '*bedava nitro*'],
},
actions: [
{ type: AutoModerationActionType.BlockMessage, metadata: { customMessage: 'Bu mesaj sunucu kurallarına aykırı.' } },
{ type: AutoModerationActionType.SendAlertMessage, metadata: { channel: logKanalId } },
{ type: AutoModerationActionType.Timeout, metadata: { durationSeconds: 60 } },
],
enabled: true,
exemptRoles: [moderatorRolId],
reason: 'Moderasyon botu kurulumu',
});Kural tetiklendiğinde Discord AUTO_MODERATION_ACTION_EXECUTION olayını gönderir. Bunu almak için AUTO_MODERATION_EXECUTION intent'i gerekir; kural oluşturma, güncelleme ve silme olayları için AUTO_MODERATION_CONFIGURATION intent'i kullanılır. Olaydaki content ve matched_content alanlarının dolu gelmesi için ayrıca Message Content intent'i gerekir.
const { Client, Events, GatewayIntentBits } = require('discord.js');
const client = new Client({
intents: [GatewayIntentBits.Guilds, GatewayIntentBits.AutoModerationExecution],
});
client.on(Events.AutoModerationActionExecution, (exec) => {
console.log(`Kural ${exec.ruleId} tetiklendi, kullanıcı: ${exec.userId}, kelime: ${exec.matchedKeyword}`);
});
client.login(process.env.DISCORD_TOKEN);Timeout (susturma) uygulamak
Timeout, üyenin communication_disabled_until alanına gelecekteki bir zaman yazılarak uygulanır. Belgeye göre bu tarih en fazla 28 gün sonrası olabilir; null göndermek timeout'u kaldırır. Bu işlem MODERATE_MEMBERS izni (istemcide "Timeout Members") gerektirir. Hedef kullanıcı ADMINISTRATOR iznine sahipse veya sunucu sahibiyse Discord 403 hatası döndürür. Timeout uygulanan üyeler, VIEW_CHANNEL ve READ_MESSAGE_HISTORY dışındaki tüm izinlerini geçici olarak kaybeder.
// discord.js: 10 dakika timeout
const { MessageFlags } = require('discord.js');
const uye = await interaction.guild.members.fetch(hedefId);
if (!uye.moderatable) {
return interaction.reply({ content: 'Bu üyeye timeout uygulayamam.', flags: MessageFlags.Ephemeral });
}
await uye.timeout(10 * 60 * 1000, 'Spam');
// kaldırmak için: await uye.timeout(null, 'Süre doldu');# discord.py: 10 dakika timeout
from datetime import timedelta
await member.edit(timed_out_until=discord.utils.utcnow() + timedelta(minutes=10), reason='Spam')Kick ve ban: gerekçeyi audit log'a yazmak
Kick (sunucudan atma) KICK_MEMBERS, ban BAN_MEMBERS izni gerektirir. Ban sırasında kullanıcının son mesajlarını silmek için delete_message_seconds kullanılır; değer 0 ile 604800 (7 gün) arasındadır. Eski delete_message_days parametresi belgede kullanımdan kalkmış (deprecated) olarak işaretlidir. Toplu ban uç noktası tek istekte en fazla 200 kullanıcıyı yasaklar ve hem BAN_MEMBERS hem MANAGE_GUILD ister.
Bu uç noktaların hepsi X-Audit-Log-Reason başlığını destekler. Başlığa yazdığınız metin denetim kaydındaki reason alanına kaydedilir; 1 ile 512 arası URL kodlanmış (URL-encoded) UTF-8 karakter kabul edilir ve hem istemcide hem API'de görünür. discord.js ve discord.py'de bu başlığı elle yazmazsınız; metotlara verdiğiniz reason parametresi başlığa çevrilir.
// discord.js
await uye.kick('Kural 3 ihlali');
await interaction.guild.members.ban(hedefId, {
reason: 'Tekrarlanan spam',
deleteMessageSeconds: 24 * 60 * 60, // son 1 günün mesajları
});# discord.py
await member.kick(reason='Kural 3 ihlali')
await member.ban(reason='Tekrarlanan spam', delete_message_seconds=86400)# Ham API örneği (Türkçe karakterli gerekçe URL kodlanmalıdır)
curl -X PUT "https://discord.com/api/v10/guilds/$GUILD_ID/bans/$USER_ID" \
-H "Authorization: Bot $DISCORD_TOKEN" \
-H "Content-Type: application/json" \
-H "X-Audit-Log-Reason: Tekrarlanan%20spam" \
-d '{"delete_message_seconds": 86400}'Audit log (denetim kaydı) okumak

Sunucuda yapılan yönetimsel işlemler denetim kaydına yazılır. Okumak için VIEW_AUDIT_LOG izni gerekir ve belgeye göre tüm kayıtlar 45 gün saklanır. GET /guilds/{guild.id}/audit-logs uç noktası tek seferde 1 ile 100 arası kayıt döndürür (varsayılan 50) ve kullanıcıya, işlem tipine ya da ID aralığına göre filtrelenebilir. Gerçek zamanlı takip için GUILD_AUDIT_LOG_ENTRY_CREATE olayı kullanılır; bu olay GUILD_MODERATION intent'i ile gelir (aynı intent ban ekleme ve kaldırma olaylarını da kapsar).
| İşlem tipi | Değer | Anlamı |
|---|---|---|
MEMBER_KICK | 20 | Üye sunucudan atıldı |
MEMBER_BAN_ADD | 22 | Üye yasaklandı |
MEMBER_UPDATE | 24 | Üye güncellendi (timeout dahil üye değişiklikleri) |
AUTO_MODERATION_BLOCK_MESSAGE | 143 | Mesaj AutoMod tarafından engellendi |
const { AuditLogEvent, Events, GatewayIntentBits } = require('discord.js');
// Client oluştururken: intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildModeration]
client.on(Events.GuildAuditLogEntryCreate, async (entry, guild) => {
if (entry.action !== AuditLogEvent.MemberBanAdd) return;
const yapan = await client.users.fetch(entry.executorId);
console.log(`${guild.name}: ${entry.targetId} yasaklandı, yapan ${yapan.tag}, gerekçe: ${entry.reason ?? '-'}`);
});
// Geçmişe dönük okuma
const kayitlar = await guild.fetchAuditLogs({ type: AuditLogEvent.MemberKick, limit: 5 });
kayitlar.entries.forEach((e) => console.log(e.executorId, e.targetId, e.reason));# discord.py: son 5 ban kaydı
async for entry in guild.audit_logs(limit=5, action=discord.AuditLogAction.ban):
print(entry.user, entry.target, entry.reason)Bir detay: belgeye göre bazı audit log işlemleri birleştirilebilir. Aynı kullanıcının kısa sürede yaptığı ardışık istekler yeni kayıt açmak yerine ilk kaydı günceller, yalnızca ilk isteğin gerekçesi saklanır ve bu güncellemeler için yeni gateway olayı gönderilmez.
Moderasyon komutlarını yalnızca yetkililere göstermek
Slash komutlarınızda default_member_permissions kullanarak komutu varsayılan olarak yalnızca ilgili izne sahip üyelere gösterebilirsiniz. discord.js'te bu setDefaultMemberPermissions(PermissionFlagsBits.BanMembers), discord.py'de @app_commands.default_permissions(ban_members=True) ile yapılır. Moderasyon komutlarının DM'de anlamı olmadığı için discord.js rehberindeki gibi setContexts(InteractionContextType.Guild) ile yalnızca sunucuda kullanılabilir yapın. Yine de komutun içinde hedef üyenin kickable, bannable veya moderatable olup olmadığını kontrol etmeyi ihmal etmeyin. Komut kayıt süreci için slash komut oluşturma rehberine bakabilirsiniz.
Hangi izin ve intent nerede gerekli? (özet)
| İş | Bot izni | Intent |
|---|---|---|
| AutoMod kurallarını yönetmek | MANAGE_GUILD | Değişiklik olayları için AUTO_MODERATION_CONFIGURATION |
| AutoMod tetiklenmesini dinlemek | - | AUTO_MODERATION_EXECUTION (+ içerik için Message Content) |
| AutoMod ile timeout aksiyonu | MANAGE_GUILD + MODERATE_MEMBERS | - |
| Timeout uygulamak | MODERATE_MEMBERS | - |
| Kick | KICK_MEMBERS | - |
| Ban / ban kaldırma | BAN_MEMBERS | Ban olayları için GUILD_MODERATION |
| Toplu ban | BAN_MEMBERS + MANAGE_GUILD | - |
| Audit log okumak | VIEW_AUDIT_LOG | Canlı olay için GUILD_MODERATION |
Sık Sorulan Sorular
AutoMod varken ayrıca moderasyon botuna gerek var mı?
AutoMod kelime, spam ve toplu etiket gibi içerik kurallarını Discord tarafında çalıştırır. Uyarı sayacı tutmak, kademeli ceza vermek, kayıtları kendi veritabanınıza yazmak veya özel komutlar sunmak için yine bir bota ihtiyaç duyarsınız. En iyi sonuç ikisini birlikte kullanmaktır.
Timeout en fazla ne kadar olabilir?
Üye düzenleme uç noktasıyla verilen timeout en fazla 28 gün sonrasına kadar ayarlanabilir. AutoMod TIMEOUT aksiyonunda süre en fazla 2419200 saniyedir (4 hafta).
Sunucu sahibine veya yöneticiye timeout verebilir miyim?
Hayır. ADMINISTRATOR iznine sahip kullanıcılara veya sunucu sahibine timeout uygulamaya çalışırsanız Discord 403 hatası döndürür.
Audit log kayıtları ne kadar süre saklanır?
Discord belgesine göre tüm audit log kayıtları 45 gün saklanır. Daha uzun süreli kayıt istiyorsanız GUILD_AUDIT_LOG_ENTRY_CREATE olayını dinleyip kendi veritabanınıza yazın; küçük botlar için SQLite yeterli olur.
Bir sunucuda kaç tane anahtar kelime kuralı olabilir?
KEYWORD tipinde en fazla 6 kural oluşturabilirsiniz. SPAM, KEYWORD_PRESET, MENTION_SPAM ve MEMBER_PROFILE tiplerinden ise sunucu başına birer tane olabilir.
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 · Discord API hata kodları · Thread ve forum kanalı botu · SQLite nedir