package com.basic.easemob;
|
|
import java.net.URLEncoder;
|
import java.util.LinkedList;
|
import java.util.List;
|
|
import org.apache.log4j.Logger;
|
import org.json.JSONArray;
|
import org.json.JSONObject;
|
import org.json.JsonUtil;
|
|
import com.basic.easemob.mapper.IMGroup;
|
import com.basic.easemob.mapper.IMMsg;
|
|
/**
|
* 全部的环信IM服务器端接口
|
*
|
* @company 北京贝思科技术有限公司
|
* @author liuyajun, 8384503@qq.com
|
* @date 2016年1月25日
|
* @time 上午11:03:45
|
*/
|
public class IM {
|
public final static String USER_NAME_PREFIX = "EASEMOB_";
|
|
private static final Logger log = Logger.getLogger(IM.class);
|
|
/**
|
* 创建单个用户<br/>
|
* 同一个IP每秒最多可调用30次
|
* @param userName
|
* @param password
|
* @return 新建用户的uuid,为null时,表示新建失败
|
*/
|
public static String createNewUser(String userName, String password) {
|
|
JSONObject data = new JSONObject();
|
data.put("username", userName);
|
data.put("password", password);
|
|
JSONObject resNode = HttpUtil.sendRequest("/users", data);
|
|
if(resNode==null || !resNode.has("entities")
|
|| resNode.getJSONArray("entities").length()==0){
|
return null;
|
}
|
|
JSONArray enty = resNode.getJSONArray("entities");
|
|
String uuid = ((JSONObject)enty.get(0)).getString("uuid");
|
|
log.info("create a easemob user and its uuid is: "+uuid);
|
|
return uuid;
|
}
|
|
/**
|
* 检查用户是否已存在<br/>
|
* 同一个IP每秒最多可调用30次
|
*
|
* @param userName
|
* @return
|
*/
|
public static boolean isUserExists(String userName){
|
JSONObject json = HttpUtil.sendRequest("/users/" + userName,
|
HttpUtil.METHOD_GET, null);
|
|
if(json==null || !json.has("entities")
|
|| json.getJSONArray("entities").length()==0){
|
return false;
|
}
|
|
JSONArray enty = json.getJSONArray("entities");
|
|
String un = ((JSONObject)enty.get(0)).getString("username");
|
return userName.equals(un);
|
}
|
|
/**
|
* 删除用户<br/>
|
* 同一个IP每秒最多可调用30
|
*
|
* @param userName
|
* @return
|
*/
|
public static boolean deleteUser(String userName){
|
JSONObject json = HttpUtil.sendRequest("/users/" + userName,
|
HttpUtil.METHOD_DELETE, null);
|
|
if(json==null || !json.has("entities")
|
|| json.getJSONArray("entities").length()==0){
|
return false;
|
}
|
|
JSONArray enty = json.getJSONArray("entities");
|
|
String un = ((JSONObject)enty.get(0)).getString("username");
|
return userName.equals(un);
|
}
|
|
/**
|
* 获取聊天记录<br/>
|
* 同一个IP每秒最多可调用1次
|
*
|
* @param lastTimestamp 上次最后一条聊天记录的timestamp,如果为空,则使用lastCursor
|
* @param lastCursor 上次获取聊天记录返回的 cursor
|
* @return 返回的每个消息里都包含timestamp,cursor
|
*/
|
public static List<IMMsg> getMsgList(Long lastTimestamp, String lastCursor){
|
|
String url = "/chatmessages";
|
|
//如果没有最后的游标,则使用最后一次时间戳
|
if(lastTimestamp !=null){
|
String q1 = "select * where timestamp>";
|
try{
|
q1 = URLEncoder.encode(q1, IMConfig.ENCODING);
|
}catch(Throwable t){
|
|
}
|
url = url + "?q1=" + q1 + lastTimestamp;
|
|
}else if(lastCursor ==null || lastCursor.trim().length()==0){
|
//没有时间戳,也没有游标,则退出
|
return null;
|
}else if(lastCursor !=null && lastCursor.trim().length()>0){
|
//有游标,使用游标
|
url = url + "?limit=600&cursor=" + lastCursor;
|
}
|
|
JSONObject json = HttpUtil.sendRequest(url, HttpUtil.METHOD_GET, null);
|
|
if(json==null || ! json.has("entities")
|
|| json.getJSONArray("entities").length()==0){
|
return null;
|
}
|
|
String cursor = null;
|
if(json.has("cursor")){
|
cursor = json.getString("cursor");
|
}
|
|
JSONArray array = json.getJSONArray("entities");
|
|
/*
|
* {
|
"uuid" : "f1a67788-c27c-11e5-a894-7ddeedf0f37b",
|
"type" : "chatmessage",
|
"created" : 1453627759061,
|
"modified" : 1453627759061,
|
"timestamp" : 1453627758434,
|
"from" : "wangjiawan",
|
"msg_id" : "154889227023155604",
|
"to" : "153783989620965808",
|
"groupId" : "153783989620965808",
|
"chat_type" : "groupchat",
|
"payload" : {
|
"bodies" : [ {
|
"type" : "txt",
|
"msg" : "为为为为"
|
|
"type" : "img",
|
"url" : "https://a1.easemob.com/bjbasic/x01/chatfiles/397611e0-c34f-11e5-8dd9-e5c2269839ee",
|
"secret" : "OXYR6sNPEeWvSVUzEI50WD6zxCw5EXpodJcLhjxiNvESXscq",
|
"filename" : "ie7.jpg",
|
"thumb" : "https://a1.easemob.com/bjbasic/x01/chatfiles/397611e0-c34f-11e5-8dd9-e5c2269839ee",
|
"thumb_secret" : "",
|
"size" : {
|
"width" : 1372,
|
"height" : 1182
|
}
|
} ],
|
"ext" : { }
|
}
|
}
|
*/
|
List<IMMsg> list = new LinkedList<IMMsg>();
|
for(int i=0, length=array.length(); i<length; i++){
|
JSONObject row = array.getJSONObject(i);
|
String chatType = row.getString("chat_type");
|
long timestamp = row.getLong("timestamp");
|
String from = row.getString("from");
|
String msgId = row.getString("msg_id");
|
String to = row.getString("to");
|
|
JSONObject payload = row.getJSONObject("payload");
|
String ext = JsonUtil.getString(payload, "ext");
|
|
JSONObject body = payload.getJSONArray("bodies").getJSONObject(0);
|
String msgType = body.getString("type");
|
String msgContent = JsonUtil.getString(body, "msg");
|
|
String mediaUrl = JsonUtil.getString(body, "url");
|
String mediaSecret = JsonUtil.getString(body, "secret");
|
String mediaFileName = JsonUtil.getString(body, "filename");
|
|
int mediaLength = 0;
|
try{
|
mediaLength = body.getInt("length");
|
}catch(Throwable t){
|
}
|
|
String addr = "";
|
double addrLat = 0;
|
double addrLng = 0;
|
try{
|
addr = body.getString("addr");
|
}catch(Throwable t){
|
|
}
|
try{
|
addrLat = body.getDouble("lat");
|
}catch(Throwable t){
|
|
}
|
try{
|
addrLng = body.getDouble("lng");
|
}catch(Throwable t){
|
|
}
|
|
IMMsg msg = new IMMsg();
|
msg.setMsgId(msgId);
|
msg.setChatType(chatType);
|
msg.setFrom(from);
|
msg.setTo(to);
|
msg.setTimestamp(timestamp);
|
msg.setMsgType(msgType);
|
msg.setMsgContent(msgContent);
|
msg.setLength(mediaLength);
|
msg.setUrl(mediaUrl);
|
msg.setSecret(mediaSecret);
|
msg.setFileName(mediaFileName);
|
msg.setAddr(addr);
|
msg.setAddrLat(addrLat);
|
msg.setAddrLng(addrLng);
|
msg.setExt(ext);
|
msg.setCursor(cursor);
|
list.add(msg);
|
}
|
|
return list;
|
}
|
|
/**
|
* 获取群组<br/>
|
* 同一个IP每秒最多可调用30次
|
*
|
* @param groupName
|
* @return
|
*/
|
public static IMGroup getGroupById(String groupId) {
|
JSONObject json = HttpUtil.sendRequest("/chatgroups/"+groupId,
|
HttpUtil.METHOD_GET, null);
|
/*
|
* "data" : [ {
|
"membersonly" : false,
|
"allowinvites" : true,
|
"public" : false,
|
"name" : "test",
|
"description" : "test",
|
"affiliations" : [ {
|
"owner" : "liuyar"
|
}, {
|
"member" : "wangjiawan"
|
} ],
|
"id" : "153783989620965808",
|
"maxusers" : 1000,
|
"affiliations_count" : 2
|
} ]
|
*/
|
if(json==null ||
|
! json.has("data") || json.getJSONArray("data").length()==0){
|
return null;
|
}
|
|
JSONObject data = json.getJSONArray("data").getJSONObject(0);
|
|
String ownerUserName = null;
|
if(data.has("affiliations") && data.getJSONArray("affiliations").length()>0){
|
JSONArray affiliations = data.getJSONArray("affiliations");
|
for(int i=0, size=affiliations.length(); i<size; i++) {
|
JSONObject subAffi =affiliations.getJSONObject(i);
|
if(subAffi.has("owner")){
|
ownerUserName = subAffi.getString("owner");
|
break;
|
}
|
}
|
}
|
|
String id = data.getString("id");
|
String name = data.getString("name");
|
|
int maxUsers = 0;
|
try{
|
maxUsers = data.getInt("maxusers");
|
}catch(Throwable t){
|
|
}
|
|
String desc = null;
|
try{
|
desc = data.getString("description");
|
}catch(Throwable t){
|
|
}
|
|
IMGroup group = new IMGroup();
|
group.setGroupId(id);
|
group.setGroupName(name);
|
group.setGroupDesc(desc);
|
group.setMaxUsers(maxUsers);
|
group.setOwnerUserName(ownerUserName);
|
|
return group;
|
}
|
|
/**
|
* 创建群组,如果群组名称已存在,则返回已存在群组
|
*
|
* @param groupName
|
* @param groupDesc
|
* @param ownerUserName
|
* @param maxUsers
|
* @param members
|
* @return
|
*/
|
public static IMGroup createGroup(String groupName, String groupDesc,
|
String ownerUserName, int maxUsers, List<String> members) {
|
groupName = groupName.replace("/", "_");
|
groupDesc = groupDesc.replace("/", "_");
|
groupDesc = groupDesc.replace(" ", "+");
|
|
/*
|
* Path : /{org_name}/{app_name}/chatgroups
|
HTTP Method : POST
|
URL Params : 无
|
Request Headers : {“Authorization”:”Bearer ${token}”}
|
Request Body :
|
{
|
"groupname":"testrestgrp12", //群组名称, 此属性为必须的
|
"desc":"server create group", //群组描述, 此属性为必须的
|
"public":true, //是否是公开群, 此属性为必须的
|
"maxusers":300, //群组成员最大数(包括群主), 值为数值类型,默认值200,此属性为可选的
|
"approval":true, //加入公开群是否需要批准, 默认值是false(加如公开群不需要群主批准), 此属性为必选的,私有群必须为true
|
"owner":"jma1", //群组的管理员, 此属性为必须的
|
"members":["jma2","jma3"] //群组成员,此属性为可选的,但是如果加了此项,数组元素至少一个(注:群主jma1不需要写入到members里面)
|
}
|
*/
|
|
JSONObject data = new JSONObject();
|
data.put("groupname", groupName);
|
data.put("desc", groupDesc);
|
data.put("public", false);
|
data.put("maxusers", maxUsers);
|
data.put("approval", true);
|
data.put("owner", ownerUserName);
|
|
if(members !=null && members.size()>0){
|
JSONArray ma = new JSONArray();
|
for(String userName : members){
|
ma.put(userName);
|
}
|
|
data.put("members", ma);
|
}
|
|
JSONObject json = HttpUtil.sendRequest("/chatgroups", data);
|
/*
|
* "data" : {
|
"groupid" : "155539808804930172"
|
},
|
*/
|
if(json ==null || ! json.has("data")
|
|| !json.getJSONObject("data").has("groupid")){
|
return null;
|
}
|
|
String groupId = json.getJSONObject("data").getString("groupid");
|
|
IMGroup group = new IMGroup();
|
group.setGroupId(groupId);
|
group.setGroupName(groupName);
|
group.setGroupDesc(groupDesc);
|
group.setMaxUsers(maxUsers);
|
group.setOwnerUserName(ownerUserName);
|
|
return group;
|
}
|
|
/**
|
* 已groupId为主键,修改群组信息
|
* @param group
|
* @return
|
*/
|
public static boolean modifyGroup(IMGroup group){
|
String groupName = group.getGroupName();
|
String groupDesc = group.getGroupDesc();
|
|
groupName = groupName==null?null:groupName.replace("/", "_");
|
groupDesc = groupDesc==null?null:groupDesc.replace("/", "_");
|
groupDesc = groupDesc==null?null:groupDesc.replace(" ", "+");
|
|
/*
|
* Path : /{org_name}/{app_name}/chatgroups/{group_id}
|
HTTP Method : PUT
|
URL Params : 无
|
Request Headers : {“Authorization”:”Bearer ${token}”}
|
Request Body :
|
{
|
"groupname":"testrestgrp12", //群组名称,修改时值不能包含斜杠("/")
|
"description":"update+groupinfo", //群组描述,修改时值不能包含斜杠("/")。有空格时需要用“+”代替。
|
"maxusers":300, //群组成员最大数(包括群主), 值为数值类型
|
}
|
*/
|
JSONObject data = new JSONObject();
|
if(groupName !=null && groupName.trim().length()>0){
|
data.put("groupname", groupName);
|
}
|
if(groupDesc !=null && groupDesc.trim().length()>0){
|
data.put("description", groupDesc);
|
}
|
if(group.getMaxUsers()>1){
|
data.put("maxusers", group.getMaxUsers());
|
}
|
|
JSONObject ret = HttpUtil.sendRequest(
|
"/chatgroups/"+group.getGroupId(),
|
HttpUtil.METHOD_PUT, data);
|
/*
|
* "data" : {
|
"maxusers" : true,
|
"groupname" : true,
|
"description" : true
|
},
|
|
*/
|
if(ret !=null && ret.has("data")
|
&& ret.getJSONObject("data").length()>0){
|
return true;
|
}
|
|
return false;
|
}
|
|
/**
|
* 删除群组
|
* @param groupId
|
* @return
|
*/
|
public static boolean deleteGroup(String groupId){
|
JSONObject ret = HttpUtil.sendRequest(
|
"/chatgroups/"+groupId,
|
HttpUtil.METHOD_DELETE, null);
|
/*
|
* "data" : {
|
"success" : true,
|
"groupid" : "1411527886490154"
|
},
|
|
*/
|
if(ret !=null && ret.has("data")
|
&& ret.getJSONObject("data").has("success")
|
&& ret.getJSONObject("data").getBoolean("success")){
|
return true;
|
}
|
|
return false;
|
}
|
|
/**
|
* 转让群
|
* @param groupId
|
* @param newOwnerUserName
|
* @return
|
*/
|
public static boolean changeGroupOwner(String groupId, String newOwnerUserName) {
|
/*
|
* Path : /{org_name}/{app_name}/chatgroups/{groupid}
|
HTTP Method : PUT
|
URL Params : 无
|
Request Headers : {“Content-Type”:“application/json”,“Authorization”:“Bearer ${token}”}
|
Request Body : {“newowner”:“${new_owner_user}”}
|
Response Body : 详情参见示例返回值, 返回的json数据中会包含除上述属性之外的一些其他信息,均可以忽略。
|
可能的错误码:
|
*/
|
JSONObject data = new JSONObject();
|
data.put("newowner", newOwnerUserName);
|
|
JSONObject json = HttpUtil.sendRequest("/chatgroups/"+groupId,
|
HttpUtil.METHOD_PUT, data);
|
/*
|
* "data": {
|
"newowner": true
|
}
|
*/
|
if(json!=null
|
&& json.has("data")
|
&& json.getJSONObject("data").has("newowner")
|
&& json.getJSONObject("data").getBoolean("newowner")){
|
return true;
|
}
|
return false;
|
}
|
|
/**
|
* 增加群成员
|
* @param groupId
|
* @param members
|
* @return
|
*/
|
public static boolean addGroupMembers(String groupId, List<String> members){
|
if(members==null || members.size()==0){
|
return false;
|
}
|
/*
|
* Path : /{org_name}/{app_name}/chatgroups/{chatgroupid}/users
|
HTTP Method : POST
|
URL Params : 无
|
Request Headers : {“Authorization”:”Bearer ${token}”}
|
Request Body :{“usernames”:[“username1”,”username2”]}’ — usernames固定属性,作为json的KEY;username1/username2 要添加到群中的成员用户名,可变
|
|
*/
|
JSONArray names = new JSONArray();
|
for(String name : members){
|
names.put(name);
|
}
|
JSONObject data = new JSONObject();
|
data.put("usernames", names);
|
|
JSONObject json = HttpUtil.sendRequest("/chatgroups/"+groupId+"/users",
|
data);
|
/*
|
* "data" : {
|
"newmembers" : [ "5cxhactgdj", "mh2kbjyop1" ],
|
"action" : "add_member",
|
"groupid" : "1411816013089"
|
},
|
*/
|
if(json!=null && json.has("data")
|
&& json.getJSONObject("data").has("groupid")){
|
return true;
|
}
|
return false;
|
}
|
|
public static boolean removeGroupMembers(String groupId, List<String> members){
|
if(members==null || members.size()==0){
|
return false;
|
}
|
/*
|
* Path : /{org_name}/{app_name}/chatgroups/{group_id}/users/memeber1,member2,member3
|
HTTP Method : DELETE
|
URL Params : 无
|
Request Headers : {“Content-Type”:“application/json”,“Authorization”:“Bearer ${token}”}
|
Request Body : 无
|
|
*/
|
StringBuffer memStr = new StringBuffer();
|
for(String mem : members){
|
memStr.append(",").append(mem);
|
}
|
memStr.deleteCharAt(0);
|
|
JSONObject json = HttpUtil.sendRequest(
|
"/chatgroups/"+groupId+"/users/"+memStr.toString(),
|
HttpUtil.METHOD_DELETE, null);
|
/*
|
* "data": [
|
{
|
"result": false,
|
"action": "remove_member",
|
"reason": "user ttestuser0015981 doesn't exist.",
|
"user": "user1",
|
"groupid": "1433492852257879"
|
},
|
|
*/
|
if(json!=null && json.has("data")
|
&& json.getJSONArray("data").length()>0){
|
return true;
|
}
|
return false;
|
}
|
}
|