Compare commits

..
5 Commits
25 changed files with 1108 additions and 221 deletions
+2 -2
View File
@@ -12,7 +12,7 @@
#服务器的接入IP。给客户端提供是${server.ip}和${http_port}。 #服务器的接入IP。给客户端提供是${server.ip}和${http_port}。
#客户端会从${http_port}端口获取到长链接端口。这个地址一定要改成客户端可以访问到的IP地址 #客户端会从${http_port}端口获取到长链接端口。这个地址一定要改成客户端可以访问到的IP地址
# (如果您部署云服务器上或者具有独立公网出口的服务器上,请改为对应的公网IP;如果您部署在在内网环境下,在内网使用,这个地方改成内网地址) # (如果您部署云服务器上或者具有独立公网出口的服务器上,请改为对应的公网IP;如果您部署在在内网环境下,在内网使用,这个地方改成内网地址)
server.ip 0.0.0.0 server.ip 192.168.3.124
##原生客户端长链接端口 ##原生客户端长链接端口
port 1883 port 1883
@@ -115,7 +115,7 @@ friend.request_expiration_duration 604800000
##旧的方式会发送notification消息(contenttype是80),内容会根据好友接收者的语言选择对应的语言,如果双方语言不一致会导致另外一方看到的不是本地语言。 ##旧的方式会发送notification消息(contenttype是80),内容会根据好友接收者的语言选择对应的语言,如果双方语言不一致会导致另外一方看到的不是本地语言。
##新的方式会发送添加好友消息(contenttype是93)和欢迎消息(contenttype是92),需要客户端实现这两种消息。 ##新的方式会发送添加好友消息(contenttype是93)和欢迎消息(contenttype是92),需要客户端实现这两种消息。
##如果客户端已经实现这两种消息可以打开这个开关 ##如果客户端已经实现这两种消息可以打开这个开关
friend.new_welcome_message false friend.new_welcome_message true
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出 ## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
chatroom.participant_idle_time 900000 chatroom.participant_idle_time 900000
@@ -0,0 +1,2 @@
alter table `t_group_member` add column `_extra` TEXT DEFAULT NULL;
alter table `t_friend_request` add column `_extra` TEXT DEFAULT NULL;
@@ -0,0 +1,2 @@
alter table `t_group_member` add column `_extra` TEXT DEFAULT NULL;
alter table `t_friend_request` add column `_extra` TEXT DEFAULT NULL;
+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>0.62</version> <version>0.63</version>
</parent> </parent>
<artifactId>moquette-broker</artifactId> <artifactId>moquette-broker</artifactId>
@@ -62,6 +62,7 @@ public class GetGroupMembersAction extends AdminAction {
pm.setMember_id(member.getMemberId()); pm.setMember_id(member.getMemberId());
pm.setAlias(member.getAlias()); pm.setAlias(member.getAlias());
pm.setType(member.getType()); pm.setType(member.getType());
pm.setExtra(member.getExtra());
out.getMembers().add(pm); out.getMembers().add(pm);
} }
result = RestResult.ok(out); result = RestResult.ok(out);
@@ -11,6 +11,7 @@ package com.xiaoleilu.loServer.action.channel;
import cn.wildfirechat.common.APIPath; import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.pojos.SendChannelMessageData; import cn.wildfirechat.pojos.SendChannelMessageData;
import cn.wildfirechat.proto.ProtoConstants;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult; import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod; import com.xiaoleilu.loServer.annotation.HttpMethod;
@@ -42,6 +43,17 @@ public class SendMessageAction extends ChannelAction {
public boolean action(Request request) { public boolean action(Request request) {
if (request.getNettyRequest() instanceof FullHttpRequest) { if (request.getNettyRequest() instanceof FullHttpRequest) {
SendChannelMessageData sendChannelMessageData = getRequestBody(request.getNettyRequest(), SendChannelMessageData.class); SendChannelMessageData sendChannelMessageData = getRequestBody(request.getNettyRequest(), SendChannelMessageData.class);
if(sendChannelMessageData.getTargets() != null && !sendChannelMessageData.getTargets().isEmpty()) {
if((channelInfo.getStatus() & ProtoConstants.ChannelState.Channel_State_Mask_Message_Unsubscribed) == 0 && (channelInfo.getStatus() & ProtoConstants.ChannelState.Channel_State_Mask_Global) == 0) {
for (String target:sendChannelMessageData.getTargets()) {
if(!messagesStore.checkUserInChannel(target, channelInfo.getTargetId())) {
setResponseContent(RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_RIGHT, "User " + target + " not in channel"));
return true;
}
}
}
}
SendMessageData sendMessageData = new SendMessageData(); SendMessageData sendMessageData = new SendMessageData();
sendMessageData.setConv(new Conversation()); sendMessageData.setConv(new Conversation());
sendMessageData.getConv().setType(ConversationType_Channel); sendMessageData.getConv().setType(ConversationType_Channel);
@@ -66,6 +66,7 @@ public class GetGroupMembersAction extends RobotAction {
pm.setMember_id(member.getMemberId()); pm.setMember_id(member.getMemberId());
pm.setAlias(member.getAlias()); pm.setAlias(member.getAlias());
pm.setType(member.getType()); pm.setType(member.getType());
pm.setExtra(member.getExtra());
out.getMembers().add(pm); out.getMembers().add(pm);
} }
if(!isInGroup) { if(!isInGroup) {
@@ -22,7 +22,7 @@ public class AddGroupMember extends GroupHandler<WFCMessage.AddGroupMemberReques
@Override @Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.AddGroupMemberRequest request, Qos1PublishHandler.IMCallback callback) { public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.AddGroupMemberRequest request, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = m_messagesStore.addGroupMembers(fromUser, isAdmin, request.getGroupId(), request.getAddedMemberList()); ErrorCode errorCode = m_messagesStore.addGroupMembers(fromUser, isAdmin, request.getGroupId(), request.getAddedMemberList(), request.getExtra());
if (errorCode == ERROR_CODE_SUCCESS) { if (errorCode == ERROR_CODE_SUCCESS) {
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
@@ -32,7 +32,7 @@ public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupReque
return ErrorCode.ERROR_CODE_NOT_RIGHT; return ErrorCode.ERROR_CODE_NOT_RIGHT;
} }
WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList(), isAdmin); WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList(), request.getMemberExtra(), isAdmin);
if (groupInfo != null) { if (groupInfo != null) {
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) { if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) {
@@ -18,7 +18,7 @@ import win.liyufan.im.IMTopic;
public class PutUserSettingHandler extends IMHandler<WFCMessage.ModifyUserSettingReq> { public class PutUserSettingHandler extends IMHandler<WFCMessage.ModifyUserSettingReq> {
@Override @Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyUserSettingReq request, Qos1PublishHandler.IMCallback callback) { public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyUserSettingReq request, Qos1PublishHandler.IMCallback callback) {
m_messagesStore.updateUserSettings(fromUser, request); m_messagesStore.updateUserSettings(fromUser, request, clientID);
return ErrorCode.ERROR_CODE_SUCCESS; return ErrorCode.ERROR_CODE_SUCCESS;
} }
} }
@@ -332,7 +332,7 @@ public class DatabaseStore {
String sql = "select `_mid`" + String sql = "select `_mid`" +
", `_alias`" + ", `_alias`" +
", `_type`" + ", `_type`" +
", `_dt`, `_create_dt` from t_group_member where _gid = ?"; ", `_dt`, `_create_dt`, `_extra` from t_group_member where _gid = ?";
statement = connection.prepareStatement(sql); statement = connection.prepareStatement(sql);
statement.setString(1, groupId); statement.setString(1, groupId);
@@ -362,6 +362,10 @@ public class DatabaseStore {
longValue = rs.getLong(index++); longValue = rs.getLong(index++);
builder.setCreateDt(longValue); builder.setCreateDt(longValue);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setExtra(value);
WFCMessage.GroupMember member = builder.build(); WFCMessage.GroupMember member = builder.build();
groupMembers.put(groupId, member); groupMembers.put(groupId, member);
} }
@@ -442,7 +446,7 @@ public class DatabaseStore {
try { try {
connection = DBUtil.getConnection(); connection = DBUtil.getConnection();
String sql = "select `_uid`, `_friend_uid`, `_reason`, `_status`, `_dt`, `_from_read_status`, `_to_read_status` from t_friend_request"; String sql = "select `_uid`, `_friend_uid`, `_reason`, `_status`, `_dt`, `_from_read_status`, `_to_read_status`, `_extra` from t_friend_request";
statement = connection.prepareStatement(sql); statement = connection.prepareStatement(sql);
int index; int index;
@@ -476,6 +480,9 @@ public class DatabaseStore {
intvalue = rs.getInt(index++); intvalue = rs.getInt(index++);
builder.setToReadStatus(intvalue > 0); builder.setToReadStatus(intvalue > 0);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setExtra(value);
WFCMessage.FriendRequest request = builder.build(); WFCMessage.FriendRequest request = builder.build();
requestMap.put(request.getFromUid(), request); requestMap.put(request.getFromUid(), request);
@@ -1713,11 +1720,12 @@ public class DatabaseStore {
", `_mid`" + ", `_mid`" +
", `_alias`" + ", `_alias`" +
", `_type`" + ", `_type`" +
", `_dt`, `_create_dt`) values(?, ?, ?, ?, ?, ?)" + ", `_dt`, `_create_dt`, `_extra`) values(?, ?, ?, ?, ?, ?,?)" +
" ON DUPLICATE KEY UPDATE " + " ON DUPLICATE KEY UPDATE " +
"`_alias` = ?," + "`_alias` = ?," +
"`_type` = ?," + "`_type` = ?," +
"`_dt` = ?"; "`_dt` = ?," +
"`_extra` = ?";
if(updateCreateTime) { if(updateCreateTime) {
sql += ", `_create_dt` = ?"; sql += ", `_create_dt` = ?";
} }
@@ -1738,9 +1746,11 @@ public class DatabaseStore {
statement.setInt(index++, member.getType()); statement.setInt(index++, member.getType());
statement.setLong(index++, dt); statement.setLong(index++, dt);
statement.setLong(index++, member.getCreateDt()); statement.setLong(index++, member.getCreateDt());
statement.setString(index++, member.getExtra());
statement.setString(index++, member.getAlias()); statement.setString(index++, member.getAlias());
statement.setInt(index++, member.getType()); statement.setInt(index++, member.getType());
statement.setLong(index++, dt); statement.setLong(index++, dt);
statement.setString(index++, member.getExtra());
if(updateCreateTime) { if(updateCreateTime) {
statement.setLong(index++, dt); statement.setLong(index++, dt);
} }
@@ -2680,14 +2690,14 @@ public class DatabaseStore {
", `_status`" + ", `_status`" +
", `_dt`" + ", `_dt`" +
", `_from_read_status`" + ", `_from_read_status`" +
", `_to_read_status` from t_friend_request where `_uid` = ? UNION ALL " + ", `_to_read_status`, `_extra` from t_friend_request where `_uid` = ? UNION ALL " +
"select `_uid`" + "select `_uid`" +
", `_friend_uid`" + ", `_friend_uid`" +
", `_reason`" + ", `_reason`" +
", `_status`" + ", `_status`" +
", `_dt`" + ", `_dt`" +
", `_from_read_status`" + ", `_from_read_status`" +
", `_to_read_status` from t_friend_request where `_friend_uid` = ?"; ", `_to_read_status`, `_extra` from t_friend_request where `_friend_uid` = ?";
statement = connection.prepareStatement(sql); statement = connection.prepareStatement(sql);
int index = 1; int index = 1;
@@ -2725,6 +2735,10 @@ public class DatabaseStore {
b = rs.getBoolean(index++); b = rs.getBoolean(index++);
builder.setToReadStatus(b); builder.setToReadStatus(b);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setExtra(value);
out.add(builder.build()); out.add(builder.build());
} }
return out; return out;
@@ -2772,13 +2786,14 @@ public class DatabaseStore {
PreparedStatement statement = null; PreparedStatement statement = null;
try { try {
connection = DBUtil.getConnection(); connection = DBUtil.getConnection();
String sql = "insert into t_friend_request (`_uid`, `_friend_uid`, `_reason`, `_status`, `_dt`, `_from_read_status`, `_to_read_status`) values(?, ?, ?, ?, ?, ?, ?)" + String sql = "insert into t_friend_request (`_uid`, `_friend_uid`, `_reason`, `_status`, `_dt`, `_from_read_status`, `_to_read_status`, `_extra`) values(?, ?, ?, ?, ?, ?, ?, ?)" +
" ON DUPLICATE KEY UPDATE " + " ON DUPLICATE KEY UPDATE " +
"`_reason` = ?," + "`_reason` = ?," +
"`_status` = ?," + "`_status` = ?," +
"`_dt` = ?," + "`_dt` = ?," +
"`_from_read_status` = ?," + "`_from_read_status` = ?," +
"`_to_read_status` = ?"; "`_to_read_status` = ?," +
"`_extra` = ?";
statement = connection.prepareStatement(sql); statement = connection.prepareStatement(sql);
int index = 1; int index = 1;
@@ -2789,12 +2804,14 @@ public class DatabaseStore {
statement.setLong(index++, request.getUpdateDt()); statement.setLong(index++, request.getUpdateDt());
statement.setInt(index++, request.getFromReadStatus() ? 1 : 0); statement.setInt(index++, request.getFromReadStatus() ? 1 : 0);
statement.setInt(index++, request.getToReadStatus() ? 1 : 0); statement.setInt(index++, request.getToReadStatus() ? 1 : 0);
statement.setString(index++, request.getExtra());
statement.setString(index++, request.getReason()); statement.setString(index++, request.getReason());
statement.setInt(index++, request.getStatus()); statement.setInt(index++, request.getStatus());
statement.setLong(index++, request.getUpdateDt()); statement.setLong(index++, request.getUpdateDt());
statement.setInt(index++, request.getFromReadStatus() ? 1 : 0); statement.setInt(index++, request.getFromReadStatus() ? 1 : 0);
statement.setInt(index++, request.getToReadStatus() ? 1 : 0); statement.setInt(index++, request.getToReadStatus() ? 1 : 0);
statement.setString(index++, request.getExtra());
int count = statement.executeUpdate(); int count = statement.executeUpdate();
LOG.info("Update rows {}", count); LOG.info("Update rows {}", count);
} catch (SQLException e) { } catch (SQLException e) {
@@ -130,7 +130,7 @@ public class MemoryMessagesStore implements IMessagesStore {
private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000; private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000;
private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000; private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000;
private long mFriendRequestExpiration = 7 * 24 * 60 * 60 * 1000; private long mFriendRequestExpiration = 7 * 24 * 60 * 60 * 1000;
private boolean mFriendNewWelcomeMessage = false; private boolean mFriendNewWelcomeMessage = true;
private boolean mMultiPlatformNotification = false; private boolean mMultiPlatformNotification = false;
private boolean mDisableStrangerChat = false; private boolean mDisableStrangerChat = false;
@@ -178,7 +178,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Utility.printExecption(LOG, e); Utility.printExecption(LOG, e);
printMissConfigLog(SERVER_MULTI_PLATFROM_NOTIFICATION, mDisableStrangerChat + ""); printMissConfigLog(SERVER_MULTI_PLATFROM_NOTIFICATION, mMultiPlatformNotification + "");
} }
try { try {
@@ -519,19 +519,27 @@ public class MemoryMessagesStore implements IMessagesStore {
if (channelInfo != null) { if (channelInfo != null) {
notifyReceivers.add(fromUser); notifyReceivers.add(fromUser);
if (channelInfo.getOwner().equals(fromUser)) { if (channelInfo.getOwner().equals(fromUser)) {
Collection<String> listeners = getChannelListener(message.getConversation().getTarget()); if((channelInfo.getStatus() & ProtoConstants.ChannelState.Channel_State_Mask_Global) > 0) {
if (!StringUtil.isNullOrEmpty(message.getToUser())) { if((message.getToList() != null && !message.getToList().isEmpty())) {
if (listeners.contains(message.getToUser())) { notifyReceivers.addAll(message.getToList());
notifyReceivers.add(message.getToUser()); } else {
} notifyReceivers.addAll(getAllEnds());
} else if(message.getToList() != null && !message.getToList().isEmpty()) {
for (String to:message.getToList()) {
if (listeners.contains(to)) {
notifyReceivers.add(to);
}
} }
} else { } else {
notifyReceivers.addAll(listeners); Collection<String> listeners = getChannelListener(message.getConversation().getTarget());
if (!StringUtil.isNullOrEmpty(message.getToUser())) {
if (listeners.contains(message.getToUser()) || (channelInfo.getStatus() & ProtoConstants.ChannelState.Channel_State_Mask_Message_Unsubscribed) > 0) {
notifyReceivers.add(message.getToUser());
}
} else if (message.getToList() != null && !message.getToList().isEmpty()) {
for (String to : message.getToList()) {
if (listeners.contains(to) || (channelInfo.getStatus() & ProtoConstants.ChannelState.Channel_State_Mask_Message_Unsubscribed) > 0) {
notifyReceivers.add(to);
}
}
} else {
notifyReceivers.addAll(listeners);
}
} }
} else { } else {
if (StringUtil.isNullOrEmpty(channelInfo.getCallback()) || channelInfo.getAutomatic() == 0) { if (StringUtil.isNullOrEmpty(channelInfo.getCallback()) || channelInfo.getAutomatic() == 0) {
@@ -926,7 +934,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} }
@Override @Override
public WFCMessage.GroupInfo createGroup(String fromUser, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, boolean isAdmin) { public WFCMessage.GroupInfo createGroup(String fromUser, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, String memberExtra, boolean isAdmin) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP); IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
@@ -948,19 +956,39 @@ public class MemoryMessagesStore implements IMessagesStore {
List<WFCMessage.GroupMember> updatedMemberList = new ArrayList<>(); List<WFCMessage.GroupMember> updatedMemberList = new ArrayList<>();
boolean hasOwnerMember = false; boolean hasOwnerMember = false;
for (WFCMessage.GroupMember member : memberList) { for (WFCMessage.GroupMember member : memberList) {
WFCMessage.GroupMember.Builder builder = member.toBuilder();
builder.setUpdateDt(dt).setCreateDt(dt);
if (member.getMemberId().equals(owner)) { if (member.getMemberId().equals(owner)) {
member = member.toBuilder().setUpdateDt(dt).setCreateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build(); builder.setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner);
hasOwnerMember = true; hasOwnerMember = true;
} else { } else {
member = member.toBuilder().setUpdateDt(dt).setCreateDt(dt).build(); if (isAdmin) {
if (member.getType() == GroupMemberType_Owner) {
builder.setType(GroupMemberType_Normal);
LOG.error("group member conflicted, group info owner is {}, and group member {} type is owner, set the member to normal member", owner, member.getMemberId());
}
} else {
builder.setType(GroupMemberType_Normal);
}
} }
if(!StringUtil.isNullOrEmpty(memberExtra)) {
builder.setExtra(memberExtra);
}
member = builder.build();
groupMembers.put(groupId, member); groupMembers.put(groupId, member);
updatedMemberList.add(member); updatedMemberList.add(member);
dt++; dt++;
} }
if(!hasOwnerMember && !StringUtil.isNullOrEmpty(owner)) { if(!hasOwnerMember && !StringUtil.isNullOrEmpty(owner)) {
WFCMessage.GroupMember member = WFCMessage.GroupMember.newBuilder().setMemberId(owner).setUpdateDt(dt).setCreateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build(); WFCMessage.GroupMember member;
if(!StringUtil.isNullOrEmpty(memberExtra)) {
member = WFCMessage.GroupMember.newBuilder().setMemberId(owner).setExtra(memberExtra).setUpdateDt(dt).setCreateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build();
} else {
member = WFCMessage.GroupMember.newBuilder().setMemberId(owner).setUpdateDt(dt).setCreateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build();
}
groupMembers.put(groupId, member); groupMembers.put(groupId, member);
updatedMemberList.add(member); updatedMemberList.add(member);
} }
@@ -1104,7 +1132,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} }
@Override @Override
public ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList) { public ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList, String extra) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP); IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
@@ -1161,18 +1189,24 @@ public class MemoryMessagesStore implements IMessagesStore {
List<WFCMessage.GroupMember> tmp = new ArrayList<>(); List<WFCMessage.GroupMember> tmp = new ArrayList<>();
ArrayList<String> newInviteUsers = new ArrayList<>(); ArrayList<String> newInviteUsers = new ArrayList<>();
for (WFCMessage.GroupMember member : memberList) { for (WFCMessage.GroupMember member : memberList) {
WFCMessage.GroupMember.Builder builder = member.toBuilder();
builder.setUpdateDt(updateDt).setCreateDt(updateDt);
if (member.getMemberId().equals(groupInfo.getOwner())) { if (member.getMemberId().equals(groupInfo.getOwner())) {
member = member.toBuilder().setType(GroupMemberType_Owner).setUpdateDt(updateDt).setCreateDt(updateDt).build(); builder.setType(GroupMemberType_Owner).build();
} else { } else {
if (isAdmin) { if (isAdmin) {
if (member.getType() != GroupMemberType_Owner) if (member.getType() == GroupMemberType_Owner) {
member = member.toBuilder().setUpdateDt(updateDt).setCreateDt(updateDt).build(); builder.setType(GroupMemberType_Normal);
else LOG.error("group member conflicted, group info owner is {}, and group member {} type is owner, set the member to normal member", groupInfo.getOwner(), member.getMemberId());
return ErrorCode.INVALID_PARAMETER; }
} else { } else {
member = member.toBuilder().setType(GroupMemberType_Normal).setUpdateDt(updateDt).setCreateDt(updateDt).build(); builder.setType(GroupMemberType_Normal);
} }
} }
if(!StringUtil.isNullOrEmpty(extra)) {
builder.setExtra(extra);
}
member = builder.build();
tmp.add(member); tmp.add(member);
newInviteUsers.add(member.getMemberId()); newInviteUsers.add(member.getMemberId());
updateDt++; updateDt++;
@@ -2104,7 +2138,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} }
if (session.getPlatform() == Platform_LINUX || session.getPlatform() == Platform_Windows || session.getPlatform() == Platform_OSX) { if (session.getPlatform() == Platform_LINUX || session.getPlatform() == Platform_Windows || session.getPlatform() == Platform_OSX) {
updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(online ? (System.currentTimeMillis() + "|" + session.getPlatform() + "|" + session.getClientID() + "|" + session.getPhoneName()) : "").build()); updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(online ? (System.currentTimeMillis() + "|" + session.getPlatform() + "|" + session.getClientID() + "|" + session.getPhoneName()) : "").build(), session.clientID);
} else { } else {
String value = null; String value = null;
for (MemorySessionStore.Session s : m_Server.getStore().sessionsStore().sessionForUser(session.username)) { for (MemorySessionStore.Session s : m_Server.getStore().sessionsStore().sessionForUser(session.username)) {
@@ -2130,11 +2164,11 @@ public class MemoryMessagesStore implements IMessagesStore {
WFCMessage.UserSettingEntry pcentry = getUserSetting(session.getUsername(), kUserSettingPCOnline, "PC"); WFCMessage.UserSettingEntry pcentry = getUserSetting(session.getUsername(), kUserSettingPCOnline, "PC");
if (value != null) { if (value != null) {
if (pcentry == null || StringUtil.isNullOrEmpty(pcentry.getValue())) { if (pcentry == null || StringUtil.isNullOrEmpty(pcentry.getValue())) {
updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(value).build()); updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(value).build(), session.clientID);
} }
} else { } else {
if (pcentry != null && !StringUtil.isNullOrEmpty(pcentry.getValue())) { if (pcentry != null && !StringUtil.isNullOrEmpty(pcentry.getValue())) {
updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue("").build()); updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue("").build(), session.clientID);
} }
} }
} }
@@ -2458,6 +2492,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} }
} }
if (mDisableStrangerChat) { if (mDisableStrangerChat) {
//在禁止私聊时,允许机器人,物联网设备及管理员进行私聊。 //在禁止私聊时,允许机器人,物联网设备及管理员进行私聊。
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS); IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
@@ -2641,6 +2676,7 @@ public class MemoryMessagesStore implements IMessagesStore {
.setFromUid(userId) .setFromUid(userId)
.setToUid(request.getTargetUid()) .setToUid(request.getTargetUid())
.setReason(request.getReason()) .setReason(request.getReason())
.setExtra(request.getExtra())
.setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Sent) .setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Sent)
.setToReadStatus(false) .setToReadStatus(false)
.setUpdateDt(System.currentTimeMillis()) .setUpdateDt(System.currentTimeMillis())
@@ -3134,7 +3170,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} }
@Override @Override
public long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request) { public long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request, String clientId) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, WFCMessage.UserSettingEntry> userSettingMap = hzInstance.getMultiMap(USER_SETTING); MultiMap<String, WFCMessage.UserSettingEntry> userSettingMap = hzInstance.getMultiMap(USER_SETTING);
@@ -3174,7 +3210,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} else if(request.getScope() == UserSettingScope.kUserSettingHiddenNotificationDetail) { } else if(request.getScope() == UserSettingScope.kUserSettingHiddenNotificationDetail) {
userPushHiddenDetail.remove(userId); userPushHiddenDetail.remove(userId);
} }
IMHandler.getPublisher().publishNotification(IMTopic.NotifyUserSettingTopic, userId, updateDt); IMHandler.getPublisher().publishNotification(IMTopic.NotifyUserSettingTopic, userId, updateDt, clientId);
return updateDt; return updateDt;
} }
@@ -3406,6 +3442,11 @@ public class MemoryMessagesStore implements IMessagesStore {
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();
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS); MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
IMap<String, WFCMessage.ChannelInfo> mIMap = hzInstance.getMap(CHANNELS);
WFCMessage.ChannelInfo channelInfo = mIMap.get(channelId);
if(channelInfo != null && (channelInfo.getStatus() & ProtoConstants.ChannelState.Channel_State_Mask_Private) > 0) {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
getChannelListener(channelId); getChannelListener(channelId);
@@ -3441,12 +3482,12 @@ public class MemoryMessagesStore implements IMessagesStore {
@Override @Override
public boolean checkUserInChannel(String user, String channelId) { public boolean checkUserInChannel(String user, String channelId) {
Collection<String> chatroomMembers = getChannelListener(channelId); Collection<String> channelMembers = getChannelListener(channelId);
if (chatroomMembers == null) { if (channelMembers == null) {
return false; return false;
} }
if(!chatroomMembers.contains(user)) { if(!channelMembers.contains(user)) {
IMap<String, WFCMessage.ChannelInfo> mIMap = m_Server.getHazelcastInstance().getMap(CHANNELS); IMap<String, WFCMessage.ChannelInfo> mIMap = m_Server.getHazelcastInstance().getMap(CHANNELS);
WFCMessage.ChannelInfo info = mIMap.get(channelId); WFCMessage.ChannelInfo info = mIMap.get(channelId);
if (info == null || !info.getOwner().equals(user)) { if (info == null || !info.getOwner().equals(user)) {
@@ -106,8 +106,8 @@ public interface IMessagesStore {
WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType); WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType);
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count); WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count);
long insertUserMessages(String sender, int conversationType, String target, int line, int messageContentType, String userId, long messageId); long insertUserMessages(String sender, int conversationType, String target, int line, int messageContentType, String userId, long messageId);
WFCMessage.GroupInfo createGroup(String operator, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, boolean isAdmin); WFCMessage.GroupInfo createGroup(String operator, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, String memberExtra, boolean isAdmin);
ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList); ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList, String extra);
ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List<String> memberList); ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List<String> memberList);
ErrorCode quitGroup(String operator, String groupId); ErrorCode quitGroup(String operator, String groupId);
void clearUserGroups(String userId); void clearUserGroups(String userId);
@@ -190,7 +190,7 @@ public interface IMessagesStore {
ErrorCode getUserSettings(String userId, long version, WFCMessage.GetUserSettingResult.Builder builder); ErrorCode getUserSettings(String userId, long version, WFCMessage.GetUserSettingResult.Builder builder);
WFCMessage.UserSettingEntry getUserSetting(String userId, int scope, String key); WFCMessage.UserSettingEntry getUserSetting(String userId, int scope, String key);
List<WFCMessage.UserSettingEntry> getUserSetting(String userId, int scope); List<WFCMessage.UserSettingEntry> getUserSetting(String userId, int scope);
long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request); long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request, String clientId);
void clearUserSettings(String userId); void clearUserSettings(String userId);
boolean getUserGlobalSilent(String userId); boolean getUserGlobalSilent(String userId);
@@ -465,14 +465,21 @@ public class MessagesPublisher {
publishNotification(topic, receiver, head, null, null); publishNotification(topic, receiver, head, null, null);
} }
public void publishNotification(String topic, String receiver, long head, String fromUser, String pushContent) { public void publishNotification(String topic, String receiver, long head, String exceptClientId) {
publishNotificationLocal(topic, receiver, head, fromUser, pushContent); publishNotification(topic, receiver, head, null, null, exceptClientId);
} }
void publishNotificationLocal(String topic, String receiver, long head, String fromUser, String pushContent) { public void publishNotification(String topic, String receiver, long head, String fromUser, String pushContent) {
publishNotification(topic, receiver, head, fromUser, pushContent, null);
}
public void publishNotification(String topic, String receiver, long head, String fromUser, String pushContent, String exceptClientId) {
Collection<Session> sessions = m_sessionsStore.sessionForUser(receiver); Collection<Session> sessions = m_sessionsStore.sessionForUser(receiver);
String fromUserName = null; String fromUserName = null;
for (Session targetSession : sessions) { for (Session targetSession : sessions) {
if(targetSession.getClientID().equals(exceptClientId)) {
continue;
}
boolean needPush = !StringUtil.isNullOrEmpty(pushContent); boolean needPush = !StringUtil.isNullOrEmpty(pushContent);
boolean targetIsActive = this.connectionDescriptors.isConnected(targetSession.getClientSession().clientID); boolean targetIsActive = this.connectionDescriptors.isConnected(targetSession.getClientSession().clientID);
if (targetIsActive) { if (targetIsActive) {
+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>0.62</version> <version>0.63</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -40,7 +40,8 @@ public enum ErrorCode {
ERROR_CODE_ALREADY_FRIENDS(23, "already friends"), ERROR_CODE_ALREADY_FRIENDS(23, "already friends"),
ERROR_CODE_RECALL_TIME_EXPIRED(24, "recall time expired"), ERROR_CODE_RECALL_TIME_EXPIRED(24, "time expired"),
ERROR_CODE_CONFERENCE_ROOM_NOT_EXIST(60, "conference room not exist"),
ERROR_CODE_API_NOT_SIGNED(239, "api not signed or sign parameter not completion"), ERROR_CODE_API_NOT_SIGNED(239, "api not signed or sign parameter not completion"),
ERROR_CODE_GROUP_EXCEED_MAX_MEMBER_COUNT(240, "group exceed max member count"), ERROR_CODE_GROUP_EXCEED_MAX_MEMBER_COUNT(240, "group exceed max member count"),
@@ -47,6 +47,9 @@ public class InputAddGroupMember extends InputGroupBase {
groupMemberBuilder.setAlias(pojoGroupMember.getAlias()); groupMemberBuilder.setAlias(pojoGroupMember.getAlias());
} }
groupMemberBuilder.setType(pojoGroupMember.getType()); groupMemberBuilder.setType(pojoGroupMember.getType());
if(!StringUtil.isNullOrEmpty(pojoGroupMember.getExtra())) {
groupMemberBuilder.setExtra(pojoGroupMember.getExtra());
}
addGroupBuilder.addAddedMember(groupMemberBuilder); addGroupBuilder.addAddedMember(groupMemberBuilder);
} }
@@ -67,6 +67,9 @@ public class InputCreateGroup extends InputGroupBase {
groupMemberBuilder.setAlias(pojoGroupMember.getAlias()); groupMemberBuilder.setAlias(pojoGroupMember.getAlias());
} }
groupMemberBuilder.setType(pojoGroupMember.getType()); groupMemberBuilder.setType(pojoGroupMember.getType());
if(!StringUtil.isNullOrEmpty(pojoGroupMember.getExtra())) {
groupMemberBuilder.setExtra(pojoGroupMember.extra);
}
groupBuilder.addMembers(groupMemberBuilder); groupBuilder.addMembers(groupMemberBuilder);
} }
@@ -12,6 +12,7 @@ public class PojoGroupMember {
String member_id; String member_id;
String alias; String alias;
int type; int type;
String extra;
public String getMember_id() { public String getMember_id() {
return member_id; return member_id;
@@ -36,4 +37,12 @@ public class PojoGroupMember {
public void setType(int type) { public void setType(int type) {
this.type = type; this.type = type;
} }
public String getExtra() {
return extra;
}
public void setExtra(String extra) {
this.extra = extra;
}
} }
@@ -94,6 +94,10 @@ public class ProtoConstants {
int Modify_Group_JoinType = 4; int Modify_Group_JoinType = 4;
int Modify_Group_PrivateChat = 5; int Modify_Group_PrivateChat = 5;
int Modify_Group_Searchable = 6; int Modify_Group_Searchable = 6;
//仅专业版支持
int Modify_Group_History_Message = 7;
//仅专业版的server api支持
int Modify_Group_Max_Member_Count = 8;
} }
//ModifyGroupInfoRequest -> type //ModifyGroupInfoRequest -> type
@@ -121,8 +125,9 @@ public class ProtoConstants {
//第1位表示是否允许查看非订阅用户信息 //第1位表示是否允许查看非订阅用户信息
//第2位表示是否允许主动添加用户订阅关系 //第2位表示是否允许主动添加用户订阅关系
//第3位表示是否允许给非订阅用户发送消息 //第3位表示是否允许给非订阅用户发送消息
//第4位表示是否私有 //第4位表示是否私有,不可以被用户搜索和主动订阅
//第6位表示是否删除 //第6位表示是否删除
//第8位表示是否是全局频道,全局频道没有订阅关系,会发送给系统内所有成员。
public interface ChannelState { public interface ChannelState {
int Channel_State_Mask_FullInfo = 0x01; int Channel_State_Mask_FullInfo = 0x01;
int Channel_State_Mask_Unsubscribed_User_Access = 0x02; int Channel_State_Mask_Unsubscribed_User_Access = 0x02;
@@ -130,6 +135,7 @@ public class ProtoConstants {
int Channel_State_Mask_Message_Unsubscribed = 0x08; int Channel_State_Mask_Message_Unsubscribed = 0x08;
int Channel_State_Mask_Private = 0x10; int Channel_State_Mask_Private = 0x10;
int Channel_State_Mask_Deleted = 0x40; int Channel_State_Mask_Deleted = 0x40;
int Channel_State_Mask_Global = 0x80;
} }
File diff suppressed because it is too large Load Diff
+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>0.62</version> <version>0.63</version>
</parent> </parent>
<artifactId>distribution</artifactId> <artifactId>distribution</artifactId>
@@ -109,7 +109,7 @@ friend.request_expiration_duration 604800000
##旧的方式会发送notification消息(contenttype是80),内容会根据好友接收者的语言选择对应的语言,如果双方语言不一致会导致另外一方看到的不是本地语言。 ##旧的方式会发送notification消息(contenttype是80),内容会根据好友接收者的语言选择对应的语言,如果双方语言不一致会导致另外一方看到的不是本地语言。
##新的方式会发送添加好友消息(contenttype是93)和欢迎消息(contenttype是92),需要客户端实现这两种消息。 ##新的方式会发送添加好友消息(contenttype是93)和欢迎消息(contenttype是92),需要客户端实现这两种消息。
##如果客户端已经实现这两种消息可以打开这个开关 ##如果客户端已经实现这两种消息可以打开这个开关
friend.new_welcome_message false friend.new_welcome_message true
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出 ## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
chatroom.participant_idle_time 900000 chatroom.participant_idle_time 900000
+1 -1
View File
@@ -12,7 +12,7 @@
<artifactId>wildfirechat-parent</artifactId> <artifactId>wildfirechat-parent</artifactId>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>0.62</version> <version>0.63</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>
+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>0.62</version> <version>0.63</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>