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.
- 🚀 Asenkron Yapı: Performans kaybı yaşamadan
async/awaitile 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,deletevb.) anında haberdar olun! - 📦 Nokta Notasyonu Desteği:
user.profile.namegibi 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:
findile tek bir veri bulun veyafilterile 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()vesubtract()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.
npm install @furkibu/aiko.db//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.
*/.set(key, value): Bir anahtara değer atar. Nokta notasyonunu destekler. (setolayı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. (deleteolayını tetikler).clear(): Veritabanındaki tüm verileri temizler. (clearolayını tetikler)
.add(key, amount): Sayısal bir değere ekleme yapar. (setolayını tetikler).subtract(key, amount): Sayısal bir değerden çıkarma yapar. (setolayını tetikler).push(key, ...values): Bir diziye bir veya daha fazla eleman ekler. (setolayını tetikler).pull(key, callback): Bir diziden,callbackkoşulunu sağlayan elemanları çıkarır. (setolayını tetikler)
.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. YoksadefaultValueatar. (setolayı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.
.backup(filePath): Veritabanının belirtilen yola bir yedeğini oluşturur.
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,ensuremetotları 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ı!');
});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ılarınız ve fikirleriniz projeyi daha iyi hale getirecektir. Lütfen bir "issue" açmaktan veya "pull request" göndermekten çekinmeyin.
Bu proje MIT Lisansı ile lisanslanmıştır.