मैंने हाल ही में अपने Discord.js बॉट में एक XP सिस्टम बनाया है, और यह काम करता है कि इसे कैसे करना चाहिए, लेकिन XP प्राप्त करना बहुत आसान है क्योंकि आप स्पैम कर सकते हैं। किसी के द्वारा भेजे गए प्रत्येक संदेश में आपको XP देने का 50/50% मौका होता है।

मैं इस प्रणाली में स्पैम को कैसे रोक सकता हूँ?

-2
BackspaceRGB 26 नवम्बर 2020, 16:27

2 जवाब

सबसे बढ़िया उत्तर

एक कोल्डाउन सिस्टम बनाएं, ताकि कोई व्यक्ति XP को प्रति मिनट अधिकतम एक बार ही प्राप्त कर सके। आप एक Setबनाकर ऐसा कर सकते हैं। और यह जांचना कि क्या उपयोगकर्ता XP जोड़ने से पहले सेट में हैं। अगर हैं तो रद्द कर दें। यदि वे नहीं हैं, तो XP जोड़ें, उन्हें सेट में जोड़ें, और उन्हें सेट से निकालने के लिए टाइमर सेट करें।

उदाहरण के लिए:

// declare this somewhere that it won't be reset every new message
const cooldowns = new Set()

...

// if they're on cooldown
if (cooldowns.has(message.author.id)) return;

// otherwise, add them to the cooldown
cooldowns.add(message.author.id);

...

// set a timer for 60000ms (60s)
setTimeout(() => cooldowns.remove(message.author.id), 60000)
0
Lioness100 26 नवम्बर 2020, 16:34

जिस तरह से मैं उससे संपर्क करूंगा, वह यह है कि जब आपने किसी उपयोगकर्ता को आखिरी बार कोई XP दिया था। आप इसे डेटाबेस में कर सकते हैं, लेकिन मैं एक ऑब्जेक्ट का उपयोग करूंगा। उदाहरण:

client.xpHistory = {};

client.on("message", message => {
    let author = message.member;
    let authorId = author.id;
    let historyKey = authorId + ":" + message.guild.id;
    let authorHistory = client.recentXP[historyKey];
    let msgSentAt = Math.floor(message.createdAt.getTime()/1000);
    
    if(typeof authorHistory === 'undefined') {
        //They haven't sent any messages since the bot restarted, so give them some
        client.recentXP[historyKey] = msgSentAt;
        let xpAmount = Math.floor(Math.random() * (25 - 10) + 10);
        //Give them that much XP, however you store your levels. Also this generates between 10 and 25 xp, change that how you like
        // The line below is set to let them have xp every 30 seconds, change that however you like
    } else if(msgSentAt >= client.recentXP[historyKey] + 30) {
        client.recentXP[historyKey] = msgSentAt;
        let xpAmount = Math.floor(Math.random() * (25 - 10) + 10);
        //Give them that much XP, however you store your levels. Also this generates between 10 and 25 xp, change that how you like
    }
});
0
Yankue Team 26 नवम्बर 2020, 20:01