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; } }