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);
/**
* 创建单个用户
* 同一个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;
}
/**
* 检查用户是否已存在
* 同一个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);
}
/**
* 删除用户
* 同一个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);
}
/**
* 获取聊天记录
* 同一个IP每秒最多可调用1次
*
* @param lastTimestamp 上次最后一条聊天记录的timestamp,如果为空,则使用lastCursor
* @param lastCursor 上次获取聊天记录返回的 cursor
* @return 返回的每个消息里都包含timestamp,cursor
*/
public static List 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 list = new LinkedList();
for(int i=0, length=array.length(); i
* 同一个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 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 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 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;
}
}