简述
小话话对接收到的消息以插件方式处理,是以解析消息中的命令。
消息命令格式
在对话窗口中与小话话对话,可以以如下格式输入特别命令:
/cmd [arg1] [arg2] ...
简单来说就是以斜线开头的 '/' 消息将被当作命令来处理(如果找不着命令(即没有处理这个命令的插件)的话是当普通消息处理还是告诉用户命令错了呢?)
如:
/friend add
north...@hotmail.com
这条命令用来添加
north...@hotmail.com(就是我) 为好友(当然,这个功能暂时还没实现,如果我有四只以上的手的话可能已经实现了。)
插件运行方式
如下图所示:
开发说明
不知道上面的说清楚了没有,有问题的请直接回复或是通过MSN找到我(
north...@hotmail.com)。下面是干的了。
配置方式
从头说起怕容易让人一头雾水,做这个做那个不知道有什么作用,干脆用“倒叙”的办法让目标更明确。先说配置(按说这是最后一步不是么?如果觉得奇怪可从最后面开始看。)
配置文件名为 Message-Adapters.xml ,内容是一个很简单的 spring beans 配置,稍微知道点spring的看一眼就知道了,不知道的呢也非常简单,容我慢慢道来。(为什么要用spring风格的配置文件?因为我懒而且只会这个。不会spring也没有关系,写插件跟spring一点关系也没有。)
配置全部内容如下,加了一点说明,看起来应该不太困难:
"
http://www.springframework.org/dtd/spring-beans.dtd">
class="cn.colormagic.msnbot.callback.MessageAdapterFactory">
true
要注意的是这里的key值,它就是命令的主要内容,是跟在 '/' 后面的那个,如 /cmd 中的 cmd,看起来把配置文件和逻辑搞到一起了,不过这样很方便就这样吧。
配置就是这么配置了,但是最重要的是那个只有简单一句解释的插件还没有说明,下面就是。
插件接口
先简单说明一下插件接口,所有插件必须实现 cn.colormagic.msnbot.callback.MessageCommandListener 这个接口,接口非常简单,全文如下:
package cn.colormagic.msnbot.callback;
import java.lang.reflect.Method;
public interface MessageCommandListener {
/**
* Get method name by 'command line args'
* ex. '/help msg', the 'msg' in this line is the arg, so the args must be String[]{'msg'}
* @param args
* @return
*/
public String getMethodName(String args);
}
这只代表目前的情况,很快将有一些改动,至少要添加一个help方法用来回馈用户的/help cmd,这是必须的,虽然会变,但是这个仍然非常简单。
public String getMethodName(String args);方法用来根据命令参数返回处理该命令的方法名,这样看来,这个接口的实现实在太简单了,在最初的消息处理中这个方法甚至简单到只返回一个"save"字符串。(我没说谎,就在下面:)
public String getMethodName(String args) {
String rs = "save";
if(args.startsWith(">")){
rs = "reply";
}
return rs;
}
值得注意的是,这里的args是指命令格式中的所有参数部分,并未作任何处理(只是去掉了命令部分,因为我不会知道那些参数中有什么空格或是什么符号代表什么意义),如
/friend add
north...@hotmail.com
得到的参数将是
add
north...@hotmail.com
CommandContent类和CommandResult类
差一点忘了这两个重要的类,分别是cn.colormagic.msnbot.callback.CommandContent和cn.colormagic.msnbot.callback.CommandResult,顾名思义,一个是命令内容,一个是命令结果。
CommandContent
CommandContent中我几乎把所有能得到的东西都给转了进去,具体包括
private SwitchboardSession session; //会话的Session,如果要处理同一个会话的内容或什么的可能用得到,我在消息处理中用到了
private MsnFriend sender; // 消息的发送者
private MimeMessage message; // 消息内容
private MSNMessenger messenger; // msn客户端的主要实例,如果要主动发送消息,在调用MessengerSender的时候会需要它,暂时还没想到有什么办法规避这个依赖性
CommandResult类
CommandResult是执行命令的结果,内容比上面的简单,命令执行后会自动将该类实例里的消息都返回给用户。
private boolean needReply = true; // 是否需要回复,如果为false的话就什么都回复了
private List
replys = new ArrayList
(); //用来存储回复消息
public void addMsg(String msg){
replys.add(msg);
}
public String getMsg(int i){
return replys.get(i);
}
public List
getMsgs(){
return replys;
}
public boolean isNeedReply() {
return needReply;
}
实例
好像差不多可以讲的就这些,还是那句话有什么问题直接跟我说,下面贴一下消息处理的插件的主要内容
package cn.colormagic.msnbot.callback;
import java.util.Date;
import rath.msnm.SwitchboardSession;
import rath.msnm.entity.MsnFriend;
import rath.msnm.msg.MimeMessage;
import cn.colormagic.msnbot.ConversationPool;
import cn.colormagic.msnbot.MessageSender;
import cn.colormagic.msnbot.pojo.ReceivedMessage;
import cn.colormagic.msnbot.pojo.dao.ReceivedMessageDAO;
import cn.colormagic.util.DAOTestHelper;
/**
* This is a special command listener,save message by default.
* @author fenglu
*
*/
public class ReceivedMessageListener implements MessageCommandListener {
private ReceivedMessageDAO messageDAO;
private ConversationPool conversations;
public ReceivedMessageListener(){
messageDAO = (ReceivedMessageDAO) DAOTestHelper.getBean("receivedMessageDAO");
conversations = new ConversationPool();
}
public void setMessageDAO(ReceivedMessageDAO messageDAO) {
this.messageDAO = messageDAO;
}
public CommandResult save(MessageContent mc){
CommandResult replyMsg = new CommandResult();
// do some save operation
return replyMsg;
}
public CommandResult reply(MessageContent mc){
CommandResult replyMsg = new CommandResult();
// do some save operation
return rs;
}
}
Orignal From:
MSN小话话插件开发说明