Бот - это клиентское приложение, имитирующее пользовательское подключение и предназначенное для выполнения дополнительных функций, заданных разработчиком. Спектр таких функций чрезвычайно широк - от файл-серверов, баз данных, новостей и до викторин, мадов и служб знакомств. Фантазия разработчиков практически безгранична. Сеть IRC полна примеров творческого использования ботов, что же мешает создавать подобные сервисы для ичата? Основным препятствием как правило оказывались закрытость протокола и сложность реализации.
Предлагаемый вашему вниманию framework для разработки ботов значительно упрощает задачу разработчику. Вся "черновая" работа сделана разработчиками framework'а, вам же предоставляется шанс сосредоточиться непосредственно на задачах, которые должен решать ваш сервис. Таким образом вам, в принципе, не надо даже знать детали реализации ичата, особенности его протокола и пр.
Фреймворк организован на основе паттерна observer.
Работа основывается на взаимодействии класса
IChatServiceBot
и ваших собственных классов с помощью ряда
Listener-классов.
Listener-класс существует для любого типа сообщений ичата, а также для
некоторых событий самого бота, таких как успешное подключение к серверу или отключение от него. Вам нужно лишь
"подписаться" на интересующие вас события, вызвав соответствующий addXXXListener
метод. Если же
вам нужно отправить сообщение в ответ, сначала вам нужно создать соответствующее сообщение с помощью
фабрики
создания сообщений. После этого вы можете отправить это сообщение с помощью метода
sendMessage.
В качестве примера напишем простого бота, реагирующего на сообщение "preved" и пишушего в ответ что-то вроде "ник: medved!!":
Created with Colorer-take5 Library. Type 'java'
0: /*
1: * Created on 13.06.2006
2: *
3: * (c) K.Baturytski
4: *
5: * This program is free software; you can redistribute it and/or
6: * modify it under the terms of the GNU General Public License
7: * as published by the Free Software Foundation; either version 2
8: * of the License, or (at your option) any later version.
9: *
10: * This program is distributed in the hope that it will be useful,
11: * but WITHOUT ANY WARRANTY; without even the implied warranty of
12: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: * GNU General Public License for more details.
14: *
15: * You should have received a copy of the GNU General Public License
16: * along with this program; if not, write to the Free Software
17: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18: *
19: * $revision$
20: */
21: package com.web_visage.jedi.ichatbot.examples;
22:
23: import com.web_visage.ichat.DefaultMessageFactory;
24: import com.web_visage.ichat.IChatBotProperties;
25: import com.web_visage.ichat.IChatMessage;
26: import com.web_visage.ichat.IChatMessageConstants;
27: import com.web_visage.ichat.IChatMessageFactory;
28: import com.web_visage.ichat.IChatServiceBot;
29: import com.web_visage.ichat.IChatUserInfo;
30: import com.web_visage.ichat.exception.IChatUserNotFoundException;
31: import com.web_visage.ichat.listeners.PublicMessageListener;
32: import com.web_visage.ichat.messages.IChatTextMessage;
33:
34: /**
35: * IChatBot usage example. This is a simple bot reacting on a public message
36: * "preved", writing "<username>: medved" in response. This bot doesn't do
37: * error handling and other dirty work to keep the example tiny and simple, but
38: * the real one should.
39: *
40: * @author K.Baturytski
41: */
42: public class PrevedBotExample implements PublicMessageListener {
43:
44: /** service bot instance */
45: private final IChatServiceBot serviceBot;
46:
47: /** message factory to use */
48: private final IChatMessageFactory messageFactory;
49:
50: /**
51: * Constructor.
52: *
53: * @param props -
54: * configuration bean
55: */
56: public PrevedBotExample(IChatBotProperties props) {
57: super();
58: messageFactory = DefaultMessageFactory.getSingleton();
59: serviceBot = new IChatServiceBot(props, messageFactory);
60: // subscribe ourselves on public messages
61: serviceBot.addPublicMessageListener(this);
62: }
63:
64: /**
65: * Checks public messages for the word "preved", if found, sends username
66: * followed by ": medved!!" string in response. If not found, sends "oops!
67: * and who said \"preved\"??" message in response to everybody.
68: */
69: public void processPublicMessage(IChatTextMessage aMessage) {
70: // do a simple check for a string of interest
71: if ("preved".equalsIgnoreCase(aMessage.getText())) {
72: try {
73: // get user information record based on user "sender" identity
74: // object
75: IChatUserInfo userInfo = serviceBot.getUserList().getUser(
76: aMessage.getSender());
77: // create response message, use serviceBot as id generator and
78: // our own sender object as ours identity object
79: IChatMessage responseMessage = messageFactory
80: .createPublicMessage(serviceBot.getMessageId(),
81: serviceBot.getSender(), userInfo.getNickName()
82: + ": medved!!");
83: // send the message to everybody
84: serviceBot.sendMessage(responseMessage,
85: IChatMessageConstants.WILDCARD);
86:
87: } catch (IChatUserNotFoundException e) {
88: // the user might have been disconnected just before we wanted
89: // to hail him, send our discontent to everybody
90: IChatMessage responseMessage = messageFactory
91: .createPublicMessage(serviceBot.getMessageId(),
92: serviceBot.getSender(),
93: "oops! and who said \"preved\"??");
94: serviceBot.sendMessage(responseMessage,
95: IChatMessageConstants.WILDCARD);
96: }
97: }
98: }
99:
100: /**
101: * Connects our bot to a server.
102: */
103: public void connect() {
104: try {
105: serviceBot.connect();
106: } catch (Exception e) {
107: // some retry code usually goes here
108: System.out.println("Failed to start");
109: e.printStackTrace();
110: }
111: }
112:
113: /**
114: * Shuts down our lovely bot.
115: */
116: public void stop() {
117: serviceBot.shutdown();
118: }
119:
120: /**
121: * Configure and start our bot.
122: *
123: * @param args
124: */
125: public static void main(String[] args) {
126: final PrevedBotExample bot = new PrevedBotExample(
127: new IChatBotProperties("127.0.0.1", 6666, "MedvedBot I am",
128: "Medved", "127.0.0.1", "MedvedLogin", "MedvedPC",
129: "Vsem preved, ya Medved!"));
130: bot.connect();
131: // register a shutdown hook to stop the bot upon jvm exit
132: Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
133: /**
134: * Shutdown the bot upon jvm shutdown.
135: *
136: * @see java.lang.Runnable#run()
137: */
138: public void run() {
139: bot.stop();
140: }
141: }));
142: }
143: }