openfire插件最佳实践(三) 用户加入指定群组功能

原创 2014年01月14日 11:14:44

忽然要实现这样一个功能,完全没头绪还是看一下openfire的源码吧,发现room部分的服务器端可以直接将用户加入群组,只要发送请求

http://jabber.org/protocol/muc

那么我们可以利用这个请求:


依旧是使用一个自定义IQ来获取用户请求

假设我们指定iq如下格式:

<span style="font-size:18px;"><iq id="2uF5u-4" type="set" from="test@888/Smack">
<query xmlns="hoo.iq.roommember">
<roomJID>1388453982252@conference.888</roomJID>
<jID>wtf111@888</jID>
<affiliation>member</affiliation>
</query>
</iq></span>

iq 包set请求,包含roomJID、jID、affiliation三个参数,
roomJID是房间的jid,jID是想要操作的用户的jID,affiliation是用户被操作后的类型,
affiliation 设置为owner :拥有者权限
affiliation 设置为admin :管理员权限
affiliation 设置为member:房间成员权限
affiliation 设置为outcast:被排除者权限

通过发送上面的数据将会将wtf111这个人设置为1388453982252的房间成员
用户可通过这个接口重复设置,也就是说:
如果用户开始是拥有者,再次设置affiliation 设置为member 则此用户成灰普通房间成员,
但是当拥有者=1时,不允许继续减少拥有者

好的,我们定义好了消息格式,可以开始对消息进行处理了!

重写 handleIQ 方法 


@Override  
    public IQ handleIQ(IQ packet) throws UnauthorizedException { 
    	System.out.println(packet.toXML());
    	//iqpackage:(因为麻烦所以,当前只提供单个用户对某房间的某权限添加)。iq包格式如下
    	//<iq ><query>
    	//<roomJID></><jID></><affiliation></>
    	//</iq><query>
    	IQ reply = IQ.createResultIQ(packet);
    	reply.setChildElement(packet.getChildElement().createCopy());
    	try {
    		
    		ClientSession session = sessionManager.getSession(packet.getFrom());
    		if (session == null) {
    			 Log.error("Error during userInfo. Session not found in " +
    	                    sessionManager.getPreAuthenticatedKeys() +
    	                    " for key " +
    	                    packet.getFrom());
    	            // This error packet will probably won't make it through
    	            reply.setError(PacketError.Condition.internal_server_error);
    	            return reply;
    		}
    		if (IQ.Type.get.equals(packet.getType())) {
    			throw new RuntimeException("no interface to get it ");
			} else if (IQ.Type.set.equals(packet.getType())) {
				Element iq = packet.getElement();
				Element query = iq.element("query");
				Element roomJIDEle = query.element("roomJID");
				Element jID = query.element("jID");
				Element affiliation = query.element("affiliation");
				if (roomJIDEle == null || jID == null || affiliation == null) {
					reply.setError(PacketError.Condition.item_not_found);
					return reply;
				}

				WebManager webManager = new WebManager();
				JID roomJID = new JID(roomJIDEle.getText());
				String roomName = roomJID.getNode();
				MUCRoom room = webManager.getMultiUserChatManager().getMultiUserChatService(roomJID).getChatRoom(roomName);
				IQ muciq = new IQ(IQ.Type.set);
//下面都是对内部发送IQ请求来功能

				if ("owner".equals(affiliation.getText())|| "admin".equals(affiliation.getText())) {
					Element frag = muciq.setChildElement("query","http://jabber.org/protocol/muc#owner");
					Element item = frag.addElement("item");
					item.addAttribute("affiliation", affiliation.getText());
					item.addAttribute("jid", jID.getText());
					// Send the IQ packet that will modify the room's
					// configuration
					room.getIQOwnerHandler().handleIQ(muciq, room.getRole());
				} else if ("member".equals(affiliation.getText())|| "outcast".equals(affiliation.getText())) {
					Element frag = muciq.setChildElement("query","http://jabber.org/protocol/muc#admin");
					Element item = frag.addElement("item");
					item.addAttribute("affiliation", affiliation.getText());
					item.addAttribute("jid", jID.getText());
					// Send the IQ packet that will modify the room's
					// configuration
					room.getIQAdminHandler().handleIQ(muciq, room.getRole());
				}
			}
    		
		} catch (Exception e) {
			reply.setError(PacketError.Condition.internal_server_error);
			return reply;
		}
        return reply;  
    } 

这样就完成了处理,记得把它加到你的插件中啊~
server.getIQRouter().addHandler(new RoomMemberIQHander());




Openfire实现QQ群功能

原文地址前言在使用Openfire + Asmack开发移动 IM 时发现Openfire中的会议室实现的功能并不像QQ群,不能保存离线用户,用户一旦断开连接,就会自动离开会议室。所以想通过开发插件的...
  • zaoan_wx
  • zaoan_wx
  • 2016年03月18日 19:35
  • 1792

将Openfire中的MUC改造成类似QQ群一样的永久群

将Openfire中的MUC改造成类似QQ群一样的永久群 1、新建立永久房间,同时保证房间中的成员存储到“ofmucmember”表当中。 2、新建一个用户登陆监听的插件,这个插件监听用户的登陆行为,...
  • yangzl2008
  • yangzl2008
  • 2013年11月27日 19:33
  • 18459

多人在线聊天系统源码 xmpp+openfire

  • 2013年05月11日 19:42
  • 3.16MB
  • 下载

OpenFire源码学习之八:MUC用户聊天室

MUC 房间属性设置 以上属性存储在MUCPersistenceManager private staticConcurrentHashMap propertyMaps = newConcurr...
  • huwenfeng_2011
  • huwenfeng_2011
  • 2015年02月02日 20:39
  • 33003

openfire-好友管理实现好友添加及分组管理

openfire-好友管理实现好友添加及分组管理  (2015-04-17 08:16:16) 转载▼ 标签:  杂谈   转载本站...
  • w690333243
  • w690333243
  • 2017年02月26日 11:20
  • 1082

基于XMPP——openfire 实现了群聊和单聊效果

  • 2016年03月28日 11:43
  • 10.1MB
  • 下载

ios xmpp+openfire 群聊

最近在做直播的项目里面用的的群聊的功能,规定是要用xmpp+openfire。以前也没做过通过网上找资料最终还是把这部分功能实现了,只是简单的群聊天功能,当然这里我也只是把网上找到的东西分享给大家而已...
  • itpeng523
  • itpeng523
  • 2015年10月08日 16:19
  • 4400

Android基于XMPP Smack Openfire下学习开发IM(四)单人聊天和多人聊天(发送消息、接收消息)

很久没有写博客了,回顾了一下原先学习的,接着没有写完的继续写咯。(ps:告诉大家一个秘密,其实写写博客对自己的帮助是非常大的哦~) 好了废话不多说,进入主题吧。 一、单人聊天 1)发送消息: 首先...
  • h7870181
  • h7870181
  • 2013年10月09日 11:58
  • 35681

openfire群聊精华

m http://blog.chinaunix.net/zt/1038/openfirejun_1038901.shtml
  • m372897500
  • m372897500
  • 2015年09月21日 16:22
  • 1404

xmpp with openfire之五 插件-利用Broadcast实现群

openfire提供了很好的插件支持,安装也非常方便。 下面介绍一个使用Broadcast插件实现的简单群 Broadcast插件是一个向用户发送广播消息的插件。 安装插件 登录openfire管理控...
  • qqiabc521
  • qqiabc521
  • 2011年07月05日 23:15
  • 5996
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:openfire插件最佳实践(三) 用户加入指定群组功能
举报原因:
原因补充:

(最多只允许输入30个字)