Отправить сообщение на канал 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")
}