忽然要实现这样一个功能,完全没头绪还是看一下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 throughreply.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// configurationroom.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// configurationroom.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插件最佳实践(三) 用户加入指定群组功能相关推荐

  1. UX最佳实践:提高用户体验影响力的艺术

    <UX最佳实践:提高用户体验影响力的艺术> 基本信息 原书名:UX Best Practices How to Achieve More Impact with User Experien ...

  2. linux 用户加入次要群组,linux学习笔记之 帐号和群组管理

    /etc/passwd    用户名:用户密码:UID:GID:说明:家目录:使用的shell 1. 账号名称: 就是账号啦!用来对应 UID 的.例如 root 的 UID 对应就是 0 (第三字段 ...

  3. 最佳实践 | 通过用户画像工具确定目标用户

    问题 产品的功能繁多,却无法真正满足任何一种用户的需求 不论什么规模的组织,资源永远是有限的.如果你想覆盖多种用户的需求,产品为很多不同类型的用户而设计,会使产品过于复杂,结果是任何一种用户你都无法真 ...

  4. jquery插件最佳实践之progressbar

    感觉自己以前写得那些jquery小插件,组织形式不是很好.看到jquery官网有一篇关于 jquery plugin最佳实践的文章. 觉得有所收获,就写了个progressbar插件来做个练习. 代码 ...

  5. netease-im网易云通信小程序集成实践+群组功能完善

    在微信里放一个IM,被指定放网易云通信.这次实践是一场非常虐心的体验,虽然集成网易云通信有官方资料参考,也有官方的demo参考,但是踩的坑也不少. 一.不完全是技术问题 消息漫游需要联系商务开通 二. ...

  6. RDS最佳实践(三)—如何制定相关的流程来规范RDS的使用

    上一篇文章中,我们介绍了如何快速的把本地自建的数据库迁移入云,那是不是把数据库迁移到RDS后,用户就什么都不需要做了?比如RDS帮你的数据库做到了高可用,在主库出现down机后能够快速切换到备库,立刻 ...

  7. ASP.NETSpring.NETNHibernate最佳实践(三)——第2章环境准备

    2.1. 开发工具  Microsoft Visual Studio 2005  ASP.NET AJAX Extensions V1.0(http://www.asp.net/ajax/)  ...

  8. 最佳实践 | 助您提升应用的无障碍功能

    某些使用 Android 设备的用户具有不同于他人的无障碍功能需求.为了帮助具有共同的无障碍功能需求的特定人群,Android 框架为开发者创建无障碍服务提供了相关功能,这种服务可将应用的内容呈现给此 ...

  9. 【Redis最佳实践】使用DCS Redis实现排行榜功能

    本节基于华为云DCS Redis实践所编写,用于指导您在以下场景使用DCS Redis实现排行榜功能. 目录 场景介绍 代码示例 实践指导 运行结果 华为云DCS Redis介绍 场景介绍 在网页和A ...

最新文章

  1. linux看测试环境版本,最新版 EOS 在 Ubuntu 18.04.1 LTS 环境上的安装测试教程
  2. [技术文档] 一劳永逸,用USB设备制作多系统引导
  3. selendroid之inspector
  4. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 在 Flutter 端实现 EventChannel 通信 )
  5. jmeter脚本_性能工具之Jmeter脚本python启动
  6. secoclient隧道保活超时或协商超时_推荐:承德市隧道led大屏厂家电话【联丰智慧科技】...
  7. 【离散数学中的数据结构与算法】十 汉诺塔
  8. XML文件结构和基本语法
  9. 使用shell脚本或命令行添加、删除 crontab 定时任务
  10. 监控和审计 Oracle 数据库错误
  11. HT for Web的HTML5树组件延迟加载技术实现
  12. 提升开发者安全的七大可行实践
  13. Android中生成库文件与移除以及导入jar包重复问题
  14. 我被开除了。。只因为看了骂公司的帖子
  15. 第1天学习打卡(Javaweb 邮件发送:原理、发送简单文本邮件、发送带图片和附件邮件、网站注册发送邮件Servlet实现)
  16. C++程序设计之客户消费积分管理
  17. deb软件包管理(二)
  18. 用Python画笑脸
  19. 测量的基准面和基准线
  20. 什么是java线程?java线程模型的组成

热门文章

  1. WordPress固定链接怎么设置为伪静态设置教程
  2. 《计算机组成原理(微课版)》第4章课后习题答案
  3. WampServer 安装教程
  4. 【编译原理】使用Lex将C/C++文件输出为HTML文件
  5. 【bzoj2818】Gcd
  6. 振幅调制器【Multisim】【高频电子线路】
  7. 数字电路要点总结-数模模数转换电路
  8. HDLBits Tb/tff
  9. 02-QNX 进程管理器(转)
  10. 接上篇。隔了很久之后才更新arch,次日又发现两个问题。