0

IRCLibforJavaを使用してIRCボットを作成しています。ライブラリで提供されるクライアントとしてMoepiiを使用します。Moepiiの問題は、洪水防止機能が組み込まれていないため、これを自分で実装する必要があることです。現在、多くのコマンドに応答したときのボットは、Quakesnetの過剰なフラッドをトリガーし、起動しました。

洪水防御を実装する方法について誰か提案がありますか?私が得たアイデアの1つは、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);
            }
        });

    }
}
4

1 に答える 1

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;
    }
}
于 2012-12-16T16:04:21.973 に答える