本次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. live555 for Android

    因为Live555 包中未提供Android 的config 所以编译器来比較麻烦,须要自己编写Android.mk ,下面是我通过 改动 现有的config文件,在cygwin实现 编译的过程,co ...

  2. activity点击时各种方法的区别

    用到不同方法时候某些系统有不太一样的情况: public class MainActivity extends Activity { private static String TAG = " ...

  3. ZOJ 2680 Clock()数学

    主题链接:problemId=1680" target="_blank">http://acm.zju.edu.cn/onlinejudge/showProblem ...

  4. 《Linux内核设计与实现》的地址空间读书笔记的过程

    1.核心区域进程包括各种内存对象 种内存对象,比方: 1.可运行文件代码能够包括各种内存映射,称为代码段(text section). 2.可运行文件的已初始化全局变量的内存映射,称为数据段(data ...

  5. GUIForDebug

    package gui; import org.luaj.vm2.Globals; import org.luaj.vm2.LuaValue; import org.luaj.vm2.ast.Chun ...

  6. 阿里巴巴2014年校园招聘(秋季招聘)在线笔试--測试研发project师

    第一部分是单选题:40分钟答题时间. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveG1oMTk1NA==/font/5a6L5L2T/fontsize/ ...

  7. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)

    ---------------------------------------------------------------------------------------------------- ...

  8. Android 角色时间戳

    我是在用MediaRecorder进行录像时发生视频和音频不同步的问题,请教了一些人后感觉应该是没有时间戳,之前一直觉得时间戳就是给用户看的一个数据,查了一下发现不是的,以下是转载的.希望对大家实用: ...

  9. 为什么MVC不是一种设计模式(转)

    MVC(Model-View-Controller)是处理界面应用程序时常用的解决方案,构成了表示层. MVC通过分离模型.视图.控制器在应用程序中的角色,实现界面和业务逻辑的解耦.Model(是OO ...

  10. pragma message任务

    pragma message它是用来告诉程序猿,在编译的程序信息.和outputdebugstr则是告诉程序猿.程序在执行时期的信息. 以下就以一个样例来解说pragma message. 配合#if ...