对IRC机器人的速率限制调用

时间:2015-03-04 21:11:21

标签: java thread-sleep rate-limiting

我正在研究一个拥有该命令的IRC机器人!Scouter它将生成一个随机数....我已经完成了,我想做的是一个冷却系统,以防止人们发送垃圾邮件再一次。

这是我的代码。

public class Twitchbot extends PircBot {
    Random dice = new Random();
    int number;

    for(int counter=1; counter<=1;counter++) {
        number = 1+dice.nextInt(9001);
        System.out.println(number + " ");
    }

    public Twitchbot() {
        this.setName("Blah");
    }

    public void onMessage(String channel, String sender, String login, String hostname, String message) {
       if (message.equalsIgnoreCase("!Scouter")) {
           sendMessage(channel,": The time is now " + sender + number);
           for(int counter=1; counter<=1;counter++) {
              number = 1+dice.nextInt(9001);
              System.out.println(number + " ");
              try {
                 Thread.sleep(5000);
              } catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
              }
           }
       }
    }
}

我尝试使用此代码进行冷却

 try {
    Thread.sleep(5000);
 } catch(InterruptedException ex) {
     Thread.currentThread().interrupt();
 }

但它所做的只是在睡了5秒后做代码。我不想要这个命令!Scouter在那个冷静期间注册。有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

问题是onMessage是异步调用的,所以你不能阻止它被睡眠调用。

最简单的解决方法是将当前时间存储为实例变量,如果存储时间与当前时间之间的差异小于5秒,则立即返回onMessage

答案 1 :(得分:0)

您可以使用以下方式在成功通话时保存当前系统时间:

lastCall = System.currentTimeMillis();

之前,你检查

if(System.currentTimeMillis() - lastCall >= DELAY)

其中DELAY是以毫秒为单位的时间(1秒等于1000毫秒)。

如果该语句为真,则将lastCall设置为当前时间:

lastCall = System.currentTimeMillis();

并调用正常代码。


它看起来像这样:

long lastCall = 0L; //Initializing 

public void onMessage(String channel, String sender,
        String login, String hostname, String message) {

   if (message.equalsIgnoreCase("!Scouter")) {
       if(System.currentTimeMillis() - lastCall >= 5000)
       {
           lastCall = System.currentTimeMillis(); // Set lastCall again
           sendMessage(channel,": The time is now " + sender + number);
           for(int counter=1; counter<=1;counter++) {
             number = 1+dice.nextInt(9001);
             System.out.println(number + " ");
           }
       }
   }
}

答案 2 :(得分:0)

我并不完全了解您系统的功能,但我发现您的系统每次进入睡眠状态时都会卡住。

如果你想摆脱这种行为,一个好的方法是使用一个Thread作为匿名类调用,并在后台做事。

我会这样做:

if (message.equalsIgnoreCase("!Scouter")) {
            sendMessage(channel,": The time is now " + sender + number);
            new Thread() {
                @Override
                public void run() {
                    for(int counter=1; counter<=1;counter++) {
                        number = 1+dice.nextInt(9001);
                        System.out.println(number + " ");
                        try {
                            sleep(5000);
                        } catch(InterruptedException ex) {
                            Thread.currentThread().interrupt();
                        }
                    }
                }
            }.run();
        }

希望它有所帮助。