根据openfire源码的提供,其中SubscriptionPlugin这个插件已经实现了自动添加了好友的功能,但好我项目的的要求还是有些不一样,我根据源码中的内容自己编写了一个插件,关键代码如下:
- public static void acceptSubscription(Packet packet ,PresenceRouter router) throws PacketRejectedException {
- String serverName = XMPPServer.getInstance().getServerInfo().getXMPPDomain();
- if (getSubscriptionLevel().equals(LOCAL)) {
- String toDomain = packet.getTo().getDomain();
- String fromDomain = packet.getFrom().getDomain();
-
- if (!toDomain.equals(serverName) || !fromDomain.equals(serverName)) {
- return;
- }
- }
- Presence presence = new Presence();
- presence.setType(Presence.Type.subscribed);
- presence.setTo(packet.getTo());
- presence.setFrom(packet.getFrom());
- router.route(presence);
-
- String toUserName = packet.getTo().getNode();
- try {
- // 获取昵称
- String nickName = UserManager.getInstance().getUser(toUserName).getName();
- if (nickName == null || nickName.trim().length() == 0){
- nickName = packet.getFrom().getNode();
- }
-
- // 添加一个分组为fans的名
- List<String> groups = new ArrayList<String>();
- groups.add("fans");
- RosterItem item = new RosterItem(packet.getFrom(), RosterItem.SUB_BOTH, RosterItem.ASK_NONE, RosterItem.RECV_NONE, nickName, groups);
- RosterManager.getRosterItemProvider().createItem(toUserName, item);
-
-
- // 将状态设置为 “相互为好友”
- Iterator<RosterItem> rosterItemIterator= RosterManager.getRosterItemProvider().getItems(packet.getFrom().getNode());
- if (rosterItemIterator != null){
- while (rosterItemIterator.hasNext()) {
- RosterItem rosterItem = (RosterItem) rosterItemIterator.next();
- if (toUserName.equals(rosterItem.getJid().getNode())){
- rosterItem.setSubStatus(RosterItem.SUB_BOTH);
- RosterManager.getRosterItemProvider().updateItem(toUserName, rosterItem);
- break;
- }
- }
- }
-
- Cache cache[] = CacheFactory.getAllCaches();
- if (cache != null){
- for (Cache cache2 : cache) {
- if("Roster".equals(cache2.getName())){
- cache2.clear();
- break;
- }
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- throw new PacketRejectedException();
- }
而在其中,缓存的刷新尤其重要,不然,只有重启服务器,你才能看到两个好友之间才是真正的订阅关系的!
|