實現(xiàn)功能:
對用戶發(fā)送消息,如果在線就直接發(fā)送,不在線時存為離線消息
對組發(fā)送消息,如果在線就直接發(fā)送,不在線時存為離線消息
以下是插件配置:
說明參考:http://www.igniterealtime.org/builds/openfire/docs/latest/documentation/plugin-dev-guide.html
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<class>org.jivesoftware.openfire.plugin.Msger</class>
<name>${msger.plugin.name}</name>
<description>${msger.plugin.description}</description>
<author>leon</author>
<version>1.0.0</version>
<date>2/20/2009</date>
<url>http://hi.baidu.com/jyleon</url>
<minServerVersion>3.6.3</minServerVersion>
<adminconsole>
<tab id="tab-session">
<sidebar id="sidebar-tools" description="${msger.sidebar.name}">
<item id="msger-send" name="${msger.sendToUser}" description="${msger.sendToUser.title}" url="msger-send.jsp"/>
<item id="msger-sendGroup" name="${msger.sendToGroup}" description="${msger.sendToGroup.title}" url="msger-sendGroup.jsp"/>
</sidebar>
</tab>
</adminconsole>
</plugin>
要注意的是:
1、<sidebar id="sidebar-tools" description="${msger.sidebar.name}">
id="sidebar-tools" 是把這個插件放到openfire導(dǎo)航的“會話”的“工具”下面。(openfire導(dǎo)航標簽參考admin-sidebar.xml ),${msger.sidebar.name} 國際化設(shè)置,如果不設(shè)置的話,只能用英文
2、 <item id="msger-send" name="${msger.sendToUser}" description="${msger.sendToUser.title}" url="msger-send.jsp"/>
功能是新加一個連接“對用戶發(fā)送消息”,連接到msger-send.jsp
注意:openfire使用的是:Sitemesh 頁面裝飾框架,插件標簽中定義 id="msger-send" ,那么msger-send.jsp 必須要在head里添加:<meta name="pageID" content="msger-send"/>,否則將無法正常顯示。
3、 <minServerVersion>3.6.3</minServerVersion> 插件定義openfire服務(wù)的版本,不能上傳低于3.6.3的版本。如低于3.6.3,將此處改成與openfire 對應(yīng)的版本號即可。
4. jsp 代碼 msger-send.jsp
< import="org.jivesoftware.openfire.XMPPServer"%>
<%@ page import="java.util.*" %>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/style/global.css">
<%@ taglib uri="<%@ taglib uri="<title><fmt:message key="msger.sendToUser.title"/></title>
<meta name="pageID" content="msger-send"/>
</head>
<jsp:useBean id="webManager" class="org.jivesoftware.util.WebManager" />
<body>
<%@ page import="org.jivesoftware.openfire.PresenceManager,
org.jivesoftware.openfire.group.Group,
org.jivesoftware.openfire.group.GroupManager,
org.jivesoftware.openfire.user.User,
org.jivesoftware.openfire.user.UserManager,
org.jivesoftware.openfire.user.UserNotFoundException,
org.jivesoftware.util.ParamUtils,
org.jivesoftware.openfire.SessionManager,
org.xmpp.packet.JID,
org.xmpp.packet.Message,
java.util.Collection"
errorPage="error.jsp"
%>
<%
boolean send = ParamUtils.getBooleanParameter(request,"send");
String toUser = ParamUtils.getParameter(request,"toUser");
String fromUser = ParamUtils.getParameter(request,"fromUser");
String message = ParamUtils.getParameter(request,"message");
String success=null;
if (send) {
//send to user
SessionManager sessionManager = webManager.getSessionManager();
PresenceManager presenceManager = webManager.getPresenceManager();
UserManager userManager = webManager.getUserManager();
String serverDomainName =XMPPServer.getInstance().getServerInfo().getXMPPDomain();
User user=null;
JID toUserJid= null;
JID fromUserJid= null;
if(fromUser!=null)
fromUserJid=new JID(fromUser+"@"+serverDomainName);
else
fromUserJid=new JID(");
if(toUser!=null&&message!=null&&userManager.isRegisteredUser(toUser)==true){
try {
user = userManager.getUser(toUser);
if (presenceManager.isAvailable(user)) {
// online messages
toUserJid = presenceManager.getPresence(user).getFrom();
sessionManager.sendServerMessage(toUserJid , null, message);
success="true";
}else{
// offline message
toUserJid =new JID(toUser+"@"+serverDomainName);
if(toUserJid!=null){
Message msg = new Message();
msg.setBody(message);
msg.setTo(toUserJid);
msg.setFrom(fromUserJid);
XMPPServer.getInstance().getOfflineMessageStrategy().storeOffline(msg);
}
success="true";
}
}
catch (UserNotFoundException e) {
success="fail";
e.printStackTrace();
}
}else{
success="fail";
}
}
%>
<% if (success=="true") { %>
<div class="jive-success">
<table cellpadding="0" cellspacing="0" border="0">
<tbody>
<tr><td class="jive-icon"><img src="images/success-16x16.gif" width="16" height="16" border="0" alt=""></td>
<td class="jive-icon-label">
<fmt:message key="msger.sendReault.success" />
</td></tr>
</tbody>
</table>
</div><br>
<% }if(success=="fail"){ %>
<div class="jive-success">
<table cellpadding="0" cellspacing="0" border="0">
<tbody>
<tr><td class="jive-icon"><img src="images/error-16x16.gif" width="16" height="16" border="0" alt=""></td>
<td class="jive-icon-label">
<fmt:message key="msger.sendReault.fail" />! <fmt:message key="msger.sendReault.fail.nouser" /> , <fmt:message key="msger.sendReault.fail.noContent" />
</td></tr>
</tbody>
</table>
</div><br>
<%}%>
<table cellpadding="3">
<form action="msger-send.jsp" id="sendMsg" method="post">
<tr>
<td><fmt:message key="msger.sendToUser"/></td>
<td><input type="text" name="toUser" id="toUser"></td>
</tr>
<tr>
<td> <fmt:message key="msger.sendContent"/></td>
<td><textarea rows="10" name="message" cols="60"></textarea></td>
<tr>
<td></td>
<td>
<input type="submit" value="<fmt:message key="msger.send.submit"/>"><input type="hidden" name="send" value="true">
</td>
</tr>
</form>
</table>
</body>
</html>
openfire的插件開發(fā),是一件很有意思的事情,這只是在初期學(xué)的時候的一些總結(jié)和經(jīng)驗,適合新手。希望更多的人參與進來,大家共同研究。