本次Spark二次开发是为了客服模块的开发, 能让用户一旦点击该客服则直接自己主动加入好友。而客服放则需自己主动加入好友,不同弹出对话框进行允许,这方便的广大客服。

如今废话不多说,直接上代码。

package org.jivesoftware.spark.ui;

import java.util.ArrayList;

import org.jivesoftware.spark.util.log.Log;
import org.jivesoftware.spark.util.ModelUtil;
import org.jivesoftware.resource.Res;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterGroup;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.RosterPacket;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.spark.SparkManager;
import org.jivesoftware.spark.UserManager; /**
* 处理全部订阅请求
* @author jian
*
*/
public class MySubscription {
private String jid;
//构造函数
public MySubscription(){
}
/**
* 调用
* @param jid 主键ID
*/
public void invoke(final String jid){
this.jid=jid;
final Roster roster=SparkManager.getConnection().getRoster();//返回好友冊
//假设用户已经在好友其中,则不显示
RosterEntry entry=roster.getEntry(jid);//返回相应的用户
if(entry!=null&&entry.getType()==RosterPacket.ItemType.to){
Presence response=new Presence(Presence.Type.subscribed);
response.setTo(jid);
SparkManager.getConnection().sendPacket(response);
return;
}
UserManager userManager=SparkManager.getUserManager();
String username=userManager.getNickname(userManager.getFullJID(jid));
username=username==null? StringUtils.parseName(UserManager.unescapeJID(jid)):username;//给usernam赋值
boolean addEntry=addEntry(username);
GetGroupName();
if(addEntry){
Presence response=new Presence(Presence.Type.subscribed);
response.setTo(jid);
SparkManager.getConnection().sendPacket(response);
}
}
/**
* 允许加入好友
*/
private boolean addEntry(String username){
String errorMessage=Res.getString("title.error");
String groupName="Friends"; //获取该用户组是否存在
ContactGroup contactGroup=SparkManager.getWorkspace().getContactList().getContactGroup(groupName);
boolean isSharedGroup = contactGroup!=null&&contactGroup.isSharedGroup();
System.out.println("用户组存在?"+isSharedGroup);
if(isSharedGroup){
errorMessage=Res.getString("message.cannot.add.contact.to.shared.group");
}else if(!ModelUtil.hasLength(username)){
errorMessage=Res.getString("message.specify.contact.jid");
}else if(!ModelUtil.hasLength(groupName)){
errorMessage=Res.getString("message.specify.group");
}else if(ModelUtil.hasLength(username)&&ModelUtil.hasLength(groupName)&&!isSharedGroup){
System.out.println("加入好友");
System.out.println("直接输出Group组:"+groupName);
addEntity(jid, username, groupName);
return true;
}
return false;
} /**
* 把新用户加入到好友名单
* @param jid 账号
* @param username 昵称
* @param groupName 组名
*/
private RosterEntry addEntity(String jid,String username,String groupName){
String[] groups={groupName};
System.out.println("開始加入了哦");
for(int i=0;i<groups.length;i++){
System.out.println(groups[i]);
}
Roster roster=SparkManager.getConnection().getRoster();
RosterEntry userEntry=roster.getEntry(jid);
boolean isSubscribed=true;
if(userEntry!=null){
isSubscribed=userEntry.getGroups().size()==0;
}
if(isSubscribed){
try {
roster.createEntry(jid, username, new String[]{groupName});
} catch (XMPPException e) {
Log.error("不能加入新的好友"+jid,e);
}
return roster.getEntry(jid);
}
try {
RosterGroup rosterGroup=roster.getGroup(groupName);
if(rosterGroup==null){
rosterGroup=roster.createGroup(groupName);
}
if(userEntry==null){
roster.createEntry(jid, username, groups);
userEntry=roster.getEntry(jid);
}else {
userEntry.setName(username);
rosterGroup.addEntry(userEntry);
}
userEntry=roster.getEntry(jid);
} catch (XMPPException ex) {
Log.error(ex);
}
return userEntry;
} private void GetGroupName(){
ArrayList<String> list=new ArrayList<String>();
for(ContactGroup group:SparkManager.getWorkspace().getContactList().getContactGroups()){
if(!group.isOfflineGroup()&&!"Unfiled".equalsIgnoreCase(group.getGroupName())&&!group.isSharedGroup()){
list.add(group.getGroupName());
System.out.println(group.getGroupName());
}
}
}
}

而在加入好友所用的类:org.jivesoftware.spark.ui.SubscriptionDialog.java

而监听并调用的类为:org.jivesoftware.spark.ui.ContactList.java
第2134行

版权声明:本文博客原创文章。博客,未经同意,不得转载。

PC结束 Spark 二次开发 收到自己主动,并允许好友请求的更多相关文章

  1. openfire spark 二次 开发 服务插件

    ====================  废话 begin   ============================ 最近老大让我为研发平台增加即时通讯功能.告诉我用comet 在web端实现即 ...

  2. shop_z 一套非常适合二次开发的php后台管理系统

    QQ群:247823727 如果你需要定制某些功能开联系群主,价格实惠,后期交接完善,有上手培训 shop_z基础thinkphp5  php7上开发运行,速度杠杠的 地址:https://gitee ...

  3. 【基于spark IM 的二次开发笔记】第一天 各种配置

    [基于spark IM 的二次开发笔记]第一天 各种配置 http://juforg.iteye.com/blog/1870487 http://www.igniterealtime.org/down ...

  4. [PC]PHPCMS二次开发指南(上)

    ------------------------------------------------------------------------------------- PHPCMS本身功能已经很完 ...

  5. 大数据笔记(二十八)——执行Spark任务、开发Spark WordCount程序

    一.执行Spark任务: 客户端 1.Spark Submit工具:提交Spark的任务(jar文件) (*)spark提供的用于提交Spark任务工具 (*)example:/root/traini ...

  6. E8.Net 工作流二次开发架构平台

    一.          产品简介 E8.Net工作流开发架构是基于微软.Net技术架构的工作流中间件产品,是国内商业流程管理(BPM)领域在.Net平台上的领先产品,是快速搭建流程管理解决方案的二次开 ...

  7. SVN二次开发——让SVN、TSVN(TortoiseSVN)支持windows的访问控制模型、NTFS ADS(可选数据流、NTFS的安全属性)

    SVN二次开发 ——让SVN.TSVN(TortoiseSVN)支持windows的访问控制模型.NTFS ADS (可选数据流.NTFS的安全属性) SVN secondary developmen ...

  8. Linux内核启动代码分析二之开发板相关驱动程序加载分析

    Linux内核启动代码分析二之开发板相关驱动程序加载分析 1 从linux开始启动的函数start_kernel开始分析,该函数位于linux-2.6.22/init/main.c  start_ke ...

  9. (5)微信二次开发 之 XML格式数据解析

    1.首先理解一下html html的全名是:HyperText Transfer markup language 超级文本标记语言,html本质上是一门标记(符合)语言,在html里,这些标记是事先定 ...

随机推荐

  1. mysql copy复制拷贝表数据及结构的几种方式(转)

    mysql拷贝表操作我们会常常用到,下面就为您详细介绍几种mysql拷贝表的方式,希望对您学习mysql拷贝表方面能够有所帮助.假如我们有以下这样一个表:id username password--- ...

  2. coco2d-x 基于视口的地图设计

    <pre name="code" class="plain"> 基于视口的地图设计 DionysosLai 2014-06-14 第三人称游戏,玩家 ...

  3. 移动应用开发(IOS/android等一下)在一般图像缓存方案评述(附流程图)

    在移动应用开发.我们经常从网络请求到该设备显示遇到的场景图片. 假设多次发动每个请求,废物流.浪费电.: 将图片持久化到磁盘也不失为一种策略:但每次从文件读取图片也存在一定的io开销,就算採用此策略, ...

  4. 在 VS 类库项目中 Add Service References 和 Add Web References 的区别

    原文:在 VS 类库项目中 Add Service References 和 Add Web References 的区别 出身问题: 1.在vs2005时代,Add Web Reference(添加 ...

  5. GUI (图形界面)知识点

    一:组件知识点 JTextField:    作用:  定义文本域,只支持单行输入.                使用:  定义文本域:  JTextField jtf=new JTextField ...

  6. Java知多少(4)J2SE、J2EE、J2ME的区别

    原文:Java知多少(4)J2SE.J2EE.J2ME的区别 1998年12月,SUN公司发布了Java 1.2,开始使用“Java 2” 这一名称,目前我们已经很少使用1.2之前的版本,所以通常所说 ...

  7. GitLab一键式安装bitnami

    https://bitnami.com/stack/gitlab/installer https://bitnami.com/redirect/to/96764/bitnami-gitlab-8.5. ...

  8. SRM 590 DIV1

    转载请注明出处,谢谢viewmode=contents">http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlov ...

  9. 终结者单身——setAccessible(true)

    首先看一下"传说"Singleton模式 package go.derek; public class Singleton{ public static int times; pr ...

  10. Mac下一个svn提交.a文件

    Mac在版本控制工具Versions非常方便.一些库有.a文件必须提交svn,commit它发现被忽略的,不能提交没有这个文件.然后通过设置.VEIW->SHOW IGNORED ITEMS选, ...