All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.anyline.easemob.util.EasemobUtil Maven / Gradle / Ivy

There is a newer version: 8.7.2-20240916
Show newest version
/*
 * Copyright 2006-2023 www.anyline.org
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */




package org.anyline.easemob.util; 
 
import org.anyline.entity.DataRow;
import org.anyline.entity.DataSet;
import org.anyline.net.HttpBuilder;
import org.anyline.net.HttpUtil;
import org.anyline.util.AnylineConfig;
import org.anyline.util.BasicUtil;
import org.anyline.util.BeanUtil;
import org.anyline.util.ConfigTable;
import org.apache.http.HttpEntity;
import org.apache.http.entity.StringEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
 
public class EasemobUtil {
	private static final Logger log = LoggerFactory.getLogger(EasemobUtil.class); 
	private static Hashtable instances = new Hashtable(); 
	private EasemobConfig config = null; 
	private static long access_token_expires = 0; 
 
	 
//	private static final String orgName = EasemobConfig.ORG_NAME; 
//	private static final String appName = EasemobConfig.APP_NAME; 
//	private static final String clientId= EasemobConfig.CLIENT_ID; 
//	private static final String clientSecret = EasemobConfig.CLIENT_SECRET; 
//	private static final String host = EasemobConfig.HOST; 
//	 
	private String baseUrl =""; 
	private String access_token = null;

	static {
		Hashtable configs = EasemobConfig.getInstances();
		for(String key:configs.keySet()){
			instances.put(key, getInstance(key));
		}
	}
	public static Hashtable getInstances(){
		return instances;
	}
 
	public static EasemobUtil getInstance(){
		return getInstance(EasemobConfig.DEFAULT_INSTANCE_KEY);
	} 
	public static EasemobUtil getInstance(String key){
		if(BasicUtil.isEmpty(key)){
			key = EasemobConfig.DEFAULT_INSTANCE_KEY;
		} 
		EasemobUtil util = instances.get(key); 
		if(null == util){
			EasemobConfig config = EasemobConfig.getInstance(key);
			if(null != config) {
				util = new EasemobUtil();
				util.config = config;
				util.baseUrl = config.HOST + "/" + config.ORG_NAME + "/" + config.APP_NAME;
				instances.put(key, util);
			}
		} 
		return util; 
	} 
	 
	public EasemobConfig getConfig() {
		return config; 
	} 

 
	/** 
	 * 注册用户 
	 * @param user  user
	 * @param password  password
	 * @param nickname 昵称 
	 * @return DataRow
	 */ 
	public DataRow reg(String user, String password, String nickname){
		DataRow result = null; 
		String url = baseUrl + "/users"; 
		Map map = new HashMap(); 
		map.put("username", user); 
		map.put("password", password); 
		map.put("nickname", nickname); 
		Map headers = defaultHeader(); 
		headers.put("Content-Type", "application/json"); 
		try {
			HttpEntity entity = new StringEntity(BeanUtil.map2json(map), "UTF-8"); 
			String txt = HttpUtil.post(defaultHeader(), url, "UTF-8", entity).getText(); 
			DataRow row = DataRow.parseJson(txt); 
			if(null != row && row.containsKey("entities")){
				DataSet set = row.getSet("entities"); 
				if(set.size() > 0){
					result = set.getRow(0); 
				} 
			} 
			if(ConfigTable.IS_DEBUG && log.isInfoEnabled()){
				log.info("[reg user][result:{}]",txt);
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
	public DataRow reg(String user, String password){
		return reg(user,password, user); 
	} 
	/** 
	 * 批量注册 
	 * @param list  list
	 * @return DataSet
	 */ 
	public DataSet regs(List> list){
		DataSet result = new DataSet(); 
		StringBuilder json = new StringBuilder(); 
		json.append("["); 
		if(null != list){
			int size = list.size(); 
			for(int i=0; i map = list.get(i); 
				if(i > 0){
					json.append(","); 
				} 
				String nickname = map.get("nickname"); 
				json.append("\"username\":\"").append(map.get("username")) 
				.append("\",\"password\":\"").append(map.get("password")).append("\""); 
				if(BasicUtil.isNotEmpty(nickname)){
					json.append("\"nickname\":\"").append(nickname).append("\""); 
				} 
				json.append("}"); 
			} 
		} 
		json.append("]"); 
		String url = baseUrl + "/users"; 
		Map headers = defaultHeader(); 
		headers.put("Content-Type", "application/json"); 
		try{
			String txt = HttpUtil.post(headers, url,"UTF-8", new StringEntity(json.toString(), "UTF-8")).getText(); 
			DataRow row = DataRow.parseJson(txt); 
			if(null != row && row.containsKey("entities")){
				result = row.getSet("entities"); 
			} 
			if(ConfigTable.IS_DEBUG && log.isInfoEnabled()){
				log.info("[reg users][result:{}]",txt);
			} 
		}catch(Exception e){
			e.printStackTrace(); 
		} 
		return result; 
	} 
	/** 
	 * 修改密码 
	 * @param user  user
	 * @param password  password
	 * @return boolean
	 */ 
	public boolean resetPassword(String user, String password){
		boolean result = false; 
		String url = baseUrl + "/users/"+user+"/password"; 
		Map map = new HashMap(); 
		map.put("newpassword", password); 
		String json = BeanUtil.map2json(map); 
		try {
 
			Map headers = new HashMap(); 
			headers.put("Authorization", "Bearer " + getAccessToken()); 
			String txt = HttpUtil.put(headers, url,"UTF-8", new StringEntity(json, "UTF-8")).getText(); 
			if(ConfigTable.IS_DEBUG && log.isInfoEnabled()){
				log.info("[reset password][json:{}][result:{}]",json,txt);
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		result = true; 
		return result; 
	} 
	/** 
	 * 修改昵称 
	 * @param user  user
	 * @param nickname  nickname
	 * @return DataRow
	 */ 
	public DataRow resetNickname(String user, String nickname){
		DataRow result = null; 
		String url = baseUrl + "/users/"+user; 
		Map map = new HashMap(); 
		map.put("nickname", nickname); 
		try {
			String txt = HttpUtil.put(defaultHeader(), url,"UTF-8", new StringEntity(BeanUtil.map2json(map), "UTF-8")).getText(); 
			result = parseUser(txt); 
			if(ConfigTable.IS_DEBUG && log.isInfoEnabled()){
				log.info("[reset nickname][result:{}]",txt);
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
 
	/** 
	 * 删除用户 
	 * @param user  user
	 * @return boolean
	 */ 
	public boolean delete(String user){
		boolean result = false; 
		String url = baseUrl + "/users/" + user; 
		try {
			String txt = HttpUtil.delete(defaultHeader(),url, "UTF-8").getText(); 
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[delete user][result:{}]",txt); 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		result = true; 
		return result; 
	} 
	/** 
	 * 用户信息 
	 * @param user  user
	 * @return DataRow
	 */ 
	public DataRow getUser(String user){
		DataRow result = new DataRow(); 
		String url = baseUrl +  "/users/" + user; 
		try{
			String txt = HttpBuilder.init()
					.setHeaders(defaultHeader())
					.setUrl(url)
					.build().get().getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[get user][result:{}]",txt); 
			} 
			DataRow row = DataRow.parseJson(txt); 
			if(null != row && row.containsKey("entities")){
				DataSet set = row.getSet("entities"); 
				if(set.size() > 0){
					result = set.getRow(0); 
				} 
			} 
		}catch(Exception e){
			e.printStackTrace(); 
		} 
		return result; 
	} 
	/** 
	 * 批量用户信息 
	 * @param limit  limit
	 * @param cursor 分页游标 
	 * @return DataSet
	 */ 
	public DataSet getUsers(int limit, String cursor){
		DataSet set = new DataSet(); 
		String url = baseUrl +  "/users/"; 
		Map params = new HashMap(); 
		params.put("limit", limit+""); 
		if(BasicUtil.isNotEmpty(cursor)){
			params.put("cursor", cursor); 
		} 
		try{
			String txt = HttpBuilder.init()
					.setHeaders(defaultHeader())
					.setUrl(url)
					.build().get().getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[get user list][result:{}]",txt); 
			} 
			DataRow row = DataRow.parseJson(txt); 
			if(null != row && row.containsKey("entities")){
				set = row.getSet("entities"); 
			} 
		}catch(Exception e){
			e.printStackTrace(); 
		} 
		return set; 
	} 
	public DataSet getUsers(int limit){
		return getUsers(limit, null); 
	} 
	/** 
	 * 添加好友 
	 * @param user  user
	 * @param friend  friend
	 * @return DataRow
	 */ 
	public DataRow addFriend(String user, String friend){
		DataRow result = null; 
		String url = baseUrl + "/users/" + user + "/contacts/users/" + friend; 
		try {
			String txt = HttpUtil.post(defaultHeader(), url).getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[add friend][result:{}]",txt); 
			} 
			result = parseUser(txt); 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
	/** 
	 * 好友列表(只查username) 
	 * @param user  user
	 * @return DataSet
	 */ 
	public DataSet getFriends(String user){
		DataSet result = new DataSet(); 
		String url = baseUrl + "/users/" + user + "/contacts/users"; 
		try {
			String txt = HttpBuilder.init()
					.setHeaders(defaultHeader())
					.setUrl(url)
					.build().get().getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[get friend list][result:{}]",txt); 
			} 
			DataRow json = DataRow.parseJson(txt); 
			if(null != json && json.has("data")){
				List datas = json.getList("data"); 
				for(Object data:datas){
					DataRow row = new DataRow(); 
					row.put("username", data); 
					if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
						log.warn("[get friend][friend username:{}]",data); 
					} 
					result.add(row); 
				} 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
 
	/** 
	 * 删除好友 
	 * @param user  user
	 * @param friend  friend
	 * @return 返回被删除的好友数据 
	 */ 
	public DataRow deleteFriend(String user, String friend){
		DataRow result = null; 
		String url = baseUrl + "/users/" + user + "/contacts/users/" + friend; 
		try {
			String txt = HttpUtil.delete(defaultHeader(), url,"UTF-8").getText(); 
			result = parseUser(txt); 
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[delete friend][result:{}]",txt); 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
 
	/** 
	 * 添加黑名单 
	 * @param user  user
	 * @param block  block
	 * @return DataRow
	 */ 
	public DataRow addBlock(String user, String block){
		DataRow result = null; 
		// 删除好友
		deleteFriend(user, block); 
		String url = baseUrl + "/users/" + user + "/blocks/users"; 
		try {
			String params = "{\"usernames\":[\""+block+"\"]} "; 
			String txt = HttpUtil.post(defaultHeader(), url,"UTF-8", new StringEntity(params, "UTF-8")).getText(); 
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[add blocks][result:{}]",txt); 
			} 
			// 封装添加成功的用户username
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	}
	/**
	 * @param block  block
	 * @return DataSet
	 */
	public DataSet getBlocks(String block){
		DataSet result = new DataSet(); 
		String url = baseUrl + "/users/" + block + "/blocks/users"; 
		try {
			String txt = HttpBuilder.init()
					.setHeaders(defaultHeader())
					.setUrl(url)
					.build().get().getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[get block list][result:{}]",txt); 
			} 
			DataRow json = DataRow.parseJson(txt); 
			if(null != json && json.has("data")){
				List datas = json.getList("data"); 
				for(Object data:datas){
					DataRow row = new DataRow(); 
					row.put("username", data); 
					if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
						log.warn("[get block][block username:{}]",data); 
					} 
					result.add(row); 
				} 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
 
	/** 
	 * 删除黑名单  
	 * @param user  user
	 * @param block  block
	 * @return 返回被删除的黑名单数据 
	 */ 
	public DataRow deleteBlock(String user, String block){
		DataRow result = null; 
		String url = baseUrl + "/users/" + user + "/blocks/users/" + block; 
		try {
			String txt = HttpUtil.delete(defaultHeader(), url,"UTF-8").getText(); 
			result = parseUser(txt); 
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[delete block][result:{}]",txt); 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
	/** 
	 * 在线状态  1:在线 0:离线 
	 * @param user  user
	 * @return String
	 */ 
	public String status(String user){
		String result = "0"; 
		String url = baseUrl + "/users/" + user + "/status"; 
		try {
			String txt = HttpBuilder.init()
					.setHeaders(defaultHeader())
					.setUrl(url)
					.build().get().getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[get user status][result:{}]",txt); 
			} 
			DataRow row = DataRow.parseJson(txt); 
			if(null != row && row.has("data")){
				row = row.getRow("data"); 
				String status = row.getString(user); 
				log.warn("[get user status][status:{}]",status); 
				if("online".equals(status)){
					result = "1"; 
				} 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
	/** 
	 * 离线消息数量 
	 * @param user  user
	 * @return int
	 */ 
	public int offlineMsgCount(String user){
		int result = 0; 
		String url = baseUrl + "/users/" + user + "/offline_msg_count"; 
		try {
			String txt = HttpBuilder.init()
					.setHeaders(defaultHeader())
					.setUrl(url)
					.build().get().getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[get user status][result:{}]",txt); 
			} 
			DataRow row = DataRow.parseJson(txt); 
			if(null != row && row.has("data")){
				row = row.getRow("data"); 
				result = row.getInt(user); 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
 
	/** 
	 * 离线消息状态 
	 * deliverd:表示此用户的该条离线消息已经收到过了 undelivered:表示此用户的该条离线消息还未收到 
	 * @param user  user 
	 * @param msg msg
	 * @return String
	 */ 
	public String offlineMsgStatus(String user, String msg){
		String result = ""; 
		String url = baseUrl + "/users/" + user + "/offline_msg_status/" + msg; 
		try {
			String txt = HttpBuilder.init()
					.setHeaders(defaultHeader())
					.setUrl(url)
					.build().get().getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[get user status][result:{}]",txt); 
			} 
			DataRow row = DataRow.parseJson(txt); 
			if(null != row && row.has("data")){
				row = row.getRow("data"); 
				result = row.getString(msg); 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
	/** 
	 * 禁用帐号 
	 * @param user  user
	 * @return DataRow
	 */ 
	public DataRow deactivate(String user){
		DataRow result = null; 
		String url = baseUrl + "/users/" + user + "/deactivate"; 
		try {
			String txt = HttpUtil.post(defaultHeader(), url).getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[deactivate user][result:{}]",txt); 
			} 
			result = parseUser(txt); 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
	 
	 
 
	/** 
	 * 激活已禁用帐号 
	 * @param user  user
	 */ 
	public void activate(String user){
		String url = baseUrl + "/users/" + user + "/activate"; 
		try {
			String txt = HttpUtil.post(defaultHeader(), url).getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[activate user][result:{}]",txt); 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
	} 
	/** 
	 * 强制用户下线  
	 * @param user  user
	 * @return boolean
	 */ 
	public boolean disconnect(String user){
		boolean result = false; 
		String url = baseUrl + "/users/" + user + "/disconnect"; 
		try {
			String txt = HttpUtil.post(defaultHeader(), url).getText();
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[disconnect user][result:{}]",txt); 
			} 
			DataRow row = DataRow.parseJson(txt); 
			if(null != row && row.has("data")){
				row = row.getRow("data"); 
				if(null != row && row.has("result") && row.getBoolean("result", false)){
					result = true; 
				} 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
	/** 
	 * 消息发送 
	 * @param from  from
	 * @param msg  msg
	 * @param to  to
	 * @return boolean
	 */ 
	public boolean send(String from, String msg, String to){
		boolean result = false; 
		String json = "{\"target_type\":\"users\"," 
				+ "\"target\":[\"" + to + "\"]," 
				+ "\"msg\":{\"type\":\"txt\",\"msg\":\"" + msg + "\"}," 
				+ "\"from\":\""+from+"\"}"; 
		String url = baseUrl + "/messages"; 
		try {
			String txt = HttpUtil.post(defaultHeader(), url,"UTF-8", new StringEntity(json, "UTF-8")).getText(); 
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[send message][result:" + txt + "]"); 
			} 
			DataRow row = DataRow.parseJson(txt); 
			if(null != row && row.has("data")){
				row = row.getRow("data"); 
				if(null != row && row.has(to) && "success".equals(row.getString(to))){
					result = true; 
				} 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
	 
	/** 
	 * 创建群 
	 * @param name 名称 
	 * @param des 描述 
	 * @param pub 是否公开 
	 * @param max 最大人数 
	 * @param approve 是否需要审核 
	 * @param owner 群主 
	 * @return String
	 */ 
	public String createGroup(String name, String des, boolean pub, int max, boolean approve, String owner){
		String result = ""; 
		String url = baseUrl + "/chatgroups"; 
		try {
			Map params = new HashMap(); 
			params.put("groupname", name); 
			params.put("desc", des); 
			params.put("public", ""+pub); 
			params.put("maxusers", ""+max); 
			params.put("approval", ""+approve); 
			params.put("owner", owner); 
			String txt = HttpUtil.post(defaultHeader(), url, "UTF-8", params).getText(); 
			if(ConfigTable.IS_DEBUG && log.isWarnEnabled()){
				log.warn("[create group][result:{}]",txt);
			} 
			DataRow row = DataRow.parseJson(txt); 
			if(null != row && row.has("data")){
				row = row.getRow("data"); 
				if(null != row && row.has("groupid")){
					result = row.getString("groupid"); 
				} 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return result; 
	} 
	/** 
	 * 根据返回值解析用户数据  
	 * @param txt  txt
	 * @return DataRow
	 */ 
	@SuppressWarnings("unchecked")
	private static DataRow parseUser(String txt){
		DataRow user = null; 
		DataRow row = DataRow.parseJson(txt); 
		if(null != row && row.containsKey("entities")){
			Object entitys = row.get("entities"); 
			if(null != entitys && entitys instanceof List){
				List list = (List)entitys; 
				if(list.size()>0){
					user = list.get(0); 
				} 
			} 
		} 
		return user; 
	} 
	 
	 
	 
	 
	 
	private  Map defaultHeader(){
		Map headers = new HashMap(); 
		headers.put("Authorization", "Bearer " + getAccessToken()); 
		headers.put("Content-Type", "application/json"); 
		return headers; 
	} 
	private String getAccessToken(){
		String token = null; 
		if(System.currentTimeMillis()/1000 > access_token_expires){
			token = createNewAccessToken(); 
		}else{
			token = access_token; 
		} 
		return token; 
	} 
	 
	/** 
	 * 创建新token  
	 * @return String
	 */ 
	private String createNewAccessToken(){
		Map headers = new HashMap(); 
		headers.put("Content-Type", "application/json"); 
		Map map = new HashMap(); 
		map.put("grant_type", "client_credentials"); 
		map.put("client_id", config.CLIENT_ID); 
		map.put("client_secret", config.CLIENT_SECRET); 
		try {
			String url = baseUrl + "/token"; 
			String txt = HttpUtil.post(headers, url, "UTF-8", new StringEntity(BeanUtil.map2json(map), "UTF-8")).getText();
			DataRow row = DataRow.parseJson(txt);
			if(row.containsKey("access_token")){
				access_token = row.getString("access_token"); 
			} 
			if(row.containsKey("expires_in")){
				access_token_expires = System.currentTimeMillis()/1000 + row.getLong("expires_in"); 
			} 
		} catch (Exception e) {
			e.printStackTrace(); 
		} 
		return access_token; 
	} 
} 




© 2015 - 2024 Weber Informatics LLC | Privacy Policy