На главную : Статьи : Форум : Блог : Связаться с автором

IChatBot - framework для разработки ботов для Intranet Chat

Бот - это клиентское приложение, имитирующее пользовательское подключение и предназначенное для выполнения дополнительных функций, заданных разработчиком. Спектр таких функций чрезвычайно широк - от файл-серверов, баз данных, новостей и до викторин, мадов и служб знакомств. Фантазия разработчиков практически безгранична. Сеть 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: }

© 2006 - Авторство и copyright на все материалы - Константин Батурицкий
На главную : Статьи : Форум : Блог : Связаться с автором