Dc Random Hesab Botu Nasıl Yapılır ?

Konuyu başlatankyr karacaMod·
Yanıt
0
Görüntülenme
1
Oy
0
Son yanıt
Henüz yok
1 görüntülenme

Dc Random Hesab Botu Nasıl Yapılır ?

Otomatik Veri Dağıtım Botu: Geliştirme ve Kullanım Kılavuzu

Botun Temel Amacı

Bu botun ana görevi, sunucudaki üyelere (rollerine göre) otomatik olarak veri (hesap, kod, link vb.) dağıtmaktır. Bu görevi yerine getirmek için bot, hem sunucu düzenini korur hem de kullanıcıların bu verileri sürekli "spamlamasını" engellemek için gelişmiş bir bekleme süresi (cooldown) sistemi kullanır.

Temel Özellikler

  • Rol Bazlı Yetkilendirme: Bot; free, premium ve booster gibi rollere özel çalışır. Her rolün kendine ait bir kanalı ve bekleme süresi vardır.
  • Otomatik Kurulum: Bot sunucuya girdiğinde, gerekli rolleri ve bu rollere özel gizli kanalları (permissionOverwrites kullanarak) otomatik olarak oluşturur.
  • Stok Yönetimi: Verileri veriler.txt dosyasından çeker. Bir veri bir kullanıcıya gönderildiğinde, o veri dosyadan silinir (böylece her veri tek kullanımlıktır).
  • Bekleme Süresi (Cooldown): Kullanıcı bir hesap aldığında, cooldowns.json dosyasına kaydedilir. Belirlenen süre (örneğin 60 dakika) dolmadan tekrar hesap alamaz.
  • DM Yoluyla Teslimat: Veriler, güvenlik ve gizlilik amacıyla kullanıcının direkt mesaj (DM) kutusuna gönderilir.

Nasıl Çalışır? (Mantık Akışı)

  • Açılış: Bot başladığında sunucuda free-ozel, premium-ozel gibi kanallar var mı diye bakar; yoksa oluşturur.
  • Komut Tetikleme: Bir kullanıcı uygun kanalda !rh (Random Hesap) komutunu yazar.
  • Rol Kontrolü: Bot, kullanıcının rolüne bakar. Örneğin kullanıcı "Premium" ise ona 30 dakika, "Free" ise 60 dakika bekleme süresi tanımlar.
  • Süre Kontrolü: Bot cooldowns.json dosyasını kontrol eder. Eğer kullanıcının süresi dolmadıysa, şık bir Embed mesajı ile ne kadar süre beklemesi gerektiğini söyler.
  • Veri Gönderimi: Eğer süre dolmuşsa, veriler.txt dosyasının en üstündeki satırı alır, kullanıcıya DM atar ve o satırı dosyadan siler.
  • Kayıt: Yeni bekleme süresi kaydedilir ve işlem tamamlanır.

Dosya Yapısı

Botun sağlıklı çalışması için aynı klasörde şu dosyaların bulunması gerekir:

  • main.js: Paylaştığın kodun bulunduğu ana dosya.
  • veriler.txt: İçine alt alta verileri/hesapları ekleyeceğin dosya.
  • cooldowns.json: Botun bekleme sürelerini otomatik kaydedeceği dosya (Bot kendisi oluşturur).

Dikkat Edilmesi Gerekenler

  • Token: const Token = 'Bot Tokeni' kısmına kendi Discord Developer portalından aldığın tokeni yazmalısın.
  • Intents: Kodda MessageContent intent'i kullanılmış. Botun mesajları okuyabilmesi için Discord Developer Portal üzerinden "Message Content Intent" ayarını aktif etmen gerekir.
  • Hata Yönetimi: Eğer kullanıcının DM'leri kapalıysa bot hata verebilir; kodda bu durum için bir try-catch bloğu eklenmiş, bu sayede bot çökmez.

Not: Bu bot, sunucunuzun düzenini koruduğu gibi kullanıcıların spamlamasını da engellemek için gelişmiş bir bekleme süresi (cooldown) sistemi kullanır. Bu sayede bot, hem sunucunuzun düzenini korur hem de kullanıcıların spamlamasını engeller.

İşte Aşağıda Açık Kaynaklı Kodum İyi Eğlenceler :D

const
const fs = require('fs');
const { r } = require('discord.js'); 
const client = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent,
        GatewayIntentBits.DirectMessages
    ]
});

// Yapılandırma
const Token ='Bot Tokeni'// Bot tokeni

const config = {
    prefix: '!',
    rolesToCreate: [
        { name: 'free', color: 'Blue', cooldown: 3600000, channelName: 'free-ozel' },
        { name: 'premium', color: 'Gold', cooldown: 1800000, channelName: 'premium-ozel' },
        { name: 'booster', color: 'LuminousVividPink', cooldown: 1800000, channelName: 'booster-ozel' }
    ]
};

function getCooldowns() {
    if (!fs.existsSync('cooldowns.json')) {
        fs.writeFileSync('cooldowns.json', '{}', 'utf8');
    }
    try {
        return JSON.parse(fs.readFileSync('cooldowns.json', 'utf8'));
    } catch (e) {
        return {};
    }
}

function saveCooldowns(data) {
    fs.writeFileSync('cooldowns.json', JSON.stringify(data, null, 2), 'utf8');
}
// ------------------------------------------

client.once('ready', async () => {
    console.log(`${client.user.tag} aktif! Kurulum kontrol ediliyor...`);

    for (const guild of client.guilds.cache.values()) {
        for (const roleData of config.rolesToCreate) {
            let role = guild.roles.cache.find(r => r.name.toLowerCase() === roleData.name);
            if (!role) {
                role = await guild.roles.create({
                    name: roleData.name,
                    color: roleData.color,
                    reason: 'Otomatik kurulum'
                });
                console.log(`${guild.name} sunucusunda ${role.name} rolü oluşturuldu.`);
            }

            let channel = guild.channels.cache.find(c => c.name === roleData.channelName);
            if (!channel) {
                await guild.channels.create({
                    name: roleData.channelName,
                    type: ChannelType.GuildText,
                    permissionOverwrites: [
                        {
                            id: guild.id,
                            deny: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel],
                        },
                        {
                            id: role.id,
                            allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel],
                        },
                    ],
                });
                console.log(`${guild.name} sunucusunda ${roleData.channelName} kanalı oluşturuldu.`);
            }
        }
    }
});

client.on('messageCreate', async (message) => {
    if (message.author.bot || !message.content.startsWith(config.prefix)) return;

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

    if (command === 'rh') {
        const member = message.member;
        let activeRoleData = null;

        for (const rData of config.rolesToCreate) {
            if (member.roles.cache.some(r => r.name.toLowerCase() === rData.name)) {
                activeRoleData = rData;
                break;
            }
        }

        if (!activeRoleData) return;

        if (message.channel.name !== activeRoleData.channelName) {
            const targetChannel = message.guild.channels.cache.find(c => c.name === activeRoleData.channelName);
            return message.reply(`Bu komutu sadece <#${targetChannel?.id || 'kanalda'}> kullanabilirsin.`);
        }

        const now = Date.now();
        const userKey = message.author.id; 
        let db = getCooldowns();

        if (db[userKey]) {
            const expirationTime = db[userKey].expiry;
            if (now < expirationTime) {
                const timeLeft = Math.ceil((expirationTime - now) / 1000 / 60);
                
                const waitEmbed = new EmbedBuilder()
                    .setColor('#E74C3C') // Alttan kırmızı renk
                    .setTitle('⏳ Bekleme Bölgesindesin!')
                    .setDescription(`Henüz yeni bir hesap alamazsın. Mevcut rolün için belirlenen süreyi beklemelisin.`)
                    .addFields(
                        { name: 'Kalan Süre', value: `\`${timeLeft} Dakika\``, inline: true },
                        { name: 'Kullandığın Rol', value: `\`${activeRoleData.name.toUpperCase()}\``, inline: true }
                    )
                    .setFooter({ text: 'Süren dolduğunda tekrar dene.' });

                return message.reply({ embeds: [waitEmbed] });
            } else {
                delete db[userKey];
            }
        }

        try {
            let fileContent = fs.readFileSync('veriler.txt', 'utf8');
            let lines = fileContent.split('\n').filter(l => l.trim() !== '');

            if (lines.length === 0) {
                const emptyEmbed = new EmbedBuilder()
                    .setColor('#F1C40F')
                    .setTitle('⚠️ Stok Tükendi!')
                    .setDescription('Şu an random hesap bulunmuyor. Lütfen yetkililere bildir.');
                return message.reply({ embeds: [emptyEmbed] });
            }

            const selectedLine = lines[0]; 
            
            const dmEmbed = new EmbedBuilder()
                .setColor('#2ECC71') 
                .setTitle('Random Hesap')
                .setDescription('Random Hesabın Aşadadır,Bizi Tercih Etiğin İçin Teşekürler')
                .addFields({ name: ':', value: `\`\`\`${selectedLine}\`\`\`` })
                .setTimestamp()
                .setFooter({ text: `${message.guild.name} Otomatik Sistem` });

            await message.author.send({ embeds: [dmEmbed] });

            const successEmbed = new EmbedBuilder()
                .setColor('#3498DB') // Mavi
                .setAuthor({ name: message.author.username, iconURL: message.author.displayAvatarURL() })
                .setTitle('✅ İşlem Başarılı')
                .setDescription('Random Hesabın DM Üzerinden Gönderildi. Bekleme Süren Başladı.')
                .addFields({ name: 'Süre', value: `\`${activeRoleData.cooldown / 60000} Dakika\`` });

            message.reply({ embeds: [successEmbed] });

            lines.shift(); 
            fs.writeFileSync('veriler.txt', lines.join('\n'), 'utf8');

            db[userKey] = {
                expiry: now + activeRoleData.cooldown,
                role: activeRoleData.name
            };
            saveCooldowns(db);

        } catch (err) {
            console.error('Hata:', err);
            message.reply('Beklenmedik bir hata oluştu. Lütfen DM kutunun açık olduğundan emin ol!');
        }


    }
});

client.login(Token);```
0 yanıt1

Konuyu Yanıtla

Markdown destekler · Alıntı, kod, liste kullanabilirsiniz

Konuyu yanıtlamak için giriş yapmalısınız.

Bu konuda yer alanlar

Bu gönderinin yazarı ve yorum yazan üyeler (yalnızca bu konu).