Отправить сообщение на канал IRC с помощью PircBot

Я нахожусь в процессе создания бота IRC для практики, но застрял. Я использую библиотеку PircBot в качестве базы.

У меня проблема в том, что я могу отправлять сообщения на канал следующим образом:

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

    if(message.equalsIgnoreCase("hello")){

    sendMessage(channel, "Hello "+sender);
    }
}

Это в обычном "бот" классе и работает. Но это очень быстро запутывается, поэтому я создал два класса, чтобы разобраться с этим. Они называются с:

public void onMessage(String channel, String sender, String message) {`
    MessageHandler mh = new MessageHandler();
    CommandHandler ch = new CommandHandler();

    if (message.startsWith("+")){
    ch.commandQuery(channel, sender, message);
    }
    else{mh.messageRespondQuery(channel, sender, message);
    }
}

Который ТАКЖЕ работает отлично. Но если я попытаюсь отправить сообщение в подклассах, как

if (message.contains("test")){
            sendMessage("test successful");
        }

Он не отправляет сообщение вообще. Даже если я "вложил" метод sendMessage() в другой метод класса "бот", он не работает. Только внутри метода onMessage(). Я отладил его, и он везде перемещается правильно, за исключением того, что он не отправляет сообщение. Та же проблема относится к методу sendRawLine().

Может ли кто-нибудь со знанием IRC/ Pircbot помочь мне?

1 ответ

Решение

Ответ

Ваша проблема в том, что у классов-обработчиков вообще нет ссылки на бота, и поскольку сам класс не имеет функции sendMessage, он не будет отправлять сообщение.

Вы должны включить объект бота в конструктор класса обработчика, т.е.

MessageHandler mh = new MessageHandler(this);
CommandHandler ch = new CommandHandler(this);

объяснение

this это ключевое слово в Java, которое ссылается на экземпляр самого класса. Отправив экземпляр вашего класса бота в конструктор и настроив конструктор для его принятия, вы по сути отправили копию экземпляра бота в класс обработчика. Вы бы приняли это, используя конструктор как:

public MessageHandler(BotClassName b) {
    this.b = b;
}

А затем отправьте сообщение, используя:

if (message.contains("test")) {
    b.sendMessage("test successful")
}
Другие вопросы по тегам