Skip to content
Arda edited this page Jun 12, 2026 · 1 revision
ByteBunny Banner ByteBunny — Core Wiki

🧩 Core Sistemine Yeni Komut Ekleme Rehberi

Bu sayfa, ByteBunny'nin Core sistemine nasıl yeni bir komut ekleyeceğini ve mevcut komutları nasıl özelleştirebileceğini adım adım anlatır. Mimari değişmediği sürece bu rehber geçerliliğini korur, bu yüzden komut bazlı ayrıca bir dokümana ihtiyaç yoktur.


📐 Genel Mantık

ByteBunny'de bir komut iki parçadan oluşur:

  1. Go dosyası (Bot/Core/Commands/*.go) — komutun mantığını, çalışma şeklini içerir.
  2. YAML dosyası (Bot/Modules/Locales/<dil>/Commands/...) — komutun ismi, açıklaması, mesajları, ikonları ve ayarlarını içerir. Bu ayrım sayesinde:
  • Metinler ve ayarlar kodu değiştirmeden düzenlenebilir.
  • Yeni diller eklemek kolaylaşır.
  • Komutlar enabled, cooldown, category gibi ayarlarla kontrol edilebilir.

⚠️ Kural: Komutun adı ile YAML dosyasının adı aynı olmalıdır. Aksi halde help, listcommands gibi komutlar tarafından bulunamaz.


📁 Önce: YAML Dosyasını Oluştur

Bot/Modules/Locales/tr/Command.example.yaml dosyasını kopyalayarak başla. Bu dosya tüm alanları örnekleriyle açıklar.

Yeni dosyayı şuraya koy:

Bot/Modules/Locales/tr/Commands/<kategori>/<komut_adi>.yaml

Örnek (bir "ping" komutu için):

Bot/Modules/Locales/tr/Commands/General/ping.yaml

Temel alanlar

name: "ping"
description: "Botun gecikme süresini gösterir."
usage: "ping"
 
titles:
  success: "🏓 Pong!"
  error: "❌ Hata"
 
messages:
  success: "Gecikme: {latency}ms"
 
options:
  enabled: true
  category: "general"
  ephemeral: false
  prefix: true
  cooldown: 5.0

Önemli alanlar:

Alan Açıklama
name Komut adı, dosya adıyla aynı olmalı
description Slash komutlarda Discord'da görünen açıklama
titles / messages Embed başlık ve içerikleri, {placeholder} destekler
options.enabled false yapılırsa komut tamamen devre dışı kalır
options.category listcommands çıktısında hangi kategoride görüneceği
options.cooldown Saniye cinsinden bekleme süresi
options.slash Slash komut argümanları (varsa)

🛠️ Sonra: Go Dosyasını Oluştur

Bot/Core/Commands/ altına yeni bir .go dosyası oluştur (örn. Ping.go). Mevcut komutlar (Help.go, ListCommands.go) için aynı iskeleti takip eder.

Minimum iskelet

package commands
 
import (
	config "ByteBunny/Bot/Config"
	events "ByteBunny/Bot/Core/Events"
	library "ByteBunny/Bot/Core/Library"
	utils "ByteBunny/Bot/Core/Utils"
	"path/filepath"
	"sync"
 
	"github.com/bwmarrin/discordgo"
)
 
type PingCommandSlash struct{ cmd *library.CommandLib }
type PingCommandPrefix struct{ cmd *library.CommandLib }
 
var (
	slashOncePing  sync.Once
	prefixOncePing sync.Once
)
 
func init() {
	events.RegisterSlashCacheCommand(&PingCommandSlash{})
	events.RegisterPrefixCacheCommand(&PingCommandPrefix{})
}
 
func loadPingLib() (*library.CommandLib, error) {
	var lib library.CommandLib
	path := filepath.Join("Modules", "Locales", config.AppConfig.Bot.Lang, "Commands", "General", "ping.yaml")
	ok, err := utils.ReadYaml(path, &lib)
	if err != nil || !ok {
		return nil, err
	}
	return &lib, nil
}
 
// ... checkLibrary(), LoadCommandLib(), Name(), Description(),
//     Options(), GetGeneralFormatKeys(), Execute() metotları

Uyulması gereken arayüzler

Slash komutları şu metotları içermeli:

  • Name() string

  • Description() string

  • Options() []*discordgo.ApplicationCommandOption

  • Execute(s *discordgo.Session, i *discordgo.InteractionCreate)

  • LoadCommandLib() error

  • GetGeneralFormatKeys(...) map[string]string Prefix komutları şu metotları içermeli:

  • Name() string

  • Execute(s *discordgo.Session, m *discordgo.MessageCreate, args []string)

  • LoadCommandLib() error

  • GetGeneralFormatKeys(...) map[string]string

💡 İpucu: Bot/Core/Commands/Help.go ve ListCommands.go dosyaları, bu arayüzlerin gerçek hayatta nasıl uygulandığını gösteren en iyi referanslardır. Yeni bir komut yazarken bu dosyaları kopyalayıp düzenlemek en hızlı yoldur.


🎨 Embed Oluşturma

Mesaj/embed göndermek için utils paketindeki yardımcı fonksiyonları kullan:

  • utils.BuildCommandEmbedFast(...) — YAML'daki titles/messages/icons alanlarından otomatik embed oluşturur.
  • utils.SendEmbedToChannel(...) — Slash komut yanıtı gönderir.
  • utils.SendEmbedReplyToChannel(...) — Prefix komut yanıtı gönderir. Renkler için library.Colors (bkz. Bot/Config/Colors.yaml) kullanılır — library.Colors.Status.Info, .Success, .Error gibi.

🔄 Mevcut Bir Komutu Özelleştirme

Kod değiştirmeden yapılabilecekler sadece YAML üzerinden:

  • Mesaj metinlerini değiştir (messages, titles, footers)
  • Komutu kapat/aç (options.enabled)
  • Kategori değiştir (options.category)
  • Cooldown ayarla (options.cooldown)
  • İkon değiştir (icons) Davranışı (mantığı) değiştirmek için ilgili .go dosyasındaki Execute() fonksiyonu düzenlenir.

✅ Kontrol Listesi

Yeni bir komut eklerken:

  • YAML dosyası oluşturuldu, name alanı dosya adıyla eşleşiyor
  • YAML doğru kategori klasörüne kondu (Commands/<Kategori>/)
  • Go dosyası Bot/Core/Commands/ altına eklendi
  • init() içinde RegisterSlashCacheCommand / RegisterPrefixCacheCommand çağrıldı
  • options.enabled: true olarak ayarlandı
  • category alanı dolduruldu (listcommands'da görünmesi için)
  • Bot derlenip (go run ./Bot) komut test edildi

🤝 Katkı Sağlarken

Yeni bir komut/modül PR'ı açarken:

  1. Mevcut komutların isimlendirme ve dosya yapısı desenini takip et.
  2. Mesajları Common.yaml'daki ortak mesajlarla tekrar etmeden, mümkünse fallback'lerden yararlan.
  3. Hata mesajlarının err_ öneki kuralına uyduğundan emin ol.
  4. Kodun Help.go / ListCommands.go ile aynı stil ve yorum düzenini koru.

Herhangi bir noktada takılırsan, GitHub üzerinden bir **Issue** açmaktan çekinme — birlikte çözeriz! 🐰