【问题标题】:Discord.js: Asynchronous message Cooldown / AntispamDiscord.js:异步消息冷却/反垃圾邮件
【发布时间】:2021-08-16 14:41:38
【问题描述】:

我正在制作一个 Discord Bot,它会在用户加入特定语音频道时通知版主。 Bot 还应该具有垃圾邮件保护功能,即每个用户每分钟只记录一次消息。

这是我之前尝试过的:

const { Client } = require("discord.js");
const { config } = require("dotenv");
const fs = require('fs');


const client = new Client({
    partials: ['MESSAGE', 'CHANNEL', 'REACTION']
});

config({
    path: __dirname + "/.env"
})

var supportchannel = '827574015526567947'

var dutychannel = '847445933969113118'

var ondutyrole = '847447374925398016'

client.on("ready", () => {
    console.log(`Hi, ${client.user.username} is now online!`);
    global.timer = 0;
    client.user.setStatus('online');
    
    client.user.setActivity('me getting developed', { type: "WATCHING"})
        .then(presence => console.log('status set'))
        .catch(console.error); 
});

client.on('voiceStateUpdate', (oldMember, newMember) => {
    let newUserChannel = newMember.channelID;
    let oldUserChannel = oldMember.channelID;
   
    if(newUserChannel === supportchannel)
    {           
            if (timer == 0){
                timer = 1
                setTimeout(() => {
                    timer = 0
                }, 60000);
                const Userfm = client.users.cache.get(newMember.id);    
                if (Userfm) {
                    const channelfx = client.channels.cache.get(dutychannel)
                    let roleId = ondutyrole
                    channelfx.send(`<@&${roleId}> **${Userfm.tag}** requires Support`);       
                }
            }else{
                return;
            }         
    }
        console.log("User joined vc with id "+newUserChannel)  
});
client.login(process.env.TOKEN);

这不符合预期,因为冷却时间不是针对每个用户单独设置的,而是设置了一个倒计时,阻止每个用户在 60 秒内引起版主的注意(所有用户共享一个冷却时间)。

我认为代码对每个用户都是异步运行的。

我使用 wait-sync npm 库的这段代码也是如此:

const { Client } = require("discord.js");
const { config } = require("dotenv");
const fs = require('fs');
const waitSync = require('wait-sync');

const client = new Client({
    partials: ['MESSAGE', 'CHANNEL', 'REACTION']
});

config({
    path: __dirname + "/.env"
})

var supportchannel = '827574015526567947'

var dutychannel = '847445933969113118'

var ondutyrole = '847447374925398016'

client.on("ready", () => {
    console.log(`Hi, ${client.user.username} is now online!`);
    global.timer = 0;
    client.user.setStatus('online');
    
    client.user.setActivity('me getting developed', { type: "WATCHING"})
        .then(presence => console.log('status set'))
        .catch(console.error); 
});

client.on('voiceStateUpdate', (oldMember, newMember) => {
    let newUserChannel = newMember.channelID;
    let oldUserChannel = oldMember.channelID;
   
    if(newUserChannel === supportchannel)
    {           
                const Userfm = client.users.cache.get(newMember.id);    
                if (Userfm) {
                    const channelfx = client.channels.cache.get(dutychannel)
                    let roleId = ondutyrole
                    channelfx.send(`<@&${roleId}> **${Userfm.tag}** requires Support`);
                    waitSync(60);       
                }
                     
    }
        console.log("User joined vc with id "+newUserChannel)  
});
client.login(process.env.TOKEN);

如果你知道如何解决这个问题,请告诉我。

提前致谢;)

【问题讨论】:

    标签: javascript node.js discord discord.js


    【解决方案1】:

    您可以做的可能是拥有某种映射来跟踪每个用户的计时器并让用户 ID 作为键:

    const timers = {};
    
    client.on('voiceStateUpdate', (oldMember, newMember) => {
    ...
        // If we don't have any timer set for this user, go ahead and set it
        if (!timers[newMember.id]) {
            timers[newMember.id] = 1;
            setTimeout(() => {
                // Delete the timer from the mapping
                delete timers[newMember.id];
            }, 60000);
    ...
    

    【讨论】:

      猜你喜欢
      • 2017-12-15
      • 2021-05-20
      • 2018-07-14
      • 2014-05-19
      • 2022-07-11
      • 2012-08-02
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      相关资源
      最近更新 更多