Compare commits

...
14 Commits
29 changed files with 539 additions and 121 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
<relativePath>../</relativePath> <relativePath>../</relativePath>
<artifactId>wildfirechat-parent</artifactId> <artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId> <groupId>cn.wildfirechat</groupId>
<version>1.1.4</version> <version>1.1.7</version>
</parent> </parent>
<artifactId>moquette-broker</artifactId> <artifactId>moquette-broker</artifactId>
@@ -12,9 +12,11 @@ package cn.wildfirechat.push;
public class PushMessage { public class PushMessage {
public String sender; public String sender;
public String senderName; public String senderName;
public String senderPortrait;
public int convType; public int convType;
public String target; public String target;
public String targetName; public String targetName;
public String targetPortrait;
public String userId; public String userId;
public int line; public int line;
public int cntType; public int cntType;
@@ -34,12 +36,14 @@ public class PushMessage {
public String language; public String language;
public long messageId; public long messageId;
public PushMessage(String sender, int conversationType, String target, int line, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionedType, boolean isHiddenDetail, String language) { public PushMessage(String sender, int conversationType, String target, int line, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionedType, boolean isHiddenDetail, String language) {
this.sender = sender; this.sender = sender;
this.convType = conversationType; this.convType = conversationType;
this.target = target; this.target = target;
this.senderName = senderName; this.senderName = senderName;
this.senderPortrait = senderPortrait;
this.targetName = targetName; this.targetName = targetName;
this.targetPortrait = targetPortrait;
this.line = line; this.line = line;
this.cntType = messageContentType; this.cntType = messageContentType;
this.serverTime = serverTime; this.serverTime = serverTime;
@@ -0,0 +1,59 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetUserInfo;
import cn.wildfirechat.pojos.InputGetUserList;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.OutputGetUserList;
import cn.wildfirechat.proto.WFCMessage;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.util.internal.StringUtil;
import java.util.ArrayList;
import java.util.List;
@Route(APIPath.User_Get_All)
@HttpMethod("POST")
public class GetAllUserAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetUserList input = getRequestBody(request.getNettyRequest(), InputGetUserList.class);
if (input != null && input.count > 0 && input.offset >= 0) {
List<WFCMessage.User> users = messagesStore.getUserInfoList(input.count, input.offset);
OutputGetUserList outputGetUserList = new OutputGetUserList();
outputGetUserList.userInfoList = new ArrayList<>();
for (WFCMessage.User user : users) {
outputGetUserList.userInfoList.add(InputOutputUserInfo.fromPbUser(user));
}
RestResult result = RestResult.ok(outputGetUserList);
setResponseContent(result, response);
} else {
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
}
}
return true;
}
}
@@ -25,6 +25,9 @@ import io.netty.util.internal.StringUtil;
import cn.wildfirechat.common.ErrorCode; import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic; import win.liyufan.im.IMTopic;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
@Route(APIPath.Msg_Recall) @Route(APIPath.Msg_Recall)
@HttpMethod("POST") @HttpMethod("POST")
public class RecallMessageAction extends AdminAction { public class RecallMessageAction extends AdminAction {
@@ -42,10 +45,9 @@ public class RecallMessageAction extends AdminAction {
WFCMessage.INT64Buf idBuf = WFCMessage.INT64Buf.newBuilder().setId(recallMessageData.getMessageUid()).build(); WFCMessage.INT64Buf idBuf = WFCMessage.INT64Buf.newBuilder().setId(recallMessageData.getMessageUid()).build();
sendApiMessage(response, recallMessageData.getOperator(), IMTopic.RecallMessageTopic, idBuf.toByteArray(), result -> { sendApiMessage(response, recallMessageData.getOperator(), IMTopic.RecallMessageTopic, idBuf.toByteArray(), result -> {
ByteBuf byteBuf = Unpooled.buffer(); ErrorCode errorCode = ErrorCode.fromCode(result[0]);
byteBuf.writeBytes(result); byte[] data = Arrays.copyOfRange(result,1, result.length);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte()); return new Result(errorCode, new String(data, StandardCharsets.UTF_8));
return new Result(errorCode);
}); });
return false; return false;
} else { } else {
@@ -0,0 +1,23 @@
package io.moquette.imhandler;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.IMTopic;
import java.util.List;
@Handler(IMTopic.ListenedChannelListTopic)
public class ChannelListenedListHandler extends IMHandler<Void> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, Void request, Qos1PublishHandler.IMCallback callback) {
List<String> channelInfoList = m_messagesStore.getListenedChannels(fromUser);
WFCMessage.IDListBuf.Builder builder = WFCMessage.IDListBuf.newBuilder();
builder.addAllId(channelInfoList);
byte[] data = builder.build().toByteArray();
ackPayload.ensureWritable(data.length).writeBytes(data);
return ErrorCode.ERROR_CODE_SUCCESS;
}
}
@@ -23,7 +23,7 @@ public class RecallMessageHandler extends IMHandler<WFCMessage.INT64Buf> {
@Override @Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.INT64Buf int64Buf, Qos1PublishHandler.IMCallback callback) { public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.INT64Buf int64Buf, Qos1PublishHandler.IMCallback callback) {
boolean isAdmin = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Admin; boolean isAdmin = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Admin;
ErrorCode errorCode = m_messagesStore.recallMessage(int64Buf.getId(), fromUser, clientID, isAdmin); ErrorCode errorCode = m_messagesStore.recallMessage(int64Buf.getId(), fromUser, clientID, isAdmin, ackPayload);
if(errorCode != ErrorCode.ERROR_CODE_SUCCESS) { if(errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
return errorCode; return errorCode;
@@ -39,6 +39,7 @@ import static cn.wildfirechat.common.IMExceptionEvent.EventType.RDBS_Exception;
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent; import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE; import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*; import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*;
import static win.liyufan.im.UserSettingScope.kUserSettingPrivacySearchable;
public class DatabaseStore { public class DatabaseStore {
private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class); private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class);
@@ -161,18 +162,12 @@ public class DatabaseStore {
} }
return null; return null;
} }
//searchType
// 0 模糊匹配displayName, 精确匹配账户名和电话号码 List<WFCMessage.User> searchUserByNameMobile(String keyword, int searchType) {
// 1 精确匹配账户名和电话号码 ArrayList<WFCMessage.User> out = new ArrayList<>();
// 2 精确匹配账户名
// 3 精确匹配电话号码
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
Connection connection = null; Connection connection = null;
PreparedStatement statement = null; PreparedStatement statement = null;
ResultSet rs = null; ResultSet rs = null;
ArrayList<WFCMessage.User> out = new ArrayList<>();
try { try {
connection = DBUtil.getConnection(); connection = DBUtil.getConnection();
String sql = "select `_uid`, `_name`" + String sql = "select `_uid`, `_name`" +
@@ -185,61 +180,34 @@ public class DatabaseStore {
", `_company`" + ", `_company`" +
", `_social`" + ", `_social`" +
", `_extra`" + ", `_extra`" +
", `_dt` from t_user"; ", `_dt`, `_type` from t_user";
switch (searchType) {
case SearchUserType_Name_Mobile:
sql += " where (`_name` = ? or `_mobile` = ?) ";
break;
case SearchUserType_Name:
sql += " where `_name` = ? ";
break;
case SearchUserType_Mobile:
sql += " where `_mobile` = ? ";
break;
case SearchUserType_General:
default:
sql += " where (`_display_name` like ? or `_name` = ? or `_mobile` = ?) ";
break;
}
if(searchType == SearchUserType_Name) {
sql += " where `_name` = ? ";
} else if(searchType == SearchUserType_Mobile) {
sql += " where `_mobile` = ? ";
} else {
sql += " where (`_name` = ? or `_mobile` = ?) ";
}
sql += " and `_type` <> 2 and `_deleted` = 0"; //can search normal user(0) and robot(1) and admin(100), can not search things sql += " and `_type` <> 2 and `_deleted` = 0"; //can search normal user(0) and robot(1) and admin(100), can not search things
if (searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) { if(searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) {
sql += " limit 1"; sql += " limit 1";
} else { } else {
sql += " limit 20"; sql += " limit 2";
}
if (page > 0) {
sql += " offset " + page * 20;
} }
statement = connection.prepareStatement(sql); statement = connection.prepareStatement(sql);
int index = 1; statement.setString(1, keyword);
if(searchType != SearchUserType_Name && searchType != SearchUserType_Mobile) {
switch (searchType) { statement.setString(2, keyword);
case SearchUserType_Name_Mobile:
statement.setString(index++, keyword);
statement.setString(index++, keyword);
break;
case SearchUserType_Name:
case SearchUserType_Mobile:
statement.setString(index++, keyword);
break;
case SearchUserType_General:
default:
statement.setString(index++, "%" + keyword + "%");
statement.setString(index++, keyword);
statement.setString(index++, keyword);
break;
} }
rs = statement.executeQuery(); rs = statement.executeQuery();
while (rs.next()) { while (rs.next()) {
WFCMessage.User.Builder builder = WFCMessage.User.newBuilder(); WFCMessage.User.Builder builder = WFCMessage.User.newBuilder();
index = 1; int index = 1;
String value = rs.getString(index++); String value = rs.getString(index++);
value = (value == null ? "" : value); value = (value == null ? "" : value);
@@ -287,6 +255,9 @@ public class DatabaseStore {
long longValue = rs.getLong(index++); long longValue = rs.getLong(index++);
builder.setUpdateDt(longValue); builder.setUpdateDt(longValue);
int type = rs.getInt(index++);
builder.setType( type);
WFCMessage.User user = builder.build(); WFCMessage.User user = builder.build();
out.add(user); out.add(user);
@@ -298,6 +269,171 @@ public class DatabaseStore {
} finally { } finally {
DBUtil.closeDB(connection, statement, rs); DBUtil.closeDB(connection, statement, rs);
} }
List<WFCMessage.User> filter = new ArrayList<>();
for (WFCMessage.User user : out) {
WFCMessage.UserSettingEntry userSettingEntry = Server.getServer().getStore().messagesStore().getUserSetting(user.getUid(), kUserSettingPrivacySearchable, null);
if(userSettingEntry != null) {
int value = 0;
try {
value = StringUtil.isNullOrEmpty(userSettingEntry.getValue())?0:Integer.parseInt(userSettingEntry.getValue());
} catch (NumberFormatException e) {
e.printStackTrace();
}
if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0) {
if (searchType == SearchUserType_Name) {
filter.add(user);
continue;
} else if(searchType != SearchUserType_Mobile) {
if(keyword.equals(user.getName())) {
if(!keyword.equals(user.getMobile())) {
filter.add(user);
continue;
} else if((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) {
filter.add(user);
continue;
}
}
}
}
if ((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) {
if (searchType == SearchUserType_Mobile) {
filter.add(user);
} else if(searchType != SearchUserType_Name) {
if(keyword.equals(user.getMobile()) && !keyword.equals(user.getName())) {
filter.add(user);
}
}
}
}
}
out.removeAll(filter);
return out;
}
List<WFCMessage.User> searchUserByDisplayName(String keyword, int page, List<WFCMessage.User> nameOrIdMatched) {
Connection connection = null;
PreparedStatement statement = null;
ResultSet rs = null;
ArrayList<WFCMessage.User> out = new ArrayList<>();
try {
connection = DBUtil.getConnection();
String sql = "select u._uid, u._name, u._display_name, u._portrait, u._mobile, u._gender, u._email, u._address, u._company, u._social, u._extra, u._dt, u._type " +
" from t_user u left join (select _uid, _value from t_user_setting where _scope = 27) s on u._uid = s._uid " +
" where u._display_name like ? and u._type <> 2 and u._deleted = 0 ";
if(nameOrIdMatched.size() == 1) {
sql += " and u._uid <> ? and u._name <> ?";
} else if(nameOrIdMatched.size() == 2) {
sql += " and u._uid <> ? and u._uid <>? and u._name <> ? and u._name <>? ";
}
sql += " and (s._value is null or (s._value <> 1 and s._value <> 3 and s._value <> 5 and s._value <> 7)) limit ";
if(page == 0) {
sql += (20 - nameOrIdMatched.size());
} else {
sql += 20;
}
if (page > 0) {
sql += " offset " + (page * 20 - nameOrIdMatched.size());
}
statement = connection.prepareStatement(sql);
statement.setString(1, "%" + keyword + "%");
if(nameOrIdMatched.size() == 1) {
statement.setString(2, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
statement.setString(3, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
} else if(nameOrIdMatched.size() == 2) {
statement.setString(2, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
statement.setString(3, nameOrIdMatched.toArray(new WFCMessage.User[0])[1].getUid());
statement.setString(4, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
statement.setString(5, nameOrIdMatched.toArray(new WFCMessage.User[0])[1].getUid());
}
rs = statement.executeQuery();
while (rs.next()) {
WFCMessage.User.Builder builder = WFCMessage.User.newBuilder();
int index = 1;
String value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setUid(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setName(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setDisplayName(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setPortrait(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setMobile(value);
int gender = rs.getInt(index++);
builder.setGender(gender);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setEmail(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setAddress(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setCompany(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setSocial(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setExtra(value);
long longValue = rs.getLong(index++);
builder.setUpdateDt(longValue);
int type = rs.getInt(index++);
builder.setType(type);
WFCMessage.User user = builder.build();
out.add(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
DBUtil.closeDB(connection, statement, rs);
}
return out;
}
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
List<WFCMessage.User> nameOrIdMatched = searchUserByNameMobile(keyword, searchType);
List<WFCMessage.User> out = new ArrayList<>();
if(page == 0) {
out.addAll(nameOrIdMatched);
}
if(searchType == SearchUserType_General) {
List<WFCMessage.User> general = searchUserByDisplayName(keyword, page, nameOrIdMatched);
general.removeAll(nameOrIdMatched);
out.addAll(general);
}
return out; return out;
} }
@@ -2640,6 +2776,103 @@ public class DatabaseStore {
return null; return null;
} }
List<WFCMessage.User> getAllUsers(int count, int offset) {
Connection connection = null;
PreparedStatement statement = null;
ResultSet rs = null;
List<WFCMessage.User> outList = new ArrayList<>();
try {
connection = DBUtil.getConnection();
String sql = "select `_uid`, `_name`" +
", `_display_name`" +
", `_portrait`" +
", `_mobile`" +
", `_gender`" +
", `_email`" +
", `_address`" +
", `_company`" +
", `_social`" +
", `_extra`" +
", `_type`" +
", `_deleted`" +
", `_dt` from t_user where `_deleted` = 0 order by _createTime limit ? offset ?";
statement = connection.prepareStatement(sql);
int index = 1;
statement.setInt(1, count);
statement.setInt(2, offset);
rs = statement.executeQuery();
while (rs.next()) {
WFCMessage.User.Builder builder = WFCMessage.User.newBuilder();
index = 1;
String value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setUid(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setName(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setDisplayName(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setPortrait(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setMobile(value);
int gender = rs.getInt(index++);
builder.setGender(gender);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setEmail(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setAddress(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setCompany(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setSocial(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setExtra(value);
int type = rs.getInt(index++);
builder.setType(type);
int deleted = rs.getInt(index++);
builder.setDeleted(deleted);
long longValue = rs.getLong(index++);
if(longValue <= 0)
longValue = 1;
builder.setUpdateDt(longValue);
outList.add(builder.build());
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
DBUtil.closeDB(connection, statement, rs);
}
return outList;
}
Set<String> getAllEnds() { Set<String> getAllEnds() {
Connection connection = null; Connection connection = null;
PreparedStatement statement = null; PreparedStatement statement = null;
@@ -35,6 +35,7 @@ import io.moquette.spi.IMessagesStore;
import io.moquette.spi.impl.security.AES; import io.moquette.spi.impl.security.AES;
import io.moquette.spi.security.Tokenor; import io.moquette.spi.security.Tokenor;
import io.moquette.spi.impl.subscriptions.Topic; import io.moquette.spi.impl.subscriptions.Topic;
import io.netty.buffer.ByteBuf;
import io.netty.handler.codec.mqtt.MqttVersion; import io.netty.handler.codec.mqtt.MqttVersion;
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.digest.DigestUtils;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
@@ -44,6 +45,7 @@ import win.liyufan.im.*;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -810,7 +812,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} }
if (bundle.getMessage().getContent().getExpireDuration() > 0) { if (bundle.getMessage().getContent().getExpireDuration() > 0) {
if (System.currentTimeMillis() > bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration()*1000) { if (System.currentTimeMillis() > bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration()* 1000L) {
continue; continue;
} }
} }
@@ -2177,7 +2179,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} }
@Override @Override
public ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin) { public ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin, ByteBuf ackPayload) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<Long, MessageBundle> mIMap = hzInstance.getMap(MESSAGES_MAP); IMap<Long, MessageBundle> mIMap = hzInstance.getMap(MESSAGES_MAP);
@@ -2303,6 +2305,7 @@ public class MemoryMessagesStore implements IMessagesStore {
databaseStore.deleteMessage(messageUid); databaseStore.deleteMessage(messageUid);
mIMap.put(messageUid, messageBundle, 7, TimeUnit.DAYS); mIMap.put(messageUid, messageBundle, 7, TimeUnit.DAYS);
ackPayload.writeBytes(recalledContent.getBytes(StandardCharsets.UTF_8));
return ErrorCode.ERROR_CODE_SUCCESS; return ErrorCode.ERROR_CODE_SUCCESS;
} else { } else {
return ErrorCode.ERROR_CODE_NOT_EXIST; return ErrorCode.ERROR_CODE_NOT_EXIST;
@@ -2764,6 +2767,12 @@ public class MemoryMessagesStore implements IMessagesStore {
String userId = databaseStore.getUserIdByMobile(mobile); String userId = databaseStore.getUserIdByMobile(mobile);
return getUserInfo(userId); return getUserInfo(userId);
} }
@Override
public List<WFCMessage.User> getUserInfoList(int count, int offset) {
return databaseStore.getAllUsers(count, offset);
}
@Override @Override
public List<WFCMessage.User> searchUser(String keyword, int searchType, int page) { public List<WFCMessage.User> searchUser(String keyword, int searchType, int page) {
if (mDisableSearch) { if (mDisableSearch) {
@@ -3101,27 +3110,16 @@ public class MemoryMessagesStore implements IMessagesStore {
} }
} }
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS); FriendData friendData1 = getFriendData(userId, request.getTargetUid());
FriendData friendData1 = null;
Collection<FriendData> friendDatas = friendsMap.get(userId);
if (friendDatas == null || friendDatas.size() == 0) {
friendDatas = loadFriend(friendsMap, userId);
}
for (FriendData fd : friendDatas) {
if (fd.getFriendUid().equals(request.getTargetUid())) {
friendData1 = fd;
break;
}
}
if (friendData1 != null && friendData1.getBlacked() > 0 && !isAdmin) {
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
}
if (friendData1 != null && friendData1.getState() == 0) { if (friendData1 != null && friendData1.getState() == 0) {
return ErrorCode.ERROR_CODE_ALREADY_FRIENDS; return ErrorCode.ERROR_CODE_ALREADY_FRIENDS;
} }
FriendData friendData2 = getFriendData(request.getTargetUid(), userId);
if (friendData2 != null && friendData2.getBlacked() > 0 && !isAdmin) {
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
}
WFCMessage.FriendRequest newRequest = WFCMessage.FriendRequest WFCMessage.FriendRequest newRequest = WFCMessage.FriendRequest
.newBuilder() .newBuilder()
.setFromUid(userId) .setFromUid(userId)
@@ -4144,6 +4142,11 @@ public class MemoryMessagesStore implements IMessagesStore {
return databaseStore.searchChannelFromDB(keyword, buzzy, page); return databaseStore.searchChannelFromDB(keyword, buzzy, page);
} }
@Override
public List<String> getListenedChannels(String userId) {
return databaseStore.getUserChannels(userId);
}
@Override @Override
public ErrorCode listenChannel(String operator, String channelId, boolean listen) { public ErrorCode listenChannel(String operator, String channelId, boolean listen) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
@@ -128,7 +128,7 @@ public interface IMessagesStore {
ErrorCode canSendMessageInGroup(String member, String groupId); ErrorCode canSendMessageInGroup(String member, String groupId);
Set<String> getGroupManagers(String groupId, boolean includeOwner); Set<String> getGroupManagers(String groupId, boolean includeOwner);
ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin); ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin, ByteBuf ackPayload);
ErrorCode recallCastMessage(long messageUid, String operatorId); ErrorCode recallCastMessage(long messageUid, String operatorId);
void clearUserMessages(String userId); void clearUserMessages(String userId);
@@ -158,6 +158,8 @@ public interface IMessagesStore {
WFCMessage.User getUserInfoByMobile(String mobile); WFCMessage.User getUserInfoByMobile(String mobile);
List<WFCMessage.User> searchUser(String keyword, int searchType, int page); List<WFCMessage.User> searchUser(String keyword, int searchType, int page);
List<WFCMessage.User> getUserInfoList(int count, int offset);
boolean updateSystemSetting(int id, String value, String desc); boolean updateSystemSetting(int id, String value, String desc);
SystemSettingPojo getSystemSetting(int id); SystemSettingPojo getSystemSetting(int id);
void createChatroom(String chatroomId, WFCMessage.ChatroomInfo chatroomInfo); void createChatroom(String chatroomId, WFCMessage.ChatroomInfo chatroomInfo);
@@ -216,6 +218,7 @@ public interface IMessagesStore {
ErrorCode transferChannel(String operator, String channelId, String newOwner); ErrorCode transferChannel(String operator, String channelId, String newOwner);
ErrorCode destroyChannel(String operator, String channelId, boolean isAdmin); ErrorCode destroyChannel(String operator, String channelId, boolean isAdmin);
List<WFCMessage.ChannelInfo> searchChannel(String keyword, boolean buzzy, int page); List<WFCMessage.ChannelInfo> searchChannel(String keyword, boolean buzzy, int page);
List<String> getListenedChannels(String userId);
ErrorCode listenChannel(String operator, String channelId, boolean listen); ErrorCode listenChannel(String operator, String channelId, boolean listen);
WFCMessage.ChannelInfo getChannelInfo(String channelId); WFCMessage.ChannelInfo getChannelInfo(String channelId);
boolean canSendMessageInChannel(String user, String channelId); boolean canSendMessageInChannel(String user, String channelId);
@@ -35,14 +35,11 @@ import io.moquette.spi.ISessionsStore;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import io.netty.handler.codec.mqtt.*; import io.netty.handler.codec.mqtt.*;
import win.liyufan.im.GsonUtil; import win.liyufan.im.*;
import win.liyufan.im.HttpUtils;
import win.liyufan.im.IMTopic;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import win.liyufan.im.Utility;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@@ -168,6 +165,9 @@ public class MessagesPublisher {
} }
WFCMessage.Message message = null; WFCMessage.Message message = null;
String senderName = null;
String senderPortrait = null;
boolean sendNameLoaded = false;
for (String user : receivers) { for (String user : receivers) {
if (!user.equals(sender)) { if (!user.equals(sender)) {
WFCMessage.User userInfo = m_messagesStore.getUserInfo(user); WFCMessage.User userInfo = m_messagesStore.getUserInfo(user);
@@ -207,10 +207,10 @@ public class MessagesPublisher {
} }
Collection<Session> sessions = m_sessionsStore.sessionForUser(user); Collection<Session> sessions = m_sessionsStore.sessionForUser(user);
String senderName = null;
String targetName = null;
boolean nameLoaded = false;
String targetName = null;
String targetPortrait = null;
boolean targetNameLoaded = false;
Collection<String> targetClients = null; Collection<String> targetClients = null;
if (pullType == ProtoConstants.PullType.Pull_ChatRoom) { if (pullType == ProtoConstants.PullType.Pull_ChatRoom) {
@@ -386,10 +386,22 @@ public class MessagesPublisher {
boolean isHiddenDetail = m_messagesStore.getUserPushHiddenDetail(user); boolean isHiddenDetail = m_messagesStore.getUserPushHiddenDetail(user);
if(!nameLoaded) { if(!sendNameLoaded) {
senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null); List<String> list = new ArrayList<>();
targetName = getTargetName(target, conversationType); senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null, list);
nameLoaded = true; if(!list.isEmpty()) {
senderPortrait = list.get(0);
}
sendNameLoaded = true;
}
if(!targetNameLoaded) {
List<String> list = new ArrayList<>();
targetName = getTargetName(target, conversationType, user, list);
if(!list.isEmpty()) {
targetPortrait = list.get(0);
}
targetNameLoaded = true;
} }
String name = senderName; String name = senderName;
@@ -399,7 +411,7 @@ public class MessagesPublisher {
name = fd.getAlias(); name = fd.getAlias();
} }
} }
this.messageSender.sendPush(sender, conversationType, target, line, messageId, targetSession.getClientID(), pushContent, pushData, messageContentType, serverTime, name, targetName, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage()); this.messageSender.sendPush(sender, conversationType, target, line, messageId, targetSession.getClientID(), pushContent, pushData, messageContentType, serverTime, name, senderPortrait, targetName, targetPortrait, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
} }
} }
@@ -461,10 +473,13 @@ public class MessagesPublisher {
} }
} }
String getUserDisplayName(String userId, String groupId) { String getUserDisplayName(String userId, String groupId, List<String> portraitList) {
WFCMessage.User user = m_messagesStore.getUserInfo(userId); WFCMessage.User user = m_messagesStore.getUserInfo(userId);
String userName = null; String userName = null;
if(user != null) { if(user != null) {
if(portraitList != null && !StringUtil.isNullOrEmpty(user.getPortrait())) {
portraitList.add(user.getPortrait());
}
userName = user.getDisplayName(); userName = user.getDisplayName();
} }
if (!StringUtil.isNullOrEmpty(groupId)) { if (!StringUtil.isNullOrEmpty(groupId)) {
@@ -476,17 +491,28 @@ public class MessagesPublisher {
return userName; return userName;
} }
String getTargetName(String targetId, int cnvType) { String getTargetName(String targetId, int cnvType, String fromUser, List<String> portraitList) {
if (cnvType == ProtoConstants.ConversationType.ConversationType_Private) { if (cnvType == ProtoConstants.ConversationType.ConversationType_Private) {
return getUserDisplayName(targetId, null); return getUserDisplayName(targetId, null, portraitList);
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Group) { } else if(cnvType == ProtoConstants.ConversationType.ConversationType_Group) {
WFCMessage.GroupInfo group = m_messagesStore.getGroupInfo(targetId); WFCMessage.GroupInfo group = m_messagesStore.getGroupInfo(targetId);
if(group != null) { if(group != null) {
if(!StringUtil.isNullOrEmpty(group.getPortrait())) {
portraitList.add(group.getPortrait());
}
WFCMessage.UserSettingEntry entry = m_messagesStore.getUserSetting(fromUser, UserSettingScope.kUserSettingGroupRemark, targetId);
if(entry != null && !StringUtil.isNullOrEmpty(entry.getValue())) {
return entry.getValue();
}
return group.getName(); return group.getName();
} }
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Channel) { } else if(cnvType == ProtoConstants.ConversationType.ConversationType_Channel) {
WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(targetId); WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(targetId);
if (channelInfo != null) { if (channelInfo != null) {
if(!StringUtil.isNullOrEmpty(channelInfo.getPortrait())) {
portraitList.add(channelInfo.getPortrait());
}
return channelInfo.getName(); return channelInfo.getName();
} }
} }
@@ -37,9 +37,9 @@ class PersistentQueueMessageSender {
this.connectionDescriptorStore = connectionDescriptorStore; this.connectionDescriptorStore = connectionDescriptorStore;
} }
void sendPush(String sender, int conversationType, String target, int line, long messageId, String deviceId, String pushContent, String pushData, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) { void sendPush(String sender, int conversationType, String target, int line, long messageId, String deviceId, String pushContent, String pushData, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) {
LOG.info("Send push to {}, message from {}", deviceId, sender); LOG.info("Send push to {}, message from {}", deviceId, sender);
PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, targetName, unReceivedMsg, mentionType, isHiddenDetail, language); PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, senderPortrait, targetName, targetPortrait, unReceivedMsg, mentionType, isHiddenDetail, language);
pushMessage.pushContent = pushContent; pushMessage.pushContent = pushContent;
pushMessage.pushData = pushData; pushMessage.pushData = pushData;
pushMessage.messageId = messageId; pushMessage.messageId = messageId;
@@ -243,20 +243,15 @@ public class Qos1PublishHandler extends QosPublishHandler {
String imtopic = topic.getTopic(); String imtopic = topic.getTopic();
ByteBuf payload = msg.payload(); ByteBuf payload = msg.payload();
byte[] payloadContent = readBytesAndRewind(payload); byte[] payloadContent = readBytesAndRewind(payload);
if(payloadContent.length == 0) { if(payloadContent.length > 0) {
ByteBuf ackPayload = Unpooled.buffer(); MemorySessionStore.Session session = m_sessionStore.getSession(clientID);
ackPayload.ensureWritable(1).writeByte(ERROR_CODE_INVALID_DATA.getCode()); payloadContent = AES.AESDecrypt(payloadContent, session.getSecret(), true);
sendPubAck(clientID, messageID, ackPayload, ERROR_CODE_INVALID_DATA); if(payloadContent == null) {
return; ByteBuf ackPayload = Unpooled.buffer();
} ackPayload.ensureWritable(1).writeByte(ERROR_CODE_INVALID_DATA.getCode());
sendPubAck(clientID, messageID, ackPayload, ERROR_CODE_INVALID_DATA);
MemorySessionStore.Session session = m_sessionStore.getSession(clientID); return;
payloadContent = AES.AESDecrypt(payloadContent, session.getSecret(), true); }
if(payloadContent == null) {
ByteBuf ackPayload = Unpooled.buffer();
ackPayload.ensureWritable(1).writeByte(ERROR_CODE_INVALID_DATA.getCode());
sendPubAck(clientID, messageID, ackPayload, ERROR_CODE_INVALID_DATA);
return;
} }
imHandler(clientID, username, imtopic, payloadContent, (errorCode, ackPayload) -> sendPubAck(clientID, messageID, ackPayload, errorCode), ProtoConstants.RequestSourceType.Request_From_User); imHandler(clientID, username, imtopic, payloadContent, (errorCode, ackPayload) -> sendPubAck(clientID, messageID, ackPayload, errorCode), ProtoConstants.RequestSourceType.Request_From_User);
@@ -77,6 +77,7 @@ public interface IMTopic {
String ChannelSearchTopic = "CHS"; String ChannelSearchTopic = "CHS";
String ChannelListenTopic = "CHL"; String ChannelListenTopic = "CHL";
String ChannelPullTopic = "CHP"; String ChannelPullTopic = "CHP";
String ListenedChannelListTopic = "CHLL";
String GetTokenTopic = "GETTOKEN"; String GetTokenTopic = "GETTOKEN";
String DestroyUserTopic = "DESTROYUSER"; String DestroyUserTopic = "DESTROYUSER";
@@ -14,5 +14,10 @@ public interface UserSettingScope {
int kUserSettingConversationDraft = 19; int kUserSettingConversationDraft = 19;
int kUserSettingDisableSyncDraft = 20; int kUserSettingDisableSyncDraft = 20;
int kUserSettingVoipSilent = 21; int kUserSettingVoipSilent = 21;
int kUserSettingPttReserved = 22;
int kUserSettingCustomState = 23;
int kUserSettingDisableSecretChat = 24;
int kUserSettingPttSilent = 25;
int kUserSettingGroupRemark = 26;
int kUserSettingPrivacySearchable = 27;
} }
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>wildfirechat-parent</artifactId> <artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId> <groupId>cn.wildfirechat</groupId>
<version>1.1.4</version> <version>1.1.7</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -26,6 +26,7 @@ public interface APIPath {
String User_Get_Token = "/admin/user/get_token"; String User_Get_Token = "/admin/user/get_token";
String User_Update_Block_Status = "/admin/user/update_block_status"; String User_Update_Block_Status = "/admin/user/update_block_status";
String User_Get_Info = "/admin/user/get_info"; String User_Get_Info = "/admin/user/get_info";
String User_Get_All = "/admin/user/all";
String User_Get_Robot_Info = "/admin/user/get_robot_info"; String User_Get_Robot_Info = "/admin/user/get_robot_info";
String User_Get_Blocked_List = "/admin/user/get_blocked_list"; String User_Get_Blocked_List = "/admin/user/get_blocked_list";
String User_Check_Block_Status = "/admin/user/check_block_status"; String User_Check_Block_Status = "/admin/user/check_block_status";
@@ -0,0 +1,6 @@
package cn.wildfirechat.pojos;
public class InputGetUserList {
public int count;
public int offset;
}
@@ -0,0 +1,7 @@
package cn.wildfirechat.pojos;
import java.util.List;
public class OutputGetUserList {
public List<InputOutputUserInfo> userInfoList;
}
@@ -156,6 +156,8 @@ public class ProtoConstants {
int Modify_Group_History_Message = 7; int Modify_Group_History_Message = 7;
//仅专业版的server api支持 //仅专业版的server api支持
int Modify_Group_Max_Member_Count = 8; int Modify_Group_Max_Member_Count = 8;
//仅专业版的server api支持
int Modify_Group_Super_Group = 9;
} }
//ModifyGroupInfoRequest -> type //ModifyGroupInfoRequest -> type
@@ -218,6 +220,12 @@ public class ProtoConstants {
int SearchUserType_Mobile = 3; int SearchUserType_Mobile = 3;
} }
public interface DisableSearchMask {
int DisableSearchDisplayNameMask = 1;
int DisableSearchNameMask = 2;
int DisableSearchMobileMask = 4;
}
public interface UserStatus { public interface UserStatus {
int Normal = 0; int Normal = 0;
int Muted = 1; int Muted = 1;
+1 -1
View File
@@ -6,7 +6,7 @@
<!--<relativePath>../pom.xml</relativePath>--> <!--<relativePath>../pom.xml</relativePath>-->
<artifactId>wildfirechat-parent</artifactId> <artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId> <groupId>cn.wildfirechat</groupId>
<version>1.1.4</version> <version>1.1.7</version>
</parent> </parent>
<artifactId>distribution</artifactId> <artifactId>distribution</artifactId>
+1 -1
View File
@@ -9,7 +9,7 @@ fi
kill -15 $pid kill -15 $pid
for i in {1..15} for i in {1..30}
do do
pid=`ps -ef | grep wildfirechat.server.Server | grep -v grep | awk '{print $2}'` pid=`ps -ef | grep wildfirechat.server.Server | grep -v grep | awk '{print $2}'`
if [ -z $pid ]; then if [ -z $pid ]; then
+2
View File
@@ -5,6 +5,8 @@ ADD distribution-*-bundle-tar.tar.gz /opt/im-server/
RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xmx128M"/JAVA_OPTS="$JAVA_OPTS -Xmx$JVM_XMX"/g' /opt/im-server/bin/wildfirechat.sh RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xmx128M"/JAVA_OPTS="$JAVA_OPTS -Xmx$JVM_XMX"/g' /opt/im-server/bin/wildfirechat.sh
RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xms128M"/JAVA_OPTS="$JAVA_OPTS -Xms$JVM_XMS"/g' /opt/im-server/bin/wildfirechat.sh RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xms128M"/JAVA_OPTS="$JAVA_OPTS -Xms$JVM_XMS"/g' /opt/im-server/bin/wildfirechat.sh
RUN chmod a+x /opt/im-server/bin/wildfirechat.sh
WORKDIR /opt/im-server WORKDIR /opt/im-server
VOLUME /opt/im-server/config VOLUME /opt/im-server/config
+1 -1
View File
@@ -12,7 +12,7 @@
<artifactId>wildfirechat-parent</artifactId> <artifactId>wildfirechat-parent</artifactId>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>1.1.4</version> <version>1.1.7</version>
<name>Wildfire Chat</name> <name>Wildfire Chat</name>
<description>Wildfire Chat Server</description> <description>Wildfire Chat Server</description>
<inceptionYear>2019</inceptionYear> <inceptionYear>2019</inceptionYear>
+18
View File
@@ -12,6 +12,24 @@
# 更新记录 # 更新记录
--------------
Release note 1.1.7:
1. 优化用户搜索功能。
2. 推送消息中使用群备注。
3. 推送消息中添加发送者和目标头像。
4. 优化撤回消息流程。
--------------
Release note 1.1.6:
1. 支持用户设置查找自己的方法。
2. 解决获取用户信息返回type无效的问题。
3. 添加用户获取频道的功能。
--------------
Release note 1.1.5:
1. 添加获取所有用户的Server API。
2. 解决添加好友时没有处理黑名单的问题。
-------------- --------------
Release note 1.1.4: Release note 1.1.4:
1. 添加PC客户端多端登录互踢时没有更新pc在线状态问题。 1. 添加PC客户端多端登录互踢时没有更新pc在线状态问题。
+1 -1
View File
@@ -3,7 +3,7 @@
<parent> <parent>
<artifactId>wildfirechat-parent</artifactId> <artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId> <groupId>cn.wildfirechat</groupId>
<version>1.1.4</version> <version>1.1.7</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -27,7 +27,7 @@
<dependency> <dependency>
<groupId>commons-codec</groupId> <groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId> <artifactId>commons-codec</artifactId>
<version>1.11</version> <version>1.15</version>
</dependency> </dependency>
<dependency> <dependency>
@@ -300,6 +300,20 @@ public class Main {
System.exit(-1); System.exit(-1);
} }
int limit = 5;
for (int i = 0; i < 100; i++) {
IMResult<OutputGetUserList> getUserListIMResult = UserAdmin.getAllUsers(limit, i*limit);
if (getUserListIMResult != null && getUserListIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("getUserListIMResult success");
if(getUserListIMResult.getResult().userInfoList.size() < limit) {
break;
}
} else {
System.out.println("getUserListIMResult failure");
System.exit(-1);
}
}
if (commercialServer) { if (commercialServer) {
IMResult<GetOnlineUserCountResult> getOnlineUserCountResultIMResult = UserAdmin.getOnlineUserCount(); IMResult<GetOnlineUserCountResult> getOnlineUserCountResultIMResult = UserAdmin.getOnlineUserCount();
if (getOnlineUserCountResultIMResult != null && getOnlineUserCountResultIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { if (getOnlineUserCountResultIMResult != null && getOnlineUserCountResultIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
@@ -733,8 +747,8 @@ public class Main {
System.exit(-1); System.exit(-1);
} }
IMResult<Void> voidIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid()); IMResult<String> stringIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid());
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { if (stringIMResult != null && stringIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("recall message success"); System.out.println("recall message success");
} else { } else {
System.out.println("recall message failure"); System.out.println("recall message failure");
@@ -742,7 +756,7 @@ public class Main {
} }
if (commercialServer) { if (commercialServer) {
voidIMResult = MessageAdmin.deleteMessage(resultSendMessage.getResult().getMessageUid()); IMResult<Void> voidIMResult = MessageAdmin.deleteMessage(resultSendMessage.getResult().getMessageUid());
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("delete message success"); System.out.println("delete message success");
} else { } else {
@@ -818,7 +832,7 @@ public class Main {
System.exit(-1); System.exit(-1);
} }
voidIMResult = MessageAdmin.recallMultiCastMessage("user1", resultMulticastMessage.result.getMessageUid(), multicastReceivers); IMResult<Void> voidIMResult = MessageAdmin.recallMultiCastMessage("user1", resultMulticastMessage.result.getMessageUid(), multicastReceivers);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("Success"); System.out.println("Success");
} else { } else {
@@ -25,12 +25,12 @@ public class MessageAdmin {
return AdminHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class); return AdminHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class);
} }
public static IMResult<Void> recallMessage(String operator, long messageUid) throws Exception { public static IMResult<String> recallMessage(String operator, long messageUid) throws Exception {
String path = APIPath.Msg_Recall; String path = APIPath.Msg_Recall;
RecallMessageData messageData = new RecallMessageData(); RecallMessageData messageData = new RecallMessageData();
messageData.setOperator(operator); messageData.setOperator(operator);
messageData.setMessageUid(messageUid); messageData.setMessageUid(messageUid);
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class); return AdminHttpUtils.httpJsonPost(path, messageData, String.class);
} }
//仅专业版支持 //仅专业版支持
@@ -24,6 +24,14 @@ public class UserAdmin {
return AdminHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class); return AdminHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
} }
public static IMResult<OutputGetUserList> getAllUsers(int count, int offset) throws Exception {
String path = APIPath.User_Get_All;
InputGetUserList input = new InputGetUserList();
input.count = count;
input.offset = offset;
return AdminHttpUtils.httpJsonPost(path, input, OutputGetUserList.class);
}
public static IMResult<OutputCreateUser> createUser(InputOutputUserInfo user) throws Exception { public static IMResult<OutputCreateUser> createUser(InputOutputUserInfo user) throws Exception {
String path = APIPath.Create_User; String path = APIPath.Create_User;
return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class); return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class);