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?

AutoMod kuralı nelerden oluşur? Olay tipleri, Tetikleyici tipleri ve sunucu başına sınırlar, Tetikleyici ayarlarının sınırları

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 tipiDeğerNe zaman kontrol edilir
MESSAGE_SEND1Üye mesaj gönderdiğinde veya düzenlediğinde
MEMBER_UPDATE2Üye profilini düzenlediğinde

Tetikleyici tipleri ve sunucu başına sınırlar

TetikleyiciDeğerNe yakalarSunucu başına en fazla
KEYWORD1Sizin tanımladığınız anahtar kelimeler6
SPAM3Genel spam içerik1
KEYWORD_PRESET4Discord'un hazır kelime setleri1
MENTION_SPAM5İzin verilenden fazla benzersiz etiket1
MEMBER_PROFILE6Üye profilinde tanımlı kelimeler1

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ı

AlanTetikleyiciEn fazla öğeÖğe başına karakter
keyword_filterKEYWORD, MEMBER_PROFILE100060
regex_patternsKEYWORD, MEMBER_PROFILE10260
allow_listKEYWORD, MEMBER_PROFILE10060
allow_listKEYWORD_PRESET100060
mention_total_limitMENTION_SPAMEn 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ı

AksiyonDeğerNe yaparMetadata
BLOCK_MESSAGE1Mesajı engeller, gönderilmesini önlercustom_message (en fazla 150 karakter, isteğe bağlı)
SEND_ALERT_MESSAGE2İçeriği belirtilen kanala kaydederchannel_id
TIMEOUT3Kullanıcıyı belirli süre sustururduration_seconds (en fazla 2419200 saniye, yani 4 hafta)
BLOCK_MEMBER_INTERACTION4Üyenin metin, ses ve diğer etkileşimleri kullanmasını engeller-

discord.js ile AutoMod kuralı oluşturmak

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.

javascript
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.

javascript
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.

javascript
// 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');
python
# 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.

javascript
// 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ı
});
python
# discord.py
await member.kick(reason='Kural 3 ihlali')
await member.ban(reason='Tekrarlanan spam', delete_message_seconds=86400)
bash
# 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

Audit log (denetim kaydı) okumak: MEMBER_KICK, MEMBER_BAN_ADD, MEMBER_UPDATE, AUTO_MODERATION_BLOCK_MESSAGE

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 tipiDeğerAnlamı
MEMBER_KICK20Üye sunucudan atıldı
MEMBER_BAN_ADD22Üye yasaklandı
MEMBER_UPDATE24Üye güncellendi (timeout dahil üye değişiklikleri)
AUTO_MODERATION_BLOCK_MESSAGE143Mesaj AutoMod tarafından engellendi
javascript
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));
python
# 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 izniIntent
AutoMod kurallarını yönetmekMANAGE_GUILDDeğişiklik olayları için AUTO_MODERATION_CONFIGURATION
AutoMod tetiklenmesini dinlemek-AUTO_MODERATION_EXECUTION (+ içerik için Message Content)
AutoMod ile timeout aksiyonuMANAGE_GUILD + MODERATE_MEMBERS-
Timeout uygulamakMODERATE_MEMBERS-
KickKICK_MEMBERS-
Ban / ban kaldırmaBAN_MEMBERSBan olayları için GUILD_MODERATION
Toplu banBAN_MEMBERS + MANAGE_GUILD-
Audit log okumakVIEW_AUDIT_LOGCanlı 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