2012-12-15 1 views
0

IRC 봇을 만들기 위해 IRCLib for Java를 사용하고 있습니다. 라이브러리에 제공되는 클라이언트로 Moepii를 사용합니다. Moepii의 문제는 홍수 예방에 내장되지 않았기 때문에이 자체를 구현해야 할 것입니다. 현재 내 봇은 많은 명령에 응답 할 때 Quakesnet 초과 홍수를 유발하고 부팅을 시작합니다.IRCLib 자바 생성 IRC 봇 문제

홍수 방지를 구현하는 방법에 대한 제안이있는 사람이 있습니까? 내가 얻은 한 가지 아이디어는 1024 바이트 버퍼를 가정하고 서버에 Ping을 보내고 계속하기 전에 응답을 기다리는 것입니다. IRC와 함께 일한 적이 없기 때문에 일부 조언을 기다리고 있습니다.

private class FloodMonitor implements Runnable { 

    private final int MAXBYTES = 512; 
    private int messageBuffer = 0; 
    private boolean suspend = false; 
    private boolean stop = false; 

    @Override 
    public void run() { 

     while (!stop) { 
      while (!suspend) { 
       MessageStructure message = out.peek(); 
       if (message != null) { 
        messageBuffer += message.msg.getBytes().length; 
        if (messageBuffer < MAXBYTES) { 
         out.poll().sendMessage(); 
        } else { 
         suspend(); 
         message.bot.send("ping irc.quakenet.org"); 
        } 
       } 
      } 
     } 
    } 

    public void resetBuffer() { 
     messageBuffer = 0; 
     suspend = false; 
    } 

    public void stop() { 
     stop = true; 
    } 

    public void suspend() { 
     suspend = true; 
    } 
} 

private class MessageStructure { 

    public String target; 
    public String msg; 
    public BotConnection bot; 

    MessageStructure(String target, String msg, BotConnection bot) { 
     this.target = target; 
     this.msg = msg; 
     this.bot = bot; 
    } 

    private void sendMessage() { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       bot.doPrivmsgApproved(target, msg); 
      } 
     }); 

    } 
} 
+1

현재 구현은 나에게 단단한 계획을 것 같은데. 그것을 밖으로 시도하고 그게 당신을 위해 작동하는지보십시오. –

+0

질문 (additiveSize + 새 메시지 크기> 1024) ping을 보내고 응답을 기다린 다음 보류중인 메시지를 보낼 때까지 대기열에있는 각 메시지의 바이트 크기는 어떻게 되나요? – meriley

+0

물론, 서버가 당신에 의해 "넘치게"되지 않는다면, 즉시 PONG을 얻고 버퍼를 재설정하고 회신을 계속할 수 있습니다. 홍수 공격을 방지하기 위해 추가 명령 (ping을 기다리는 동안)을 허용하지 마십시오. –

답변

1
private class FloodMonitor implements Runnable { 

    private final int MAXBYTES = 768; 
    private int messageBuffer = 0; 
    private boolean suspend = false; 
    private boolean stop = false; 

    @Override 
    public void run() { 

     while (!stop) { 
      while (!suspend) { 
       final MessageStructure message = out.peek(); 
       if (message != null) { 
        messageBuffer += message.msg.getBytes().length; 
        if (messageBuffer < MAXBYTES) { 
         out.poll().sendMessage(); 
        } else { 
         suspend(); 

         SwingUtilities.invokeLater(new Runnable() { 

          @Override 
          public void run() { 
           message.bot.send("ping irc.quakenet.org"); 
          } 
         }); 

        } 
       } 
      } 
     } 
    } 

    public void resetBuffer() { 
     messageBuffer = 0; 
     suspend = false; 
    } 

    public void stop() { 
     stop = true; 
    } 

    public void suspend() { 
     suspend = true; 
    } 
}