PC端 Spark 二次开发 自动接收好友请求并同意

本次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 二次开发 自动接收好友请求并同意

时间: 2024-11-10 12:58:22

PC端 Spark 二次开发 自动接收好友请求并同意的相关文章

Revit 二次开发 自动选中对象

//获取选中对象 [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)] public class setSelectEle : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements) { SetSelectionElement(co

Python自制微信机器人:群发消息、自动接收好友

运营公众号也有半年了,今年5月份开始的,之前一直用一款windows工具来运营自动接受好友请求.群发文章.自动回复等操作,但颇有不便. 举几个场景: 突然在外面看到一篇文章很好,临时写了一篇,想群发一下. 好友加我微信后,每次都要手动备注. 这些使用客户端工具都无法解决,因为客户端工具的一个特点就是native,需要你直接操作电脑,不方便. 所以就想着自己写一个干脆,经过一周漫长的开发(主要是时间太零散了),把第一版定制化微信机器人给完成了,第一版里实现了几个功能: 自动添加好友,并同时根据附加

openfire spark 二次 开发 服务插件

====================  废话 begin   ============================ 最近老大让我为研发平台增加即时通讯功能.告诉我用comet 在web端实现即时通讯. 最初狂搜集资料.不能让自己方向错了.这是很重要的. 不过还是难免的周折了一番.测试了一个comet4j的聊天小例子.用它前后端开发成本太大.对服务器也太大压力放弃了. 最终决定使用openfire +jsjac.js + JabberHTTPBind 然后实现老大要求的 web 及时通讯功

在前端眼中pc端和移动的开发区别

按照昨天所说,本包子今天将总结在前端开发中,pc端和移动端的区别,整理完这些区别,本包子将开始整理pc端的布局,会写实际的代码了,还是那句话,希望文章中有什么不足的地方,大家能多多指正,大家一起进步,成为一个优秀的前端 ~~~ > o < ~~~ PC端和移动端布局的区别 1.pc端没有触摸的各种事件,移动端有:移动端没有鼠标移入移出事件,但是pc端有 2.Pc端最常用的布局是固定宽度为980px(也有960px,1000px,1200px):而在移动端,因为有很多网页是可以横屏看也可以竖屏看

web移动端和PC端利用chrome同步开发调试

利用chrome可以同步移动端和PC端的web开发调试,前提是,Android系统版本必须4.0+,而且必须用chrome,或者Android 4.4系统版本以上的原生app里面的webview才可以. 由于Android 4.4的原生app webview 的调试暂时还比较少,所以,这里简单说一下chrome下的调试. 1.移动设备和PC设备必须安装了chrome 32以上的版本,移动设备必须为Android4.0+: 2.移动设备进入设置功能,设置为开发模式: 3.PC端chrome打开ch

JS判断是wap端访问网站还是PC端访问,然后进行自动跳转的代码

<script type="text/javascript"> function goPAGE() { if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) { windo

关于Finereport移动端报表二次开发的两个小例子

例1:刷新页面 1. 问题描述 A超链至B填报,B提交数据后返回A时,A自动刷新显示新的数据. 2. 解决方案 1. contentPane.setAppearRefresh();  //在A的加载结束后事件中添加js 3. 示例 3.1 打开报表 %FR_HOME%\WebReport\WEB-INF\reportlets\doc\Advanced\mobile-client\ DetailedDrillA.cpt %FR_HOME%\WebReport\WEB-INF\reportlets\

CAD.net二次开发--自动调成图框位置

[CommandMethod("mm")] public void mm() { Database db = HostApplicationServices.WorkingDatabase; Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; TypedValue[] values = new TypedValue[] { new TypedValue((int)DxfCode.LayerName,&quo

PC端数据下载软件开发(Python)

存储工具:阿里云->对象存储 需要将数据从云端下载到本地后再进行后续分析处理. 手动下载 需要下载的文件不多时,可以用这个方式. 依次点击:阿里云->控制台->对象存储->Bucket列表->XX Bucket->文件管理 该界面下,选中数据文件后,点击 批量操作->下载 脚本下载(Python) 按照阿里云的SDK文档(有各种语言的版本,这里选的是Python),可以很快地编写下载脚本: https://help.aliyun.com/document_deta