Compare commits

...
9 Commits
21 changed files with 324 additions and 102 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
<relativePath>../</relativePath>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.1.5</version>
<version>1.1.7</version>
</parent>
<artifactId>moquette-broker</artifactId>
@@ -12,9 +12,11 @@ package cn.wildfirechat.push;
public class PushMessage {
public String sender;
public String senderName;
public String senderPortrait;
public int convType;
public String target;
public String targetName;
public String targetPortrait;
public String userId;
public int line;
public int cntType;
@@ -34,12 +36,14 @@ public class PushMessage {
public String language;
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.convType = conversationType;
this.target = target;
this.senderName = senderName;
this.senderPortrait = senderPortrait;
this.targetName = targetName;
this.targetPortrait = targetPortrait;
this.line = line;
this.cntType = messageContentType;
this.serverTime = serverTime;
@@ -25,6 +25,9 @@ import io.netty.util.internal.StringUtil;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
@Route(APIPath.Msg_Recall)
@HttpMethod("POST")
public class RecallMessageAction extends AdminAction {
@@ -42,10 +45,9 @@ public class RecallMessageAction extends AdminAction {
WFCMessage.INT64Buf idBuf = WFCMessage.INT64Buf.newBuilder().setId(recallMessageData.getMessageUid()).build();
sendApiMessage(response, recallMessageData.getOperator(), IMTopic.RecallMessageTopic, idBuf.toByteArray(), result -> {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
return new Result(errorCode);
ErrorCode errorCode = ErrorCode.fromCode(result[0]);
byte[] data = Arrays.copyOfRange(result,1, result.length);
return new Result(errorCode, new String(data, StandardCharsets.UTF_8));
});
return false;
} 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
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;
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) {
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 io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*;
import static win.liyufan.im.UserSettingScope.kUserSettingPrivacySearchable;
public class DatabaseStore {
private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class);
@@ -161,18 +162,12 @@ public class DatabaseStore {
}
return null;
}
//searchType
// 0 模糊匹配displayName, 精确匹配账户名和电话号码
// 1 精确匹配账户名和电话号码
// 2 精确匹配账户名
// 3 精确匹配电话号码
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
List<WFCMessage.User> searchUserByNameMobile(String keyword, int searchType) {
ArrayList<WFCMessage.User> out = new ArrayList<>();
Connection connection = null;
PreparedStatement statement = null;
ResultSet rs = null;
ArrayList<WFCMessage.User> out = new ArrayList<>();
try {
connection = DBUtil.getConnection();
String sql = "select `_uid`, `_name`" +
@@ -185,61 +180,34 @@ public class DatabaseStore {
", `_company`" +
", `_social`" +
", `_extra`" +
", `_dt` 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;
}
", `_dt`, `_type` from t_user";
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
if (searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) {
if(searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) {
sql += " limit 1";
} else {
sql += " limit 20";
}
if (page > 0) {
sql += " offset " + page * 20;
sql += " limit 2";
}
statement = connection.prepareStatement(sql);
int index = 1;
switch (searchType) {
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;
statement.setString(1, keyword);
if(searchType != SearchUserType_Name && searchType != SearchUserType_Mobile) {
statement.setString(2, keyword);
}
rs = statement.executeQuery();
while (rs.next()) {
WFCMessage.User.Builder builder = WFCMessage.User.newBuilder();
index = 1;
int index = 1;
String value = rs.getString(index++);
value = (value == null ? "" : value);
@@ -287,6 +255,9 @@ public class DatabaseStore {
long longValue = rs.getLong(index++);
builder.setUpdateDt(longValue);
int type = rs.getInt(index++);
builder.setType( type);
WFCMessage.User user = builder.build();
out.add(user);
@@ -298,6 +269,171 @@ public class DatabaseStore {
} finally {
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;
}
@@ -35,6 +35,7 @@ import io.moquette.spi.IMessagesStore;
import io.moquette.spi.impl.security.AES;
import io.moquette.spi.security.Tokenor;
import io.moquette.spi.impl.subscriptions.Topic;
import io.netty.buffer.ByteBuf;
import io.netty.handler.codec.mqtt.MqttVersion;
import org.apache.commons.codec.digest.DigestUtils;
import org.json.simple.JSONObject;
@@ -44,6 +45,7 @@ import win.liyufan.im.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
@@ -810,7 +812,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
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;
}
}
@@ -2177,7 +2179,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@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();
IMap<Long, MessageBundle> mIMap = hzInstance.getMap(MESSAGES_MAP);
@@ -2303,6 +2305,7 @@ public class MemoryMessagesStore implements IMessagesStore {
databaseStore.deleteMessage(messageUid);
mIMap.put(messageUid, messageBundle, 7, TimeUnit.DAYS);
ackPayload.writeBytes(recalledContent.getBytes(StandardCharsets.UTF_8));
return ErrorCode.ERROR_CODE_SUCCESS;
} else {
return ErrorCode.ERROR_CODE_NOT_EXIST;
@@ -4139,6 +4142,11 @@ public class MemoryMessagesStore implements IMessagesStore {
return databaseStore.searchChannelFromDB(keyword, buzzy, page);
}
@Override
public List<String> getListenedChannels(String userId) {
return databaseStore.getUserChannels(userId);
}
@Override
public ErrorCode listenChannel(String operator, String channelId, boolean listen) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
@@ -128,7 +128,7 @@ public interface IMessagesStore {
ErrorCode canSendMessageInGroup(String member, String groupId);
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);
void clearUserMessages(String userId);
@@ -218,6 +218,7 @@ public interface IMessagesStore {
ErrorCode transferChannel(String operator, String channelId, String newOwner);
ErrorCode destroyChannel(String operator, String channelId, boolean isAdmin);
List<WFCMessage.ChannelInfo> searchChannel(String keyword, boolean buzzy, int page);
List<String> getListenedChannels(String userId);
ErrorCode listenChannel(String operator, String channelId, boolean listen);
WFCMessage.ChannelInfo getChannelInfo(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.Unpooled;
import io.netty.handler.codec.mqtt.*;
import win.liyufan.im.GsonUtil;
import win.liyufan.im.HttpUtils;
import win.liyufan.im.IMTopic;
import win.liyufan.im.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import win.liyufan.im.Utility;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@@ -168,6 +165,9 @@ public class MessagesPublisher {
}
WFCMessage.Message message = null;
String senderName = null;
String senderPortrait = null;
boolean sendNameLoaded = false;
for (String user : receivers) {
if (!user.equals(sender)) {
WFCMessage.User userInfo = m_messagesStore.getUserInfo(user);
@@ -207,10 +207,10 @@ public class MessagesPublisher {
}
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;
if (pullType == ProtoConstants.PullType.Pull_ChatRoom) {
@@ -386,10 +386,22 @@ public class MessagesPublisher {
boolean isHiddenDetail = m_messagesStore.getUserPushHiddenDetail(user);
if(!nameLoaded) {
senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null);
targetName = getTargetName(target, conversationType);
nameLoaded = true;
if(!sendNameLoaded) {
List<String> list = new ArrayList<>();
senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null, list);
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;
@@ -399,7 +411,7 @@ public class MessagesPublisher {
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);
String userName = null;
if(user != null) {
if(portraitList != null && !StringUtil.isNullOrEmpty(user.getPortrait())) {
portraitList.add(user.getPortrait());
}
userName = user.getDisplayName();
}
if (!StringUtil.isNullOrEmpty(groupId)) {
@@ -476,17 +491,28 @@ public class MessagesPublisher {
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) {
return getUserDisplayName(targetId, null);
return getUserDisplayName(targetId, null, portraitList);
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Group) {
WFCMessage.GroupInfo group = m_messagesStore.getGroupInfo(targetId);
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();
}
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Channel) {
WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(targetId);
if (channelInfo != null) {
if(!StringUtil.isNullOrEmpty(channelInfo.getPortrait())) {
portraitList.add(channelInfo.getPortrait());
}
return channelInfo.getName();
}
}
@@ -37,9 +37,9 @@ class PersistentQueueMessageSender {
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);
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.pushData = pushData;
pushMessage.messageId = messageId;
@@ -243,20 +243,15 @@ public class Qos1PublishHandler extends QosPublishHandler {
String imtopic = topic.getTopic();
ByteBuf payload = msg.payload();
byte[] payloadContent = readBytesAndRewind(payload);
if(payloadContent.length == 0) {
ByteBuf ackPayload = Unpooled.buffer();
ackPayload.ensureWritable(1).writeByte(ERROR_CODE_INVALID_DATA.getCode());
sendPubAck(clientID, messageID, ackPayload, ERROR_CODE_INVALID_DATA);
return;
}
MemorySessionStore.Session session = m_sessionStore.getSession(clientID);
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;
if(payloadContent.length > 0) {
MemorySessionStore.Session session = m_sessionStore.getSession(clientID);
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);
@@ -77,6 +77,7 @@ public interface IMTopic {
String ChannelSearchTopic = "CHS";
String ChannelListenTopic = "CHL";
String ChannelPullTopic = "CHP";
String ListenedChannelListTopic = "CHLL";
String GetTokenTopic = "GETTOKEN";
String DestroyUserTopic = "DESTROYUSER";
@@ -14,5 +14,10 @@ public interface UserSettingScope {
int kUserSettingConversationDraft = 19;
int kUserSettingDisableSyncDraft = 20;
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>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.1.5</version>
<version>1.1.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -156,6 +156,8 @@ public class ProtoConstants {
int Modify_Group_History_Message = 7;
//仅专业版的server api支持
int Modify_Group_Max_Member_Count = 8;
//仅专业版的server api支持
int Modify_Group_Super_Group = 9;
}
//ModifyGroupInfoRequest -> type
@@ -218,6 +220,12 @@ public class ProtoConstants {
int SearchUserType_Mobile = 3;
}
public interface DisableSearchMask {
int DisableSearchDisplayNameMask = 1;
int DisableSearchNameMask = 2;
int DisableSearchMobileMask = 4;
}
public interface UserStatus {
int Normal = 0;
int Muted = 1;
+1 -1
View File
@@ -6,7 +6,7 @@
<!--<relativePath>../pom.xml</relativePath>-->
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.1.5</version>
<version>1.1.7</version>
</parent>
<artifactId>distribution</artifactId>
+1 -1
View File
@@ -12,7 +12,7 @@
<artifactId>wildfirechat-parent</artifactId>
<packaging>pom</packaging>
<version>1.1.5</version>
<version>1.1.7</version>
<name>Wildfire Chat</name>
<description>Wildfire Chat Server</description>
<inceptionYear>2019</inceptionYear>
+13
View File
@@ -12,6 +12,19 @@
# 更新记录
--------------
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。
+1 -1
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.1.5</version>
<version>1.1.7</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -747,8 +747,8 @@ public class Main {
System.exit(-1);
}
IMResult<Void> voidIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid());
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
IMResult<String> stringIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid());
if (stringIMResult != null && stringIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("recall message success");
} else {
System.out.println("recall message failure");
@@ -756,7 +756,7 @@ public class Main {
}
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) {
System.out.println("delete message success");
} else {
@@ -832,7 +832,7 @@ public class Main {
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) {
System.out.println("Success");
} else {
@@ -25,12 +25,12 @@ public class MessageAdmin {
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;
RecallMessageData messageData = new RecallMessageData();
messageData.setOperator(operator);
messageData.setMessageUid(messageUid);
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class);
return AdminHttpUtils.httpJsonPost(path, messageData, String.class);
}
//仅专业版支持