aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Discord Botları

Discord Bot İstatistik Paneli: Sunucu Sayısı ve Metrikler

Bir Discord bot istatistik paneli, botunun kaç sunucuda olduğunu, kaç kullanıcıya hizmet verdiğini ve hangi komutların en çok çalıştırıldığını tek bakışta görmeni sağlar. Bu metrikler hem botun büyümesini takip etmek hem de hangi özelliklerin gerçekten kullanıldığını anlamak için paha biçilmezdir. Bu yazıda discord.js ile sunucu sayısı başta olmak üzere kullanım metriklerini nasıl topladığını, sakladığını ve canlı bir panelde nasıl gösterdiğini adım adım anlatıyorum.

Hangi metrikleri toplamalısın?

Her sayıyı toplamak yerine kararlarına yön verecek olanlara odaklan. Çoğu bot için şu çekirdek metrikler yeterlidir:

  • Sunucu (guild) sayısı — botun bulunduğu toplam sunucu adedi. Büyümenin en doğrudan göstergesi.
  • Toplam kullanıcı sayısı — eriştiğin tahmini kitle (sunucu üye sayılarının toplamı).
  • Komut kullanımı — hangi slash komutunun kaç kez çalıştırıldığı.
  • Aktif sunucular — son 24 saatte en az bir komut çalıştırılan sunucular.
  • Shard durumu — bot büyüdüğünde her shard'ın gecikmesi (latency) ve uptime değeri.

Gizliliğe dikkat et: mesaj içeriği gibi hassas verileri saklama. İstatistik için sayılar yeterlidir, içerik gerekmez.

Sunucu sayısını anlık okumak

En temel metrik olan sunucu sayısı, discord.js'te doğrudan client.guilds.cache üzerinden gelir. Bot hazır olduğunda bunu okuyabilir, ayrıca botun katıldığı ve ayrıldığı anlarda güncelleyebilirsin:

const { Client, GatewayIntentBits, Events } = require('discord.js');

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

client.once(Events.ClientReady, (c) => {
  const serverCount = c.guilds.cache.size;
  const userCount = c.guilds.cache.reduce(
    (acc, g) => acc + g.memberCount, 0
  );
  console.log(`${c.user.tag} ${serverCount} sunucuda, ~${userCount} kullanıcı`);
});

client.on(Events.GuildCreate, (guild) => {
  console.log(`Yeni sunucu: ${guild.name} (${guild.memberCount})`);
});

client.on(Events.GuildDelete, (guild) => {
  console.log(`Ayrıldı: ${guild.name}`);
});

client.login(process.env.DISCORD_TOKEN);

memberCount alanı, ek bir intent veya üye listesini çekmek gerekmeden sunucunun toplam üye sayısını verir; bu yüzden kullanıcı tahmini için ide-aldır ve hızlıdır.

Komut kullanımını kaydetme

Hangi komutların değerli olduğunu anlamak için her çalıştırmayı kalıcı bir yere yazman gerekir. Slash komutu işleyicinde basit bir sayaç tutabilirsin. Aşağıdaki örnekte her komut çağrısını bir veritabanına atıyoruz:

client.on(Events.InteractionCreate, async (interaction) => {
  if (!interaction.isChatInputCommand()) return;

  // Komutu çalıştır...
  const command = commands.get(interaction.commandName);
  if (command) await command.execute(interaction);

  // Metriği kaydet (engelleme yapmadan)
  recordUsage(interaction.commandName, interaction.guildId)
    .catch(console.error);
});

Metrik yazma işlemi komutun cevabını yavaşlatmamalı. Bu yüzden await kullanmadan, hata yakalayarak ayrı bir fonksiyona devrediyoruz. Veriyi saklamak için küçük botlarda SQLite, büyüyen botlarda PostgreSQL ya da hızlı sayaçlar için Redis mantıklı seçimlerdir.

Verileri saklamak: basit bir şema

İstatistik için iki tabloluk sade bir yapı çoğu zaman yeter. Biri zaman içindeki anlık görüntüler (snapshot), diğeri komut sayaçları için:

CREATE TABLE stat_snapshots (
  id          INTEGER PRIMARY KEY,
  server_count INTEGER NOT NULL,
  user_count   INTEGER NOT NULL,
  recorded_at  TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE TABLE command_usage (
  command   TEXT NOT NULL,
  guild_id  TEXT,
  used_at   TEXT NOT NULL DEFAULT (datetime('now'))
);

Snapshot tablosuna her saat başı veya günde bir satır eklemek, sunucu sayısının zaman içindeki grafiğini çizmeni sağlar. Bunu basit bir aralıklı görevle (interval) yapabilirsin:

const ONE_HOUR = 60 * 60 * 1000;

setInterval(() => {
  const servers = client.guilds.cache.size;
  const users = client.guilds.cache.reduce(
    (a, g) => a + g.memberCount, 0
  );
  db.run(
    'INSERT INTO stat_snapshots (server_count, user_count) VALUES (?, ?)',
    [servers, users]
  );
}, ONE_HOUR);

Paneli yayınlamak: küçük bir API ve arayüz

Verileri topladıktan sonra bunları bir panelde göstermek için minik bir HTTP sunucusu yeterlidir. Express ile JSON döndüren bir uç nokta açıp, önyüzde basit kartlar olarak çizebilirsin:

const express = require('express');
const app = express();

app.get('/api/stats', (req, res) => {
  res.json({
    servers: client.guilds.cache.size,
    users: client.guilds.cache.reduce((a, g) => a + g.memberCount, 0),
    uptime: Math.floor(client.uptime / 1000),
    ping: client.ws.ping,
  });
});

app.listen(3000);

Önyüzde bu uç noktayı birkaç saniyede bir fetch ile çekip sayıları güncelleyerek canlı bir his verebilirsin. Geçmiş grafik için stat_snapshots verisini bir çizgi grafiği kütüphanesine (örneğin Chart.js) bağlaman yeterli. Paneli herkese açacaksan, yazma uçlarını koruyup yalnızca okunabilir istatistikleri sun.

Shard'lı botlarda toplam saymak

Botun büyüyüp sharding'e geçtiğinde her shard yalnızca kendi sunucularını görür. Doğru toplam sunucu sayısı için tüm shard'lardan veri toplaman gerekir. discord.js'in ShardingManager sınıfı bunu kolaylaştırır:

const total = await client.shard.fetchClientValues('guilds.cache.size');
const serverCount = total.reduce((acc, n) => acc + n, 0);

Bu çağrı her shard'a sorar ve bir dizi döndürür; sen de toplarsın. Kullanıcı sayısı gibi hesaplanan değerler için broadcastEval kullanırsın. Sharding'i erkenden kurmana gerek yok; ancak panelini baştan toplama mantığıyla tasarlamak, ileride taşımayı çok kolaylaştırır.

Sık Sorulan Sorular

Sunucu sayısını botun durumunda (status) gösterebilir miyim?

Evet. client.user.setActivity ile "X sunucuda" gibi bir metin gösterebilirsin. Bunu sunucu katılma/ayrılma olaylarında veya birkaç dakikalık aralıklarla güncelle; çok sık güncelleme rate limit'e takılabilir.

Kullanıcı sayısı tam doğru mu?

memberCount sunucunun bildirdiği toplam üyeyi verir, ancak aynı kişi birden çok sunucunda olabilir; yani bu bir "tekil kullanıcı" değil "erişim" tahminidir. Tekil kullanıcı saymak çok daha maliyetlidir ve genelde gerekmez.

Hangi veritabanını seçmeliyim?

Birkaç yüz sunucuya kadar SQLite fazlasıyla yeter ve sıfır kurulum ister. Büyüdükçe PostgreSQL'e, çok yüksek frekanslı sayaçlar içinse Redis'e geçebilirsin.

Botun için profesyonel bir istatistik paneli mi istiyorsun? Sunucu sayısından komut analizine kadar metrik altyapısını kurar, canlı paneli tasarlarım. Benimle iletişime geç ve botunu veriyle yönetmeye başla.

Bu kategorideki tüm yazılar →

Devamı için