Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6e8cd4ca8 | ||
|
|
da74b9fa94 | ||
|
|
281fe4c955 | ||
|
|
adfa3d3031 | ||
|
|
6c34a9e512 | ||
|
|
0fd56ba61d | ||
|
|
01342174af | ||
|
|
4742b135a5 | ||
|
|
6466218836 | ||
|
|
a973a731e4 | ||
|
|
90449e08c6 | ||
|
|
5857a3fbd1 | ||
|
|
ae4d8a95ba | ||
|
|
9fa1370219 | ||
|
|
dd4cdb4bc4 | ||
|
|
e07b839671 | ||
|
|
3a0653b8ed | ||
|
|
b4979e5408 |
@@ -7,7 +7,7 @@
|
|||||||
| [android-chat](https://github.com/wildfirechat/android-chat) | 野火IM Android SDK源码和App源码 |可以很方便地进行二次开发,或集成到现有应用当中 |
|
| [android-chat](https://github.com/wildfirechat/android-chat) | 野火IM Android SDK源码和App源码 |可以很方便地进行二次开发,或集成到现有应用当中 |
|
||||||
| [ios-chat](https://github.com/wildfirechat/ios-chat) | 野火IM iOS SDK源码和App源码 |可以很方便地进行二次开发,或集成到现有应用当中 |
|
| [ios-chat](https://github.com/wildfirechat/ios-chat) | 野火IM iOS SDK源码和App源码 |可以很方便地进行二次开发,或集成到现有应用当中 |
|
||||||
| [pc-chat](https://github.com/wildfirechat/pc-chat) | 基于[Electron](https://electronjs.org/)开发的PC平台应用 | |
|
| [pc-chat](https://github.com/wildfirechat/pc-chat) | 基于[Electron](https://electronjs.org/)开发的PC平台应用 | |
|
||||||
| [web-chat](https://github.com/wildfirechat/web-chat) | Web平台的Demo, [体验地址](http://web.wildfirechat.cn) | |
|
| [web-chat](https://github.com/wildfirechat/web-chat) | Web平台的Demo, [体验地址](http://web.wildfirechat.net) | |
|
||||||
| [wx-chat](https://github.com/wildfirechat/wx-chat) | 微信小程序平台的Demo | |
|
| [wx-chat](https://github.com/wildfirechat/wx-chat) | 微信小程序平台的Demo | |
|
||||||
| [server](https://github.com/wildfirechat/server) | IM server | |
|
| [server](https://github.com/wildfirechat/server) | IM server | |
|
||||||
| [app server](https://github.com/wildfirechat/app_server) | 应用服务端 | |
|
| [app server](https://github.com/wildfirechat/app_server) | 应用服务端 | |
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
| [docs](https://github.com/wildfirechat/docs) | 野火IM相关文档,包含设计、概念、开发、使用说明 | | | |
|
| [docs](https://github.com/wildfirechat/docs) | 野火IM相关文档,包含设计、概念、开发、使用说明 | | | |
|
||||||
|
|
||||||
# server
|
# server
|
||||||
本工程为野火IM 社区版IM服务软件。野火IM作为一个通用的即时通讯解决方案,可以集成到各种应用中。请阅读[docs](http://docs.wildfirechat.cn)或下载服务器[发布版本](https://github.com/wildfirechat/server/releases)
|
本工程为野火IM 社区版IM服务软件。野火IM作为一个通用的即时通讯解决方案,可以集成到各种应用中。请阅读[docs](http://docs.wildfirechat.net)或下载服务器[发布版本](https://github.com/wildfirechat/server/releases)
|
||||||
|
|
||||||
|
|
||||||
开发一套IM系统真的很艰辛,请路过的朋友们给点个star,支持我们坚持下去🙏🙏🙏🙏🙏
|
开发一套IM系统真的很艰辛,请路过的朋友们给点个star,支持我们坚持下去🙏🙏🙏🙏🙏
|
||||||
@@ -73,6 +73,7 @@
|
|||||||
## 升级说明
|
## 升级说明
|
||||||
1. 从0.42 版本增加了群成员数限制,默认为2000。如果您从之前的版本升级到这个版本或以后,需要注意到群成员数的限制。升级之后超出限制的群不受影响,但不能继续加人,如果您想修改默认值,可以在升级版本之后,修改t_setting表,把默认的大小改为您期望的人数。另外修改t_group表,把已经存在的群组max_member_count改成您期望的,然后重启。
|
1. 从0.42 版本增加了群成员数限制,默认为2000。如果您从之前的版本升级到这个版本或以后,需要注意到群成员数的限制。升级之后超出限制的群不受影响,但不能继续加人,如果您想修改默认值,可以在升级版本之后,修改t_setting表,把默认的大小改为您期望的人数。另外修改t_group表,把已经存在的群组max_member_count改成您期望的,然后重启。
|
||||||
2. 0.46和0.47版本升级到0.48及以后版本时,可能会提示flyway migrate 38错误,请执行 [修复脚本](https://github.com/wildfirechat/server/blob/wildfirechat/flyway_repaire_migrate_38.sql) 进行修复。0.46和0.47版本之外的版本不会出现此问题。
|
2. 0.46和0.47版本升级到0.48及以后版本时,可能会提示flyway migrate 38错误,请执行 [修复脚本](https://github.com/wildfirechat/server/blob/wildfirechat/flyway_repaire_migrate_38.sql) 进行修复。0.46和0.47版本之外的版本不会出现此问题。
|
||||||
|
3. 从0.54之前版本升级到0.54及以后版本时,会提示flyway migrate错误。因为0.54版本删除了sql脚本中默认敏感词的内容,flyway checksum失败。请执行```update flyway_schema_history set checksum = 0 where script = 'V17__add_default_sensitive_word.sql';```来修复。
|
||||||
|
|
||||||
## 特别感谢
|
## 特别感谢
|
||||||
1. [moquette](https://github.com/moquette-io/moquette) 本项目是基于此项目二次开发而来,处理MQTT相关业务。
|
1. [moquette](https://github.com/moquette-io/moquette) 本项目是基于此项目二次开发而来,处理MQTT相关业务。
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ chatroom.participant_idle_time 900000
|
|||||||
chatroom.rejoin_when_active true
|
chatroom.rejoin_when_active true
|
||||||
|
|
||||||
## 是否允许客户端发送操作群的自定义群通知消息
|
## 是否允许客户端发送操作群的自定义群通知消息
|
||||||
group.allow_client_custom_operation_notification false
|
group.allow_client_custom_operation_notification true
|
||||||
|
|
||||||
## 当群成员退出或者被移除时,是否同时给管理员和相关人员发送显式通知消息。
|
## 当群成员退出或者被移除时,是否同时给管理员和相关人员发送显式通知消息。
|
||||||
## 0 不发送,1 退群时发送,2 踢人时发送,3 退群和踢人时都发送。
|
## 0 不发送,1 退群时发送,2 踢人时发送,3 退群和踢人时都发送。
|
||||||
@@ -213,6 +213,8 @@ push.ios.server.address http://localhost:8085/ios/push
|
|||||||
##消息转发地址
|
##消息转发地址
|
||||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
#message.forward.url http://localhost:8888/im_event/message
|
#message.forward.url http://localhost:8888/im_event/message
|
||||||
|
##需要转发的消息类型,当有多个时以英文逗号分割。如果转发所有消息,请注释掉配置或者设置为空
|
||||||
|
#message.forward.types 1,2,3
|
||||||
|
|
||||||
##设备信息转发地址
|
##设备信息转发地址
|
||||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
@@ -241,5 +243,16 @@ push.ios.server.address http://localhost:8085/ios/push
|
|||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
# Sensitive configuration
|
# Sensitive configuration
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
##文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***;3 记录并继续发送
|
## 内置文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***;3 记录并继续发送
|
||||||
sensitive.filter.type 0
|
sensitive.filter.type 0
|
||||||
|
|
||||||
|
## 如果内置敏感词库无法满足您的需求,可以自己开发部署敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址
|
||||||
|
## 审核服务返回状态码200表示继续发送,如果需要替换内容,返回状态码200并且内容为替换后的内容。返回403表示不允许发送。其它错误继续发送。
|
||||||
|
## 独立审核服务地址,IM服务会post SendMessageData。如果需要修改消息内容,返回 MessagePayload。请参考应用服务中 "/message/censor" Mapping.
|
||||||
|
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
|
||||||
|
## 需要进行敏感词审核的消息类型,当有多个时以英文逗号分割
|
||||||
|
#sensitive.remote_sensitive_message_type 1,2,3
|
||||||
|
## 如果远程审核服务返回403,返回给发送端发送失败还是成功?实际上这个值影响发送响应是否等待审核结果,当为false时,消息发送给审核服务就立即返回
|
||||||
|
## 成功给客户端。当为true时,消息发送给审核服务,等待审核结果,如果结果为继续发送就返回给客户端为成功,结果为禁止发送就返回失败给客户端。
|
||||||
|
## 客户端操作的超时一般为10s左右,且考虑到复杂的网络情况,建议处理时间不要超过3s。建议这个值为false。
|
||||||
|
#sensitive.remote_fail_when_matched false
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -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.52</version>
|
<version>0.55</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>moquette-broker</artifactId>
|
<artifactId>moquette-broker</artifactId>
|
||||||
|
|||||||
@@ -80,9 +80,12 @@ public class LoFileServer {
|
|||||||
|
|
||||||
channel = b.bind(port).sync().channel();
|
channel = b.bind(port).sync().channel();
|
||||||
Logger.info("***** Welcome To LoServer on port [{}], startting spend {}ms *****", port, DateUtil.spendMs(start));
|
Logger.info("***** Welcome To LoServer on port [{}], startting spend {}ms *****", port, DateUtil.spendMs(start));
|
||||||
} finally {
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
Logger.error("端口 {} 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep {}", port, port);
|
||||||
|
System.out.println("端口 " + port + " 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep " + port);
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
if (this.channel != null) {
|
if (this.channel != null) {
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ public class LoServer {
|
|||||||
|
|
||||||
registerAllAction();
|
registerAllAction();
|
||||||
|
|
||||||
|
int bindingPort = port;
|
||||||
try {
|
try {
|
||||||
final ServerBootstrap b = new ServerBootstrap();
|
final ServerBootstrap b = new ServerBootstrap();
|
||||||
final ServerBootstrap adminB = new ServerBootstrap();
|
final ServerBootstrap adminB = new ServerBootstrap();
|
||||||
@@ -87,6 +88,7 @@ public class LoServer {
|
|||||||
channel = b.bind(port).sync().channel();
|
channel = b.bind(port).sync().channel();
|
||||||
|
|
||||||
|
|
||||||
|
bindingPort = adminPort;
|
||||||
adminB.group(bossGroup, workerGroup)
|
adminB.group(bossGroup, workerGroup)
|
||||||
.channel(NioServerSocketChannel.class)
|
.channel(NioServerSocketChannel.class)
|
||||||
.option(ChannelOption.SO_BACKLOG, 10240) // 服务端可连接队列大小
|
.option(ChannelOption.SO_BACKLOG, 10240) // 服务端可连接队列大小
|
||||||
@@ -108,10 +110,14 @@ public class LoServer {
|
|||||||
|
|
||||||
adminChannel = adminB.bind(adminPort).sync().channel();
|
adminChannel = adminB.bind(adminPort).sync().channel();
|
||||||
Logger.info("***** Welcome To LoServer on port [{},{}], startting spend {}ms *****", port, adminPort, DateUtil.spendMs(start));
|
Logger.info("***** Welcome To LoServer on port [{},{}], startting spend {}ms *****", port, adminPort, DateUtil.spendMs(start));
|
||||||
} finally {
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
Logger.error("端口 {} 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep {}", bindingPort, bindingPort);
|
||||||
|
System.out.println("端口 " + bindingPort + " 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep " + bindingPort);
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
if (this.channel!= null) {
|
if (this.channel!= null) {
|
||||||
this.channel.close();
|
this.channel.close();
|
||||||
|
|||||||
+61
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* 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.pojos.InputUserId;
|
||||||
|
import cn.wildfirechat.pojos.OutputStringList;
|
||||||
|
import cn.wildfirechat.pojos.RelationPojo;
|
||||||
|
import cn.wildfirechat.pojos.StringPairPojo;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
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 com.xiaoleilu.loServer.model.FriendData;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(APIPath.Relation_Get)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class RelationGetAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
StringPairPojo input = getRequestBody(request.getNettyRequest(), StringPairPojo.class);
|
||||||
|
FriendData data = messagesStore.getFriendData(input.getFirst(), input.getSecond());
|
||||||
|
|
||||||
|
RelationPojo out = new RelationPojo();
|
||||||
|
out.userId = input.getFirst();
|
||||||
|
out.targetId = input.getSecond();
|
||||||
|
if(data != null ) {
|
||||||
|
out.isFriend = data.getState() == 0;
|
||||||
|
out.isBlacked = data.getBlacked() == 1;
|
||||||
|
out.alias = data.getAlias();
|
||||||
|
out.extra = data.getExtra();
|
||||||
|
}
|
||||||
|
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
RestResult result = RestResult.ok(out);
|
||||||
|
response.setContent(new Gson().toJson(result));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+65
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* 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.common.IMExceptionEvent;
|
||||||
|
import cn.wildfirechat.pojos.InputOutputUserInfo;
|
||||||
|
import cn.wildfirechat.pojos.InputUpdateUserInfo;
|
||||||
|
import cn.wildfirechat.pojos.OutputCreateUser;
|
||||||
|
import cn.wildfirechat.proto.ProtoConstants;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
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.handler.codec.http.HttpResponseStatus;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import win.liyufan.im.UUIDGenerator;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
|
@Route(APIPath.Update_User)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class UpdateUserAction extends AdminAction {
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(UpdateUserAction.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputUpdateUserInfo inputCreateUser = getRequestBody(request.getNettyRequest(), InputUpdateUserInfo.class);
|
||||||
|
if (inputCreateUser != null
|
||||||
|
&& inputCreateUser.userInfo != null
|
||||||
|
&& !StringUtil.isNullOrEmpty(inputCreateUser.userInfo.getUserId())
|
||||||
|
&& inputCreateUser.flag > 0) {
|
||||||
|
|
||||||
|
ErrorCode errorCode = messagesStore.updateUserInfo(inputCreateUser.userInfo, inputCreateUser.flag);
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
RestResult result = RestResult.resultOf(errorCode);
|
||||||
|
response.setContent(new Gson().toJson(result));
|
||||||
|
} else {
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||||
|
response.setContent(new Gson().toJson(result));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -121,7 +121,12 @@ public final class BrokerConstants {
|
|||||||
|
|
||||||
public static final String SENSITIVE_Filter_Type = "sensitive.filter.type";
|
public static final String SENSITIVE_Filter_Type = "sensitive.filter.type";
|
||||||
|
|
||||||
|
public static final String SENSITIVE_Remote_Server_URL = "sensitive.remote_server_url";
|
||||||
|
public static final String SENSITIVE_Remote_Message_Type = "sensitive.remote_sensitive_message_type";
|
||||||
|
public static final String SENSITIVE_Remote_Fail_When_Matched = "sensitive.remote_fail_when_matched";
|
||||||
|
|
||||||
public static final String MESSAGE_Forward_Url = "message.forward.url";
|
public static final String MESSAGE_Forward_Url = "message.forward.url";
|
||||||
|
public static final String MESSAGE_Forward_Types = "message.forward.types";
|
||||||
|
|
||||||
public static final String SERVER_MULTI_ENDPOINT = "server.multi_endpoint";
|
public static final String SERVER_MULTI_ENDPOINT = "server.multi_endpoint";
|
||||||
public static final String SERVER_MULTI_PLATFROM_NOTIFICATION = "server.multi_platform_notification";
|
public static final String SERVER_MULTI_PLATFROM_NOTIFICATION = "server.multi_platform_notification";
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ abstract public class GroupHandler<T> extends IMHandler<T> {
|
|||||||
try {
|
try {
|
||||||
long messageId = MessageShardingUtil.generateId();
|
long messageId = MessageShardingUtil.generateId();
|
||||||
builder.setMessageId(messageId);
|
builder.setMessageId(messageId);
|
||||||
saveAndPublish(fromUser, null, builder.build(), false);
|
saveAndPublish(fromUser, null, builder.build());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
|
|||||||
long timestamp = System.currentTimeMillis();
|
long timestamp = System.currentTimeMillis();
|
||||||
builder.setMessageId(messageId);
|
builder.setMessageId(messageId);
|
||||||
builder.setServerTimestamp(timestamp);
|
builder.setServerTimestamp(timestamp);
|
||||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
saveAndPublish(request.getTargetUid(), null, builder.build());
|
||||||
|
|
||||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
||||||
String language = "zh_CN";
|
String language = "zh_CN";
|
||||||
@@ -60,7 +60,7 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
|
|||||||
|
|
||||||
messageId = MessageShardingUtil.generateId();
|
messageId = MessageShardingUtil.generateId();
|
||||||
builder.setMessageId(messageId);
|
builder.setMessageId(messageId);
|
||||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
saveAndPublish(request.getTargetUid(), null, builder.build());
|
||||||
|
|
||||||
if (m_messagesStore.isNewFriendWelcomeMessage()) {
|
if (m_messagesStore.isNewFriendWelcomeMessage()) {
|
||||||
contentBuilder.setType(93);
|
contentBuilder.setType(93);
|
||||||
@@ -73,7 +73,7 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
|
|||||||
builder.setMessageId(messageId);
|
builder.setMessageId(messageId);
|
||||||
timestamp = System.currentTimeMillis();
|
timestamp = System.currentTimeMillis();
|
||||||
builder.setServerTimestamp(timestamp);
|
builder.setServerTimestamp(timestamp);
|
||||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
saveAndPublish(request.getTargetUid(), null, builder.build());
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
@@ -204,8 +204,9 @@ abstract public class IMHandler<T> {
|
|||||||
errorCode = ErrorCode.ERROR_CODE_SERVER_ERROR;
|
errorCode = ErrorCode.ERROR_CODE_SERVER_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(errorCode != ErrorCode.INVALID_ASYNC_HANDLING) {
|
||||||
response(ackPayload, errorCode, callback);
|
response(ackPayload, errorCode, callback);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG.error("Handler {} preAction failure", this.getClass().getName());
|
LOG.error("Handler {} preAction failure", this.getClass().getName());
|
||||||
ByteBuf ackPayload = Unpooled.buffer(1);
|
ByteBuf ackPayload = Unpooled.buffer(1);
|
||||||
@@ -236,17 +237,17 @@ abstract public class IMHandler<T> {
|
|||||||
Set<String> notifyReceivers = new LinkedHashSet<>();
|
Set<String> notifyReceivers = new LinkedHashSet<>();
|
||||||
|
|
||||||
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
|
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
|
||||||
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers, false);
|
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers);
|
||||||
mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType));
|
mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType));
|
||||||
return notifyReceivers.size();
|
return notifyReceivers.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected long saveAndPublish(String username, String clientID, WFCMessage.Message message, boolean ignoreMsg) {
|
protected long saveAndPublish(String username, String clientID, WFCMessage.Message message) {
|
||||||
Set<String> notifyReceivers = new LinkedHashSet<>();
|
Set<String> notifyReceivers = new LinkedHashSet<>();
|
||||||
|
|
||||||
message = m_messagesStore.storeMessage(username, clientID, message);
|
message = m_messagesStore.storeMessage(username, clientID, message);
|
||||||
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
|
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
|
||||||
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers, ignoreMsg);
|
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers);
|
||||||
mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType));
|
mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType));
|
||||||
return notifyReceivers.size();
|
return notifyReceivers.size();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,32 +8,51 @@
|
|||||||
|
|
||||||
package io.moquette.imhandler;
|
package io.moquette.imhandler;
|
||||||
|
|
||||||
|
import cn.wildfirechat.pojos.MessagePayload;
|
||||||
import cn.wildfirechat.proto.ProtoConstants;
|
import cn.wildfirechat.proto.ProtoConstants;
|
||||||
import cn.wildfirechat.proto.WFCMessage;
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
import com.hazelcast.util.StringUtil;
|
import com.hazelcast.util.StringUtil;
|
||||||
import io.moquette.BrokerConstants;
|
import io.moquette.BrokerConstants;
|
||||||
import io.moquette.spi.impl.Qos1PublishHandler;
|
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import io.netty.buffer.Unpooled;
|
||||||
|
import win.liyufan.im.HttpUtils;
|
||||||
import win.liyufan.im.IMTopic;
|
import win.liyufan.im.IMTopic;
|
||||||
import win.liyufan.im.MessageShardingUtil;
|
import win.liyufan.im.MessageShardingUtil;
|
||||||
import win.liyufan.im.Utility;
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import static cn.wildfirechat.proto.ProtoConstants.ContentType.Text;
|
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
|
||||||
@Handler(value = IMTopic.SendMessageTopic)
|
@Handler(value = IMTopic.SendMessageTopic)
|
||||||
public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||||
private int mSensitiveType = 0; //命中敏感词时,0 失败,1 吞掉, 2 敏感词替换成*。
|
private int mSensitiveType = 0; //命中敏感词时,0 失败,1 吞掉, 2 敏感词替换成*。
|
||||||
private String mForwardUrl = null;
|
private String mForwardUrl = null;
|
||||||
|
private Set<Integer> mForwardMessageTypes = new HashSet<>();
|
||||||
private int mBlacklistStrategy = 0; //黑名单中时,0失败,1吞掉。
|
private int mBlacklistStrategy = 0; //黑名单中时,0失败,1吞掉。
|
||||||
|
|
||||||
|
private String mRemoteSensitiveServerUrl = null;
|
||||||
|
private Set<Integer> mRemoteSensitiveMessageTypes;
|
||||||
|
private boolean mWaitRemoteSensitiveServerResponse = false;
|
||||||
|
|
||||||
public SendMessageHandler() {
|
public SendMessageHandler() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
String forwardUrl = mServer.getConfig().getProperty(BrokerConstants.MESSAGE_Forward_Url);
|
String forwardUrl = mServer.getConfig().getProperty(BrokerConstants.MESSAGE_Forward_Url);
|
||||||
if (!StringUtil.isNullOrEmpty(forwardUrl)) {
|
if (!StringUtil.isNullOrEmpty(forwardUrl)) {
|
||||||
mForwardUrl = forwardUrl;
|
mForwardUrl = forwardUrl;
|
||||||
|
|
||||||
|
String forwardTypes = mServer.getConfig().getProperty(BrokerConstants.MESSAGE_Forward_Types);
|
||||||
|
if (!StringUtil.isNullOrEmpty(forwardTypes)) {
|
||||||
|
String[] tss = forwardTypes.split(",");
|
||||||
|
for (String ts:tss) {
|
||||||
|
mForwardMessageTypes.add(Integer.parseInt(ts.trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -49,6 +68,24 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e);
|
Utility.printExecption(LOG, e);
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
mRemoteSensitiveServerUrl = mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Remote_Server_URL);
|
||||||
|
if(!StringUtil.isNullOrEmpty(mRemoteSensitiveServerUrl)) {
|
||||||
|
mWaitRemoteSensitiveServerResponse = Boolean.parseBoolean(mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Remote_Fail_When_Matched, "false"));
|
||||||
|
String types = mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Remote_Message_Type, "");
|
||||||
|
mRemoteSensitiveMessageTypes = new HashSet<>();
|
||||||
|
if(!StringUtil.isNullOrEmpty(types)) {
|
||||||
|
String[] ts = types.split(",");
|
||||||
|
for (String t:ts) {
|
||||||
|
mRemoteSensitiveMessageTypes.add(Integer.parseInt(t.trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -105,7 +142,7 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
long timestamp = System.currentTimeMillis();
|
long timestamp = System.currentTimeMillis();
|
||||||
long messageId = 0;
|
final long messageId;
|
||||||
try {
|
try {
|
||||||
messageId = MessageShardingUtil.generateId();
|
messageId = MessageShardingUtil.generateId();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -114,34 +151,101 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
|||||||
}
|
}
|
||||||
message = message.toBuilder().setFromUser(fromUser).setMessageId(messageId).setServerTimestamp(timestamp).build();
|
message = message.toBuilder().setFromUser(fromUser).setMessageId(messageId).setServerTimestamp(timestamp).build();
|
||||||
|
|
||||||
if (mForwardUrl != null) {
|
if (mForwardUrl != null && (mForwardMessageTypes.isEmpty() || mForwardMessageTypes.contains(message.getContent().getType()))) {
|
||||||
publisher.forwardMessage(message, mForwardUrl);
|
publisher.forwardMessage(message, mForwardUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!isAdmin) {
|
if (!isAdmin) {
|
||||||
Set<String> matched = m_messagesStore.handleSensitiveWord(message.getContent().getSearchableContent());
|
if(StringUtil.isNullOrEmpty(mRemoteSensitiveServerUrl)) {
|
||||||
if (matched != null && !matched.isEmpty()) {
|
Set<String> matched = m_messagesStore.handleSensitiveWord(message.getContent().getSearchableContent());
|
||||||
m_messagesStore.storeSensitiveMessage(message);
|
if (matched != null && !matched.isEmpty()) {
|
||||||
if (mSensitiveType == 0) {
|
m_messagesStore.storeSensitiveMessage(message);
|
||||||
errorCode = ErrorCode.ERROR_CODE_SENSITIVE_MATCHED;
|
if (mSensitiveType == 0) {
|
||||||
} else if(mSensitiveType == 1) {
|
errorCode = ErrorCode.ERROR_CODE_SENSITIVE_MATCHED;
|
||||||
ignoreMsg = true;
|
} else if (mSensitiveType == 1) {
|
||||||
} else if(mSensitiveType == 2) {
|
ignoreMsg = true;
|
||||||
String text = message.getContent().getSearchableContent();
|
} else if (mSensitiveType == 2) {
|
||||||
for (String word : matched) {
|
String text = message.getContent().getSearchableContent();
|
||||||
text = text.replace(word, "***");
|
for (String word : matched) {
|
||||||
|
text = text.replace(word, "***");
|
||||||
|
}
|
||||||
|
message = message.toBuilder().setContent(message.getContent().toBuilder().setSearchableContent(text).build()).build();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(mRemoteSensitiveMessageTypes.contains(message.getContent().getType())) {
|
||||||
|
final WFCMessage.Message finalMsg = message;
|
||||||
|
publisher.forwardMessageWithCallback(message, mRemoteSensitiveServerUrl, new HttpUtils.HttpCallback() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(String content) {
|
||||||
|
if(StringUtil.isNullOrEmpty(content)) {
|
||||||
|
saveAndPublish(fromUser, clientID, finalMsg);
|
||||||
|
} else {
|
||||||
|
MessagePayload payload = new Gson().fromJson(content, MessagePayload.class);
|
||||||
|
if (payload != null && payload.getType() > 0) {
|
||||||
|
WFCMessage.Message newMsg = finalMsg.toBuilder().setContent(payload.toProtoMessageContent()).build();
|
||||||
|
saveAndPublish(fromUser, clientID, newMsg);
|
||||||
|
} else {
|
||||||
|
LOG.error("Response content {} from censor is invalid payload, ignore response and send original message", content);
|
||||||
|
saveAndPublish(fromUser, clientID, finalMsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(mWaitRemoteSensitiveServerResponse) {
|
||||||
|
ByteBuf ackPayload = Unpooled.buffer(21);
|
||||||
|
ErrorCode errorCode = ERROR_CODE_SUCCESS;
|
||||||
|
ackPayload.writeByte(errorCode.getCode());
|
||||||
|
ackPayload.writeLong(messageId);
|
||||||
|
ackPayload.writeLong(timestamp);
|
||||||
|
callback.onIMHandled(ErrorCode.ERROR_CODE_SUCCESS, ackPayload);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
message = message.toBuilder().setContent(message.getContent().toBuilder().setSearchableContent(text).build()).build();
|
@Override
|
||||||
} else if(mSensitiveType == 3) {
|
public void onFailure(int statusCode, String errorMessage) {
|
||||||
|
ByteBuf ackPayload = null;
|
||||||
|
ErrorCode errorCode = ERROR_CODE_SUCCESS;
|
||||||
|
if(statusCode == 403) {
|
||||||
|
if(mWaitRemoteSensitiveServerResponse) {
|
||||||
|
errorCode = ErrorCode.ERROR_CODE_SENSITIVE_MATCHED;
|
||||||
|
ackPayload = Unpooled.buffer(1);
|
||||||
|
ackPayload.writeByte(errorCode.getCode());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LOG.warn("Failed to censor message with status {}, errorMessage {}. Send the original message", statusCode, errorMessage);
|
||||||
|
saveAndPublish(fromUser, clientID, finalMsg);
|
||||||
|
|
||||||
|
if(mWaitRemoteSensitiveServerResponse) {
|
||||||
|
errorCode = ERROR_CODE_SUCCESS;
|
||||||
|
ackPayload = Unpooled.buffer(21);
|
||||||
|
ackPayload.writeByte(errorCode.getCode());
|
||||||
|
ackPayload.writeLong(messageId);
|
||||||
|
ackPayload.writeLong(timestamp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mWaitRemoteSensitiveServerResponse) {
|
||||||
|
callback.onIMHandled(errorCode, ackPayload);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if(mWaitRemoteSensitiveServerResponse) {
|
||||||
|
ackPayload.clear();
|
||||||
|
return ErrorCode.INVALID_ASYNC_HANDLING;
|
||||||
|
} else {
|
||||||
|
ackPayload = ackPayload.capacity(20);
|
||||||
|
ackPayload.writeLong(messageId);
|
||||||
|
ackPayload.writeLong(timestamp);
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
saveAndPublish(fromUser, clientID, message, ignoreMsg);
|
if(!ignoreMsg) {
|
||||||
|
saveAndPublish(fromUser, clientID, message);
|
||||||
|
}
|
||||||
ackPayload = ackPayload.capacity(20);
|
ackPayload = ackPayload.capacity(20);
|
||||||
ackPayload.writeLong(messageId);
|
ackPayload.writeLong(messageId);
|
||||||
ackPayload.writeLong(timestamp);
|
ackPayload.writeLong(timestamp);
|
||||||
|
|||||||
@@ -1136,7 +1136,6 @@ public class DatabaseStore {
|
|||||||
"`_type` = ?," +
|
"`_type` = ?," +
|
||||||
"`_extra` = ?," +
|
"`_extra` = ?," +
|
||||||
"`_dt` = ?," +
|
"`_dt` = ?," +
|
||||||
"`_member_count` = ?," +
|
|
||||||
"`_mute` = ?" +
|
"`_mute` = ?" +
|
||||||
", `_join_type` = ?" +
|
", `_join_type` = ?" +
|
||||||
", `_private_chat` = ?" +
|
", `_private_chat` = ?" +
|
||||||
@@ -1167,7 +1166,6 @@ public class DatabaseStore {
|
|||||||
statement.setInt(index++, groupInfo.getType());
|
statement.setInt(index++, groupInfo.getType());
|
||||||
statement.setString(index++, groupInfo.getExtra());
|
statement.setString(index++, groupInfo.getExtra());
|
||||||
statement.setLong(index++, groupInfo.getUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
|
statement.setLong(index++, groupInfo.getUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
|
||||||
statement.setInt(index++, groupInfo.getMemberCount());
|
|
||||||
statement.setInt(index++, groupInfo.getMute());
|
statement.setInt(index++, groupInfo.getMute());
|
||||||
statement.setInt(index++, groupInfo.getJoinType());
|
statement.setInt(index++, groupInfo.getJoinType());
|
||||||
statement.setInt(index++, groupInfo.getPrivateChat());
|
statement.setInt(index++, groupInfo.getPrivateChat());
|
||||||
@@ -1605,12 +1603,10 @@ public class DatabaseStore {
|
|||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
String sql = "select `_gid` from t_group_member where `_mid` = ? and `_type` <> ?";
|
String sql = "select `_gid` from t_group_member where `_mid` = ? and `_type` <> 4";
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
statement.setString(1, userId);
|
statement.setString(1, userId);
|
||||||
statement.setInt(2, ProtoConstants.GroupMemberType.GroupMemberType_Removed);
|
|
||||||
|
|
||||||
|
|
||||||
rs = statement.executeQuery();
|
rs = statement.executeQuery();
|
||||||
Set<String> out = new HashSet<>();
|
Set<String> out = new HashSet<>();
|
||||||
@@ -1628,25 +1624,17 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
void updateGroupMemberCountDt(final String groupId, final int count, final long dt) {
|
|
||||||
|
void updateGroupMemberDt(final String groupId, final long dt) {
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
|
|
||||||
String sql ;
|
String sql = "update t_group set `_member_dt` = ?, `_dt` = ? where `_gid` = ?";
|
||||||
|
|
||||||
if (count >= 0) {
|
|
||||||
sql = "update t_group set `_member_count` = ?, `_member_dt` = ? , `_dt` = ? where `_gid` = ?";
|
|
||||||
} else {
|
|
||||||
sql = "update t_group set `_member_dt` = ?, `_dt` = ? where `_gid` = ?";
|
|
||||||
}
|
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
int index = 1;
|
int index = 1;
|
||||||
if (count >=0) {
|
|
||||||
statement.setInt(index++, count);
|
|
||||||
}
|
|
||||||
statement.setLong(index++, dt);
|
statement.setLong(index++, dt);
|
||||||
statement.setLong(index++, dt);
|
statement.setLong(index++, dt);
|
||||||
statement.setString(index++, groupId);
|
statement.setString(index++, groupId);
|
||||||
@@ -1662,6 +1650,29 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateGroupMemberCountDt(final String groupId) {
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
|
||||||
|
String sql = "update t_group set `_member_count` = (select count(*) from t_group_member where `_gid` = ? and `_type` <> 4 limit 1), `_dt` = ?, `_member_dt` = `_member_dt` + 1 where `_gid` = ?";
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setString(1, groupId);
|
||||||
|
statement.setLong(2, System.currentTimeMillis());
|
||||||
|
statement.setString(3, groupId);
|
||||||
|
|
||||||
|
int c = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", c);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void persistGroupMember(final String groupId, final List<WFCMessage.GroupMember> memberList) {
|
void persistGroupMember(final String groupId, final List<WFCMessage.GroupMember> memberList) {
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
@@ -1724,11 +1735,8 @@ public class DatabaseStore {
|
|||||||
int removeGroupMember(String groupId, List<String> groupMembers) {
|
int removeGroupMember(String groupId, List<String> groupMembers) {
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
PreparedStatement statement2 = null;
|
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
connection.setAutoCommit(false);
|
|
||||||
|
|
||||||
StringBuilder sqlBuilder = new StringBuilder("update t_group_member set `_type` = ?, `_dt` = ? where `_mid` in (");
|
StringBuilder sqlBuilder = new StringBuilder("update t_group_member set `_type` = ?, `_dt` = ? where `_mid` in (");
|
||||||
for (int i = 0; i < groupMembers.size(); i++) {
|
for (int i = 0; i < groupMembers.size(); i++) {
|
||||||
sqlBuilder.append("?");
|
sqlBuilder.append("?");
|
||||||
@@ -1737,9 +1745,7 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqlBuilder.append(")");
|
sqlBuilder.append(")");
|
||||||
|
|
||||||
sqlBuilder.append(" and _gid = ?");
|
sqlBuilder.append(" and _gid = ?");
|
||||||
|
|
||||||
statement = connection.prepareStatement(sqlBuilder.toString());
|
statement = connection.prepareStatement(sqlBuilder.toString());
|
||||||
|
|
||||||
int index = 1;
|
int index = 1;
|
||||||
@@ -1751,36 +1757,14 @@ public class DatabaseStore {
|
|||||||
statement.setString(index++, memberId);
|
statement.setString(index++, memberId);
|
||||||
}
|
}
|
||||||
statement.setString(index++, groupId);
|
statement.setString(index++, groupId);
|
||||||
|
|
||||||
int count = statement.executeUpdate();
|
int count = statement.executeUpdate();
|
||||||
LOG.info("Update rows {}", count);
|
LOG.info("Update rows {}", count);
|
||||||
|
|
||||||
String sql = "update t_group set `_member_count` = `_member_count` - ?, `_member_dt` = ? , `_dt` = ? where `_gid` = ?";
|
|
||||||
|
|
||||||
statement2 = connection.prepareStatement(sql);
|
|
||||||
index = 1;
|
|
||||||
statement2.setInt(index++, count);
|
|
||||||
statement2.setLong(index++, current);
|
|
||||||
statement2.setLong(index++, current);
|
|
||||||
statement2.setString(index++, groupId);
|
|
||||||
statement2.executeUpdate();
|
|
||||||
connection.commit();
|
|
||||||
connection.setAutoCommit(true);
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
if (connection != null) {
|
|
||||||
try {
|
|
||||||
connection.commit();
|
|
||||||
connection.setAutoCommit(true);
|
|
||||||
} catch (SQLException e1) {
|
|
||||||
e1.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||||
} finally {
|
} finally {
|
||||||
DBUtil.closeDB(connection, statement);
|
DBUtil.closeDB(connection, statement);
|
||||||
DBUtil.closeDB(connection, statement2);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ import static cn.wildfirechat.proto.ProtoConstants.ModifyChannelInfoType.*;
|
|||||||
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.*;
|
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.*;
|
||||||
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
|
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
|
||||||
import static cn.wildfirechat.proto.ProtoConstants.Platform.*;
|
import static cn.wildfirechat.proto.ProtoConstants.Platform.*;
|
||||||
|
import static cn.wildfirechat.proto.ProtoConstants.UpdateUserInfoMask.*;
|
||||||
import static io.moquette.BrokerConstants.*;
|
import static io.moquette.BrokerConstants.*;
|
||||||
import static io.moquette.server.Constants.MAX_CHATROOM_MESSAGE_QUEUE;
|
import static io.moquette.server.Constants.MAX_CHATROOM_MESSAGE_QUEUE;
|
||||||
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
||||||
@@ -406,24 +407,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder messageBuilder, Set<String> notifyReceivers, boolean ignoreMsg) {
|
public int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder messageBuilder, Set<String> notifyReceivers) {
|
||||||
WFCMessage.Message message = messageBuilder.build();
|
WFCMessage.Message message = messageBuilder.build();
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
int type = message.getConversation().getType();
|
int type = message.getConversation().getType();
|
||||||
int pullType = ProtoConstants.PullType.Pull_Normal;
|
int pullType = ProtoConstants.PullType.Pull_Normal;
|
||||||
|
|
||||||
if (ignoreMsg) {
|
|
||||||
if (type == ProtoConstants.ConversationType.ConversationType_ChatRoom) {
|
|
||||||
pullType = ProtoConstants.PullType.Pull_ChatRoom;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if (message.getContent().getPersistFlag() != Transparent) {
|
|
||||||
notifyReceivers.add(fromUser);
|
|
||||||
// }
|
|
||||||
return pullType;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (type == ProtoConstants.ConversationType.ConversationType_Private) {
|
if (type == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||||
notifyReceivers.add(fromUser);
|
notifyReceivers.add(fromUser);
|
||||||
notifyReceivers.add(message.getConversation().getTarget());
|
notifyReceivers.add(message.getConversation().getTarget());
|
||||||
@@ -934,7 +923,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
.setExtra(groupInfo.getExtra())
|
.setExtra(groupInfo.getExtra())
|
||||||
.setUpdateDt(dt)
|
.setUpdateDt(dt)
|
||||||
.setMemberUpdateDt(dt)
|
.setMemberUpdateDt(dt)
|
||||||
.setMemberCount(memberList.size())
|
.setMemberCount(updatedMemberList.size())
|
||||||
.setOwner(owner)
|
.setOwner(owner)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@@ -1158,26 +1147,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (WFCMessage.GroupMember member : members) {
|
|
||||||
if (newInviteUsers.contains(member.getMemberId())) {
|
|
||||||
groupMembers.remove(groupId, member);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (WFCMessage.GroupMember member : memberList) {
|
|
||||||
groupMembers.put(groupId, member);
|
|
||||||
}
|
|
||||||
|
|
||||||
int count = 0;
|
|
||||||
for (WFCMessage.GroupMember member : groupMembers.get(groupId)) {
|
|
||||||
if (member.getType() != GroupMemberType_Removed) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mIMap.put(groupId, groupInfo.toBuilder().setMemberUpdateDt(updateDt).setUpdateDt(updateDt).setMemberCount(count).build());
|
|
||||||
databaseStore.persistGroupMember(groupId, memberList);
|
databaseStore.persistGroupMember(groupId, memberList);
|
||||||
databaseStore.updateGroupMemberCountDt(groupId, count, updateDt);
|
databaseStore.updateGroupMemberCountDt(groupId);
|
||||||
|
|
||||||
|
groupMembers.remove(groupId);
|
||||||
|
mIMap.evict(groupId);
|
||||||
|
|
||||||
List<String> memberIds = new ArrayList<>();
|
List<String> memberIds = new ArrayList<>();
|
||||||
for (WFCMessage.GroupMember member : memberList) {
|
for (WFCMessage.GroupMember member : memberList) {
|
||||||
@@ -1203,12 +1177,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
void removeGroupMember(String groupId, List<String> memberIds) {
|
void removeGroupMember(String groupId, List<String> memberIds) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
databaseStore.removeGroupMember(groupId, memberIds);
|
databaseStore.removeGroupMember(groupId, memberIds);
|
||||||
|
databaseStore.updateGroupMemberCountDt(groupId);
|
||||||
|
|
||||||
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||||
groupMembers.remove(groupId);
|
groupMembers.remove(groupId);
|
||||||
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
|
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
|
||||||
mIMap.evict(groupId);
|
mIMap.evict(groupId);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeFavGroup(String groupId, List<String> memberIds) {
|
void removeFavGroup(String groupId, List<String> memberIds) {
|
||||||
@@ -1396,8 +1370,6 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WFCMessage.GroupInfo.Builder newInfoBuilder = oldInfo.toBuilder();
|
WFCMessage.GroupInfo.Builder newInfoBuilder = oldInfo.toBuilder();
|
||||||
|
|
||||||
if (modifyType == Modify_Group_Name)
|
if (modifyType == Modify_Group_Name)
|
||||||
@@ -1419,7 +1391,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
|
|
||||||
newInfoBuilder.setUpdateDt(System.currentTimeMillis());
|
newInfoBuilder.setUpdateDt(System.currentTimeMillis());
|
||||||
mIMap.put(groupId, newInfoBuilder.build());
|
databaseStore.persistGroupInfo(newInfoBuilder.build());
|
||||||
|
mIMap.evict(groupId);
|
||||||
|
|
||||||
if (modifyType == Modify_Group_Mute) {
|
if (modifyType == Modify_Group_Mute) {
|
||||||
if (newInfoBuilder.getMute() > 0) {
|
if (newInfoBuilder.getMute() > 0) {
|
||||||
@@ -1500,7 +1473,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
groupMembers.remove(groupId, member);
|
groupMembers.remove(groupId, member);
|
||||||
member = member.toBuilder().setAlias(alias).setUpdateDt(updateDt).build();
|
member = member.toBuilder().setAlias(alias).setUpdateDt(updateDt).build();
|
||||||
databaseStore.persistGroupMember(groupId, Arrays.asList(member));
|
databaseStore.persistGroupMember(groupId, Arrays.asList(member));
|
||||||
databaseStore.updateGroupMemberCountDt(groupId, -1, updateDt);
|
databaseStore.updateGroupMemberDt(groupId, updateDt);
|
||||||
groupMembers.put(groupId, member);
|
groupMembers.put(groupId, member);
|
||||||
|
|
||||||
mIMap.set(groupId, groupInfo.toBuilder().setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build());
|
mIMap.set(groupId, groupInfo.toBuilder().setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build());
|
||||||
@@ -1704,11 +1677,10 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
member = member.toBuilder().setType(type == 0 ? ProtoConstants.GroupMemberType.GroupMemberType_Normal : ProtoConstants.GroupMemberType.GroupMemberType_Manager).setUpdateDt(updateDt).build();
|
member = member.toBuilder().setType(type == 0 ? ProtoConstants.GroupMemberType.GroupMemberType_Normal : ProtoConstants.GroupMemberType.GroupMemberType_Manager).setUpdateDt(updateDt).build();
|
||||||
databaseStore.persistGroupMember(groupId, Arrays.asList(member));
|
databaseStore.persistGroupMember(groupId, Arrays.asList(member));
|
||||||
groupMembers.put(groupId, member);
|
groupMembers.put(groupId, member);
|
||||||
// userList.remove(member.getMemberId());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
databaseStore.persistGroupInfo(groupInfo.toBuilder().setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build());
|
||||||
mIMap.put(groupId, groupInfo.toBuilder().setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build());
|
mIMap.evict(groupId);
|
||||||
|
|
||||||
callbackGroupMemberEvent(operator, groupId, userList, ProtoConstants.GroupMemberUpdateEventType.Group_Member_Event_Type_Update, (type == 0 ? ProtoConstants.GroupMemberType.GroupMemberType_Normal : ProtoConstants.GroupMemberType.GroupMemberType_Manager) + "");
|
callbackGroupMemberEvent(operator, groupId, userList, ProtoConstants.GroupMemberUpdateEventType.Group_Member_Event_Type_Update, (type == 0 ? ProtoConstants.GroupMemberType.GroupMemberType_Normal : ProtoConstants.GroupMemberType.GroupMemberType_Manager) + "");
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
@@ -2156,6 +2128,56 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ErrorCode updateUserInfo(InputOutputUserInfo userInfo, int flag) {
|
||||||
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
|
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
||||||
|
WFCMessage.User user = mUserMap.get(userInfo.getUserId());
|
||||||
|
if(user == null) {
|
||||||
|
return ErrorCode.ERROR_CODE_NOT_EXIST;
|
||||||
|
}
|
||||||
|
WFCMessage.User.Builder builder = user.toBuilder();
|
||||||
|
if((flag & Update_User_DisplayName) > 0) {
|
||||||
|
builder.setDisplayName(userInfo.getDisplayName());
|
||||||
|
}
|
||||||
|
if((flag & Update_User_Portrait) > 0) {
|
||||||
|
builder.setPortrait(userInfo.getPortrait());
|
||||||
|
}
|
||||||
|
if((flag & Update_User_Gender) > 0) {
|
||||||
|
builder.setGender(userInfo.getGender());
|
||||||
|
}
|
||||||
|
if((flag & Update_User_Mobile) > 0) {
|
||||||
|
builder.setMobile(userInfo.getMobile());
|
||||||
|
}
|
||||||
|
if((flag & Update_User_Email) > 0) {
|
||||||
|
builder.setEmail(userInfo.getEmail());
|
||||||
|
}
|
||||||
|
if((flag & Update_User_Address) > 0) {
|
||||||
|
builder.setAddress(userInfo.getAddress());
|
||||||
|
}
|
||||||
|
if((flag & Update_User_Company) > 0) {
|
||||||
|
builder.setCompany(userInfo.getCompany());
|
||||||
|
}
|
||||||
|
if((flag & Update_User_Social) > 0) {
|
||||||
|
builder.setSocial(userInfo.getSocial());
|
||||||
|
}
|
||||||
|
if((flag & Update_User_Extra) > 0) {
|
||||||
|
builder.setExtra(userInfo.getExtra());
|
||||||
|
}
|
||||||
|
builder.setUpdateDt(System.currentTimeMillis());
|
||||||
|
user = builder.build();
|
||||||
|
try {
|
||||||
|
databaseStore.updateUser(user);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return ErrorCode.ERROR_CODE_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
mUserMap.put(user.getUid(), user);
|
||||||
|
callbackUserInfoEvent(user);
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addUserInfo(WFCMessage.User user, String password) throws Exception {
|
public void addUserInfo(WFCMessage.User user, String password) throws Exception {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
|
|||||||
@@ -149,12 +149,10 @@ public class NettyAcceptor implements ServerAcceptor {
|
|||||||
} catch (InterruptedException ex) {
|
} catch (InterruptedException ex) {
|
||||||
LOG.error("An interruptedException was caught while initializing server. Protocol={}", protocol, ex);
|
LOG.error("An interruptedException was caught while initializing server. Protocol={}", protocol, ex);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
if(e instanceof BindException) {
|
e.printStackTrace();
|
||||||
e.printStackTrace();
|
LOG.error("端口 {} 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep {}", port, port);
|
||||||
LOG.error("端口 {} 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep {}", port, port);
|
System.out.println("端口 " + port + " 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep " + port);
|
||||||
System.out.println("端口 " + port + " 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep " + port);
|
System.exit(-1);
|
||||||
}
|
|
||||||
throw e;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package io.moquette.spi;
|
package io.moquette.spi;
|
||||||
|
|
||||||
|
import cn.wildfirechat.pojos.InputOutputUserInfo;
|
||||||
import cn.wildfirechat.pojos.SystemSettingPojo;
|
import cn.wildfirechat.pojos.SystemSettingPojo;
|
||||||
import cn.wildfirechat.proto.WFCMessage;
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
import com.xiaoleilu.loServer.model.FriendData;
|
import com.xiaoleilu.loServer.model.FriendData;
|
||||||
@@ -100,7 +101,7 @@ public interface IMessagesStore {
|
|||||||
DatabaseStore getDatabaseStore();
|
DatabaseStore getDatabaseStore();
|
||||||
WFCMessage.Message storeMessage(String fromUser, String fromClientId, WFCMessage.Message message);
|
WFCMessage.Message storeMessage(String fromUser, String fromClientId, WFCMessage.Message message);
|
||||||
void storeSensitiveMessage(WFCMessage.Message message);
|
void storeSensitiveMessage(WFCMessage.Message message);
|
||||||
int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set<String> notifyReceivers, boolean ignoreMsg);
|
int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set<String> notifyReceivers);
|
||||||
Set<String> getAllEnds();
|
Set<String> getAllEnds();
|
||||||
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);
|
||||||
@@ -142,6 +143,7 @@ public interface IMessagesStore {
|
|||||||
int getUserStatus(String userId);
|
int getUserStatus(String userId);
|
||||||
List<InputOutputUserBlockStatus> getUserStatusList();
|
List<InputOutputUserBlockStatus> getUserStatusList();
|
||||||
|
|
||||||
|
ErrorCode updateUserInfo(InputOutputUserInfo userInfo, int flag);
|
||||||
void addUserInfo(WFCMessage.User user, String password) throws Exception;
|
void addUserInfo(WFCMessage.User user, String password) throws Exception;
|
||||||
void destoryUser(String userId);
|
void destoryUser(String userId);
|
||||||
void updateUserInfo(WFCMessage.User user) throws Exception;
|
void updateUserInfo(WFCMessage.User user) throws Exception;
|
||||||
|
|||||||
@@ -624,6 +624,29 @@ public class MessagesPublisher {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void forwardMessageWithCallback(final WFCMessage.Message message, String forwardUrl, HttpUtils.HttpCallback callback) {
|
||||||
|
try {
|
||||||
|
HttpUtils.httpJsonPost(forwardUrl, new Gson().toJson(OutputMessageData.fromProtoMessage(message), OutputMessageData.class), new HttpUtils.HttpCallback() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(String content) {
|
||||||
|
Server.getServer().getImBusinessScheduler().execute(()->{
|
||||||
|
callback.onSuccess(content);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(int statusCode, String errorMessage) {
|
||||||
|
Server.getServer().getImBusinessScheduler().execute(()->{
|
||||||
|
callback.onFailure(statusCode, errorMessage);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void notifyChannelListenStatusChanged(WFCMessage.ChannelInfo channelInfo, String user, boolean listen) {
|
public void notifyChannelListenStatusChanged(WFCMessage.ChannelInfo channelInfo, String user, boolean listen) {
|
||||||
if (channelInfo == null || StringUtil.isNullOrEmpty(channelInfo.getCallback())) {
|
if (channelInfo == null || StringUtil.isNullOrEmpty(channelInfo.getCallback())) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -188,8 +188,7 @@ public class ProtocolProcessor {
|
|||||||
String clientId = payload.clientIdentifier();
|
String clientId = payload.clientIdentifier();
|
||||||
LOG.info("Processing CONNECT message. CId={}, username={}", clientId, payload.userName());
|
LOG.info("Processing CONNECT message. CId={}, username={}", clientId, payload.userName());
|
||||||
|
|
||||||
if (msg.variableHeader().version() < MqttVersion.MQTT_3_1_1.protocolLevel() ||
|
if (msg.variableHeader().version() < MqttVersion.MQTT_3_1_1.protocolLevel()) {
|
||||||
msg.variableHeader().version() >= MqttVersion.Wildfire_Max.protocolLevel()) {
|
|
||||||
MqttConnAckMessage badProto = connAck(CONNECTION_REFUSED_UNACCEPTABLE_PROTOCOL_VERSION);
|
MqttConnAckMessage badProto = connAck(CONNECTION_REFUSED_UNACCEPTABLE_PROTOCOL_VERSION);
|
||||||
|
|
||||||
LOG.error("MQTT protocol version is not valid. CId={}", clientId);
|
LOG.error("MQTT protocol version is not valid. CId={}", clientId);
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public enum MqttVersion {
|
|||||||
MQTT_3_1_1("MQTT", (byte) 4),
|
MQTT_3_1_1("MQTT", (byte) 4),
|
||||||
Wildfire_1("MQTT", (byte) 5),
|
Wildfire_1("MQTT", (byte) 5),
|
||||||
Wildfire_2("MQTT", (byte) 6),
|
Wildfire_2("MQTT", (byte) 6),
|
||||||
Wildfire_Max("MQTT", (byte) 7);
|
Wildfire_Future("MQTT", (byte) 7);
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final byte level;
|
private final byte level;
|
||||||
@@ -59,6 +59,9 @@ public enum MqttVersion {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(protocolLevel > Wildfire_Future.level) {
|
||||||
|
return Wildfire_Future;
|
||||||
|
}
|
||||||
throw new MqttUnacceptableProtocolVersionException(protocolName + "is unknown protocol name");
|
throw new MqttUnacceptableProtocolVersionException(protocolName + "is unknown protocol name");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -68,6 +71,9 @@ public enum MqttVersion {
|
|||||||
return mv;
|
return mv;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(protocolLevel > Wildfire_Future.level) {
|
||||||
|
return Wildfire_Future;
|
||||||
|
}
|
||||||
throw new MqttUnacceptableProtocolVersionException(protocolLevel + "is unknown protocol level");
|
throw new MqttUnacceptableProtocolVersionException(protocolLevel + "is unknown protocol level");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,8 +30,16 @@ public class HttpUtils {
|
|||||||
private static final Logger LOG = LoggerFactory.getLogger(HttpUtils.class);
|
private static final Logger LOG = LoggerFactory.getLogger(HttpUtils.class);
|
||||||
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
|
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
|
||||||
static private OkHttpClient client = new OkHttpClient();
|
static private OkHttpClient client = new OkHttpClient();
|
||||||
|
public interface HttpCallback {
|
||||||
|
void onSuccess(String content);
|
||||||
|
void onFailure(int statusCode, String errorMessage);
|
||||||
|
}
|
||||||
|
|
||||||
public static void httpJsonPost(final String url, final String jsonStr){
|
public static void httpJsonPost(final String url, final String jsonStr) {
|
||||||
|
httpJsonPost(url, jsonStr, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void httpJsonPost(final String url, final String jsonStr, final HttpCallback httpCallback) {
|
||||||
//消息推送内容为 {"sender":"uCGUxUaa","senderName":"杨","convType":0,"target":"usq7v7UU","targetName":"鞋子","userId":"usq7v7UU","line":0,"cntType":400,"serverTime":1610590766485,"pushMessageType":1,"pushType":2,"pushContent":"","pushData":"","unReceivedMsg":1,"mentionedType":0,"packageName":"cn.wildfirechat.chat","deviceToken":"AFoieP9P6u6CccIkRK23gRwUJWKqSkdiqnb-6gC1kL7Wv-9XNoEYBPU7VsINU_q8_WTKfafe35qWu7ya7Z-NmgOTX9XVW3A3zd6ilh--quj6ccINXRvVnh8QmI9QQ","isHiddenDetail":false,"language":"zh"}
|
//消息推送内容为 {"sender":"uCGUxUaa","senderName":"杨","convType":0,"target":"usq7v7UU","targetName":"鞋子","userId":"usq7v7UU","line":0,"cntType":400,"serverTime":1610590766485,"pushMessageType":1,"pushType":2,"pushContent":"","pushData":"","unReceivedMsg":1,"mentionedType":0,"packageName":"cn.wildfirechat.chat","deviceToken":"AFoieP9P6u6CccIkRK23gRwUJWKqSkdiqnb-6gC1kL7Wv-9XNoEYBPU7VsINU_q8_WTKfafe35qWu7ya7Z-NmgOTX9XVW3A3zd6ilh--quj6ccINXRvVnh8QmI9QQ","isHiddenDetail":false,"language":"zh"}
|
||||||
//推送信息只打印前100个字符,防止敏感信息打印到日志中去。
|
//推送信息只打印前100个字符,防止敏感信息打印到日志中去。
|
||||||
LOG.info("POST to {} with data {}...", url, jsonStr.substring(0, Math.min(jsonStr.length(), 100)));
|
LOG.info("POST to {} with data {}...", url, jsonStr.substring(0, Math.min(jsonStr.length(), 100)));
|
||||||
@@ -50,12 +58,27 @@ public class HttpUtils {
|
|||||||
public void onFailure(Call call, IOException e) {
|
public void onFailure(Call call, IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
LOG.info("POST to {} with data {} failure", url, jsonStr);
|
LOG.info("POST to {} with data {} failure", url, jsonStr);
|
||||||
|
if(httpCallback != null) {
|
||||||
|
httpCallback.onFailure(-1, e.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(Call call, Response response) throws IOException {
|
public void onResponse(Call call, Response response) throws IOException {
|
||||||
LOG.info("POST to {} success with response: {}", url, response.body());
|
LOG.info("POST to {} success with response: {}", url, response.body());
|
||||||
try {
|
try {
|
||||||
|
if(httpCallback != null) {
|
||||||
|
int code = response.code();
|
||||||
|
if(code == 200) {
|
||||||
|
if(response.body() != null && response.body().contentLength() > 0) {
|
||||||
|
httpCallback.onSuccess(response.body().string());
|
||||||
|
} else {
|
||||||
|
httpCallback.onSuccess(null);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
httpCallback.onFailure(code, response.message());
|
||||||
|
}
|
||||||
|
}
|
||||||
if (response.body() != null) {
|
if (response.body() != null) {
|
||||||
response.body().close();
|
response.body().close();
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.52</version>
|
<version>0.55</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ public interface APIPath {
|
|||||||
String Sensitive_Query = "/admin/sensitive/query";
|
String Sensitive_Query = "/admin/sensitive/query";
|
||||||
|
|
||||||
String Create_User = "/admin/user/create";
|
String Create_User = "/admin/user/create";
|
||||||
|
String Update_User = "/admin/user/update";
|
||||||
String Destroy_User = "/admin/user/destroy";
|
String Destroy_User = "/admin/user/destroy";
|
||||||
String Create_Robot = "/admin/robot/create";
|
String Create_Robot = "/admin/robot/create";
|
||||||
String CreateOrUpdate_Device = "/admin/device/create";
|
String CreateOrUpdate_Device = "/admin/device/create";
|
||||||
@@ -40,6 +41,7 @@ public interface APIPath {
|
|||||||
String Friend_Set_Alias = "/admin/friend/set_alias";
|
String Friend_Set_Alias = "/admin/friend/set_alias";
|
||||||
String Friend_Send_Request = "/admin/friend/send_request";
|
String Friend_Send_Request = "/admin/friend/send_request";
|
||||||
String Friend_Get_Requests = "/admin/friend/get_requests";
|
String Friend_Get_Requests = "/admin/friend/get_requests";
|
||||||
|
String Relation_Get = "/admin/relation/get";
|
||||||
|
|
||||||
String Msg_Send = "/admin/message/send";
|
String Msg_Send = "/admin/message/send";
|
||||||
String Msg_Recall = "/admin/message/recall";
|
String Msg_Recall = "/admin/message/recall";
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ public enum ErrorCode {
|
|||||||
ERROR_CODE_TIMEOUT(249, "timeout"),
|
ERROR_CODE_TIMEOUT(249, "timeout"),
|
||||||
ERROR_CODE_OVER_FREQUENCY(250, "over frequency"),
|
ERROR_CODE_OVER_FREQUENCY(250, "over frequency"),
|
||||||
INVALID_PARAMETER(251, "Invalid parameter"),
|
INVALID_PARAMETER(251, "Invalid parameter"),
|
||||||
|
INVALID_ASYNC_HANDLING(252, "Async handling"),
|
||||||
ERROR_CODE_NOT_EXIST(253, "not exist"),
|
ERROR_CODE_NOT_EXIST(253, "not exist"),
|
||||||
ERROR_CODE_NOT_IMPLEMENT(254, "not implement"),
|
ERROR_CODE_NOT_IMPLEMENT(254, "not implement"),
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Wildfire Chat package.
|
||||||
|
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package cn.wildfirechat.pojos;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
|
||||||
|
public class InputUpdateUserInfo {
|
||||||
|
//UpdateUserInfoMask
|
||||||
|
public int flag;
|
||||||
|
public InputOutputUserInfo userInfo;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package cn.wildfirechat.pojos;
|
||||||
|
|
||||||
|
public class RelationPojo {
|
||||||
|
public String userId;
|
||||||
|
public String targetId;
|
||||||
|
public boolean isFriend;
|
||||||
|
public boolean isBlacked;
|
||||||
|
public String alias;
|
||||||
|
public String extra;
|
||||||
|
}
|
||||||
@@ -201,6 +201,19 @@ public class ProtoConstants {
|
|||||||
int Chatroom_Member_Event_Unmute = 4;
|
int Chatroom_Member_Event_Unmute = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface UpdateUserInfoMask {
|
||||||
|
int Update_User_DisplayName = 0x01;
|
||||||
|
int Update_User_Portrait = 0x02;
|
||||||
|
int Update_User_Gender = 0x04;
|
||||||
|
int Update_User_Mobile = 0x08;
|
||||||
|
int Update_User_Email = 0x10;
|
||||||
|
int Update_User_Address = 0x20;
|
||||||
|
int Update_User_Company = 0x40;
|
||||||
|
int Update_User_Social = 0x80;
|
||||||
|
int Update_User_Extra = 0x100;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static final int MESSAGE_CONTENT_TYPE_CREATE_GROUP = 104;
|
public static final int MESSAGE_CONTENT_TYPE_CREATE_GROUP = 104;
|
||||||
public static final int MESSAGE_CONTENT_TYPE_ADD_GROUP_MEMBER = 105;
|
public static final int MESSAGE_CONTENT_TYPE_ADD_GROUP_MEMBER = 105;
|
||||||
public static final int MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER = 106;
|
public static final int MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER = 106;
|
||||||
|
|||||||
@@ -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.52</version>
|
<version>0.55</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>distribution</artifactId>
|
<artifactId>distribution</artifactId>
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ chatroom.participant_idle_time 900000
|
|||||||
chatroom.rejoin_when_active true
|
chatroom.rejoin_when_active true
|
||||||
|
|
||||||
## 是否允许客户端发送操作群的自定义群通知消息
|
## 是否允许客户端发送操作群的自定义群通知消息
|
||||||
group.allow_client_custom_operation_notification false
|
group.allow_client_custom_operation_notification true
|
||||||
|
|
||||||
## 当群成员退出或者被移除时,是否同时给管理员和相关人员发送显式通知消息。
|
## 当群成员退出或者被移除时,是否同时给管理员和相关人员发送显式通知消息。
|
||||||
## 0 不发送,1 退群时发送,2 踢人时发送,3 退群和踢人时都发送。
|
## 0 不发送,1 退群时发送,2 踢人时发送,3 退群和踢人时都发送。
|
||||||
@@ -212,6 +212,8 @@ push.ios.server.address http://localhost:8085/ios/push
|
|||||||
##消息转发地址
|
##消息转发地址
|
||||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
#message.forward.url http://localhost:8087/im_event/message
|
#message.forward.url http://localhost:8087/im_event/message
|
||||||
|
##需要转发的消息类型,当有多个时以英文逗号分割。如果转发所有消息,请注释掉配置或者设置为空
|
||||||
|
#message.forward.types 1,2,3
|
||||||
|
|
||||||
##设备信息转发地址
|
##设备信息转发地址
|
||||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
@@ -250,5 +252,16 @@ push.ios.server.address http://localhost:8085/ios/push
|
|||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
# Sensitive configuration
|
# Sensitive configuration
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
##文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***
|
## 内置文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***;3 记录并继续发送
|
||||||
sensitive.filter.type 0
|
sensitive.filter.type 0
|
||||||
|
|
||||||
|
## 如果内置敏感词库无法满足您的需求,可以自己开发部署敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址
|
||||||
|
## 审核服务返回状态码200表示继续发送,如果需要替换内容,返回状态码200并且内容为替换后的内容。返回403表示不允许发送。其它错误继续发送。
|
||||||
|
## 独立审核服务地址,IM服务会post SendMessageData。如果需要修改消息内容,返回 MessagePayload。请参考应用服务中 "/message/censor" Mapping.
|
||||||
|
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
|
||||||
|
## 需要进行敏感词审核的消息类型,当有多个时以英文逗号分割
|
||||||
|
#sensitive.remote_sensitive_message_type 1,2,3
|
||||||
|
## 如果远程审核服务返回403,返回给发送端发送失败还是成功?实际上这个值影响发送响应是否等待审核结果,当为false时,消息发送给审核服务就立即返回
|
||||||
|
## 成功给客户端。当为true时,消息发送给审核服务,等待审核结果,如果结果为继续发送就返回给客户端为成功,结果为禁止发送就返回失败给客户端。
|
||||||
|
## 客户端操作的超时一般为10s左右,且考虑到复杂的网络情况,建议处理时间不要超过3s。建议这个值为false。
|
||||||
|
#sensitive.remote_fail_when_matched false
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>0.52</version>
|
<version>0.55</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
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.52</version>
|
<version>0.55</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -134,6 +134,43 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InputOutputUserInfo updateUserInfo = new InputOutputUserInfo();
|
||||||
|
updateUserInfo.setUserId(System.currentTimeMillis()+"");
|
||||||
|
updateUserInfo.setDisplayName("updatedUserName");
|
||||||
|
updateUserInfo.setPortrait("updatedUserPortrait");
|
||||||
|
int updateUserFlag = ProtoConstants.UpdateUserInfoMask.Update_User_DisplayName | ProtoConstants.UpdateUserInfoMask.Update_User_Portrait;
|
||||||
|
IMResult<Void> result = UserAdmin.updateUserInfo(updateUserInfo, updateUserFlag);
|
||||||
|
if(result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_NOT_EXIST) {
|
||||||
|
System.out.println("updateUserInfo success");
|
||||||
|
} else {
|
||||||
|
System.out.println("updateUserInfo failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateUserInfo.setUserId(userInfo.getUserId());
|
||||||
|
result = UserAdmin.updateUserInfo(updateUserInfo, updateUserFlag);
|
||||||
|
if(result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("updateUserInfo success");
|
||||||
|
} else {
|
||||||
|
System.out.println("updateUserInfo failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
IMResult<InputOutputUserInfo> resultGetUserInfo4 = UserAdmin.getUserByUserId(userInfo.getUserId());
|
||||||
|
if (resultGetUserInfo4 != null && resultGetUserInfo4.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
if (userInfo.getUserId().equals(resultGetUserInfo4.getResult().getUserId())
|
||||||
|
&& updateUserInfo.getDisplayName().equals(resultGetUserInfo4.getResult().getDisplayName())
|
||||||
|
&& updateUserInfo.getPortrait().equals(resultGetUserInfo4.getResult().getPortrait())) {
|
||||||
|
System.out.println("get user info success");
|
||||||
|
} else {
|
||||||
|
System.out.println("get user info by userId failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.out.println("get user info by userId failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
IMResult<OutputGetIMTokenData> resultGetToken = UserAdmin.getUserToken(userInfo.getUserId(), "client111", ProtoConstants.Platform.Platform_Android);
|
IMResult<OutputGetIMTokenData> resultGetToken = UserAdmin.getUserToken(userInfo.getUserId(), "client111", ProtoConstants.Platform.Platform_Android);
|
||||||
if (resultGetToken != null && resultGetToken.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (resultGetToken != null && resultGetToken.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("get token success: " + resultGetToken.getResult().getToken());
|
System.out.println("get token success: " + resultGetToken.getResult().getToken());
|
||||||
@@ -331,17 +368,25 @@ public class Main {
|
|||||||
String alias = "hello" + System.currentTimeMillis();
|
String alias = "hello" + System.currentTimeMillis();
|
||||||
IMResult<Void> updateFriendAlias = RelationAdmin.updateFriendAlias("ff1", "ff2", alias);
|
IMResult<Void> updateFriendAlias = RelationAdmin.updateFriendAlias("ff1", "ff2", alias);
|
||||||
if (updateFriendAlias != null && updateFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (updateFriendAlias != null && updateFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("update friend status success");
|
System.out.println("update friend alias success");
|
||||||
} else {
|
} else {
|
||||||
System.out.println("update friend status failure");
|
System.out.println("update friend alias failure");
|
||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
IMResult<OutputGetAlias> getFriendAlias = RelationAdmin.getFriendAlias("ff1", "ff2");
|
IMResult<OutputGetAlias> getFriendAlias = RelationAdmin.getFriendAlias("ff1", "ff2");
|
||||||
if (getFriendAlias != null && getFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && getFriendAlias.getResult().getAlias().equals(alias)) {
|
if (getFriendAlias != null && getFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && getFriendAlias.getResult().getAlias().equals(alias)) {
|
||||||
System.out.println("update friend status success");
|
System.out.println("get friend alias success");
|
||||||
} else {
|
} else {
|
||||||
System.out.println("update friend status failure");
|
System.out.println("get friend alias failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
IMResult<RelationPojo> getRelation = RelationAdmin.getRelation("ff1", "ff2");
|
||||||
|
if (getRelation != null && getRelation.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("get friend relation success");
|
||||||
|
} else {
|
||||||
|
System.out.println("get friend relation failure");
|
||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,4 +65,10 @@ public class RelationAdmin {
|
|||||||
input.setForce(force);
|
input.setForce(force);
|
||||||
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
|
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IMResult<RelationPojo> getRelation(String userId, String targetId) throws Exception {
|
||||||
|
String path = APIPath.Relation_Get;
|
||||||
|
StringPairPojo input = new StringPairPojo(userId, targetId);
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, input, RelationPojo.class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,14 @@ public class UserAdmin {
|
|||||||
return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class);
|
return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IMResult<Void> updateUserInfo(InputOutputUserInfo user, int/*UpdateUserInfoMask*/ flag) throws Exception {
|
||||||
|
String path = APIPath.Update_User;
|
||||||
|
InputUpdateUserInfo updateUserInfo = new InputUpdateUserInfo();
|
||||||
|
updateUserInfo.flag = flag;
|
||||||
|
updateUserInfo.userInfo = user;
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, updateUserInfo, Void.class);
|
||||||
|
}
|
||||||
|
|
||||||
public static IMResult<OutputCreateRobot> createRobot(InputCreateRobot robot) throws Exception {
|
public static IMResult<OutputCreateRobot> createRobot(InputCreateRobot robot) throws Exception {
|
||||||
String path = APIPath.Create_Robot;
|
String path = APIPath.Create_Robot;
|
||||||
return AdminHttpUtils.httpJsonPost(path, robot, OutputCreateRobot.class);
|
return AdminHttpUtils.httpJsonPost(path, robot, OutputCreateRobot.class);
|
||||||
|
|||||||
Reference in New Issue
Block a user