Skip to content

furkibuu/aiko.db

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

@furkibu/aiko.db

NPM Version Downloads License TypeScript

Node.js için geliştirilmiş, modern, hızlı ve reaktif bir JSON veritabanı. aikodb'nin manevi devamı olarak, daha güçlü ve esnek özelliklerle donatılmıştır.

✨ Öne Çıkan Özellikler

  • 🚀 Asenkron Yapı: Performans kaybı yaşamadan async/await ile tüm veritabanı işlemlerini gerçekleştirin.
  • ⚡ Dahili Önbellek (Caching): Sık erişilen veriler için dosya okuma/yazma işlemlerini en aza indirerek hızı en üst düzeye çıkarır.
  • 📡 Olay Yayıcı (Event Emitter): Veritabanında bir değişiklik olduğunda (set, delete vb.) anında haberdar olun!
  • 📦 Nokta Notasyonu Desteği: user.profile.name gibi iç içe geçmiş verilere kolayca erişin.
  • 🛡️ Varsayılan Değer Atama (ensure): Veri yoksa otomatik olarak varsayılan bir değer atayarak kodunuzu basitleştirin.
  • 🔍 Esnek Sorgulama & Filtreleme: find ile tek bir veri bulun veya filter ile bir koşula uyan tüm verileri getirin.
  • 🗂️ Gelişmiş Dizi Yönetimi: push() ile eleman ekleyin, pull() ile koşula göre eleman çıkarın.
  • 🔢 Matematiksel İşlemler: add() ve subtract() ile sayısal verileri atomik olarak artırın veya azaltın.
  • 💾 Tek Satırda Yedekleme: backup() metodu ile veritabanınızı kolayca yedekleyin.
  • 🤝 Sıfır Bağımlılık: Projenize gereksiz yük bindirmez.
  • TypeScript Desteği: Tamamen TypeScript ile yazılmıştır, bu sayede modern ve tip güvenli bir geliştirme deneyimi sunar.

💾 Kurulum

npm install @furkibu/aiko.db

⚡ Hızlı Başlangıç

//const {AikoDB} = require("@furkibu/aiko.db")
import { AikoDB } from '@furkibu/aiko.db';

const db = new AikoDB('server-data.json');

// --- Olayları Dinleme ---
// Veritabanında bir veri değiştiğinde anında tepki ver
db.on('set', (key, newValue) => {
  console.log(`[DEĞİŞİKLİK] Anahtar: '${key}' | Yeni Değer: ${JSON.stringify(newValue)}`);
});

// Bir veri silindiğinde
db.on('delete', (key) => {
  console.log(`[SİLME] Anahtar: '${key}' silindi.`);
});

// --- Asenkron Fonksiyon ---
async function main() {
  // `set` olayı tetiklenecek
  await db.set('config.prefix', '!'); 
  
  // `set` olayı tetiklenecek
  await db.set('users', [{ id: '1', name: 'Furkan', level: 99 }]);

  // `delete` olayı tetiklenecek
  await db.delete('config');
}

main();

/*
  KONSOL ÇIKTISI:
  [DEĞİŞİKLİK] Anahtar: 'config.prefix' | Yeni Değer: "!"
  [DEĞİŞİKLİK] Anahtar: 'users' | Yeni Değer: [{"id":"1","name":"Furkan","level":99}]
  [SİLME] Anahtar: 'config' silindi.
*/

📚 API Referansı

Temel İşlemler

  • .set(key, value): Bir anahtara değer atar. Nokta notasyonunu destekler. (set olayını tetikler)
  • .get(key): Bir anahtarın değerini döndürür.
  • .has(key): Bir anahtarın var olup olmadığını kontrol eder (true/false).
  • .delete(key): Bir anahtar-değer çiftini siler. (delete olayını tetikler)
  • .clear(): Veritabanındaki tüm verileri temizler. (clear olayını tetikler)

Sayı & Dizi İşlemleri

  • .add(key, amount): Sayısal bir değere ekleme yapar. (set olayını tetikler)
  • .subtract(key, amount): Sayısal bir değerden çıkarma yapar. (set olayını tetikler)
  • .push(key, ...values): Bir diziye bir veya daha fazla eleman ekler. (set olayını tetikler)
  • .pull(key, callback): Bir diziden, callback koşulunu sağlayan elemanları çıkarır. (set olayını tetikler)

Sorgulama & Veri Yönetimi

  • .all(): Veritabanındaki tüm veriyi bir JavaScript objesi olarak döndürür.
  • .size(): Veritabanındaki ana (top-level) anahtar sayısını döndürür.
  • .ensure(key, defaultValue): Bir anahtarın var olduğundan emin olur. Yoksa defaultValue atar. (set olayını tetikleyebilir)
  • .find(callback): Bir koşula uyan ilk veriyi bulur. Dizilerin içini de arar.
  • .filter(callback): Bir koşula uyan tüm verileri bir dizi olarak döndürür.

Yardımcı Programlar

  • .backup(filePath): Veritabanının belirtilen yola bir yedeğini oluşturur.

Olaylar (Events)

AikoDB, EventEmitter sınıfından miras alır. Bu sayede veritabanındaki değişiklikleri dinleyebilirsiniz.

  • .on('set', (key, newValue) => { ... }) Bir veri eklendiğinde veya güncellendiğinde tetiklenir. add, subtract, push, pull, ensure metotları da bu olayı tetikler.

  • .on('delete', (key) => { ... }) Bir veri silindiğinde tetiklenir.

  • .on('clear', () => { ... }) Veritabanı temizlendiğinde tetiklenir.

// Bir olayı sadece bir kez dinlemek için .once() kullanabilirsiniz
db.once('set', (key, value) => {
  console.log('İlk veri başarıyla ayarlandı!');
});

Discord Botunda

const { Client, GatewayIntentBits } = require('discord.js');
const { AikoDB } = require('@furkibu/aiko.db'); 

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


const db = new AikoDB('aikodb.json');


// Veritabanında bir veri değiştiğinde veya eklendiğinde bu olay tetiklenir
db.on('set', (key, newValue) => {
    console.log(`[VERİTABANI] Değişiklik algılandı: ${key} -> ${JSON.stringify(newValue)}`);
    
    // Eğer değişen anahtar 'prefix' ise, botun durumunu güncelle
    // Botun o an online olduğundan emin olmak için (client.user null olmasın diye) kontrol ekleyelim
    if (key === 'prefix' && client.user) {
        const newStatus = `Yeni prefix: ${newValue}`;
        client.user.setActivity(newStatus);
        console.log(`[BOT] Bot durumu güncellendi: ${newStatus}`);
    }
});

// Veritabanı temizlendiğinde
db.on('clear', () => {
    console.log('[VERİTABANI] Tüm veritabanı temizlendi!');
    if (client.user) {
        client.user.setActivity('Ayarlar sıfırlandı!');
    }
});


client.on('ready', async () => {
    console.log(`${client.user.tag} adıyla giriş yapıldı!`);
    
    // Bot başladığında, veritabanından prefix'i kontrol et
    // Eğer 'prefix' ayarlanmamışsa, varsayılan olarak '!' ata
    const prefix = await db.ensure('prefix', '!');
    
    // Botun durumunu ayarla
    client.user.setActivity(`Prefix: ${prefix}`);
    console.log(`[BOT] Aktif prefix: ${prefix}`);
});

// 4. Komutları Yönetme (MessageCreate) Olayı
client.on('messageCreate', async message => {
    if (message.author.bot) return;

    // Mevcut prefix'i veritabanından al
    const prefix = await db.get('prefix'); // ensure sayesinde artık '!' olduğundan eminiz

    // Mesaj prefix ile başlamıyorsa ignore'la
    if (!message.content.startsWith(prefix)) return;

    const args = message.content.slice(prefix.length).trim().split(/ +/);
    const command = args.shift().toLowerCase();

    // --- Prefix Ayarlama Komutu ---
    if (command === 'setprefix') {
        const newPrefix = args[0];
        if (!newPrefix) {
            return message.channel.send('Lütfen yeni bir prefix girin. (Örn: `!setprefix ?`)');
        }
        
        // Veritabanını güncelle
        // BU SATIR, YUKARIDAKİ db.on('set', ...) OLAYINI TETİKLEYECEK!
        await db.set('prefix', newPrefix); 
        
        message.channel.send(`Prefix başarıyla \`${newPrefix}\` olarak ayarlandı!`);
    }

    // --- Diğer Komutlar ---
    if (command === 'ping') {
        message.channel.send('Pong!');
    }
    
    if (command === 'profil') {
        // Kullanıcının parasını (yoksa 0 ata) getir
        const balance = await db.ensure(`users.${message.author.id}.balance`, 0);
        message.channel.send(`${message.author.username}, şu an ${balance} altının var.`);
    }

    if (command === 'calis') {
        // Kullanıcının parasına rastgele 10-50 arası altın ekle
        const kazanc = Math.floor(Math.random() * 41) + 10;
        const newBalance = await db.add(`users.${message.author.id}.balance`, kazanc);
        message.channel.send(`Çalıştın ve ${kazanc} altın kazandın! Yeni bakiyen: ${newBalance} altın.`);
    }
});


// Botu Discord'a bağla
client.login('Token');

🤝 Katkıda Bulunma

Katkılarınız ve fikirleriniz projeyi daha iyi hale getirecektir. Lütfen bir "issue" açmaktan veya "pull request" göndermekten çekinmeyin.

📜 Lisans

Bu proje MIT Lisansı ile lisanslanmıştır.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors