Compare commits

...
65 Commits
Author SHA1 Message Date
heavyrain.lee 8a4ae37247 update version to 0.40 2020-04-15 10:52:33 +08:00
heavyrain.lee c11b004e04 update 2020-04-15 10:34:33 +08:00
imhao183 4d07757b83 添加sticker/moments的bucket支持 2020-04-14 16:12:19 +08:00
heavyrain.lee bdc2f70785 update 2020-04-11 08:13:32 +08:00
imhao183 768fe75e04 update sdk to fix black list api 2020-04-08 16:13:21 +08:00
heavyrain.lee 2ba54a41db 撤回消息时带上被撤回消息的信息 2020-04-06 11:29:31 +08:00
imhao183 e414fa4a0a fix error 2020-04-05 22:48:28 +08:00
imhao183 da011f4957 添加PC在线状态通知开关 2020-04-05 21:14:39 +08:00
heavyrain.lee 38f42697cb upgrade mysql connector to 8.0.19 2020-04-05 12:11:56 +08:00
imhao183 3f5a8f579a 添加禁止好友请求的配置。另外更新部分配置说明 2020-04-04 10:11:42 +08:00
imhao183 5ebd77a1a1 添加禁止搜索用户和禁止昵称搜索用户的配置项 2020-04-04 09:55:53 +08:00
imhao183 1047db9990 add chatroom api 2020-04-02 22:50:04 +08:00
imhao183 83eae385b3 修改拒绝好友请求的错误 2020-04-02 18:26:15 +08:00
imhao183 e2a334af91 update version to 0.39 2020-03-29 13:38:29 +08:00
imhao183 7927cea105 敏感词过来所有消息的searchableContent字段 2020-03-27 17:00:31 +08:00
imhao183 029cdd5817 api添加好友时的推送通知 2020-03-27 16:42:25 +08:00
imhao183 54e868a36c linux平台的多端处理 2020-03-26 17:58:17 +08:00
imhao183 d099c2aa14 好友请求推送 2020-03-26 13:31:35 +08:00
heavyrain.lee 2f554bd046 获取用户状态接口 2020-03-25 10:25:18 +08:00
imhao183 310b2e1016 修正封禁用户登录返回的错误码错误 2020-03-24 16:42:04 +08:00
heavyrain.lee 117f5e6678 添加一个hz map 2020-03-19 09:53:47 +08:00
imhao183 49edf8e06d update 2020-03-12 12:55:34 +08:00
heavyrain.lee 93a56e4bbc fix friend extra action error 2020-03-09 18:12:53 +08:00
heavyrain.lee 4533c2aac6 添加获取聊天室成员API接口 2020-03-09 16:24:00 +08:00
heavyrain.lee 9cd3fe6b8c 客户端上报语言为空时,处理好友请求异常 2020-03-09 15:51:43 +08:00
imhao183 7e0f268b7c token expire time 2020-03-07 15:19:50 +08:00
heavyrain.lee c03a6f46fb 用户信息的extra 2020-03-07 11:27:39 +08:00
heavyrain.lee 7888c1e0d9 add extran in friendData 2020-03-07 10:34:33 +08:00
heavyrain.lee c0dd1c6581 add extra to friend table 2020-03-07 10:31:56 +08:00
heavyrain.lee 4f13cdeb76 update proto 2020-03-07 10:31:46 +08:00
heavyrain.lee a7aa42b851 修正用户信息中社交信息字段无法更新问题 2020-03-07 08:31:28 +08:00
heavyrain.lee 5187e63329 透传消息如果是超过一小时不在线就不需要发送了 2020-03-06 08:11:42 +08:00
heavyrain.lee 4b89774206 解决接收好友请求异常的错误 2020-03-02 16:51:46 +08:00
heavyrain.lee 46211aae44 修正存储消息是发送对象没有存储下来的错误 2020-03-02 15:53:06 +08:00
heavyrain.lee 3c241295ce 修正频道拉取远程消息的问题 2020-03-01 15:18:08 +08:00
heavyrain.lee e366962c65 修改定向消息拉取远程消息时的错误问题 2020-03-01 14:45:44 +08:00
heavyrain.lee a01fa84cae 调整用户关系API 2020-02-29 08:32:30 +08:00
heavyrain.lee a22f76d8d6 修改一个字段名 2020-02-28 19:16:20 +08:00
heavyrain.lee dd5ecd09f2 api的完善 2020-02-28 19:03:50 +08:00
heavyrain.lee 1bd060936c 机器人可以根据用户命或电话号码查询用户信息 2020-02-27 16:18:02 +08:00
imndx 0d03ef5758 文件接口允许跨域 2020-02-27 13:53:44 +08:00
heavyrain.lee 498bfccfe8 修正内置服务器上传文件链接错误 2020-02-26 12:45:33 +08:00
heavyrain.lee de064aa582 国际化支持 2020-02-25 15:49:43 +08:00
heavyrain.lee 54ce0d5b51 修改拒绝好友时的错误处理 2020-02-25 15:48:36 +08:00
heavyrain.lee b2e495b3ac 添加多语言处理 2020-02-25 15:48:29 +08:00
heavyrain.lee 603e8cf5fc 测试服务器存储文件名 2020-02-25 15:48:12 +08:00
imndx c3ae7cb0a7 fix handle friend request issue 2020-02-25 10:57:23 +08:00
heavyrain.lee a1b4eca6f2 修改推送时名称的问题 2020-02-21 11:19:52 +08:00
heavyrain.lee f65fe87119 好友通知消息支持英文 2020-02-21 09:23:44 +08:00
heavyrain.lee a4a9e1418e update 2020-02-20 16:08:45 +08:00
imhao183 5e92735e27 update 2020-02-20 16:08:45 +08:00
heavyrain.lee 4f27d492a1 修改频道部分错误 2020-02-19 17:20:46 +08:00
heavyrain.lee 7c6ef9b66c update version to 0.37 2020-02-19 14:16:07 +08:00
heavyrain.lee 6bfd175781 update 2020-02-19 14:04:44 +08:00
heavyrain.lee 1fc093a2ed 遗漏的配置 2020-02-19 13:58:09 +08:00
imhao183 969d865061 添加检查token接口 2020-02-18 09:57:42 +08:00
imhao183 6a6c59bdf2 修正发送消息给指定频道目标错误问题 2020-02-17 16:06:19 +08:00
imhao183 7adadd21a6 update 2020-02-13 15:09:52 +08:00
imhao183 21394985b3 增加日志的大小 2020-02-12 19:20:46 +08:00
heavyrain.lee b55694624d update log4j version 2020-02-03 12:24:07 +08:00
imhao183 cca9cafb7e 修改群头像时,通知消息里带上头像内容 2020-02-02 16:09:15 +08:00
imhao183 950334aad3 add user type parameter when create user 2020-01-22 21:08:22 +08:00
imhao183 ce578234f4 聊天室相关测试代码 2020-01-16 21:16:58 +08:00
imhao183 5daa4b1dc8 修正黑名单策略为1时发送消息仍失败的错误 2020-01-15 17:06:21 +08:00
imhao183 22a23a3f33 添加好友请求过期时间配置 2020-01-14 10:39:36 +08:00
95 changed files with 2320 additions and 391 deletions
+1
View File
@@ -59,3 +59,4 @@ sdk/target
moments/target
monitor
wildfire_jmeter
git.properties
+15
View File
@@ -61,6 +61,15 @@
</map-store>
</map>
<map name="user_friends_empty">
<time-to-live-seconds>86400</time-to-live-seconds>
<eviction-policy>LRU</eviction-policy>
<max-size policy="PER_NODE">1000000</max-size>
<eviction-percentage>10</eviction-percentage>
</map>
<set name="node_ids"/>
<multimap name="user_setting">
@@ -81,6 +90,12 @@
<map name="user_chatroom">
</map>
<multimap name="chatroom_black">
</multimap>
<multimap name="chatroom_manager">
</multimap>
<map name="robots">
<!-- 7 days -->
<time-to-live-seconds>604800</time-to-live-seconds>
+3
View File
@@ -0,0 +1,3 @@
#native2ascii -encoding UTF-8 messages.properties temp_messages.properties
Above_Greeting_Message=\u4ee5\u4e0a\u662f\u6253\u62db\u547c\u4fe1\u606f
Friend_Can_Start_Chat=\u4f60\u4eec\u5df2\u7ecf\u6210\u4e3a\u597d\u53cb\u4e86\uff0c\u73b0\u5728\u53ef\u4ee5\u5f00\u59cb\u804a\u5929\u4e86
@@ -0,0 +1,2 @@
Above_Greeting_Message=This's the greeting
Friend_Can_Start_Chat=You're already friend, start chat now.
@@ -0,0 +1,2 @@
Above_Greeting_Message=This's the greeting
Friend_Can_Start_Chat=You're already friend, start chat now.
@@ -0,0 +1,2 @@
Above_Greeting_Message=\u4ee5\u4e0a\u662f\u6253\u62db\u547c\u4fe1\u606f
Friend_Can_Start_Chat=\u4f60\u4eec\u5df2\u7ecf\u6210\u4e3a\u597d\u53cb\u4e86\uff0c\u73b0\u5728\u53ef\u4ee5\u5f00\u59cb\u804a\u5929\u4e86
@@ -0,0 +1,2 @@
Above_Greeting_Message=\u4ee5\u4e0a\u662f\u6253\u62db\u547c\u4fe1\u606f
Friend_Can_Start_Chat=\u4f60\u4eec\u5df2\u7ecf\u6210\u4e3a\u597d\u53cb\u4e86\uff0c\u73b0\u5728\u53ef\u4ee5\u5f00\u59cb\u804a\u5929\u4e86
+25 -3
View File
@@ -36,7 +36,7 @@ host 0.0.0.0
local_port 80
##是否使用内置DB。0使用mysql;1使用h2db;2使用mysql+mongodb。社区版只支持0和1,专业版支持2
embed.db 0
embed.db 1
##服务器管理接口密钥
http.admin.secret_key 123456
@@ -52,6 +52,9 @@ client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0
##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记
token.key testim
##token的过期时间,单位为毫秒,默认为无限期。如果需要设置无限期,客户端上一定需要加上token过期的处理。token过期的处理请参考文档的常见问题
##token.expire_time 2592000000
##首次登录,是否接收之前的历史消息。0 不接收;1接收。
message.roaming 0
@@ -64,16 +67,28 @@ message.max_queue 1024
##是否禁止陌生人聊天
message.disable_stranger_chat false
##黑名单处理策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃;
##黑名单处理策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃;2 敏感词替换为***;3 不处理。
##所有命中敏感词的消息都会被记录在敏感词消息表中
message.blacklist.strategy 0
##禁止搜索用户
friend.disable_search false
##禁止按照昵称搜索用户。
friend.disable_nick_name_search false
##禁止发送好友邀请,通过server api添加好友不受此限制
friend.disable_friend_request false
##好友请求重复发送的间隔,单位是毫秒,默认是7天,0为不限制
friend.repeat_request_duration 604800000
##好友请求被拒绝后再次发送的间隔,单位是毫秒,默认是30天,0为不限制
friend.reject_request_duration 2592000000
##好友请求过期时间,单位是毫秒,默认是7天,0为不限制
friend.request_expiration_duration 604800000
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
chatroom.participant_idle_time 900000
@@ -114,6 +129,10 @@ qiniu.bucket_video_name media
qiniu.bucket_video_domain http://pghnpyzos.bkt.clouddn.com
qiniu.bucket_file_name media
qiniu.bucket_file_domain http://pghnpyzos.bkt.clouddn.com
qiniu.bucket_sticker_name media
qiniu.bucket_sticker_domain http://pghnpyzos.bkt.clouddn.com
qiniu.bucket_moments_name media
qiniu.bucket_moments_domain http://pghnpyzos.bkt.clouddn.com
qiniu.bucket_portrait_name storage
qiniu.bucket_portrait_domain http://cdn2.wildfirechat.cn
qiniu.bucket_favorite_name storage
@@ -127,6 +146,9 @@ local.media.storage.root media
# 是否支持多端登陆
server.multi_endpoint false
# 多平台连接状态通知(仅当multi_endpoint为false时有效)
server.multi_platform_notification false
#*********************************************************************
# Push server configuration
#*********************************************************************
+1
View File
@@ -0,0 +1 @@
update t_channel set `_status` = 64 where `_status` = 3;
+2
View File
@@ -0,0 +1,2 @@
alter table t_messages add column `_to` varchar(64) DEFAULT NULL;
+1
View File
@@ -0,0 +1 @@
alter table t_friend add column `_extra` TEXT DEFAULT NULL;
@@ -0,0 +1,22 @@
DROP TABLE IF EXISTS `t_chatroom_blacklist`;
CREATE TABLE `t_chatroom_blacklist` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`_cid` varchar(64) NOT NULL,
`_uid` varchar(64) NOT NULL,
`_state` tinyint NOT NULL DEFAULT 0,
`_expired_time` bigint(20) NOT NULL,
`_dt` bigint(20) NOT NULL,
UNIQUE INDEX `cr_bl_uid_index` (`_cid`,_uid)
);
DROP TABLE IF EXISTS `t_chatroom_manager`;
CREATE TABLE `t_chatroom_manager` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`_cid` varchar(64) NOT NULL,
`_uid` varchar(64) NOT NULL,
`_state` tinyint NOT NULL DEFAULT 0,
`_dt` bigint(20) NOT NULL,
UNIQUE INDEX `cr_man_uid_index` (`_cid`,_uid)
);
+1
View File
@@ -0,0 +1 @@
update t_channel set `_status` = 64 where `_status` = 3;
+38
View File
@@ -0,0 +1,38 @@
alter table t_messages add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_0 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_1 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_2 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_3 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_4 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_5 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_6 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_7 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_8 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_9 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_10 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_11 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_12 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_13 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_14 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_15 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_16 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_17 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_18 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_19 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_20 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_21 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_22 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_23 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_24 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_25 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_26 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_27 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_28 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_29 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_30 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_31 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_32 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_33 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_34 add column `_to` varchar(64) DEFAULT NULL;
alter table t_messages_35 add column `_to` varchar(64) DEFAULT NULL;
+1
View File
@@ -0,0 +1 @@
alter table t_friend add column `_extra` TEXT DEFAULT NULL;
@@ -0,0 +1,30 @@
DROP TABLE IF EXISTS `t_chatroom_blacklist`;
CREATE TABLE `t_chatroom_blacklist` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`_cid` varchar(64) NOT NULL,
`_uid` varchar(64) NOT NULL,
`_state` tinyint NOT NULL DEFAULT 0,
`_expired_time` bigint(20) NOT NULL,
`_dt` bigint(20) NOT NULL,
UNIQUE INDEX `cr_bl_uid_index` (`_cid`,_uid)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
DROP TABLE IF EXISTS `t_chatroom_manager`;
CREATE TABLE `t_chatroom_manager` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`_cid` varchar(64) NOT NULL,
`_uid` varchar(64) NOT NULL,
`_state` tinyint NOT NULL DEFAULT 0,
`_dt` bigint(20) NOT NULL,
UNIQUE INDEX `cr_man_uid_index` (`_cid`,_uid)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;
+26 -5
View File
@@ -9,19 +9,40 @@ server {
root html;
index index.html index.htm index.php;
## send request back to im server ##
location /im {
location /route {
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://imserver;
}
location /route {
#社区版需要启用下面一段,专业版不能用
location /im {
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://imserver;
}
location /api {
proxy_pass http://imserver;
}
location / {
proxy_pass https://wildfirechat.github.io/docs/;
location /fs {
proxy_pass http://imserver;
}
location /robot {
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://imserver;
}
location /channel {
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://imserver;
}
}
+3 -3
View File
@@ -5,7 +5,7 @@
<relativePath>../</relativePath>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.37</version>
<version>0.40</version>
</parent>
<artifactId>moquette-broker</artifactId>
@@ -41,14 +41,14 @@
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.14</version>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
<version>8.0.19</version>
</dependency>
<dependency>
@@ -46,4 +46,13 @@ public class PushMessage {
this.isHiddenDetail = isHiddenDetail;
this.language = language;
}
public PushMessage(String sender, String target, long serverTime, String senderName, int unReceivedMsg, String language, int pushMessageType) {
this.sender = sender;
this.target = target;
this.senderName = senderName;
this.serverTime = serverTime;
this.unReceivedMsg = unReceivedMsg;
this.pushMessageType = pushMessageType;
this.language = language;
}
}
@@ -34,6 +34,7 @@ public class PushServer {
int PUSH_MESSAGE_TYPE_NORMAL = 0;
int PUSH_MESSAGE_TYPE_VOIP_INVITE = 1;
int PUSH_MESSAGE_TYPE_VOIP_BYE = 2;
int PUSH_MESSAGE_TYPE_FRIEND_REQUEST = 3;
}
private static PushServer INSTANCE = new PushServer();
@@ -57,7 +58,7 @@ public class PushServer {
}
public void pushMessage(PushMessage pushMessage, String deviceId, String pushContent) {
LOG.info("try to delivery push diviceId = {}, pushContent = {}", deviceId, pushContent);
LOG.info("try to delivery push diviceId = {}, conversationType = {}, pushContent = {}", deviceId, pushMessage.convType, pushContent);
executorService.execute(() ->{
try {
pushMessageInternel(pushMessage, deviceId, pushContent);
@@ -0,0 +1,75 @@
/*
* 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;
import com.google.gson.Gson;
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.moquette.persistence.MemorySessionStore;
import io.moquette.spi.security.Tokenor;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.GitRepositoryState;
import win.liyufan.im.RateLimiter;
import win.liyufan.im.Utility;
import java.io.IOException;
@Route("/api/verify_token")
@HttpMethod("GET")
public class CheckTokenAction extends Action {
private final RateLimiter mLimitCounter = new RateLimiter(10, 1);
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
response.setStatus(HttpResponseStatus.OK);
String userId = request.getParam("userId");
String clientId = request.getParam("clientId");
String token = request.getParam("token");
String result = "这是个检查token有效性的接口,如果客户端无法连接成功,可以使用这个接口检查token是否正确。\n";
result += "使用方法是在浏览器中输入http://imserverip/api/verify_token?userId=${userId}&clientId=${clientId}&token=${token}。\n";
result += "例如:http://localhost/api/verify_token?userId=123&clientId=456&token=789。\n";
result += "特别注意的是:必须使用正确的clientId,clientId必须是在测试手机上调用im接口获取。不用手机上获取到的clientId也都是不同的,一定不能用错!!!\n\n\n";
if (StringUtil.isNullOrEmpty(userId)) {
result += "错误,userId为空";
} else if (StringUtil.isNullOrEmpty(clientId)) {
result += "错误,clientId为空";
} else if (StringUtil.isNullOrEmpty(token)) {
result += "错误,token为空";
} else if(!mLimitCounter.isGranted("verify_token")) {
result += "接口请求超频!接口限制每10秒只能验证一次!";
} else {
MemorySessionStore.Session session = sessionsStore.getSession(clientId);
if (session == null) {
result += "错误,session不存在。请确认token是从本服务通过getToken接口获取的,另外请确认clientId是否正确";
} else if (session.getDeleted() == 1) {
result += "错误,session已经被清除,请确认当前客户没有多端登录或者主动退出";
} else if(!session.getUsername().equals(userId)) {
result += "错误,当前客户端的登录用户不是" + userId + "。这一般发生在当前clientId又为其它用户获取过token";
} else {
String id = Tokenor.getUserId(token.getBytes());
if (id == null) {
result += "错误,无效的token";
} else if(!id.equals(userId)) {
result += "错误,改token是用户" + id + "的";
} else {
result += "恭喜,您的信息是正确的";
}
}
}
response.setContent(result);
}
return true;
}
}
@@ -35,6 +35,7 @@ public class FileAction extends Action {
@Override
public boolean action(Request request, Response response) {
response.setHeader("Access-Control-Allow-Origin", "*");
if (false == Request.METHOD_GET.equalsIgnoreCase(request.getMethod())) {
response.sendError(HttpResponseStatus.METHOD_NOT_ALLOWED, "Please use GET method to request file!");
return true;
@@ -254,7 +254,7 @@ public class UploadFileAction extends Action {
}
String filePath = dir + "/" + requestId;
String filePath = dir + "/" + (StringUtil.isNullOrEmpty(remoteFileName) ? requestId : remoteFileName);
logger.info("the file path is " + filePath);
File tmpFile = new File(filePath);
@@ -279,7 +279,7 @@ public class UploadFileAction extends Action {
fileUpload.release();
response.setStatus(HttpResponseStatus.OK);
String relativePath = datePath + "/" + requestId;
String relativePath = datePath + "/" + (StringUtil.isNullOrEmpty(remoteFileName) ? requestId : remoteFileName);
response.setContent("{\"key\":\"" + relativePath + "\"}");
break;
}
@@ -0,0 +1,88 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputBlacklistRequest;
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.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Blacklist_Update_Status)
@HttpMethod("POST")
public class BlacklistAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputBlacklistRequest inputData = getRequestBody(request.getNettyRequest(), InputBlacklistRequest.class);
if (inputData != null
&& !StringUtil.isNullOrEmpty(inputData.getUserId())
&& !StringUtil.isNullOrEmpty(inputData.getTargetUid())
) {
WFCMessage.BlackUserRequest friendRequest = WFCMessage.BlackUserRequest.newBuilder().setUid(inputData.getTargetUid()).setStatus(inputData.getStatus()).build();
RPCCenter.getInstance().sendRequest(inputData.getUserId(), null, IMTopic.BlackListUserTopic, friendRequest.toByteArray(), inputData.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> ctx.executor().execute(command);
}
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,54 @@
/*
* 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.InputGetFriendList;
import cn.wildfirechat.pojos.InputUserId;
import cn.wildfirechat.pojos.OutputStringList;
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.List;
@Route(APIPath.Blacklist_Get_List)
@HttpMethod("POST")
public class BlacklistGetAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputUserId inputGetFriendList = getRequestBody(request.getNettyRequest(), InputUserId.class);
List<FriendData> dataList = messagesStore.getFriendList(inputGetFriendList.getUserId(), null, 0);
List<String> list = new ArrayList<>();
for (FriendData data : dataList) {
if (data.getBlacked() > 0) {
list.add(data.getFriendUid());
}
}
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.ok(new OutputStringList(list));
response.setContent(new Gson().toJson(result));
}
return true;
}
}
@@ -9,6 +9,10 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.pojos.BroadMessageResult;
import cn.wildfirechat.pojos.OutputCheckUserOnline;
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;
@@ -16,10 +20,15 @@ import com.xiaoleilu.loServer.handler.Response;
import cn.wildfirechat.pojos.InputGetUserInfo;
import io.moquette.persistence.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import cn.wildfirechat.common.ErrorCode;
import java.util.concurrent.Executor;
@Route(APIPath.User_Get_Online_Status)
@HttpMethod("POST")
public class CheckUserOnlineAction extends AdminAction {
@@ -34,12 +43,34 @@ public class CheckUserOnlineAction extends AdminAction {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class);
if (inputUserId == null || !StringUtil.isNullOrEmpty(inputUserId.getUserId())) {
RPCCenter.getInstance().sendRequest(null, null, RPCCenter.CHECK_USER_ONLINE_REQUEST, inputUserId.getUserId().getBytes(), inputUserId.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, null, true);
return true;
RPCCenter.getInstance().sendRequest(null, null, RPCCenter.CHECK_USER_ONLINE_REQUEST, inputUserId.getUserId().getBytes(), inputUserId.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] res) {
OutputCheckUserOnline out = new Gson().fromJson(new String(res), OutputCheckUserOnline.class);
sendResponse(response, null, out);
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, true);
return false;
} else {
sendResponse(response, ErrorCode.INVALID_PARAMETER, null);
}
}
return true;
}
@@ -9,6 +9,7 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
@@ -43,7 +44,8 @@ public class CreateUserAction extends AdminAction {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputOutputUserInfo inputCreateUser = getRequestBody(request.getNettyRequest(), InputOutputUserInfo.class);
if (inputCreateUser != null
&& !StringUtil.isNullOrEmpty(inputCreateUser.getName())) {
&& !StringUtil.isNullOrEmpty(inputCreateUser.getName())
&& (inputCreateUser.getType() == ProtoConstants.UserType.UserType_Normal || inputCreateUser.getType() == ProtoConstants.UserType.UserType_Admin || inputCreateUser.getType() == ProtoConstants.UserType.UserType_Super_Admin)) {
if(StringUtil.isNullOrEmpty(inputCreateUser.getPassword())) {
inputCreateUser.setPassword(UUIDGenerator.getUUID());
@@ -78,6 +80,7 @@ public class CreateUserAction extends AdminAction {
if (inputCreateUser.getExtra() != null)
newUserBuilder.setExtra(inputCreateUser.getExtra());
newUserBuilder.setType(inputCreateUser.getType());
newUserBuilder.setUpdateDt(System.currentTimeMillis());
@@ -46,8 +46,11 @@ public class FriendRelationAction extends AdminAction {
&& !StringUtil.isNullOrEmpty(friendAdd.getUserId())
&& !StringUtil.isNullOrEmpty(friendAdd.getFriendUid())
) {
WFCMessage.HandleFriendRequest friendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(friendAdd.getFriendUid()).setStatus(friendAdd.getStatus()).build();
RPCCenter.getInstance().sendRequest(friendAdd.getUserId(), null, IMTopic.HandleFriendRequestTopic, friendRequest.toByteArray(), friendAdd.getFriendUid(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
WFCMessage.HandleFriendRequest.Builder friendRequestBuilder = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(friendAdd.getFriendUid()).setStatus(friendAdd.getStatus());
if (!StringUtil.isNullOrEmpty(friendAdd.getExtra())) {
friendRequestBuilder = friendRequestBuilder.setExtra(friendAdd.getExtra());
}
RPCCenter.getInstance().sendRequest(friendAdd.getUserId(), null, IMTopic.HandleFriendRequestTopic, friendRequestBuilder.build().toByteArray(), friendAdd.getFriendUid(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
@@ -9,6 +9,7 @@
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.pojos.InputUserId;
import cn.wildfirechat.pojos.OutputStringList;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
@@ -36,11 +37,11 @@ public class FriendRelationGetAction extends AdminAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetFriendList inputGetFriendList = getRequestBody(request.getNettyRequest(), InputGetFriendList.class);
InputUserId inputGetFriendList = getRequestBody(request.getNettyRequest(), InputUserId.class);
List<FriendData> dataList = messagesStore.getFriendList(inputGetFriendList.getUserId(), null, 0);
List<String> list = new ArrayList<>();
for (FriendData data : dataList) {
if (data.getState() == inputGetFriendList.getStatus()) {
if (data.getState() == 0) {
list.add(data.getFriendUid());
}
}
@@ -0,0 +1,74 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetChatroomInfo;
import cn.wildfirechat.pojos.OutputGetChatroomInfo;
import cn.wildfirechat.pojos.OutputStringList;
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.moquette.persistence.UserClientEntry;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Route(APIPath.Chatroom_GetMembers)
@HttpMethod("POST")
public class GetChatroomMembersAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetChatroomInfo getChatroomInfo = getRequestBody(request.getNettyRequest(), InputGetChatroomInfo.class);
String chatroomid = getChatroomInfo.getChatroomId();
if (!StringUtil.isNullOrEmpty(chatroomid)) {
Collection<UserClientEntry> members = messagesStore.getChatroomMembers(chatroomid);
List<String> list = new ArrayList<>();
for (UserClientEntry entry : members) {
list.add(entry.userId);
}
RestResult result;
if (!list.isEmpty()) {
result = RestResult.ok(new OutputStringList(list));
} else {
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
}
response.setStatus(HttpResponseStatus.OK);
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;
}
}
@@ -10,6 +10,7 @@ package com.xiaoleilu.loServer.action.channel;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.pojos.SendChannelMessageData;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
@@ -44,11 +45,15 @@ public class SendMessageAction extends ChannelAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
SendMessageData sendMessageData = getRequestBody(request.getNettyRequest(), SendMessageData.class);
SendChannelMessageData sendChannelMessageData = getRequestBody(request.getNettyRequest(), SendChannelMessageData.class);
SendMessageData sendMessageData = new SendMessageData();
sendMessageData.setConv(new Conversation());
sendMessageData.getConv().setType(ConversationType_Channel);
sendMessageData.getConv().setTarget(channelInfo.getTargetId());
sendMessageData.getConv().setLine(sendChannelMessageData.getLine());
sendMessageData.setSender(channelInfo.getOwner());
sendMessageData.setPayload(sendChannelMessageData.getPayload());
sendMessageData.setToUsers(sendChannelMessageData.getTargets());
if (SendMessageData.isValide(sendMessageData)) {
RPCCenter.getInstance().sendRequest(sendMessageData.getSender(), null, IMTopic.SendMessageTopic, sendMessageData.toProtoMessage().toByteArray(), sendMessageData.getSender(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
@@ -113,7 +113,8 @@ abstract public class ActionHandler extends SimpleChannelInboundHandler<FullHttp
* @param response 响应对象
*/
private void doAction(ChannelHandlerContext ctx, Request request, Response response){
if( "/route".equalsIgnoreCase(request.getPath()) && "OPTIONS".equalsIgnoreCase(request.getMethod())){
if(("/route".equalsIgnoreCase(request.getPath()) || request.getPath().startsWith("/fs/"))
&& "OPTIONS".equalsIgnoreCase(request.getMethod())){
handleOptions(ctx, request, response);
return;
}
@@ -14,15 +14,17 @@ public class FriendData implements Serializable {
private String userId;
private String friendUid;
private String alias;
private String extra;
private int state;
private int blacked;
private long timestamp;
public FriendData(String userId, String friendUid, String alias, int state, int blacked, long timestamp) {
public FriendData(String userId, String friendUid, String alias, String extra, int state, int blacked, long timestamp) {
this.userId = userId;
this.friendUid = friendUid;
this.alias = alias;
this.extra = extra;
this.state = state;
this.blacked = blacked;
this.timestamp = timestamp;
@@ -55,6 +57,14 @@ public class FriendData implements Serializable {
this.alias = alias;
}
public String getExtra() {
return extra;
}
public void setExtra(String extra) {
this.extra = extra;
}
public int getState() {
return state;
}
@@ -77,6 +77,10 @@ public final class BrokerConstants {
public static final String QINIU_BUCKET_VIDEO_DOMAIN = "qiniu.bucket_video_domain";
public static final String QINIU_BUCKET_FILE_NAME= "qiniu.bucket_file_name";
public static final String QINIU_BUCKET_FILE_DOMAIN = "qiniu.bucket_file_domain";
public static final String QINIU_BUCKET_STICKER_NAME= "qiniu.bucket_sticker_name";
public static final String QINIU_BUCKET_STICKER_DOMAIN = "qiniu.bucket_sticker_domain";
public static final String QINIU_BUCKET_MOMENTS_NAME= "qiniu.bucket_moments_name";
public static final String QINIU_BUCKET_MOMENTS_DOMAIN = "qiniu.bucket_moments_domain";
public static final String QINIU_BUCKET_PORTRAIT_NAME= "qiniu.bucket_portrait_name";
public static final String QINIU_BUCKET_PORTRAIT_DOMAIN = "qiniu.bucket_portrait_domain";
public static final String QINIU_BUCKET_FAVORITE_NAME= "qiniu.bucket_favorite_name";
@@ -99,6 +103,7 @@ public final class BrokerConstants {
public static final String CLIENT_PROTO_SECRET_KEY = "client.proto.secret_key";
public static final String TOKEN_SECRET_KEY = "token.key";
public static final String TOKEN_EXPIRE_TIME = "token.expire_time";
public static final String EMBED_DB_PROPERTY_NAME = "embed.db";
@@ -109,6 +114,7 @@ public final class BrokerConstants {
public static final String MESSAGE_Forward_Url = "message.forward.url";
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 MONGODB_Client_URI = "mongodb.client_uri";
public static final String MONGODB_Database = "mongodb.database";
@@ -122,8 +128,13 @@ public final class BrokerConstants {
public static final String MESSAGE_Disable_Stranger_Chat = "message.disable_stranger_chat";
public static final String MESSAGE_Blacklist_Strategy = "message.blacklist.strategy";
public static final String FRIEND_Disable_Search = "friend.disable_search";
public static final String FRIEND_Disable_NickName_Search = "friend.disable_nick_name_search";
public static final String FRIEND_Disable_Friend_Request = "friend.disable_friend_request";
public static final String FRIEND_Repeat_Request_Duration = "friend.repeat_request_duration";
public static final String FRIEND_Reject_Request_Duration = "friend.reject_request_duration";
public static final String FRIEND_Request_Expiration_Duration = "friend.request_expiration_duration";
public static final String CHATROOM_Participant_Idle_Time = "chatroom.participant_idle_time";
public static final String CHATROOM_Rejoin_When_Active = "chatroom.rejoin_when_active";
@@ -27,7 +27,7 @@ public class AddFriendHandler extends GroupHandler<WFCMessage.AddFriendRequest>
if (errorCode == ERROR_CODE_SUCCESS) {
WFCMessage.User user = m_messagesStore.getUserInfo(request.getTargetUid());
if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) {
publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, request.getTargetUid(), head[0]);
publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, request.getTargetUid(), head[0], fromUser, request.getReason());
} else if(user != null && user.getType() == ProtoConstants.UserType.UserType_Robot) {
WFCMessage.HandleFriendRequest handleFriendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(fromUser).setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).build();
mServer.internalRpcMsg(request.getTargetUid(), null, handleFriendRequest.toByteArray(), 0, fromUser, HandleFriendRequestTopic, false);
@@ -41,7 +41,7 @@ public class CreateChannelHandler extends GroupHandler<WFCMessage.ChannelInfo> {
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
WFCMessage.ModifyUserSettingReq modifyUserSettingReq = WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingMyChannels).setKey(request.getTargetId()).setValue("1").build();
mServer.internalRpcMsg(fromUser, null, modifyUserSettingReq.toByteArray(), 0, fromUser, PutUserSettingTopic, false);
byte[] data = request.getSecret().getBytes();
byte[] data = request.getTargetId().getBytes();
ackPayload.ensureWritable(data.length).writeBytes(data);
return ErrorCode.ERROR_CODE_SUCCESS;
} else {
@@ -30,6 +30,9 @@ public class FriendPullHandler extends IMHandler<WFCMessage.Version> {
if (!StringUtil.isNullOrEmpty(data.getAlias())) {
builder1.setAlias(data.getAlias());
}
if (!StringUtil.isNullOrEmpty(data.getExtra())) {
builder1.setExtra(data.getExtra());
}
builder.addEntry(builder1.build());
}
byte[] data = builder.build().toByteArray();
@@ -60,6 +60,14 @@ public class GetMediaUploadTokenHandler extends IMHandler<WFCMessage.GetUploadTo
bucketName = MediaServerConfig.QINIU_BUCKET_FAVORITE_NAME;
bucketDomain = MediaServerConfig.QINIU_BUCKET_FAVORITE_DOMAIN;
break;
case 7:
bucketName = MediaServerConfig.QINIU_BUCKET_STICKER_NAME;
bucketDomain = MediaServerConfig.QINIU_BUCKET_STICKER_DOMAIN;
break;
case 8:
bucketName = MediaServerConfig.QINIU_BUCKET_MOMENTS_NAME;
bucketDomain = MediaServerConfig.QINIU_BUCKET_MOMENTS_DOMAIN;
break;
default:
bucketName = MediaServerConfig.QINIU_BUCKET_GENERAL_NAME;
bucketDomain = MediaServerConfig.QINIU_BUCKET_GENERAL_DOMAIN;
@@ -67,6 +67,14 @@ public class GetQiniuUploadTokenHandler extends IMHandler<Byte> {
bucketName = MediaServerConfig.QINIU_BUCKET_FAVORITE_NAME;
bucketDomain = MediaServerConfig.QINIU_BUCKET_FAVORITE_DOMAIN;
break;
case 7:
bucketName = MediaServerConfig.QINIU_BUCKET_STICKER_NAME;
bucketDomain = MediaServerConfig.QINIU_BUCKET_STICKER_DOMAIN;
break;
case 8:
bucketName = MediaServerConfig.QINIU_BUCKET_MOMENTS_NAME;
bucketDomain = MediaServerConfig.QINIU_BUCKET_MOMENTS_DOMAIN;
break;
default:
bucketName = MediaServerConfig.QINIU_BUCKET_GENERAL_NAME;
bucketDomain = MediaServerConfig.QINIU_BUCKET_GENERAL_DOMAIN;
@@ -10,9 +10,12 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import io.moquette.persistence.MemorySessionStore;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import cn.wildfirechat.common.ErrorCode;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.I18n;
import win.liyufan.im.IMTopic;
import win.liyufan.im.MessageShardingUtil;
@@ -27,35 +30,43 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
long[] heads = new long[2];
ErrorCode errorCode = m_messagesStore.handleFriendRequest(fromUser, request, builder, heads, isAdmin);
if (errorCode == ERROR_CODE_SUCCESS && !isAdmin) {
long messageId = MessageShardingUtil.generateId();
long timestamp = System.currentTimeMillis();
builder.setMessageId(messageId);
builder.setServerTimestamp(timestamp);
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
if (errorCode == ERROR_CODE_SUCCESS) {
if (!isAdmin && builder.getConversation() != null && request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) {
long messageId = MessageShardingUtil.generateId();
long timestamp = System.currentTimeMillis();
builder.setMessageId(messageId);
builder.setServerTimestamp(timestamp);
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
WFCMessage.MessageContent.Builder contentBuilder = WFCMessage.MessageContent.newBuilder().setType(90).setContent("以上是打招呼信息");
builder = WFCMessage.Message.newBuilder();
builder.setFromUser(request.getTargetUid());
builder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
builder.setContent(contentBuilder);
timestamp = System.currentTimeMillis();
builder.setServerTimestamp(timestamp);
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
String language = "zh_CN";
if (session != null && !StringUtil.isNullOrEmpty(session.getLanguage())) {
language = session.getLanguage();
}
WFCMessage.MessageContent.Builder contentBuilder = WFCMessage.MessageContent.newBuilder().setType(90).setContent(I18n.getString(language, "Above_Greeting_Message"));
messageId = MessageShardingUtil.generateId();
builder.setMessageId(messageId);
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
builder = WFCMessage.Message.newBuilder();
builder.setFromUser(request.getTargetUid());
builder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
builder.setContent(contentBuilder);
timestamp = System.currentTimeMillis();
builder.setServerTimestamp(timestamp);
contentBuilder.setContent("你们已经成为好友了,现在可以开始聊天了");
builder.setContent(contentBuilder);
messageId = MessageShardingUtil.generateId();
builder.setMessageId(messageId);
timestamp = System.currentTimeMillis();
builder.setServerTimestamp(timestamp);
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
messageId = MessageShardingUtil.generateId();
builder.setMessageId(messageId);
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
publisher.publishNotification(IMTopic.NotifyFriendTopic, request.getTargetUid(), heads[0]);
publisher.publishNotification(IMTopic.NotifyFriendTopic, fromUser, heads[1]);
contentBuilder.setContent(I18n.getString(language, "Friend_Can_Start_Chat"));
builder.setContent(contentBuilder);
messageId = MessageShardingUtil.generateId();
builder.setMessageId(messageId);
timestamp = System.currentTimeMillis();
builder.setServerTimestamp(timestamp);
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
publisher.publishNotification(IMTopic.NotifyFriendTopic, request.getTargetUid(), heads[0]);
publisher.publishNotification(IMTopic.NotifyFriendTopic, fromUser, heads[1]);
}
}
return errorCode;
}
@@ -32,6 +32,8 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedHashSet;
@@ -63,6 +65,9 @@ abstract public class IMHandler<T> {
protected static String actionName;
public static MessagesPublisher getPublisher() {
return publisher;
}
public IMHandler() {
try {
@@ -83,15 +88,11 @@ abstract public class IMHandler<T> {
}
}
for (Method method : getClass().getDeclaredMethods()
) {
if (method.getName() == actionName && method.getParameterCount() == 6 && !method.getParameterTypes()[4].equals(Object.class)) {
dataCls = method.getParameterTypes()[4];
break;
}
}
Type t = getClass().getGenericSuperclass();
ParameterizedType p = (ParameterizedType) t ;
Class<T> c = (Class<T>) p.getActualTypeArguments()[0];
dataCls = c;
if (dataCls.getSuperclass().equals(GeneratedMessage.class)) {
parseDataMethod = dataCls.getMethod("parseFrom", byte[].class);
} else if (dataCls.isPrimitive()) {
@@ -32,6 +32,12 @@ public class LoadRemoteMessagesHandler extends IMHandler<WFCMessage.LoadRemoteMe
}
}
if (request.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Channel) {
if (!m_messagesStore.checkUserInChannel(fromUser, request.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_IN_CHANNEL;
}
}
WFCMessage.PullMessageResult result = m_messagesStore.loadRemoteMessages(fromUser, request.getConversation(), beforeUid, request.getCount());
byte[] data = result.toByteArray();
LOG.info("User {} load message with count({}), payload size({})", fromUser, result.getMessageCount(), data.length);
@@ -31,7 +31,7 @@ public class ModifyGroupInfoHandler extends GroupHandler<WFCMessage.ModifyGroupI
if (request.getType() == Modify_Group_Name) {
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupNameNotifyContent();
} else if(request.getType() == Modify_Group_Portrait) {
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").getChangeGroupPortraitNotifyContent();
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupPortraitNotifyContent();
} else if(request.getType() == Modify_Group_Mute) {
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupMuteNotifyContent();
} else if(request.getType() == Modify_Group_JoinType) {
@@ -18,8 +18,7 @@ import win.liyufan.im.IMTopic;
public class PutUserSettingHandler extends IMHandler<WFCMessage.ModifyUserSettingReq> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyUserSettingReq request, Qos1PublishHandler.IMCallback callback) {
long timestamp = m_messagesStore.updateUserSettings(fromUser, request);
publisher.publishNotification(IMTopic.NotifyUserSettingTopic, fromUser, timestamp);
m_messagesStore.updateUserSettings(fromUser, request);
return ErrorCode.ERROR_CODE_SUCCESS;
}
}
@@ -21,13 +21,12 @@ import java.util.Set;
public class RecallMessageHandler extends IMHandler<WFCMessage.INT64Buf> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.INT64Buf int64Buf, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = m_messagesStore.recallMessage(int64Buf.getId(), fromUser, isAdmin);
ErrorCode errorCode = m_messagesStore.recallMessage(int64Buf.getId(), fromUser, clientID, isAdmin);
if(errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
return errorCode;
}
Set<String> notifyReceivers = new LinkedHashSet<>();
WFCMessage.Message message = m_messagesStore.getMessage(int64Buf.getId());
if (message == null) {
return ErrorCode.ERROR_CODE_NOT_EXIST;
@@ -35,11 +34,6 @@ public class RecallMessageHandler extends IMHandler<WFCMessage.INT64Buf> {
publish(fromUser, clientID, message);
//等待客户端实现根据撤回消息更新内容,之后可以删掉这段代码
m_messagesStore.getNotifyReceivers(fromUser, message.toBuilder(), notifyReceivers, false);
this.publisher.publishRecall2Receivers(int64Buf.getId(), fromUser, notifyReceivers, clientID);
return errorCode;
}
@@ -71,6 +71,7 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
if (errorCode == ErrorCode.ERROR_CODE_IN_BLACK_LIST && mBlacklistStrategy != ProtoConstants.BlacklistStrategy.Message_Reject) {
ignoreMsg = true;
errorCode = ErrorCode.ERROR_CODE_SUCCESS;
} else {
return errorCode;
}
@@ -107,7 +108,7 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
}
if (!isAdmin && message.getContent().getType() == Text) {
if (!isAdmin) {
Set<String> matched = m_messagesStore.handleSensitiveWord(message.getContent().getSearchableContent());
if (matched != null && !matched.isEmpty()) {
m_messagesStore.storeSensitiveMessage(message);
@@ -380,7 +380,7 @@ public class DatabaseStore {
try {
connection = DBUtil.getConnection();
String sql = "select `_uid`, `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt` from t_friend";
String sql = "select `_uid`, `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt`, `_extra` from t_friend";
statement = connection.prepareStatement(sql);
int index;
@@ -411,6 +411,8 @@ public class DatabaseStore {
long longvalue = rs.getLong(index++);
builder.setTimestamp(longvalue);
builder.setExtra(rs.getString(index++));
friendsMap.put(builder.getUserId(), builder);
}
} catch (SQLException e) {
@@ -493,7 +495,7 @@ public class DatabaseStore {
try {
connection = DBUtil.getConnection();
String sql = "insert into " + MessageShardingUtil.getMessageTable(message.getMessageId()) +
" (`_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_searchable_key`, `_dt`, `_content_type`) values(?, ?, ?, ?, ?, ?, ?, ?, ?)" +
" (`_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_searchable_key`, `_dt`, `_content_type`, `_to`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
" ON DUPLICATE KEY UPDATE " +
"`_data` = ?," +
"`_searchable_key` = ?," +
@@ -515,6 +517,13 @@ public class DatabaseStore {
statement.setString(index++, searchableContent);
statement.setTimestamp(index++, new Timestamp(message.getServerTimestamp()));
statement.setInt(index++, message.getContent().getType());
String to = message.getToUser();
if (StringUtil.isNullOrEmpty(message.getToUser())) {
if (message.getToList()!= null && message.getToList().size() == 1) {
to = message.getToList().get(0);
}
}
statement.setString(index++, to);
statement.setBlob(index++, blob);
statement.setString(index++, searchableContent);
@@ -721,21 +730,27 @@ public class DatabaseStore {
}
List<WFCMessage.Message> loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count) {
List<WFCMessage.Message> messages = loadRemoteMessagesFromTable(user, conversation, beforeUid, count, MessageShardingUtil.getMessageTable(beforeUid));
if (messages != null && messages.size() < count) {
String nexTable = MessageShardingUtil.getPreviousMessageTable(beforeUid);
if (!StringUtil.isNullOrEmpty(nexTable)) {
List<WFCMessage.Message> nextMessages = loadRemoteMessagesFromTable(user, conversation, beforeUid, count - messages.size(), nexTable);
if (nextMessages != null) {
messages.addAll(nextMessages);
List<WFCMessage.Message> messages = new ArrayList<>();
long[] before = new long[1];
before[0] = beforeUid;
boolean hasMore = loadRemoteMessagesFromTable(user, conversation, before, count, MessageShardingUtil.getMessageTable(beforeUid), messages);
if (messages.size() < count) {
if (hasMore) {
loadRemoteMessagesFromTable(user, conversation, before, count - messages.size(), MessageShardingUtil.getMessageTable(beforeUid), messages);
} else {
String nexTable = MessageShardingUtil.getPreviousMessageTable(before[0]);
if (!StringUtil.isNullOrEmpty(nexTable)) {
loadRemoteMessagesFromTable(user, conversation, before, count - messages.size(), nexTable, messages);
}
}
}
return messages;
}
List<WFCMessage.Message> loadRemoteMessagesFromTable(String user, WFCMessage.Conversation conversation, long beforeUid, int count, String table) {
String sql = "select `_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_dt` from " + table +" where";
boolean loadRemoteMessagesFromTable(String user, WFCMessage.Conversation conversation, long[] before, int count, String table, List<WFCMessage.Message> messages) {
long beforeUid = before[0];
String sql = "select `_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_dt`, `_to` from " + table +" where";
if (conversation.getType() == ProtoConstants.ConversationType.ConversationType_Private) {
sql += " _type = ? and _line = ? and _mid < ? and ((_target = ? and _from = ?) or (_target = ? and _from = ?))";
} else {
@@ -747,7 +762,6 @@ public class DatabaseStore {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
List<WFCMessage.Message> out = new ArrayList<>();
try {
connection = DBUtil.getConnection();
statement = connection.prepareStatement(sql);
@@ -764,9 +778,12 @@ public class DatabaseStore {
statement.setInt(index++, count);
resultSet = statement.executeQuery();
while (resultSet.next()) {
count--;
WFCMessage.Message.Builder builder = WFCMessage.Message.newBuilder();
index = 1;
builder.setMessageId(resultSet.getLong(index++));
before[0] = builder.getMessageId();
builder.setFromUser(resultSet.getString(index++));
WFCMessage.Conversation.Builder cb = WFCMessage.Conversation.newBuilder();
cb.setType(resultSet.getInt(index++));
@@ -777,9 +794,22 @@ public class DatabaseStore {
WFCMessage.MessageContent messageContent = WFCMessage.MessageContent.parseFrom(blob.getBinaryStream());
builder.setContent(messageContent);
builder.setServerTimestamp(resultSet.getTimestamp(index++).getTime());
String to = resultSet.getString(index++);
if (!StringUtil.isNullOrEmpty(to)) {
if (to.equals(user) || builder.getFromUser().equals(user)) {
builder.setToUser(to);
} else {
continue;
}
}
WFCMessage.Message message = builder.build();
out.add(message);
messages.add(message);
}
if (count == 0) {
return true;
}
} catch (SQLException | IOException e) {
e.printStackTrace();
@@ -787,7 +817,7 @@ public class DatabaseStore {
} finally {
DBUtil.closeDB(connection, statement, resultSet);
}
return out;
return false;
}
void persistUserMessage(final String userId, final long messageId, final long messageSeq) {
@@ -1446,8 +1476,9 @@ public class DatabaseStore {
try {
connection = DBUtil.getConnection();
String sql;
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX
|| platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Linux) {
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0";
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0";
} else {
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and `_platform` = ? and `_cid` <> ? and `_deleted` = 0";
@@ -1463,9 +1494,10 @@ public class DatabaseStore {
statement.setString(index++, uid);
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX) {
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Linux) {
statement.setInt(index++, ProtoConstants.Platform.Platform_Windows);
statement.setInt(index++, ProtoConstants.Platform.Platform_OSX);
statement.setInt(index++, ProtoConstants.Platform.Platform_Linux);
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
statement.setInt(index++, ProtoConstants.Platform.Platform_iOS);
statement.setInt(index++, ProtoConstants.Platform.Platform_Android);
@@ -2473,7 +2505,7 @@ public class DatabaseStore {
ResultSet rs = null;
try {
connection = DBUtil.getConnection();
String sql = "select `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt` from t_friend where `_uid` = ?";
String sql = "select `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt`, `_extra` from t_friend where `_uid` = ?";
statement = connection.prepareStatement(sql);
@@ -2489,8 +2521,9 @@ public class DatabaseStore {
int state = rs.getInt(3);
int blacked = rs.getInt(4);
long timestamp = rs.getLong(5);
String extra = rs.getString(6);
FriendData data = new FriendData(userId, uid, alias, state, blacked, timestamp);
FriendData data = new FriendData(userId, uid, alias, extra, state, blacked, timestamp);
out.add(data);
}
return out;
@@ -2510,7 +2543,7 @@ public class DatabaseStore {
PreparedStatement statement = null;
try {
connection = DBUtil.getConnection();
String sql = "update t_friend set `_alias` = '', `_state` = 1, `_blacked` = 0, `_dt` = ? where `_uid` = ? or `_friend_uid` = ?";
String sql = "update t_friend set `_alias` = '', `_state` = 1, `_blacked` = 0, `_dt` = ?, `_extra` = 0 where `_uid` = ? or `_friend_uid` = ?";
statement = connection.prepareStatement(sql);
int index = 1;
@@ -2693,12 +2726,13 @@ public class DatabaseStore {
PreparedStatement statement = null;
try {
connection = DBUtil.getConnection();
String sql = "insert into t_friend (`_uid`, `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt`) values(?, ?, ?, ?, ?, ?)" +
String sql = "insert into t_friend (`_uid`, `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt`, `_extra`) values(?, ?, ?, ?, ?, ?, ?)" +
" ON DUPLICATE KEY UPDATE " +
"`_alias` = ?," +
"`_state` = ?," +
"`_blacked` = ?," +
"`_dt` = ?";
"`_dt` = ?," +
"`_extra` = ?";
statement = connection.prepareStatement(sql);
@@ -2709,10 +2743,12 @@ public class DatabaseStore {
statement.setInt(index++, request.getState());
statement.setInt(index++, request.getBlacked());
statement.setLong(index++, request.getTimestamp());
statement.setString(index++, request.getExtra());
statement.setString(index++, request.getAlias());
statement.setInt(index++, request.getState());
statement.setInt(index++, request.getBlacked());
statement.setLong(index++, request.getTimestamp());
statement.setString(index++, request.getExtra());
int count = statement.executeUpdate();
LOG.info("Update rows {}", count);
} catch (SQLException e) {
@@ -3001,7 +3037,7 @@ public class DatabaseStore {
rs = statement.executeQuery();
while (rs.next()) {
String value = rs.getString(index++);
String value = rs.getString(1);
if (!StringUtil.isNullOrEmpty(value)) {
out.add(value);
}
@@ -22,11 +22,11 @@ import cn.wildfirechat.proto.WFCMessage;
import com.google.protobuf.ByteString;
import com.hazelcast.core.*;
import com.hazelcast.util.StringUtil;
import com.xiaoleilu.hutool.system.UserInfo;
import com.xiaoleilu.loServer.model.FriendData;
import cn.wildfirechat.pojos.InputOutputUserBlockStatus;
import cn.wildfirechat.common.ErrorCode;
import io.moquette.BrokerConstants;
import io.moquette.imhandler.IMHandler;
import io.moquette.server.Constants;
import io.moquette.server.Server;
import io.moquette.spi.IMatchingCondition;
@@ -51,16 +51,17 @@ import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.function.Consumer;
import static cn.wildfirechat.proto.ProtoConstants.ChannelStatus.Channel_Status_Destoryed;
import static cn.wildfirechat.proto.ProtoConstants.ChannelState.Channel_State_Mask_Deleted;
import static cn.wildfirechat.proto.ProtoConstants.GroupMemberType.*;
import static cn.wildfirechat.proto.ProtoConstants.ModifyChannelInfoType.*;
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.*;
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
import static cn.wildfirechat.proto.ProtoConstants.Platform.*;
import static io.moquette.BrokerConstants.*;
import static io.moquette.server.Constants.MAX_CHATROOM_MESSAGE_QUEUE;
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
import static win.liyufan.im.MyInfoType.*;
import static win.liyufan.im.UserSettingScope.kUserSettingPCOnline;
public class MemoryMessagesStore implements IMessagesStore {
private static final String MESSAGES_MAP = "messages_map";
@@ -120,8 +121,14 @@ public class MemoryMessagesStore implements IMessagesStore {
private ConcurrentHashMap<String, Boolean> userPushHiddenDetail = new ConcurrentHashMap<>();
private ConcurrentHashMap<String, Boolean> userConvSlientMap = new ConcurrentHashMap<>();
private boolean mDisableSearch = false;
private boolean mDisableNicknameSearch = false;
private boolean mDisableFriendRequest = false;
private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000;
private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000;
private long mFriendRequestExpiration = 7 * 24 * 60 * 60 * 1000;
private boolean mMultiPlatformNotification = false;
private boolean mDisableStrangerChat = false;
private long mChatroomParticipantIdleTime = 900000;
@@ -130,6 +137,7 @@ public class MemoryMessagesStore implements IMessagesStore {
MemoryMessagesStore(Server server, DatabaseStore databaseStore) {
m_Server = server;
this.databaseStore = databaseStore;
IS_MESSAGE_ROAMING = "1".equals(m_Server.getConfig().getProperty(MESSAGE_ROAMING));
IS_MESSAGE_REMOTE_HISTORY_MESSAGE = "1".equals(m_Server.getConfig().getProperty(MESSAGE_Remote_History_Message));
Constants.MAX_MESSAGE_QUEUE = Integer.parseInt(m_Server.getConfig().getProperty(MESSAGE_Max_Queue));
@@ -139,6 +147,37 @@ public class MemoryMessagesStore implements IMessagesStore {
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
printMissConfigLog(MESSAGE_Disable_Stranger_Chat, mDisableStrangerChat + "");
}
try {
mMultiPlatformNotification = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.SERVER_MULTI_PLATFROM_NOTIFICATION, "false"));
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
printMissConfigLog(SERVER_MULTI_PLATFROM_NOTIFICATION, mDisableStrangerChat + "");
}
try {
mDisableSearch = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Disable_Search));
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
printMissConfigLog(FRIEND_Disable_Search, mDisableSearch + "");
}
try {
mDisableNicknameSearch = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Disable_NickName_Search));
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
printMissConfigLog(FRIEND_Disable_NickName_Search, mDisableNicknameSearch + "");
}
try {
mDisableFriendRequest = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Disable_Friend_Request));
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
printMissConfigLog(FRIEND_Disable_Friend_Request, mDisableFriendRequest + "");
}
try {
@@ -146,6 +185,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
printMissConfigLog(FRIEND_Repeat_Request_Duration, mFriendRequestDuration + "");
}
try {
@@ -153,6 +193,15 @@ public class MemoryMessagesStore implements IMessagesStore {
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
printMissConfigLog(FRIEND_Reject_Request_Duration, mFriendRejectDuration + "");
}
try {
mFriendRequestExpiration = Long.parseLong(m_Server.getConfig().getProperty(FRIEND_Request_Expiration_Duration));
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
printMissConfigLog(FRIEND_Request_Expiration_Duration, mFriendRequestExpiration + "");
}
try {
@@ -160,6 +209,7 @@ public class MemoryMessagesStore implements IMessagesStore {
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
printMissConfigLog(CHATROOM_Rejoin_When_Active, mChatroomRejoinWhenActive + "");
}
try {
@@ -167,9 +217,14 @@ public class MemoryMessagesStore implements IMessagesStore {
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
printMissConfigLog(CHATROOM_Participant_Idle_Time, mChatroomParticipantIdleTime + "");
}
}
private void printMissConfigLog(String config, String defaultValue) {
LOG.info("配置文件中缺少配置项目 {}, 缺省值为 {},可以忽略本提醒,或者更新配置项", config, defaultValue);
}
@Override
public void initStore() {
updateSensitiveWord();
@@ -250,8 +305,17 @@ public class MemoryMessagesStore implements IMessagesStore {
if (!StringUtil.isNullOrEmpty(message.getToUser())) {
notifyReceivers.add(message.getToUser());
} else if(!message.getToList().isEmpty()) {
notifyReceivers.addAll(message.getToList());
} else if(message.getToList()!=null && !message.getToList().isEmpty()) {
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
if (members == null || members.size() == 0) {
members = loadGroupMemberFromDB(hzInstance, message.getConversation().getTarget());
}
for (WFCMessage.GroupMember member : members) {
if (member.getType() != GroupMemberType_Removed && message.getToList().contains(member.getMemberId())) {
notifyReceivers.add(member.getMemberId());
}
}
} else {
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
@@ -288,14 +352,19 @@ public class MemoryMessagesStore implements IMessagesStore {
if (channelInfo != null) {
notifyReceivers.add(fromUser);
if (channelInfo.getOwner().equals(fromUser)) {
if (StringUtil.isNullOrEmpty(message.getToUser())) {
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
notifyReceivers.addAll(listeners.get(message.getConversation().getTarget()));
} else {
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
if (listeners.values().contains(message.getToUser())) {
Collection<String> listeners = getChannelListener(message.getConversation().getTarget());
if (!StringUtil.isNullOrEmpty(message.getToUser())) {
if (listeners.contains(message.getToUser())) {
notifyReceivers.add(message.getToUser());
}
} else if(message.getToList() != null && !message.getToList().isEmpty()) {
for (String to:message.getToList()) {
if (listeners.contains(to)) {
notifyReceivers.add(to);
}
}
} else {
notifyReceivers.addAll(listeners);
}
} else {
if (StringUtil.isNullOrEmpty(channelInfo.getCallback()) || channelInfo.getAutomatic() == 0) {
@@ -1272,7 +1341,7 @@ public class MemoryMessagesStore implements IMessagesStore {
if (members == null || members.size() == 0) {
members = loadGroupMemberFromDB(hzInstance, groupId);
}
boolean isInGroup = false;
for (WFCMessage.GroupMember member : members) {
if (member.getMemberId().equals(memberId)) {
@@ -1301,7 +1370,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@Override
public ErrorCode recallMessage(long messageUid, String operatorId, boolean isAdmin) {
public ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<Long, MessageBundle> mIMap = hzInstance.getMap(MESSAGES_MAP);
@@ -1352,8 +1421,14 @@ public class MemoryMessagesStore implements IMessagesStore {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
message = message.toBuilder().setContent(message.getContent().toBuilder().setContent(operatorId).setType(80).clearSearchableContent().setData(ByteString.copyFrom(new StringBuffer().append(messageUid).toString().getBytes())).build()).build();
String searchContent = message.getContent().getSearchableContent() == null ? "" : message.getContent().getSearchableContent();
String cont = message.getContent().getContent() == null ? "" : message.getContent().getContent();
String extra = message.getContent().getExtra() == null ? "" : message.getContent().getExtra();
String recalledContent = "{\"s\":\"" + message.getFromUser() + "\",\"ts\":" + message.getServerTimestamp() + ",\"t\":" + message.getContent().getType() + ",\"sc\":\"" + searchContent + "\",\"c\":\"" + cont + "\",\"e\":\"" + extra + "\"}";
message = message.toBuilder().setContent(message.getContent().toBuilder().setContent(operatorId).setType(80).clearSearchableContent().setData(ByteString.copyFrom(String.valueOf(messageUid).getBytes())).setExtra(recalledContent).build()).build();
messageBundle.setMessage(message);
messageBundle.setFromClientId(clientId);
databaseStore.deleteMessage(messageUid);
@@ -1479,7 +1554,8 @@ public class MemoryMessagesStore implements IMessagesStore {
modified = true;
break;
case Modify_Social:
builder.setSocial(entry.getValue());
modified = true;
break;
case Modify_Extra:
builder.setExtra(entry.getValue());
@@ -1502,6 +1578,56 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@Override
public void updateUserOnlineSetting(MemorySessionStore.Session session, boolean online) {
if(!mMultiPlatformNotification) {
return;
}
if (m_Server.getStore().sessionsStore().isMultiEndpointSupported()) {
return;
}
if (m_Server.isShutdowning()) {
return;
}
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());
} else {
String value = null;
for (MemorySessionStore.Session s : m_Server.getStore().sessionsStore().sessionForUser(session.username)) {
if (s.getDeleted() != 0 || !m_Server.getConnectionsManager().isConnected(s.getClientID())) {
continue;
}
switch (s.getPlatform()) {
case Platform_Linux:
case Platform_Windows:
case Platform_OSX:
value = System.currentTimeMillis() + "|" + s.getPlatform() + "|" + s.getClientID() + "|" + s.getPhoneName();
break;
default:
break;
}
if (value != null) {
break;
}
}
WFCMessage.UserSettingEntry pcentry = getUserSetting(session.getUsername(), kUserSettingPCOnline, "PC");
if (value != null) {
if (pcentry == null || StringUtil.isNullOrEmpty(pcentry.getValue())) {
updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(value).build());
}
} else {
if (pcentry != null && !StringUtil.isNullOrEmpty(pcentry.getValue())) {
updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue("").build());
}
}
}
}
@Override
public ErrorCode modifyUserStatus(String userId, int status) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
@@ -1590,6 +1716,14 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@Override
public List<WFCMessage.User> searchUser(String keyword, int searchType, int page) {
if (mDisableSearch) {
return new ArrayList<>();
}
if (mDisableNicknameSearch && searchType == ProtoConstants.SearchUserType.SearchUserType_General) {
searchType = ProtoConstants.SearchUserType.SearchUserType_Name_Mobile;
}
return databaseStore.searchUserFromDB(keyword, searchType, page);
}
@@ -1923,6 +2057,10 @@ public class MemoryMessagesStore implements IMessagesStore {
@Override
public ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head) {
if (mDisableFriendRequest) {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, WFCMessage.FriendRequest> requestMap = hzInstance.getMultiMap(USER_FRIENDS_REQUEST);
Collection<WFCMessage.FriendRequest> requests = requestMap.get(userId);
@@ -2018,9 +2156,10 @@ public class MemoryMessagesStore implements IMessagesStore {
}
}
if (friendData1 == null) {
friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getStatus(), 0, System.currentTimeMillis());
friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getExtra(), request.getStatus(), 0, System.currentTimeMillis());
} else {
friendData1.setState(request.getStatus());
friendData1.setExtra(request.getExtra());
friendData1.setTimestamp(System.currentTimeMillis());
}
@@ -2040,7 +2179,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
}
if (friendData2 == null) {
friendData2 = new FriendData(request.getTargetUid(), userId, "", request.getStatus(), 0, friendData1.getTimestamp());
friendData2 = new FriendData(request.getTargetUid(), userId, "", request.getExtra(), request.getStatus(), 0, friendData1.getTimestamp());
} else {
friendsMap.remove(request.getTargetUid(), friendData2);
friendData2.setState(request.getStatus());
@@ -2074,29 +2213,30 @@ public class MemoryMessagesStore implements IMessagesStore {
}
if (existRequest != null) {
if (mFriendRequestDuration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestDuration) {
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_OVERTIME;
if (mFriendRequestExpiration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestExpiration) {
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_EXPIRED;
} else {
existRequest = existRequest.toBuilder().setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).setUpdateDt(System.currentTimeMillis()).build();
existRequest = existRequest.toBuilder().setStatus(request.getStatus()).setUpdateDt(System.currentTimeMillis()).build();
databaseStore.persistOrUpdateFriendRequest(existRequest);
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
if(request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted){
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
FriendData friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getExtra(), 0, 0, System.currentTimeMillis());
databaseStore.persistOrUpdateFriendData(friendData1);
FriendData friendData1 = new FriendData(userId, request.getTargetUid(), "", 0, 0, System.currentTimeMillis());
databaseStore.persistOrUpdateFriendData(friendData1);
FriendData friendData2 = new FriendData(request.getTargetUid(), userId, "", request.getExtra(), 0, 0, friendData1.getTimestamp());
databaseStore.persistOrUpdateFriendData(friendData2);
FriendData friendData2 = new FriendData(request.getTargetUid(), userId, "", 0, 0, friendData1.getTimestamp());
databaseStore.persistOrUpdateFriendData(friendData2);
requestMap.remove(userId);
requestMap.remove(request.getTargetUid());
friendsMap.remove(userId);
friendsMap.remove(request.getTargetUid());
requestMap.remove(userId);
requestMap.remove(request.getTargetUid());
friendsMap.remove(userId);
friendsMap.remove(request.getTargetUid());
heads[0] = friendData2.getTimestamp();
heads[1] = friendData1.getTimestamp();
heads[0] = friendData2.getTimestamp();
heads[1] = friendData1.getTimestamp();
msgBuilder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(userId).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
msgBuilder.setContent(WFCMessage.MessageContent.newBuilder().setType(1).setSearchableContent(existRequest.getReason()).build());
msgBuilder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(userId).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
msgBuilder.setContent(WFCMessage.MessageContent.newBuilder().setType(1).setSearchableContent(existRequest.getReason()).build());
}
return ErrorCode.ERROR_CODE_SUCCESS;
}
} else {
@@ -2129,7 +2269,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
if (friendData == null) {
friendData = new FriendData(fromUser, targetUserId, "", 1, state, System.currentTimeMillis());
friendData = new FriendData(fromUser, targetUserId, "", "", 1, state, System.currentTimeMillis());
}
friendData.setBlacked(state);
friendData.setTimestamp(System.currentTimeMillis());
@@ -2143,6 +2283,25 @@ public class MemoryMessagesStore implements IMessagesStore {
return ErrorCode.ERROR_CODE_SUCCESS;
}
@Override
public FriendData getFriendData(String fromUser, String targetUserId) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
Collection<FriendData> friends = friendsMap.get(fromUser);
if (friends == null || friends.size() == 0) {
friends = loadFriend(friendsMap, fromUser);
}
for (FriendData fd:friends) {
if (fd.getFriendUid().equals(targetUserId)) {
return fd;
}
}
return null;
}
@Override
public ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] heads){
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
@@ -2411,6 +2570,7 @@ public class MemoryMessagesStore implements IMessagesStore {
userGlobalSlientMap.remove(userId);
userConvSlientMap.remove(userId);
userPushHiddenDetail.remove(userId);
IMHandler.getPublisher().publishNotification(IMTopic.NotifyUserSettingTopic, userId, updateDt);
return updateDt;
}
@@ -2575,7 +2735,7 @@ public class MemoryMessagesStore implements IMessagesStore {
WFCMessage.ChannelInfo.Builder newInfoBuilder = oldInfo.toBuilder();
newInfoBuilder.setStatus(Channel_Status_Destoryed);
newInfoBuilder.setStatus(oldInfo.getStatus() | Channel_State_Mask_Deleted);
newInfoBuilder.setUpdateDt(System.currentTimeMillis());
mIMap.put(channelId, newInfoBuilder.build());
return ErrorCode.ERROR_CODE_SUCCESS;
@@ -2591,6 +2751,8 @@ public class MemoryMessagesStore implements IMessagesStore {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
getChannelListener(channelId);
if (listen) {
listeners.put(channelId, operator);
} else {
@@ -2601,6 +2763,19 @@ public class MemoryMessagesStore implements IMessagesStore {
return ErrorCode.ERROR_CODE_SUCCESS;
}
private Collection<String> getChannelListener(String channelId) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
Collection<String> result = listeners.get(channelId);
if (result.isEmpty()) {
result = databaseStore.getChannelListener(channelId);
for (String userId : result) {
listeners.put(channelId, userId);
}
}
return result;
}
@Override
public WFCMessage.ChannelInfo getChannelInfo(String channelId) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
@@ -2610,12 +2785,12 @@ public class MemoryMessagesStore implements IMessagesStore {
@Override
public boolean checkUserInChannel(String user, String channelId) {
MultiMap<String, String> chatroomMembers = m_Server.getHazelcastInstance().getMultiMap(CHANNEL_LISTENERS);
Collection<String> chatroomMembers = getChannelListener(channelId);
if (chatroomMembers == null) {
return false;
}
if(!chatroomMembers.containsEntry(channelId, user)) {
if(!chatroomMembers.contains(user)) {
IMap<String, WFCMessage.ChannelInfo> mIMap = m_Server.getHazelcastInstance().getMap(CHANNELS);
WFCMessage.ChannelInfo info = mIMap.get(channelId);
if (info == null || !info.getOwner().equals(user)) {
@@ -2625,6 +2800,16 @@ public class MemoryMessagesStore implements IMessagesStore {
return true;
}
@Override
public Collection<String> getChannelSubscriber(String channelId) {
MultiMap<String, String> channelMembers = m_Server.getHazelcastInstance().getMultiMap(CHANNEL_LISTENERS);
if (channelMembers == null) {
return new ArrayList<>();
}
return channelMembers.get(channelId);
}
@Override
public Set<String> handleSensitiveWord(String message) {
updateSensitiveWord();
@@ -279,6 +279,9 @@ public class MemorySessionStore implements ISessionsStore {
@Override
public Session getSession(String clientID) {
if (StringUtil.isNullOrEmpty(clientID)) {
return null;
}
Session session = sessions.get(clientID);
if (session == null) {
LOG.error("Can't find the session for client <{}>", clientID);
@@ -378,8 +381,8 @@ public class MemorySessionStore implements ISessionsStore {
if (s.getPlatform() == ProtoConstants.Platform.Platform_Android || s.getPlatform() == ProtoConstants.Platform.Platform_iOS) {
remove = true;
}
} else if(platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Windows) {
if (s.getPlatform() == ProtoConstants.Platform.Platform_OSX || s.getPlatform() == ProtoConstants.Platform.Platform_Windows) {
} else if(platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_Linux) {
if (s.getPlatform() == ProtoConstants.Platform.Platform_OSX || s.getPlatform() == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_Linux) {
remove = true;
}
} else {
@@ -677,4 +680,8 @@ public class MemorySessionStore implements ISessionsStore {
// TODO this missing last step breaks the junit test
sessions.remove(clientID);
}
@Override
public boolean isMultiEndpointSupported() {
return supportMultiEndpoint;
}
}
@@ -35,11 +35,13 @@ import io.moquette.spi.IStore;
import io.moquette.spi.impl.ProtocolProcessor;
import io.moquette.spi.impl.ProtocolProcessorBootstrapper;
import io.moquette.spi.impl.security.AES;
import io.moquette.spi.impl.subscriptions.Token;
import io.moquette.spi.security.IAuthenticator;
import io.moquette.spi.security.IAuthorizator;
import io.moquette.spi.security.ISslContextCreator;
import io.moquette.spi.security.Tokenor;
import io.netty.util.ResourceLeakDetector;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.DBUtil;
import org.slf4j.Logger;
@@ -80,6 +82,8 @@ public class Server {
private ServerAcceptor m_acceptor;
private boolean m_shutdowning = false;
public volatile boolean m_initialized;
private ProtocolProcessor m_processor;
@@ -315,6 +319,12 @@ public class Server {
MediaServerConfig.QINIU_BUCKET_FILE_NAME = config.getProperty(BrokerConstants.QINIU_BUCKET_FILE_NAME);
MediaServerConfig.QINIU_BUCKET_FILE_DOMAIN = config.getProperty(BrokerConstants.QINIU_BUCKET_FILE_DOMAIN);
MediaServerConfig.QINIU_BUCKET_STICKER_NAME = config.getProperty(BrokerConstants.QINIU_BUCKET_STICKER_NAME);
MediaServerConfig.QINIU_BUCKET_STICKER_DOMAIN = config.getProperty(BrokerConstants.QINIU_BUCKET_STICKER_DOMAIN);
MediaServerConfig.QINIU_BUCKET_MOMENTS_NAME = config.getProperty(BrokerConstants.QINIU_BUCKET_MOMENTS_NAME);
MediaServerConfig.QINIU_BUCKET_MOMENTS_DOMAIN = config.getProperty(BrokerConstants.QINIU_BUCKET_MOMENTS_DOMAIN);
MediaServerConfig.QINIU_BUCKET_PORTRAIT_NAME = config.getProperty(BrokerConstants.QINIU_BUCKET_PORTRAIT_NAME);
MediaServerConfig.QINIU_BUCKET_PORTRAIT_DOMAIN = config.getProperty(BrokerConstants.QINIU_BUCKET_PORTRAIT_DOMAIN);
@@ -387,6 +397,14 @@ public class Server {
hazelcastInstance.getCluster().getLocalMember().setIntAttribute(HZ_Cluster_Node_ID, nodeId);
hazelcastInstance.getCluster().getLocalMember().setStringAttribute(HZ_Cluster_Node_External_IP, serverIp);
Tokenor.setKey(config.getProperty(BrokerConstants.TOKEN_SECRET_KEY));
String expirTimeStr = config.getProperty(TOKEN_EXPIRE_TIME);
if (!StringUtil.isNullOrEmpty(expirTimeStr)) {
try {
Tokenor.setExpiredTime(Long.parseLong(expirTimeStr));
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
RPCCenter.getInstance().init(this);
return true;
}
@@ -405,9 +423,15 @@ public class Server {
m_processor.onRpcMsg(fromUser, clientId, message, messageId, from, request, isAdmin);
}
public boolean isShutdowning() {
return m_shutdowning;
}
public void stopServer() {
System.out.println("Server will flush data to db before shutting down, please wait 5 seconds!");
LOG.info("Unbinding server from the configured ports");
m_shutdowning = true;
m_acceptor.close();
LOG.trace("Stopping MQTT protocol processor");
m_processorBootstrapper.shutdown();
@@ -15,6 +15,10 @@ public class MediaServerConfig {
public static String QINIU_BUCKET_VIDEO_DOMAIN;
public static String QINIU_BUCKET_FILE_NAME;
public static String QINIU_BUCKET_FILE_DOMAIN;
public static String QINIU_BUCKET_STICKER_NAME;
public static String QINIU_BUCKET_STICKER_DOMAIN;
public static String QINIU_BUCKET_MOMENTS_NAME;
public static String QINIU_BUCKET_MOMENTS_DOMAIN;
public static String QINIU_BUCKET_PORTRAIT_NAME;
public static String QINIU_BUCKET_PORTRAIT_DOMAIN;
public static String QINIU_BUCKET_FAVORITE_NAME;
@@ -122,7 +122,7 @@ public interface IMessagesStore {
boolean isMemberInGroup(String member, String groupId);
ErrorCode canSendMessageInGroup(String member, String groupId);
ErrorCode recallMessage(long messageUid, String operatorId, boolean isAdmin);
ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin);
void clearUserMessages(String userId);
@@ -131,6 +131,8 @@ public interface IMessagesStore {
ErrorCode getUserInfo(List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder);
ErrorCode modifyUserInfo(String userId, WFCMessage.ModifyMyInfoRequest request) throws Exception;
void updateUserOnlineSetting(MemorySessionStore.Session session, boolean online);
ErrorCode modifyUserStatus(String userId, int status);
int getUserStatus(String userId);
List<InputOutputUserBlockStatus> getUserStatusList();
@@ -167,6 +169,7 @@ public interface IMessagesStore {
ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin);
ErrorCode deleteFriend(String userId, String friendUid, long[] head);
ErrorCode blackUserRequest(String fromUser, String targetUserId, int status, long[] head);
FriendData getFriendData(String fromUser, String targetUserId);
ErrorCode SyncFriendRequestUnread(String userId, long unreadDt, long[] head);
ErrorCode isAllowUserMessage(String fromUser, String userId);
ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] head);
@@ -195,6 +198,7 @@ public interface IMessagesStore {
ErrorCode listenChannel(String operator, String channelId, boolean listen);
WFCMessage.ChannelInfo getChannelInfo(String channelId);
boolean checkUserInChannel(String user, String channelId);
Collection<String> getChannelSubscriber(String channelId);
Set<String> handleSensitiveWord(String message);
boolean addSensitiveWords(List<String> words);
@@ -149,4 +149,6 @@ public interface ISessionsStore {
int getSecondPhaseAckPendingMessages(String clientID);
void cleanSession(String clientID);
boolean isMultiEndpointSupported();
}
@@ -18,11 +18,14 @@ package io.moquette.spi.impl;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import cn.wildfirechat.push.PushServer;
import com.google.gson.Gson;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.util.StringUtil;
import cn.wildfirechat.pojos.OutputNotifyChannelSubscribeStatus;
import cn.wildfirechat.pojos.SendMessageData;
import com.xiaoleilu.hutool.system.UserInfo;
import com.xiaoleilu.loServer.model.FriendData;
import io.moquette.persistence.*;
import io.moquette.persistence.MemorySessionStore.Session;
import io.moquette.server.ConnectionDescriptorStore;
@@ -316,11 +319,19 @@ public class MessagesPublisher {
boolean isHiddenDetail = m_messagesStore.getUserPushHiddenDetail(user);
if(!nameLoaded) {
senderName = getUserDisplayName(sender);
senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null);
targetName = getTargetName(target, conversationType);
nameLoaded = true;
}
this.messageSender.sendPush(sender, conversationType, target, line, messageHead, targetSession.getClientID(), pushContent, messageContentType, serverTime, senderName, targetName, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
String name = senderName;
if (!sender.equals(user)) {
FriendData fd = m_messagesStore.getFriendData(user, sender);
if (fd != null && !StringUtil.isNullOrEmpty(fd.getAlias())) {
name = fd.getAlias();
}
}
this.messageSender.sendPush(sender, conversationType, target, line, messageHead, targetSession.getClientID(), pushContent, messageContentType, serverTime, name, targetName, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
}
}
@@ -335,6 +346,10 @@ public class MessagesPublisher {
Collection<Session> sessions = m_sessionsStore.sessionForUser(user);
for (Session targetSession : sessions) {
if(System.currentTimeMillis() - targetSession.getLastActiveTime() > 60 * 60 * 1000) {
continue;
}
if (targetSession.getClientID() == null) {
continue;
}
@@ -356,33 +371,51 @@ public class MessagesPublisher {
}
}
String getUserDisplayName(String userId) {
String getUserDisplayName(String userId, String groupId) {
WFCMessage.User user = m_messagesStore.getUserInfo(userId);
String userName = null;
if(user != null) {
return user.getDisplayName();
userName = user.getDisplayName();
}
return null;
if (!StringUtil.isNullOrEmpty(groupId)) {
WFCMessage.GroupMember member = m_messagesStore.getGroupMember(groupId, userId);
if (member != null && !StringUtil.isNullOrEmpty(member.getAlias())) {
userName = member.getAlias();
}
}
return userName;
}
String getTargetName(String targetId, int cnvType) {
if (cnvType == ProtoConstants.ConversationType.ConversationType_Private) {
return getUserDisplayName(targetId);
return getUserDisplayName(targetId, null);
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Group) {
WFCMessage.GroupInfo group = m_messagesStore.getGroupInfo(targetId);
if(group != null) {
return group.getName();
}
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Channel) {
WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(targetId);
if (channelInfo != null) {
return channelInfo.getName();
}
}
return null;
}
public void publishNotification(String topic, String receiver, long head) {
publishNotificationLocal(topic, receiver, head);
publishNotification(topic, receiver, head, null, null);
}
void publishNotificationLocal(String topic, String receiver, long head) {
public void publishNotification(String topic, String receiver, long head, String fromUser, String pushContent) {
publishNotificationLocal(topic, receiver, head, fromUser, pushContent);
}
void publishNotificationLocal(String topic, String receiver, long head, String fromUser, String pushContent) {
Collection<Session> sessions = m_sessionsStore.sessionForUser(receiver);
String fromUserName = null;
for (Session targetSession : sessions) {
boolean needPush = !StringUtil.isNullOrEmpty(pushContent);
boolean targetIsActive = this.connectionDescriptors.isConnected(targetSession.getClientSession().clientID);
if (targetIsActive) {
ByteBuf payload = Unpooled.buffer();
@@ -393,9 +426,24 @@ public class MessagesPublisher {
boolean result = this.messageSender.sendPublish(targetSession.getClientSession(), publishMsg);
if (!result) {
LOG.warn("Publish friend request failure");
} else {
needPush = false;
}
}
if (needPush) {
if (fromUserName == null) {
WFCMessage.User userInfo = m_messagesStore.getUserInfo(fromUser);
if (userInfo == null) {
fromUserName = "";
} else {
fromUserName = userInfo.getDisplayName();
}
}
if (IMTopic.NotifyFriendRequestTopic.equals(topic)) {
messageSender.sendPush(fromUser, receiver, targetSession.getClientID(), pushContent, PushServer.PushMessageType.PUSH_MESSAGE_TYPE_FRIEND_REQUEST, System.currentTimeMillis(), fromUserName, targetSession.getUnReceivedMsgs() + 1, targetSession.getLanguage());
}
}
}
}
@@ -40,6 +40,14 @@ class PersistentQueueMessageSender {
void sendPush(String sender, int conversationType, String target, int line, long messageHead, String deviceId, String pushContent, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) {
LOG.info("Send push to {}, message from {}", deviceId, sender);
PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, targetName, unReceivedMsg, mentionType, isHiddenDetail, language);
pushMessage.pushContent = pushContent;
PushServer.getServer().pushMessage(pushMessage, deviceId, pushContent);
}
void sendPush(String sender, String target, String deviceId, String pushContent, int pushContentType, long serverTime, String senderName, int unReceivedMsg, String language) {
LOG.info("Send push to {}, message from {}", deviceId, sender);
PushMessage pushMessage = new PushMessage(sender, target, serverTime, senderName, unReceivedMsg, language, pushContentType);
pushMessage.pushContent = pushContent;
PushServer.getServer().pushMessage(pushMessage, deviceId, pushContent);
}
@@ -109,8 +109,6 @@ public class ProtocolProcessor {
protected ConnectionDescriptorStore connectionDescriptors;
private boolean allowAnonymous;
private boolean allowZeroByteClientId;
private IAuthorizator m_authorizator;
private IMessagesStore m_messagesStore;
@@ -147,8 +145,6 @@ public class ProtocolProcessor {
LOG.info("Initializing MQTT protocol processor...");
this.connectionDescriptors = connectionDescriptors;
this.m_interceptor = interceptor;
this.allowAnonymous = false;
this.allowZeroByteClientId = false;
m_authorizator = authorizator;
m_authenticator = authenticator;
m_messagesStore = storageService;
@@ -199,9 +195,7 @@ public class ProtocolProcessor {
MqttVersion mqttVersion = MqttVersion.fromProtocolLevel(msg.variableHeader().version());
if (!login(channel, msg, clientId, mqttVersion)) {
MqttConnAckMessage badId = connAck(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD);
channel.writeAndFlush(badId);
channel.flush();
channel.close();
LOG.error("The MQTT login failure. Username={}", payload.userName());
return;
@@ -250,6 +244,7 @@ public class ProtocolProcessor {
if(session != null) {
session.refreshLastActiveTime();
forwardOnlineStatusEvent(payload.userName(), clientId, session.getPlatform(), UserOnlineStatus.ONLINE);
m_messagesStore.updateUserOnlineSetting(session, true);
} else {
forwardOnlineStatusEvent(payload.userName(), clientId, ProtoConstants.Platform.Platform_UNSET, UserOnlineStatus.ONLINE);
}
@@ -303,6 +298,7 @@ public class ProtocolProcessor {
if (session == null) {
ErrorCode errorCode = m_sessionsStore.loadActiveSession(msg.payload().userName(), clientId);
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
failedNoSession(channel);
return false;
}
session = m_sessionsStore.getSession(clientId);
@@ -310,6 +306,7 @@ public class ProtocolProcessor {
if (session.getDeleted() != 0) {
LOG.error("user {} session {} is deleted. login failure", msg.payload().userName(), clientId);
failedNoSession(channel);
return false;
}
@@ -327,7 +324,7 @@ public class ProtocolProcessor {
return false;
}
session.setMqttVersion(mqttVersion);
} else if (!this.allowAnonymous) {
} else {
LOG.error("Client didn't supply any password and MQTT anonymous mode is disabled CId={}", clientId);
failedCredentials(channel);
return false;
@@ -339,12 +336,12 @@ public class ProtocolProcessor {
return false;
}
NettyUtils.userName(channel, msg.payload().userName());
} else if (!this.allowAnonymous) {
return true;
} else {
LOG.error("Client didn't supply any credentials and MQTT anonymous mode is disabled. CId={}", clientId);
failedCredentials(channel);
return false;
}
return true;
}
private boolean sendAck(ConnectionDescriptor descriptor, MqttConnectMessage msg, final String clientId) {
@@ -563,6 +560,9 @@ public class ProtocolProcessor {
String username = NettyUtils.userName(channel);
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
if(session != null) {
m_messagesStore.updateUserOnlineSetting(session, false);
}
if(session != null) {
forwardOnlineStatusEvent(username, clientID, session.getPlatform(), UserOnlineStatus.LOGOUT);
}
@@ -609,6 +609,7 @@ public class ProtocolProcessor {
if(session != null) {
session.refreshLastActiveTime();
forwardOnlineStatusEvent(username, clientID, session.getPlatform(), clearSession ? UserOnlineStatus.LOGOUT : UserOnlineStatus.OFFLINE);
m_messagesStore.updateUserOnlineSetting(session, false);
}
ConnectionDescriptor oldConnDescr = new ConnectionDescriptor(clientID, channel);
@@ -128,23 +128,25 @@ public class Qos1PublishHandler extends QosPublishHandler {
String userId = new String(payloadContent);
int status;
ClientSession clientSession = m_sessionStore.sessionForClient(userId);
if (clientSession == null) {
status = 2;
} else {
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(clientSession.clientID);
Collection<MemorySessionStore.Session> useSessions = m_sessionStore.sessionForUser(userId);
OutputCheckUserOnline out = new OutputCheckUserOnline();
for (MemorySessionStore.Session session : useSessions) {
if (session.getDeleted() > 0) {
continue;
}
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(session.getClientID());
if (descriptor == null) {
status = 1;
} else {
status = 0;
}
out.addSession(userId, session.getClientID(), session.getPlatform(), status, session.getLastActiveTime());
}
OutputCheckUserOnline out = new OutputCheckUserOnline();
out.setStatus(status);
RestResult result = RestResult.ok(out);
callback.onRouteHandled(new Gson().toJson(result).getBytes());
callback.onRouteHandled(new Gson().toJson(out).getBytes());
});
}
@@ -6,6 +6,7 @@ import io.moquette.spi.impl.security.AES;
public class Tokenor {
private static String KEY = "testim";
private static long expiredTime = Long.MAX_VALUE;
public static void setKey(String key) {
if (!StringUtil.isNullOrEmpty(key)) {
@@ -13,6 +14,10 @@ public class Tokenor {
}
}
public static void setExpiredTime(long expiredTime) {
Tokenor.expiredTime = expiredTime;
}
public static String getUserId(byte[] password) {
try {
String signKey =
@@ -21,8 +26,8 @@ public class Tokenor {
if (signKey.startsWith(KEY + "|")) {
signKey = signKey.substring(KEY.length() + 1);
long timestamp = Long.parseLong(signKey.substring(0, signKey.indexOf('|')));
if (System.currentTimeMillis() - timestamp > 7 * 24 * 60 *60 *1000) {
//return false;
if (expiredTime > 0 && System.currentTimeMillis() - timestamp > expiredTime) {
return null;
}
String id = signKey.substring(signKey.indexOf('|') + 1);
return id;
@@ -80,12 +80,10 @@ public class DBUtil {
comboPooledDataSource = new ComboPooledDataSource("mysql");
try {
String url01 = comboPooledDataSource.getJdbcUrl().substring(0,comboPooledDataSource.getJdbcUrl().indexOf("?"));
String url02 = url01.substring(0,url01.lastIndexOf("/"));
String datasourceName = url01.substring(url01.lastIndexOf("/")+1);
// 连接已经存在的数据库,如:mysql
Connection connection = DriverManager.getConnection(url02, comboPooledDataSource.getUser(), comboPooledDataSource.getPassword());
String jdbc = comboPooledDataSource.getJdbcUrl().replace(datasourceName, "");
Connection connection = DriverManager.getConnection(jdbc, comboPooledDataSource.getUser(), comboPooledDataSource.getPassword());
Statement statement = connection.createStatement();
// 创建数据库
@@ -0,0 +1,68 @@
package win.liyufan.im;
import io.netty.util.internal.StringUtil;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class I18n {
private static ClassLoader Loader = null;
static {
String configPath = System.getProperty("wildfirechat.path", null);
String resBundlePaht = "config/i18n";
File file = new File(configPath, resBundlePaht);
URL[] urls = new URL[0];
try {
urls = new URL[]{file.toURI().toURL()};
Loader = new URLClassLoader(urls);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
private static Map<String, ResourceBundle> bundleMap = new ConcurrentHashMap<>();
public static String getString(String language, String key) {
ResourceBundle bundle = bundleMap.get(language);
if (StringUtil.isNullOrEmpty(language)) language = "zh_CN";
if (bundle == null) {
bundle = ResourceBundle.getBundle("messages", new Locale(language), Loader);
bundleMap.put(language, bundle);
}
try {
return bundle.getString(key);
} catch (Exception e) {
e.printStackTrace();
}
return "糟糕,字符串 " + key + " 没有找到";
}
public static void test() throws MalformedURLException {
// 设置定制的语言国家代码
Locale locale1 = new Locale("zh");
Locale locale2 = new Locale("en");
ResourceBundle rb = ResourceBundle.getBundle("messages", locale1, Loader);
// 获得相应的key值
String greeting = rb.getString("Above_Greeting_Message");
String userInfo = rb.getString("Friend_Can_Start_Chat");
System.out.println(greeting);
System.out.println(userInfo);
}
public static void main(String[] args) throws Exception {
test();
}
}
@@ -64,6 +64,10 @@ public class MessageBundle implements Serializable {
return message;
}
public void setFromClientId(String fromClientId) {
this.fromClientId = fromClientId;
}
public void setMessage(WFCMessage.Message message) {
this.fromUser = message.getFromUser();
this.type = message.getConversation().getType();
@@ -11,6 +11,7 @@ public interface UserSettingScope {
int kUserSettingConversationSync = 7;
int kUserSettingMyChannels = 8;
int kUserSettingListenedChannels = 9;
int kUserSettingPCOnline = 10;
int kUserSettingCustomBegin = 1000;
}
+1 -1
View File
@@ -18,7 +18,7 @@
<!--MySQL数据库驱动程序-->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<!--MySQL数据库地址-->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/wfchat?useSSL=false&amp;serverTimezone=GMT%2B8&amp;allowPublicKeyRetrieval=true&amp;useUnicode=true&amp;characterEncoding=utf8</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/wfchat?verifyServerCertificate=false&amp;useSSL=false&amp;serverTimezone=GMT%2B8&amp;allowPublicKeyRetrieval=true&amp;useUnicode=true&amp;characterEncoding=UTF-8</property>
<!--MySQL数据库用户名-->
<property name="user">root</property>
<!--MySQL数据库密码-->
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.37</version>
<version>0.40</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -4,6 +4,12 @@ public interface APIPath {
String Create_Chatroom = "/admin/chatroom/create";
String Chatroom_Destroy = "/admin/chatroom/del";
String Chatroom_Info = "/admin/chatroom/info";
String Chatroom_GetMembers = "/admin/chatroom/members";
String Chatroom_SetBlacklist = "/admin/chatroom/set_black_status";
String Chatroom_GetBlacklist = "/admin/chatroom/get_black_status";
String Chatroom_SetManager = "/admin/chatroom/set_manager";
String Chatroom_GetManagerList = "/admin/chatroom/get_manager_list";
String Chatroom_MuteAll = "/admin/chatroom/mute_all";
String Sensitive_Add = "/admin/sensitive/add";
@@ -23,6 +29,8 @@ public interface APIPath {
String Friend_Update_Status = "/admin/friend/status";
String Friend_Get_List = "/admin/friend/list";
String Blacklist_Update_Status = "/admin/blacklist/status";
String Blacklist_Get_List = "/admin/blacklist/list";
String Friend_Get_Alias = "/admin/friend/get_alias";
String Friend_Set_Alias = "/admin/friend/set_alias";
@@ -36,7 +36,7 @@ public enum ErrorCode {
//user error
ERROR_CODE_FRIEND_ALREADY_REQUEST(16, "already send request"),
ERROR_CODE_FRIEND_REQUEST_BLOCKED(18, "friend request blocked"),
ERROR_CODE_FRIEND_REQUEST_OVERTIME(19, "friend request overtime"),
ERROR_CODE_FRIEND_REQUEST_EXPIRED(19, "friend request expired"),
ERROR_CODE_NOT_IN_CHATROOM(20, "not in chatroom"),
@@ -0,0 +1,41 @@
/*
* 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;
public class InputBlacklistRequest {
private String userId;
private String targetUid;
private int status;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getTargetUid() {
return targetUid;
}
public void setTargetUid(String targetUid) {
this.targetUid = targetUid;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
@@ -0,0 +1,12 @@
package cn.wildfirechat.pojos;
public class InputChatroomId {
public String chatroomId;
public InputChatroomId() {
}
public InputChatroomId(String chatroomId) {
this.chatroomId = chatroomId;
}
}
@@ -0,0 +1,36 @@
/*
* 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;
public class InputChatroomMute {
private String chatroomId;
private int status;
public InputChatroomMute(String chatroomId, int status) {
this.chatroomId = chatroomId;
this.status = status;
}
public String getChatroomId() {
return chatroomId;
}
public void setChatroomId(String chatroomId) {
this.chatroomId = chatroomId;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
@@ -9,7 +9,6 @@
package cn.wildfirechat.pojos;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import io.netty.util.internal.StringUtil;
@@ -22,7 +21,7 @@ public class InputCreateChannel {
private int auto;
private String secret;
private String desc;
private int status;
private int state;
private String extra;
private long updateDt;
@@ -41,7 +40,7 @@ public class InputCreateChannel {
builder = builder.setSecret(secret);
if (!StringUtil.isNullOrEmpty(desc))
builder = builder.setDesc(desc);
builder = builder.setStatus(status);
builder = builder.setStatus(state);
if (!StringUtil.isNullOrEmpty(extra))
builder = builder.setExtra(extra);
if (!StringUtil.isNullOrEmpty(name))
@@ -116,12 +115,12 @@ public class InputCreateChannel {
this.desc = desc;
}
public int getStatus() {
return status;
public int getState() {
return state;
}
public void setStatus(int status) {
this.status = status;
public void setState(int state) {
this.state = state;
}
public String getExtra() {
@@ -13,6 +13,7 @@ public class InputFriendRequest {
private String userId;
private String friendUid;
private int status;
private String extra;
public String getUserId() {
@@ -38,4 +39,12 @@ public class InputFriendRequest {
public void setStatus(int status) {
this.status = status;
}
public String getExtra() {
return extra;
}
public void setExtra(String extra) {
this.extra = extra;
}
}
@@ -24,6 +24,7 @@ public class InputOutputUserInfo {
private String company;
private String social;
private String extra;
private int type;
private long updateDt;
public static InputOutputUserInfo fromPbUser(WFCMessage.User pbUser) {
@@ -39,6 +40,7 @@ public class InputOutputUserInfo {
inputCreateUser.company = pbUser.getCompany();
inputCreateUser.social = pbUser.getSocial();
inputCreateUser.extra = pbUser.getExtra();
inputCreateUser.type = pbUser.getType();
inputCreateUser.updateDt = pbUser.getUpdateDt();
return inputCreateUser;
}
@@ -74,6 +76,7 @@ public class InputOutputUserInfo {
if (getExtra() != null)
newUserBuilder.setExtra(getExtra());
newUserBuilder.setGender(gender);
newUserBuilder.setType(type);
newUserBuilder.setUpdateDt(System.currentTimeMillis());
return newUserBuilder.build();
@@ -174,4 +177,12 @@ public class InputOutputUserInfo {
public void setGender(int gender) {
this.gender = gender;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
@@ -0,0 +1,58 @@
/*
* 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;
public class InputSetChatroomBlacklist {
private String chatroomId;
private String userId;
private int status;
private long expiredTime;
public InputSetChatroomBlacklist() {
}
public InputSetChatroomBlacklist(String chatroomId, String userId, int status, long expiredTime) {
this.chatroomId = chatroomId;
this.userId = userId;
this.status = status;
this.expiredTime = expiredTime;
}
public String getChatroomId() {
return chatroomId;
}
public void setChatroomId(String chatroomId) {
this.chatroomId = chatroomId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public long getExpiredTime() {
return expiredTime;
}
public void setExpiredTime(long expiredTime) {
this.expiredTime = expiredTime;
}
}
@@ -0,0 +1,48 @@
/*
* 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;
public class InputSetChatroomManager {
private String chatroomId;
private String userId;
private int status;
public InputSetChatroomManager() {
}
public InputSetChatroomManager(String chatroomId, String userId, int status) {
this.chatroomId = chatroomId;
this.userId = userId;
this.status = status;
}
public String getChatroomId() {
return chatroomId;
}
public void setChatroomId(String chatroomId) {
this.chatroomId = chatroomId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}
@@ -0,0 +1,25 @@
package cn.wildfirechat.pojos;
import java.util.ArrayList;
import java.util.List;
public class OutputChatroomBlackInfos {
public static class OutputChatroomBlackInfo {
public String userId;
public int state;
public long expiredTime;
public OutputChatroomBlackInfo() {
}
public OutputChatroomBlackInfo(String userId, int state, long expiredTime) {
this.userId = userId;
this.state = state;
this.expiredTime = expiredTime;
}
}
public List<OutputChatroomBlackInfo> infos = new ArrayList<>();
public void addBlackInfo(String userId, int state, long expiredTime) {
infos.add(new OutputChatroomBlackInfo(userId, state, expiredTime));
}
}
@@ -8,14 +8,39 @@
package cn.wildfirechat.pojos;
public class OutputCheckUserOnline {
private int status; //0 online, 1 have session offline, 2 no session
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public int getStatus() {
return status;
public class OutputCheckUserOnline {
public static class Session {
public String clientId;
public String userId;
public int platform;
public int status; //0 online, 1 have session offline
public long lastSeen;
public Session(String clientId, String userId, int platform, int status, long lastSeen) {
this.clientId = clientId;
this.userId = userId;
this.platform = platform;
this.status = status;
this.lastSeen = lastSeen;
}
}
public void setStatus(int status) {
this.status = status;
public void addSession(String userId, String clientId, int platform, int status, long lastSeen) {
Session session = new Session(clientId, userId, platform, status, lastSeen);
sessions.add(session);
}
private List<Session> sessions = new ArrayList<>();
public List<Session> getSessions() {
return sessions;
}
public void setSessions(List<Session> sessions) {
this.sessions = sessions;
}
}
@@ -18,6 +18,7 @@ public class OutputGetChatroomInfo {
private String desc;
private String portrait;
private String extra;
private int state;
private int memberCount;
private long createDt;
private long updateDt;
@@ -28,6 +29,8 @@ public class OutputGetChatroomInfo {
this.desc = chatroomInfo.getDesc();
this.portrait = chatroomInfo.getPortrait();
this.memberCount = memberCount;
this.extra = chatroomInfo.getExtra();
this.state = chatroomInfo.getState();
this.createDt = chatroomInfo.getCreateDt();
this.updateDt = chatroomInfo.getUpdateDt();
}
@@ -98,4 +101,12 @@ public class OutputGetChatroomInfo {
public void setExtra(String extra) {
this.extra = extra;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
}
@@ -12,10 +12,13 @@ import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import io.netty.util.internal.StringUtil;
import java.util.List;
public class SendMessageData {
private String sender;
private Conversation conv;
private MessagePayload payload;
private List<String> toUsers;
public String getSender() {
return sender;
@@ -41,6 +44,14 @@ public class SendMessageData {
this.payload = payload;
}
public List<String> getToUsers() {
return toUsers;
}
public void setToUsers(List<String> toUsers) {
this.toUsers = toUsers;
}
public static boolean isValide(SendMessageData sendMessageData) {
if(sendMessageData == null ||
sendMessageData.getConv() == null ||
@@ -55,10 +66,18 @@ public class SendMessageData {
}
public WFCMessage.Message toProtoMessage() {
return WFCMessage.Message.newBuilder().setFromUser(sender)
.setConversation(WFCMessage.Conversation.newBuilder().setType(conv.getType()).setTarget(conv.getTarget()).setLine(conv.getLine()))
.setContent(payload.toProtoMessageContent())
.build();
if (toUsers != null && toUsers.size() > 0) {
return WFCMessage.Message.newBuilder().setFromUser(sender)
.setConversation(WFCMessage.Conversation.newBuilder().setType(conv.getType()).setTarget(conv.getTarget()).setLine(conv.getLine()))
.setContent(payload.toProtoMessageContent())
.addAllTo(toUsers)
.build();
} else {
return WFCMessage.Message.newBuilder().setFromUser(sender)
.setConversation(WFCMessage.Conversation.newBuilder().setType(conv.getType()).setTarget(conv.getTarget()).setLine(conv.getLine()))
.setContent(payload.toProtoMessageContent())
.build();
}
}
public static SendMessageData fromProtoMessage(WFCMessage.Message protoMessage) {
@@ -45,6 +45,8 @@ public class ProtoConstants {
int Platform_Windows = 3;
int Platform_OSX = 4;
int Platform_WEB = 5;
int Platform_WX = 6;
int Platform_Linux = 7;
}
//message NotifyMessage & PullMessageRequest -> type
@@ -114,10 +116,19 @@ public class ProtoConstants {
}
//Channel -> status
public interface ChannelStatus {
int Channel_Status_Public = 0;
int Channel_Status_Private = 1;
int Channel_Status_Destoryed = 2;
//第0位表示是否允许查看用户所有信息,还是只允许看用户id,用户名称,用户昵称和用户头像
//第1位表示是否允许查看非订阅用户信息
//第2位表示是否允许主动添加用户订阅关系
//第3位表示是否允许给非订阅用户发送消息
//第4位表示是否私有
//第6位表示是否删除
public interface ChannelState {
int Channel_State_Mask_FullInfo = 0x01;
int Channel_State_Mask_Unsubscribed_User_Access = 0x02;
int Channel_State_Mask_Active_Subscribe = 0x04;
int Channel_State_Mask_Message_Unsubscribed = 0x08;
int Channel_State_Mask_Private = 0x10;
int Channel_State_Mask_Deleted = 0x40;
}
@@ -19039,6 +19039,21 @@ public final class WFCMessage {
* <code>required int32 status = 2;</code>
*/
int getStatus();
// optional string extra = 3;
/**
* <code>optional string extra = 3;</code>
*/
boolean hasExtra();
/**
* <code>optional string extra = 3;</code>
*/
java.lang.String getExtra();
/**
* <code>optional string extra = 3;</code>
*/
com.google.protobuf.ByteString
getExtraBytes();
}
/**
* Protobuf type {@code HandleFriendRequest}
@@ -19101,6 +19116,11 @@ public final class WFCMessage {
status_ = input.readInt32();
break;
}
case 26: {
bitField0_ |= 0x00000004;
extra_ = input.readBytes();
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -19200,9 +19220,53 @@ public final class WFCMessage {
return status_;
}
// optional string extra = 3;
public static final int EXTRA_FIELD_NUMBER = 3;
private java.lang.Object extra_;
/**
* <code>optional string extra = 3;</code>
*/
public boolean hasExtra() {
return ((bitField0_ & 0x00000004) == 0x00000004);
}
/**
* <code>optional string extra = 3;</code>
*/
public java.lang.String getExtra() {
java.lang.Object ref = extra_;
if (ref instanceof java.lang.String) {
return (java.lang.String) ref;
} else {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
java.lang.String s = bs.toStringUtf8();
if (bs.isValidUtf8()) {
extra_ = s;
}
return s;
}
}
/**
* <code>optional string extra = 3;</code>
*/
public com.google.protobuf.ByteString
getExtraBytes() {
java.lang.Object ref = extra_;
if (ref instanceof java.lang.String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(java.lang.String) ref);
extra_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
private void initFields() {
targetUid_ = "";
status_ = 0;
extra_ = "";
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
@@ -19230,6 +19294,9 @@ public final class WFCMessage {
if (((bitField0_ & 0x00000002) == 0x00000002)) {
output.writeInt32(2, status_);
}
if (((bitField0_ & 0x00000004) == 0x00000004)) {
output.writeBytes(3, getExtraBytes());
}
getUnknownFields().writeTo(output);
}
@@ -19247,6 +19314,10 @@ public final class WFCMessage {
size += com.google.protobuf.CodedOutputStream
.computeInt32Size(2, status_);
}
if (((bitField0_ & 0x00000004) == 0x00000004)) {
size += com.google.protobuf.CodedOutputStream
.computeBytesSize(3, getExtraBytes());
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
return size;
@@ -19367,6 +19438,8 @@ public final class WFCMessage {
bitField0_ = (bitField0_ & ~0x00000001);
status_ = 0;
bitField0_ = (bitField0_ & ~0x00000002);
extra_ = "";
bitField0_ = (bitField0_ & ~0x00000004);
return this;
}
@@ -19403,6 +19476,10 @@ public final class WFCMessage {
to_bitField0_ |= 0x00000002;
}
result.status_ = status_;
if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
to_bitField0_ |= 0x00000004;
}
result.extra_ = extra_;
result.bitField0_ = to_bitField0_;
onBuilt();
return result;
@@ -19427,6 +19504,11 @@ public final class WFCMessage {
if (other.hasStatus()) {
setStatus(other.getStatus());
}
if (other.hasExtra()) {
bitField0_ |= 0x00000004;
extra_ = other.extra_;
onChanged();
}
this.mergeUnknownFields(other.getUnknownFields());
return this;
}
@@ -19569,6 +19651,80 @@ public final class WFCMessage {
return this;
}
// optional string extra = 3;
private java.lang.Object extra_ = "";
/**
* <code>optional string extra = 3;</code>
*/
public boolean hasExtra() {
return ((bitField0_ & 0x00000004) == 0x00000004);
}
/**
* <code>optional string extra = 3;</code>
*/
public java.lang.String getExtra() {
java.lang.Object ref = extra_;
if (!(ref instanceof java.lang.String)) {
java.lang.String s = ((com.google.protobuf.ByteString) ref)
.toStringUtf8();
extra_ = s;
return s;
} else {
return (java.lang.String) ref;
}
}
/**
* <code>optional string extra = 3;</code>
*/
public com.google.protobuf.ByteString
getExtraBytes() {
java.lang.Object ref = extra_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(java.lang.String) ref);
extra_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
/**
* <code>optional string extra = 3;</code>
*/
public Builder setExtra(
java.lang.String value) {
if (value == null) {
throw new NullPointerException();
}
bitField0_ |= 0x00000004;
extra_ = value;
onChanged();
return this;
}
/**
* <code>optional string extra = 3;</code>
*/
public Builder clearExtra() {
bitField0_ = (bitField0_ & ~0x00000004);
extra_ = getDefaultInstance().getExtra();
onChanged();
return this;
}
/**
* <code>optional string extra = 3;</code>
*/
public Builder setExtraBytes(
com.google.protobuf.ByteString value) {
if (value == null) {
throw new NullPointerException();
}
bitField0_ |= 0x00000004;
extra_ = value;
onChanged();
return this;
}
// @@protoc_insertion_point(builder_scope:HandleFriendRequest)
}
@@ -45347,6 +45503,21 @@ public final class WFCMessage {
* <code>optional int32 blacked = 5;</code>
*/
int getBlacked();
// optional string extra = 6;
/**
* <code>optional string extra = 6;</code>
*/
boolean hasExtra();
/**
* <code>optional string extra = 6;</code>
*/
java.lang.String getExtra();
/**
* <code>optional string extra = 6;</code>
*/
com.google.protobuf.ByteString
getExtraBytes();
}
/**
* Protobuf type {@code Friend}
@@ -45424,6 +45595,11 @@ public final class WFCMessage {
blacked_ = input.readInt32();
break;
}
case 50: {
bitField0_ |= 0x00000020;
extra_ = input.readBytes();
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -45598,12 +45774,56 @@ public final class WFCMessage {
return blacked_;
}
// optional string extra = 6;
public static final int EXTRA_FIELD_NUMBER = 6;
private java.lang.Object extra_;
/**
* <code>optional string extra = 6;</code>
*/
public boolean hasExtra() {
return ((bitField0_ & 0x00000020) == 0x00000020);
}
/**
* <code>optional string extra = 6;</code>
*/
public java.lang.String getExtra() {
java.lang.Object ref = extra_;
if (ref instanceof java.lang.String) {
return (java.lang.String) ref;
} else {
com.google.protobuf.ByteString bs =
(com.google.protobuf.ByteString) ref;
java.lang.String s = bs.toStringUtf8();
if (bs.isValidUtf8()) {
extra_ = s;
}
return s;
}
}
/**
* <code>optional string extra = 6;</code>
*/
public com.google.protobuf.ByteString
getExtraBytes() {
java.lang.Object ref = extra_;
if (ref instanceof java.lang.String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(java.lang.String) ref);
extra_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
private void initFields() {
uid_ = "";
state_ = 0;
updateDt_ = 0L;
alias_ = "";
blacked_ = 0;
extra_ = "";
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
@@ -45644,6 +45864,9 @@ public final class WFCMessage {
if (((bitField0_ & 0x00000010) == 0x00000010)) {
output.writeInt32(5, blacked_);
}
if (((bitField0_ & 0x00000020) == 0x00000020)) {
output.writeBytes(6, getExtraBytes());
}
getUnknownFields().writeTo(output);
}
@@ -45673,6 +45896,10 @@ public final class WFCMessage {
size += com.google.protobuf.CodedOutputStream
.computeInt32Size(5, blacked_);
}
if (((bitField0_ & 0x00000020) == 0x00000020)) {
size += com.google.protobuf.CodedOutputStream
.computeBytesSize(6, getExtraBytes());
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
return size;
@@ -45799,6 +46026,8 @@ public final class WFCMessage {
bitField0_ = (bitField0_ & ~0x00000008);
blacked_ = 0;
bitField0_ = (bitField0_ & ~0x00000010);
extra_ = "";
bitField0_ = (bitField0_ & ~0x00000020);
return this;
}
@@ -45847,6 +46076,10 @@ public final class WFCMessage {
to_bitField0_ |= 0x00000010;
}
result.blacked_ = blacked_;
if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
to_bitField0_ |= 0x00000020;
}
result.extra_ = extra_;
result.bitField0_ = to_bitField0_;
onBuilt();
return result;
@@ -45882,6 +46115,11 @@ public final class WFCMessage {
if (other.hasBlacked()) {
setBlacked(other.getBlacked());
}
if (other.hasExtra()) {
bitField0_ |= 0x00000020;
extra_ = other.extra_;
onChanged();
}
this.mergeUnknownFields(other.getUnknownFields());
return this;
}
@@ -46168,6 +46406,80 @@ public final class WFCMessage {
return this;
}
// optional string extra = 6;
private java.lang.Object extra_ = "";
/**
* <code>optional string extra = 6;</code>
*/
public boolean hasExtra() {
return ((bitField0_ & 0x00000020) == 0x00000020);
}
/**
* <code>optional string extra = 6;</code>
*/
public java.lang.String getExtra() {
java.lang.Object ref = extra_;
if (!(ref instanceof java.lang.String)) {
java.lang.String s = ((com.google.protobuf.ByteString) ref)
.toStringUtf8();
extra_ = s;
return s;
} else {
return (java.lang.String) ref;
}
}
/**
* <code>optional string extra = 6;</code>
*/
public com.google.protobuf.ByteString
getExtraBytes() {
java.lang.Object ref = extra_;
if (ref instanceof String) {
com.google.protobuf.ByteString b =
com.google.protobuf.ByteString.copyFromUtf8(
(java.lang.String) ref);
extra_ = b;
return b;
} else {
return (com.google.protobuf.ByteString) ref;
}
}
/**
* <code>optional string extra = 6;</code>
*/
public Builder setExtra(
java.lang.String value) {
if (value == null) {
throw new NullPointerException();
}
bitField0_ |= 0x00000020;
extra_ = value;
onChanged();
return this;
}
/**
* <code>optional string extra = 6;</code>
*/
public Builder clearExtra() {
bitField0_ = (bitField0_ & ~0x00000020);
extra_ = getDefaultInstance().getExtra();
onChanged();
return this;
}
/**
* <code>optional string extra = 6;</code>
*/
public Builder setExtraBytes(
com.google.protobuf.ByteString value) {
if (value == null) {
throw new NullPointerException();
}
bitField0_ |= 0x00000020;
extra_ = value;
onChanged();
return this;
}
// @@protoc_insertion_point(builder_scope:Friend)
}
@@ -60429,109 +60741,110 @@ public final class WFCMessage {
"edia_type\030\001 \002(\005\022\022\n\nmedia_path\030\002 \002(\t\"S\n\024G" +
"etUploadTokenResult\022\016\n\006domain\030\001 \002(\t\022\r\n\005t" +
"oken\030\002 \002(\t\022\016\n\006server\030\003 \002(\t\022\014\n\004port\030\004 \001(\005" +
"\"9\n\023HandleFriendRequest\022\022\n\ntarget_uid\030\001 " +
"\002(\t\022\016\n\006status\030\002 \002(\005\"\023\n\005IDBuf\022\n\n\002id\030\001 \002(\t" +
"\"\027\n\tIDListBuf\022\n\n\002id\030\001 \003(\t\"\256\001\n\007Message\022#\n" +
"\014conversation\030\001 \002(\0132\r.Conversation\022\021\n\tfr" +
"om_user\030\002 \002(\t\022 \n\007content\030\003 \002(\0132\017.Message" +
"Content\022\022\n\nmessage_id\030\004 \001(\003\022\030\n\020server_ti",
"mestamp\030\005 \001(\003\022\017\n\007to_user\030\006 \001(\t\022\n\n\002to\030\007 \003" +
"(\t\"\353\001\n\004User\022\013\n\003uid\030\001 \002(\t\022\014\n\004name\030\002 \001(\t\022\024" +
"\n\014display_name\030\003 \001(\t\022\020\n\010portrait\030\004 \001(\t\022\016" +
"\n\006mobile\030\005 \001(\t\022\r\n\005email\030\006 \001(\t\022\017\n\007address" +
"\030\007 \001(\t\022\017\n\007company\030\010 \001(\t\022\r\n\005extra\030\t \001(\t\022\021" +
"\n\tupdate_dt\030\n \001(\003\022\016\n\006gender\030\013 \001(\005\022\016\n\006soc" +
"ial\030\014 \001(\t\022\014\n\004type\030\r \001(\005\022\017\n\007deleted\030\016 \001(\005" +
"\"c\n\005Robot\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\r\n" +
"\005owner\030\003 \001(\t\022\016\n\006secret\030\004 \001(\t\022\020\n\010callback" +
"\030\005 \001(\t\022\r\n\005extra\030\006 \001(\t\"(\n\017GetRobotsResult",
"\022\025\n\005entry\030\001 \003(\0132\006.Robot\"P\n\005Thing\022\013\n\003uid\030" +
"\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\r\n\005token\030\003 \002(\t\022\r\n\005o" +
"wner\030\004 \001(\t\022\r\n\005extra\030\005 \001(\t\"(\n\017GetThingsRe" +
"sult\022\025\n\005entry\030\001 \003(\0132\006.Thing\"g\n\030UploadDev" +
"iceTokenRequest\022\020\n\010platform\030\001 \002(\005\022\020\n\010app" +
"_name\030\002 \002(\t\022\024\n\014device_token\030\003 \002(\t\022\021\n\tpus" +
"h_type\030\004 \002(\005\"\201\001\n\026ModifyGroupInfoRequest\022" +
"\020\n\010group_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\r\n\005value" +
"\030\003 \002(\t\022\017\n\007to_line\030\004 \003(\005\022\'\n\016notify_conten" +
"t\030\005 \001(\0132\017.MessageContent\"\203\001\n\026SetGroupMan",
"agerRequest\022\020\n\010group_id\030\001 \002(\t\022\014\n\004type\030\002 " +
"\002(\005\022\017\n\007user_id\030\003 \003(\t\022\017\n\007to_line\030\004 \003(\005\022\'\n" +
"\016notify_content\030\005 \001(\0132\017.MessageContent\"(" +
"\n\tInfoEntry\022\014\n\004type\030\001 \002(\005\022\r\n\005value\030\002 \002(\t" +
"\"0\n\023ModifyMyInfoRequest\022\031\n\005entry\030\001 \003(\0132\n" +
".InfoEntry\";\n\rNotifyMessage\022\014\n\004type\030\001 \002(" +
"\005\022\014\n\004head\030\002 \002(\003\022\016\n\006target\030\003 \001(\t\"=\n\022PullM" +
"essageRequest\022\n\n\002id\030\001 \002(\003\022\014\n\004type\030\002 \002(\005\022" +
"\r\n\005delay\030\003 \001(\003\"M\n\021PullMessageResult\022\031\n\007m" +
"essage\030\001 \003(\0132\010.Message\022\017\n\007current\030\002 \002(\003\022",
"\014\n\004head\030\003 \002(\003\"/\n\023PullGroupInfoResult\022\030\n\004" +
"info\030\001 \003(\0132\n.GroupInfo\"6\n\026PullGroupMembe" +
"rRequest\022\016\n\006target\030\001 \002(\t\022\014\n\004head\030\002 \002(\003\"5" +
"\n\025PullGroupMemberResult\022\034\n\006member\030\001 \003(\0132" +
"\014.GroupMember\"-\n\013UserRequest\022\013\n\003uid\030\001 \002(" +
"\t\022\021\n\tupdate_dt\030\002 \001(\003\"0\n\017PullUserRequest\022" +
"\035\n\007request\030\001 \003(\0132\014.UserRequest\"/\n\nUserRe" +
"sult\022\023\n\004user\030\001 \002(\0132\005.User\022\014\n\004code\030\002 \002(\005\"" +
"-\n\016PullUserResult\022\033\n\006result\030\001 \003(\0132\013.User" +
"Result\"^\n\020QuitGroupRequest\022\020\n\010group_id\030\001",
" \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n\016notify_content\030" +
"\003 \001(\0132\017.MessageContent\"~\n\030RemoveGroupMem" +
"berRequest\022\020\n\010group_id\030\001 \002(\t\022\026\n\016removed_" +
"member\030\002 \003(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_" +
"content\030\004 \001(\0132\017.MessageContent\"u\n\024Transf" +
"erGroupRequest\022\020\n\010group_id\030\001 \002(\t\022\021\n\tnew_" +
"owner\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_c" +
"ontent\030\004 \001(\0132\017.MessageContent\"s\n\026ModifyG" +
"roupMemberAlias\022\020\n\010group_id\030\001 \002(\t\022\r\n\005ali" +
"as\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_cont",
"ent\030\004 \001(\0132\017.MessageContent\"P\n\020UserSettin" +
"gEntry\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005va" +
"lue\030\003 \002(\t\022\021\n\tupdate_dt\030\004 \002(\003\"A\n\024ModifyUs" +
"erSettingReq\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t" +
"\022\r\n\005value\030\003 \002(\t\"\032\n\007Version\022\017\n\007version\030\001 " +
"\002(\003\"8\n\024GetUserSettingResult\022 \n\005entry\030\001 \003" +
"(\0132\021.UserSettingEntry\"W\n\006Friend\022\013\n\003uid\030\001" +
" \002(\t\022\r\n\005state\030\002 \002(\005\022\021\n\tupdate_dt\030\003 \002(\003\022\r" +
"\n\005alias\030\004 \001(\t\022\017\n\007blacked\030\005 \001(\005\"*\n\020GetFri" +
"endsResult\022\026\n\005entry\030\001 \003(\0132\007.Friend\"7\n\026Ge",
"tFriendRequestResult\022\035\n\005entry\030\001 \003(\0132\016.Fr" +
"iendRequest\"\243\001\n\021ConnectAckPayload\022\020\n\010msg" +
"_head\030\001 \001(\003\022\023\n\013friend_head\030\002 \001(\003\022\026\n\016frie" +
"nd_rq_head\030\003 \001(\003\022\024\n\014setting_head\030\004 \001(\003\022\021" +
"\n\tnode_addr\030\005 \001(\t\022\021\n\tnode_port\030\006 \001(\005\022\023\n\013" +
"server_time\030\007 \001(\003\"P\n\rIMHttpWrapper\022\r\n\005to" +
"ken\030\001 \002(\t\022\021\n\tclient_id\030\002 \002(\t\022\017\n\007request\030" +
"\003 \002(\t\022\014\n\004data\030\004 \001(\014\"A\n\021SearchUserRequest" +
"\022\017\n\007keyword\030\001 \002(\t\022\r\n\005fuzzy\030\002 \001(\005\022\014\n\004page" +
"\030\003 \001(\005\"(\n\020SearchUserResult\022\024\n\005entry\030\001 \003(",
"\0132\005.User\"@\n\026GetChatroomInfoRequest\022\023\n\013ch" +
"atroom_id\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"\227\001\n\014C" +
"hatroomInfo\022\r\n\005title\030\001 \002(\t\022\014\n\004desc\030\002 \001(\t" +
"\022\020\n\010portrait\030\003 \001(\t\022\024\n\014member_count\030\004 \001(\005" +
"\022\021\n\tcreate_dt\030\005 \001(\003\022\021\n\tupdate_dt\030\006 \001(\003\022\r" +
"\n\005extra\030\007 \001(\t\022\r\n\005state\030\010 \001(\005\"F\n\034GetChatr" +
"oomMemberInfoRequest\022\023\n\013chatroom_id\030\001 \002(" +
"\t\022\021\n\tmax_count\030\002 \001(\005\";\n\022ChatroomMemberIn" +
"fo\022\024\n\014member_count\030\001 \001(\005\022\017\n\007members\030\002 \003(" +
"\t\"\026\n\010INT64Buf\022\n\n\002id\030\001 \002(\003\"4\n\023NotifyRecal",
"lMessage\022\n\n\002id\030\001 \002(\003\022\021\n\tfrom_user\030\002 \002(\t\"" +
"/\n\020BlackUserRequest\022\013\n\003uid\030\001 \002(\t\022\016\n\006stat" +
"us\030\002 \002(\005\"\323\001\n\014RouteRequest\022\013\n\003app\030\001 \001(\t\022\020" +
"\n\010platform\030\002 \001(\005\022\021\n\tpush_type\030\003 \001(\005\022\023\n\013d" +
"evice_name\030\004 \001(\t\022\026\n\016device_version\030\005 \001(\t" +
"\022\022\n\nphone_name\030\006 \001(\t\022\020\n\010language\030\007 \001(\t\022\024" +
"\n\014carrier_name\030\010 \001(\t\022\023\n\013app_version\030\t \001(" +
"\t\022\023\n\013sdk_version\030\n \001(\t\"D\n\rRouteResponse\022" +
"\014\n\004host\030\001 \002(\t\022\021\n\tlong_port\030\002 \002(\005\022\022\n\nshor" +
"t_port\030\003 \002(\005\"G\n\017GetTokenRequest\022\017\n\007user_",
"id\030\001 \002(\t\022\021\n\tclient_id\030\002 \002(\t\022\020\n\010platform\030" +
"\003 \001(\005\"\\\n\022LoadRemoteMessages\022#\n\014conversat" +
"ion\030\001 \002(\0132\r.Conversation\022\022\n\nbefore_uid\030\002" +
" \002(\003\022\r\n\005count\030\003 \002(\005\"a\n\020MultiCastMessage\022" +
"\021\n\tfrom_user\030\001 \002(\t\022 \n\007content\030\002 \002(\0132\017.Me" +
"ssageContent\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 \002(\005B#" +
"\n\025cn.wildfirechat.protoB\nWFCMessage"
"\"H\n\023HandleFriendRequest\022\022\n\ntarget_uid\030\001 " +
"\002(\t\022\016\n\006status\030\002 \002(\005\022\r\n\005extra\030\003 \001(\t\"\023\n\005ID" +
"Buf\022\n\n\002id\030\001 \002(\t\"\027\n\tIDListBuf\022\n\n\002id\030\001 \003(\t" +
"\"\256\001\n\007Message\022#\n\014conversation\030\001 \002(\0132\r.Con" +
"versation\022\021\n\tfrom_user\030\002 \002(\t\022 \n\007content\030" +
"\003 \002(\0132\017.MessageContent\022\022\n\nmessage_id\030\004 \001",
"(\003\022\030\n\020server_timestamp\030\005 \001(\003\022\017\n\007to_user\030" +
"\006 \001(\t\022\n\n\002to\030\007 \003(\t\"\353\001\n\004User\022\013\n\003uid\030\001 \002(\t\022" +
"\014\n\004name\030\002 \001(\t\022\024\n\014display_name\030\003 \001(\t\022\020\n\010p" +
"ortrait\030\004 \001(\t\022\016\n\006mobile\030\005 \001(\t\022\r\n\005email\030\006" +
" \001(\t\022\017\n\007address\030\007 \001(\t\022\017\n\007company\030\010 \001(\t\022\r" +
"\n\005extra\030\t \001(\t\022\021\n\tupdate_dt\030\n \001(\003\022\016\n\006gend" +
"er\030\013 \001(\005\022\016\n\006social\030\014 \001(\t\022\014\n\004type\030\r \001(\005\022\017" +
"\n\007deleted\030\016 \001(\005\"c\n\005Robot\022\013\n\003uid\030\001 \002(\t\022\r\n" +
"\005state\030\002 \002(\005\022\r\n\005owner\030\003 \001(\t\022\016\n\006secret\030\004 " +
"\001(\t\022\020\n\010callback\030\005 \001(\t\022\r\n\005extra\030\006 \001(\t\"(\n\017",
"GetRobotsResult\022\025\n\005entry\030\001 \003(\0132\006.Robot\"P" +
"\n\005Thing\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\r\n\005t" +
"oken\030\003 \002(\t\022\r\n\005owner\030\004 \001(\t\022\r\n\005extra\030\005 \001(\t" +
"\"(\n\017GetThingsResult\022\025\n\005entry\030\001 \003(\0132\006.Thi" +
"ng\"g\n\030UploadDeviceTokenRequest\022\020\n\010platfo" +
"rm\030\001 \002(\005\022\020\n\010app_name\030\002 \002(\t\022\024\n\014device_tok" +
"en\030\003 \002(\t\022\021\n\tpush_type\030\004 \002(\005\"\201\001\n\026ModifyGr" +
"oupInfoRequest\022\020\n\010group_id\030\001 \002(\t\022\014\n\004type" +
"\030\002 \002(\005\022\r\n\005value\030\003 \002(\t\022\017\n\007to_line\030\004 \003(\005\022\'" +
"\n\016notify_content\030\005 \001(\0132\017.MessageContent\"",
"\203\001\n\026SetGroupManagerRequest\022\020\n\010group_id\030\001" +
" \002(\t\022\014\n\004type\030\002 \002(\005\022\017\n\007user_id\030\003 \003(\t\022\017\n\007t" +
"o_line\030\004 \003(\005\022\'\n\016notify_content\030\005 \001(\0132\017.M" +
"essageContent\"(\n\tInfoEntry\022\014\n\004type\030\001 \002(\005" +
"\022\r\n\005value\030\002 \002(\t\"0\n\023ModifyMyInfoRequest\022\031" +
"\n\005entry\030\001 \003(\0132\n.InfoEntry\";\n\rNotifyMessa" +
"ge\022\014\n\004type\030\001 \002(\005\022\014\n\004head\030\002 \002(\003\022\016\n\006target" +
"\030\003 \001(\t\"=\n\022PullMessageRequest\022\n\n\002id\030\001 \002(\003" +
"\022\014\n\004type\030\002 \002(\005\022\r\n\005delay\030\003 \001(\003\"M\n\021PullMes" +
"sageResult\022\031\n\007message\030\001 \003(\0132\010.Message\022\017\n",
"\007current\030\002 \002(\003\022\014\n\004head\030\003 \002(\003\"/\n\023PullGrou" +
"pInfoResult\022\030\n\004info\030\001 \003(\0132\n.GroupInfo\"6\n" +
"\026PullGroupMemberRequest\022\016\n\006target\030\001 \002(\t\022" +
"\014\n\004head\030\002 \002(\003\"5\n\025PullGroupMemberResult\022\034" +
"\n\006member\030\001 \003(\0132\014.GroupMember\"-\n\013UserRequ" +
"est\022\013\n\003uid\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"0\n\017P" +
"ullUserRequest\022\035\n\007request\030\001 \003(\0132\014.UserRe" +
"quest\"/\n\nUserResult\022\023\n\004user\030\001 \002(\0132\005.User" +
"\022\014\n\004code\030\002 \002(\005\"-\n\016PullUserResult\022\033\n\006resu" +
"lt\030\001 \003(\0132\013.UserResult\"^\n\020QuitGroupReques",
"t\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n\016" +
"notify_content\030\003 \001(\0132\017.MessageContent\"~\n" +
"\030RemoveGroupMemberRequest\022\020\n\010group_id\030\001 " +
"\002(\t\022\026\n\016removed_member\030\002 \003(\t\022\017\n\007to_line\030\003" +
" \003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.MessageCo" +
"ntent\"u\n\024TransferGroupRequest\022\020\n\010group_i" +
"d\030\001 \002(\t\022\021\n\tnew_owner\030\002 \002(\t\022\017\n\007to_line\030\003 " +
"\003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.MessageCon" +
"tent\"s\n\026ModifyGroupMemberAlias\022\020\n\010group_" +
"id\030\001 \002(\t\022\r\n\005alias\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005",
"\022\'\n\016notify_content\030\004 \001(\0132\017.MessageConten" +
"t\"P\n\020UserSettingEntry\022\r\n\005scope\030\001 \002(\005\022\013\n\003" +
"key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\022\021\n\tupdate_dt\030\004 " +
"\002(\003\"A\n\024ModifyUserSettingReq\022\r\n\005scope\030\001 \002" +
"(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\"\032\n\007Versio" +
"n\022\017\n\007version\030\001 \002(\003\"8\n\024GetUserSettingResu" +
"lt\022 \n\005entry\030\001 \003(\0132\021.UserSettingEntry\"f\n\006" +
"Friend\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\021\n\tup" +
"date_dt\030\003 \002(\003\022\r\n\005alias\030\004 \001(\t\022\017\n\007blacked\030" +
"\005 \001(\005\022\r\n\005extra\030\006 \001(\t\"*\n\020GetFriendsResult",
"\022\026\n\005entry\030\001 \003(\0132\007.Friend\"7\n\026GetFriendReq" +
"uestResult\022\035\n\005entry\030\001 \003(\0132\016.FriendReques" +
"t\"\243\001\n\021ConnectAckPayload\022\020\n\010msg_head\030\001 \001(" +
"\003\022\023\n\013friend_head\030\002 \001(\003\022\026\n\016friend_rq_head" +
"\030\003 \001(\003\022\024\n\014setting_head\030\004 \001(\003\022\021\n\tnode_add" +
"r\030\005 \001(\t\022\021\n\tnode_port\030\006 \001(\005\022\023\n\013server_tim" +
"e\030\007 \001(\003\"P\n\rIMHttpWrapper\022\r\n\005token\030\001 \002(\t\022" +
"\021\n\tclient_id\030\002 \002(\t\022\017\n\007request\030\003 \002(\t\022\014\n\004d" +
"ata\030\004 \001(\014\"A\n\021SearchUserRequest\022\017\n\007keywor" +
"d\030\001 \002(\t\022\r\n\005fuzzy\030\002 \001(\005\022\014\n\004page\030\003 \001(\005\"(\n\020",
"SearchUserResult\022\024\n\005entry\030\001 \003(\0132\005.User\"@" +
"\n\026GetChatroomInfoRequest\022\023\n\013chatroom_id\030" +
"\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"\227\001\n\014ChatroomInf" +
"o\022\r\n\005title\030\001 \002(\t\022\014\n\004desc\030\002 \001(\t\022\020\n\010portra" +
"it\030\003 \001(\t\022\024\n\014member_count\030\004 \001(\005\022\021\n\tcreate" +
"_dt\030\005 \001(\003\022\021\n\tupdate_dt\030\006 \001(\003\022\r\n\005extra\030\007 " +
"\001(\t\022\r\n\005state\030\010 \001(\005\"F\n\034GetChatroomMemberI" +
"nfoRequest\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tmax_c" +
"ount\030\002 \001(\005\";\n\022ChatroomMemberInfo\022\024\n\014memb" +
"er_count\030\001 \001(\005\022\017\n\007members\030\002 \003(\t\"\026\n\010INT64",
"Buf\022\n\n\002id\030\001 \002(\003\"4\n\023NotifyRecallMessage\022\n" +
"\n\002id\030\001 \002(\003\022\021\n\tfrom_user\030\002 \002(\t\"/\n\020BlackUs" +
"erRequest\022\013\n\003uid\030\001 \002(\t\022\016\n\006status\030\002 \002(\005\"\323" +
"\001\n\014RouteRequest\022\013\n\003app\030\001 \001(\t\022\020\n\010platform" +
"\030\002 \001(\005\022\021\n\tpush_type\030\003 \001(\005\022\023\n\013device_name" +
"\030\004 \001(\t\022\026\n\016device_version\030\005 \001(\t\022\022\n\nphone_" +
"name\030\006 \001(\t\022\020\n\010language\030\007 \001(\t\022\024\n\014carrier_" +
"name\030\010 \001(\t\022\023\n\013app_version\030\t \001(\t\022\023\n\013sdk_v" +
"ersion\030\n \001(\t\"D\n\rRouteResponse\022\014\n\004host\030\001 " +
"\002(\t\022\021\n\tlong_port\030\002 \002(\005\022\022\n\nshort_port\030\003 \002",
"(\005\"G\n\017GetTokenRequest\022\017\n\007user_id\030\001 \002(\t\022\021" +
"\n\tclient_id\030\002 \002(\t\022\020\n\010platform\030\003 \001(\005\"\\\n\022L" +
"oadRemoteMessages\022#\n\014conversation\030\001 \002(\0132" +
"\r.Conversation\022\022\n\nbefore_uid\030\002 \002(\003\022\r\n\005co" +
"unt\030\003 \002(\005\"a\n\020MultiCastMessage\022\021\n\tfrom_us" +
"er\030\001 \002(\t\022 \n\007content\030\002 \002(\0132\017.MessageConte" +
"nt\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 \002(\005B#\n\025cn.wildf" +
"irechat.protoB\nWFCMessage"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -60669,7 +60982,7 @@ public final class WFCMessage {
internal_static_HandleFriendRequest_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_HandleFriendRequest_descriptor,
new java.lang.String[] { "TargetUid", "Status", });
new java.lang.String[] { "TargetUid", "Status", "Extra", });
internal_static_IDBuf_descriptor =
getDescriptor().getMessageTypes().get(22);
internal_static_IDBuf_fieldAccessorTable = new
@@ -60861,7 +61174,7 @@ public final class WFCMessage {
internal_static_Friend_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_Friend_descriptor,
new java.lang.String[] { "Uid", "State", "UpdateDt", "Alias", "Blacked", });
new java.lang.String[] { "Uid", "State", "UpdateDt", "Alias", "Blacked", "Extra", });
internal_static_GetFriendsResult_descriptor =
getDescriptor().getMessageTypes().get(54);
internal_static_GetFriendsResult_fieldAccessorTable = new
+1 -1
View File
@@ -6,7 +6,7 @@
<!--<relativePath>../pom.xml</relativePath>-->
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.37</version>
<version>0.40</version>
</parent>
<artifactId>distribution</artifactId>
@@ -19,6 +19,11 @@
<directory>../broker/migrate/h2/</directory>
<outputDirectory>/migrate/h2</outputDirectory>
</fileSet>
<fileSet>
<directory>../broker/config/i18n/</directory>
<outputDirectory>/config/i18n</outputDirectory>
</fileSet>
</fileSets>
<files>
@@ -15,7 +15,7 @@
<!--MySQL数据库驱动程序-->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<!--MySQL数据库地址-->
<property name="jdbcUrl">jdbc:mysql://localhost:3306/wfchat?useSSL=false&amp;serverTimezone=GMT%2B8&amp;allowPublicKeyRetrieval=true&amp;useUnicode=true&amp;characterEncoding=utf8</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/wfchat?useSSL=false&amp;serverTimezone=GMT%2B8&amp;allowPublicKeyRetrieval=true&amp;useUnicode=true&amp;characterEncoding=UTF-8</property>
<!--MySQL数据库用户名-->
<property name="user">root</property>
<!--MySQL数据库密码-->
@@ -57,6 +57,13 @@
</map-store>
</map>
<map name="user_friends_empty">
<time-to-live-seconds>86400</time-to-live-seconds>
<eviction-policy>LRU</eviction-policy>
<max-size policy="PER_NODE">1000000</max-size>
<eviction-percentage>10</eviction-percentage>
</map>
<set name="node_ids"/>
<multimap name="user_setting">
@@ -77,6 +84,12 @@
<map name="user_chatroom">
</map>
<multimap name="chatroom_black">
</multimap>
<multimap name="chatroom_manager">
</multimap>
<map name="robots">
<!-- 7 days -->
<time-to-live-seconds>604800</time-to-live-seconds>
@@ -28,8 +28,8 @@ log4j.logger.io.moquette.parser.netty=WARN
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.Threshold=INFO
log4j.appender.file.File=logs/wildfirechat.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=20
log4j.appender.file.MaxFileSize=20MB
log4j.appender.file.MaxBackupIndex=100
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n
log4j.appender.file.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} [%t] %-5p %c{1} %L %x - %m%n
@@ -41,7 +41,7 @@ log4j.appender.messagelog=org.apache.log4j.RollingFileAppender
log4j.appender.messagelog.Threshold=WARN
log4j.appender.messagelog.File=logs/wildfirechat_messages.log
log4j.appender.messagelog.MaxFileSize=100MB
log4j.appender.messagelog.MaxBackupIndex=1
log4j.appender.messagelog.MaxBackupIndex=3
log4j.appender.messagelog.layout=org.apache.log4j.PatternLayout
log4j.appender.messagelog.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} [%t] %-5p %c{1} %L %x - %m%n
@@ -35,7 +35,7 @@ http.admin.secret_key 123456
##服务器API接口参数是否检查时间。当设置为false时,所有的请求会检查时间的有效性;当设置为true时,可以在http.admin.secret_key保持不变的情况下,使用固定的服务API签名
##nonce = "76616", timestamp = "1558350862502", sign = "b98f9b0717f59febccf1440067a7f50d9b31bdde"
http.admin.no_check_time true
http.admin.no_check_time false
##客户端协议栈密钥,需要与客户端协议栈文件libemqq.cc文件中的aes_key值保持一致,16进制byte用逗号分割。这个密钥对安全性帮助不大,客户不要修改
client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F
@@ -43,6 +43,9 @@ client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0
##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记
token.key testim
##token的过期时间,单位为毫秒,默认为无限期。如果需要设置无限期,客户端上一定需要加上token过期的处理。token过期的处理请参考文档的常见问题
##token.expire_time 2592000000
##首次登录,是否接收之前的历史消息。0 不接收;1接收。
message.roaming 0
@@ -55,15 +58,28 @@ message.max_queue 1024
##是否禁止陌生人聊天
message.disable_stranger_chat false
##黑名单处理策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃;
##黑名单处理策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃;2 敏感词替换为***;3 不处理。
##所有命中敏感词的消息都会被记录在敏感词消息表中
message.blacklist.strategy 0
##禁止搜索用户
friend.disable_search false
##禁止按照昵称搜索用户。
friend.disable_nick_name_search false
##禁止发送好友邀请,通过server api添加好友不受此限制
friend.disable_friend_request false
##好友请求重复发送的间隔,单位是毫秒,默认是7天,0为不限制
friend.repeat_request_duration 604800000
##好友请求被拒绝后再次发送的间隔,单位是毫秒,默认是30天,0为不限制
friend.reject_request_duration 2592000000
##好友请求过期时间,单位是毫秒,默认是7天,0为不限制
friend.request_expiration_duration 604800000
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
chatroom.participant_idle_time 900000
@@ -106,6 +122,10 @@ qiniu.bucket_video_name media
qiniu.bucket_video_domain http://cdn.wildfirechat.cn
qiniu.bucket_file_name media
qiniu.bucket_file_domain http://cdn.wildfirechat.cn
qiniu.bucket_sticker_name media
qiniu.bucket_sticker_domain http://cdn.wildfirechat.cn
qiniu.bucket_moments_name media
qiniu.bucket_moments_domain http://cdn.wildfirechat.cn
qiniu.bucket_portrait_name storage
qiniu.bucket_portrait_domain http://cdn2.wildfirechat.cn
qiniu.bucket_favorite_name storage
@@ -120,6 +140,9 @@ local.media.storage.root ./media
# 是否支持多端登陆
server.multi_endpoint false
# 多平台连接状态通知(仅当multi_endpoint为false时有效)
server.multi_platform_notification false
#*********************************************************************
# Push server configuration
#*********************************************************************
+1 -1
View File
@@ -12,7 +12,7 @@
<artifactId>wildfirechat-parent</artifactId>
<packaging>pom</packaging>
<version>0.37</version>
<version>0.40</version>
<name>Wildfire Chat</name>
<description>Wildfire Chat Server</description>
<inceptionYear>2019</inceptionYear>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.37</version>
<version>0.40</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -24,6 +24,18 @@ public class ChannelServiceApi {
return httpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
}
public IMResult<InputOutputUserInfo> getUserInfoByName(String userName) throws Exception {
String path = APIPath.Channel_User_Info;
InputGetUserInfo getUserInfo = new InputGetUserInfo(null, userName, null);
return httpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
}
public IMResult<InputOutputUserInfo> getUserInfoByMobile(String mobile) throws Exception {
String path = APIPath.Channel_User_Info;
InputGetUserInfo getUserInfo = new InputGetUserInfo(null, null, mobile);
return httpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
}
public IMResult<Void> modifyChannelInfo(/*ProtoConstants.ModifyChannelInfoType*/int type, String value) throws Exception {
String path = APIPath.Channel_Update_Profile;
InputModifyChannelInfo modifyChannelInfo = new InputModifyChannelInfo();
@@ -6,8 +6,15 @@ import cn.wildfirechat.sdk.model.IMResult;
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
public class ChatroomAdmin {
public static IMResult<OutputCreateChatroom> createChatroom(InputCreateChatroom input) throws Exception {
public static IMResult<OutputCreateChatroom> createChatroom(String chatroomId, String title, String desc ,String portrait, String extra, Integer state) throws Exception {
String path = APIPath.Create_Chatroom;
InputCreateChatroom input = new InputCreateChatroom();
input.setChatroomId(chatroomId);
input.setTitle(title);
input.setDesc(desc);
input.setPortrait(portrait);
input.setExtra(extra);
input.setState(state);
return AdminHttpUtils.httpJsonPost(path, input, OutputCreateChatroom.class);
}
@@ -23,5 +30,44 @@ public class ChatroomAdmin {
InputGetChatroomInfo input = new InputGetChatroomInfo(chatroomId);
return AdminHttpUtils.httpJsonPost(path, input, OutputGetChatroomInfo.class);
}
public static IMResult<OutputStringList> getChatroomMembers(String chatroomId) throws Exception {
String path = APIPath.Chatroom_GetMembers;
InputGetChatroomInfo input = new InputGetChatroomInfo(chatroomId);
return AdminHttpUtils.httpJsonPost(path, input, OutputStringList.class);
}
//仅专业版支持
//status:0,正常;1,禁言;2,禁止加入
public static IMResult<Void> setChatroomBlacklist(String chatroomId, String userId, int status) throws Exception {
String path = APIPath.Chatroom_SetBlacklist;
InputSetChatroomBlacklist input = new InputSetChatroomBlacklist(chatroomId, userId, status, 0);
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
}
public static IMResult<OutputChatroomBlackInfos> getChatroomBlacklist(String chatroomId) throws Exception {
String path = APIPath.Chatroom_GetBlacklist;
InputChatroomId input = new InputChatroomId(chatroomId);
return AdminHttpUtils.httpJsonPost(path, input, OutputChatroomBlackInfos.class);
}
//status: 1 set; 0 unset
public static IMResult<Void> setChatroomManager(String chatroomId, String userId, int status) throws Exception {
String path = APIPath.Chatroom_SetManager;
InputSetChatroomManager input = new InputSetChatroomManager(chatroomId, userId, status);
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
}
public static IMResult<OutputStringList> getChatroomManagerList(String chatroomId) throws Exception {
String path = APIPath.Chatroom_GetManagerList;
InputChatroomId input = new InputChatroomId(chatroomId);
return AdminHttpUtils.httpJsonPost(path, input, OutputStringList.class);
}
public static IMResult<Void> setChatroomMute(String chatroomId, boolean mute) throws Exception {
String path = APIPath.Chatroom_MuteAll;
InputChatroomMute input = new InputChatroomMute(chatroomId, mute ? 1 : 0);
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
}
}
+275 -70
View File
@@ -17,18 +17,33 @@ import static cn.wildfirechat.proto.ProtoConstants.SystemSettingType.Group_Max_M
public class Main {
public static void main(String[] args) throws Exception {
//admin使用的是18080端口,超级管理接口,理论上不能对外开放端口,也不能让非内部服务知悉密钥。
testAdmin();
//Robot和Channel都是使用的80端口,第三方可以创建或者为第三方创建,第三方可以使用robot或者channel与IM系统进行对接。
testRobot();
// testChannel();
//testChannel();
}
static void testAdmin() throws Exception {
//初始化服务API
AdminHttpUtils.init("http://localhost:18080", "123456");
//***********************************************
//**** 用户相关的API
//***********************************************
testUser();
testUserRelation();
testGroup();
testChatroom();
testMessage();
testGeneralApi();
System.out.println("Congratulation, all admin test case passed!!!!!!!");
}
//***********************************************
//**** 用户相关的API
//***********************************************
static void testUser() throws Exception {
InputOutputUserInfo userInfo = new InputOutputUserInfo();
userInfo.setUserId("userId1");
userInfo.setName("user1");
@@ -175,9 +190,112 @@ public class Main {
System.exit(-1);
}
//***********************************************
//**** 群组相关功能
//***********************************************
IMResult<OutputCheckUserOnline> outputCheckUserOnline = UserAdmin.checkUserOnlineStatus(userInfo.getUserId());
if (outputCheckUserOnline != null && outputCheckUserOnline.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("check user online status success:" + outputCheckUserOnline.getResult().getSessions().size());
} else {
System.out.println("block user online failure");
System.exit(-1);
}
//慎用,这个方法可能功能不完全,如果用户不在需要,建议使用block功能屏蔽用户
IMResult<Void> voidIMResult = UserAdmin.destroyUser("user11");
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("destroy user success");
} else {
System.out.println("destroy user failure");
System.exit(-1);
}
}
//***********************************************
//**** 用户关系相关的API
//***********************************************
static void testUserRelation() throws Exception {
//先创建2个用户
InputOutputUserInfo userInfo = new InputOutputUserInfo();
userInfo.setUserId("ff1");
userInfo.setName("ff1");
userInfo.setMobile("13800000000");
userInfo.setDisplayName("ff1");
IMResult<OutputCreateUser> resultCreateUser = UserAdmin.createUser(userInfo);
if (resultCreateUser != null && resultCreateUser.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("Create user " + resultCreateUser.getResult().getName() + " success");
} else {
System.out.println("Create user failure");
System.exit(-1);
}
userInfo = new InputOutputUserInfo();
userInfo.setUserId("ff2");
userInfo.setName("ff2");
userInfo.setMobile("13800000001");
userInfo.setDisplayName("ff2");
resultCreateUser = UserAdmin.createUser(userInfo);
if (resultCreateUser != null && resultCreateUser.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("Create user " + resultCreateUser.getResult().getName() + " success");
} else {
System.out.println("Create user failure");
System.exit(-1);
}
IMResult<Void> updateFriendStatusResult = RelationAdmin.setUserFriend("ff1", "ff2", true, "{\"from\":1}");
if (updateFriendStatusResult != null && updateFriendStatusResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("update friend status success");
} else {
System.out.println("update friend status failure");
System.exit(-1);
}
IMResult<OutputStringList> resultGetFriendList = RelationAdmin.getFriendList("ff1");
if (resultGetFriendList != null && resultGetFriendList.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && resultGetFriendList.getResult().getList().contains("ff2")) {
System.out.println("get friend status success");
} else {
System.out.println("get friend status failure");
System.exit(-1);
}
IMResult<Void> updateBlacklistStatusResult = RelationAdmin.setUserBlacklist("ff1", "ff2", true);
if (updateBlacklistStatusResult != null && updateBlacklistStatusResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("update blacklist status success");
} else {
System.out.println("update blacklist status failure");
System.exit(-1);
}
resultGetFriendList = RelationAdmin.getUserBlacklist("ff1");
if (resultGetFriendList != null && resultGetFriendList.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && resultGetFriendList.getResult().getList().contains("ff2")) {
System.out.println("get blacklist status success");
} else {
System.out.println("get blacklist status failure");
System.exit(-1);
}
String alias = "hello" + System.currentTimeMillis();
IMResult<Void> updateFriendAlias = RelationAdmin.updateFriendAlias("ff1", "ff2", alias);
if (updateFriendAlias != null && updateFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("update friend status success");
} else {
System.out.println("update friend status failure");
System.exit(-1);
}
IMResult<OutputGetAlias> getFriendAlias = RelationAdmin.getFriendAlias("ff1", "ff2");
if (getFriendAlias != null && getFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && getFriendAlias.getResult().getAlias().equals(alias)) {
System.out.println("update friend status success");
} else {
System.out.println("update friend status failure");
System.exit(-1);
}
}
//***********************************************
//**** 群组相关功能
//***********************************************
static void testGroup() throws Exception {
IMResult<Void> voidIMResult1 = GroupAdmin.dismissGroup("user1", "groupId1", null, null);
PojoGroupInfo groupInfo = new PojoGroupInfo();
@@ -314,10 +432,12 @@ public class Main {
System.exit(-1);
}
}
//***********************************************
//**** 消息相关功能
//***********************************************
//***********************************************
//**** 消息相关功能
//***********************************************
static void testMessage() throws Exception {
Conversation conversation = new Conversation();
conversation.setTarget("user2");
conversation.setType(ProtoConstants.ConversationType.ConversationType_Private);
@@ -334,7 +454,7 @@ public class Main {
}
voidIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid());
IMResult<Void> voidIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid());
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("recall message success");
} else {
@@ -359,7 +479,12 @@ public class Main {
System.out.println("multi message failure");
System.exit(-1);
}
}
//***********************************************
//**** 一些其它的功能,比如创建频道,更新用户设置等
//***********************************************
static void testGeneralApi() throws Exception {
IMResult<SystemSettingPojo> resultGetSystemSetting = GeneralAdmin.getSystemSetting(Group_Max_Member_Count);
if (resultGetSystemSetting != null && resultGetSystemSetting.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("success");
@@ -394,81 +519,161 @@ public class Main {
System.out.println("create channel failure");
System.exit(-1);
}
}
static void testChatroom() throws Exception {
//***********************************************
//**** 好友相关功能
//***********************************************
//先创建2个用户
userInfo = new InputOutputUserInfo();
userInfo.setUserId("ff1");
userInfo.setName("ff1");
userInfo.setMobile("13800000000");
userInfo.setDisplayName("ff1");
resultCreateUser = UserAdmin.createUser(userInfo);
if (resultCreateUser != null && resultCreateUser.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("Create user " + resultCreateUser.getResult().getName() + " success");
String chatroomId = "chatroomId1";
String chatroomTitle = "TESTCHATROM";
String chatroomDesc = "this is a test chatroom";
String chatroomPortrait = "http://pic.com/test123.png";
String chatroomExtra = "{\'managers:[\"user1\",\"user2\"]}";
IMResult<OutputCreateChatroom> chatroomIMResult = ChatroomAdmin.createChatroom(chatroomId,chatroomTitle, chatroomDesc, chatroomPortrait,chatroomExtra,ProtoConstants.ChatroomState.Chatroom_State_Normal);
if (chatroomIMResult != null && chatroomIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && chatroomIMResult.getResult().getChatroomId().equals(chatroomId)) {
System.out.println("create chatroom success");
} else {
System.out.println("Create user failure");
System.out.println("create chatroom failure");
System.exit(-1);
}
userInfo = new InputOutputUserInfo();
userInfo.setUserId("ff2");
userInfo.setName("ff2");
userInfo.setMobile("13800000001");
userInfo.setDisplayName("ff2");
resultCreateUser = UserAdmin.createUser(userInfo);
if (resultCreateUser != null && resultCreateUser.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("Create user " + resultCreateUser.getResult().getName() + " success");
IMResult<OutputGetChatroomInfo> getChatroomInfoIMResult = ChatroomAdmin.getChatroomInfo(chatroomId);
if (getChatroomInfoIMResult != null && getChatroomInfoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
if (!getChatroomInfoIMResult.getResult().getChatroomId().equals(chatroomId)
|| !getChatroomInfoIMResult.getResult().getTitle().equals(chatroomTitle)
|| !getChatroomInfoIMResult.getResult().getDesc().equals(chatroomDesc)
|| !getChatroomInfoIMResult.getResult().getPortrait().equals(chatroomPortrait)
|| !getChatroomInfoIMResult.getResult().getExtra().equals(chatroomExtra)
|| getChatroomInfoIMResult.getResult().getState() != ProtoConstants.ChatroomState.Chatroom_State_Normal) {
System.out.println("chatroom info incorrect");
System.exit(-1);
} else {
System.out.println("chatroom info incorrect");
}
} else {
System.out.println("Create user failure");
System.out.println("get chatroom info failure");
System.exit(-1);
}
IMResult<Void> updateFriendStatusResult = FriendAdmin.updateFriendStatus("ff1", "ff2", 1);
if (updateFriendStatusResult != null && updateFriendStatusResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("update friend status success");
IMResult<OutputStringList> memberList = ChatroomAdmin.getChatroomMembers(chatroomId);
if (memberList != null && memberList.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("get chatroom member success");
} else {
System.out.println("update friend status failure");
System.exit(-1);
System.out.println("get chatroom member failure: " + memberList.getErrorCode().msg);
}
IMResult<OutputStringList> resultGetFriendList = FriendAdmin.getFriendStatusList("ff1", 1);
if (resultGetFriendList != null && resultGetFriendList.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && resultGetFriendList.getResult().getList().contains("ff2")) {
System.out.println("get friend status success");
} else {
System.out.println("get friend status failure");
System.exit(-1);
}
String alias = "hello" + System.currentTimeMillis();
IMResult<Void> updateFriendAlias = FriendAdmin.updateFriendAlias("ff1", "ff2", alias);
if (updateFriendAlias != null && updateFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("update friend status success");
} else {
System.out.println("update friend status failure");
System.exit(-1);
}
IMResult<OutputGetAlias> getFriendAlias = FriendAdmin.getFriendAlias("ff1", "ff2");
if (getFriendAlias != null && getFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && getFriendAlias.getResult().getAlias().equals(alias)) {
System.out.println("update friend status success");
} else {
System.out.println("update friend status failure");
System.exit(-1);
}
voidIMResult = UserAdmin.destroyUser("user11");
IMResult<Void> voidIMResult = ChatroomAdmin.destroyChatroom(chatroomId);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("destroy user success");
System.out.println("destroy chatroom done!");
} else {
System.out.println("destroy user failure");
System.out.println("destroy chatroom failure");
System.exit(-1);
}
getChatroomInfoIMResult = ChatroomAdmin.getChatroomInfo(chatroomId);
if (getChatroomInfoIMResult != null && getChatroomInfoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && getChatroomInfoIMResult.getResult().getState() == ProtoConstants.ChatroomState.Chatroom_State_End) {
System.out.println("chatroom destroyed!");
} else {
System.out.println("chatroom not destroyed!");
System.exit(-1);
}
//下面仅专业版支持
/*
//设置用户聊天室黑名单。0正常;1禁言;2禁止加入。
IMResult<Void> voidIMResult1 = ChatroomAdmin.setChatroomBlacklist("chatroom1", "oto9o9__", 1);
if (voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("add chatroom black success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//获取聊天室黑名单
IMResult<OutputChatroomBlackInfos> blackInfos = ChatroomAdmin.getChatroomBlacklist("chatroom1");
if (blackInfos != null && blackInfos.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !blackInfos.getResult().infos.isEmpty()) {
boolean success = false;
for (OutputChatroomBlackInfos.OutputChatroomBlackInfo info : blackInfos.getResult().infos) {
if (info.userId.equals("oto9o9__")) {
success = true;
break;
}
}
if (success) {
System.out.println("add chatroom black success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//取消用户聊天室黑名单。0正常;1禁言;2禁止加入。
voidIMResult1 = ChatroomAdmin.setChatroomBlacklist("chatroom1", "oto9o9__", 0);
if (voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("remove chatroom black success");
} else {
System.out.println("remove chatroom black failure");
System.exit(-1);
}
//获取聊天室黑名单
blackInfos = ChatroomAdmin.getChatroomBlacklist("chatroom1");
if (blackInfos != null && blackInfos.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
boolean success = true;
for (OutputChatroomBlackInfos.OutputChatroomBlackInfo info : blackInfos.getResult().infos) {
if (info.userId.equals("oto9o9__")) {
success = false;
break;
}
}
if (success) {
System.out.println("remove chatroom black success");
} else {
System.out.println("remove chatroom black failure");
System.exit(-1);
}
} else {
System.out.println("remove chatroom black failure");
System.exit(-1);
}
//设置聊天室管理员
IMResult<Void> voidIMResult2 = ChatroomAdmin.setChatroomManager("chatroom1", "UserId1", 1);
if (voidIMResult2 != null && voidIMResult2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("add chatroom manager success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//获取聊天室管理员
IMResult<OutputStringList> managers = ChatroomAdmin.getChatroomManagerList("chatroom1");
if (managers != null && managers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !managers.getResult().getList().isEmpty() && managers.getResult().getList().contains("UserId1")) {
System.out.println("add chatroom black success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//取消聊天室管理员
IMResult<Void> voidIMResult3 = ChatroomAdmin.setChatroomManager("chatroom1", "UserId1", 0);
if (voidIMResult3 != null && voidIMResult3.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("add chatroom manager success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//获取聊天室管理员
IMResult<OutputStringList> managers2 = ChatroomAdmin.getChatroomManagerList("chatroom1");
if (managers2 != null && managers2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !managers2.getResult().getList().contains("UserId1")) {
System.out.println("add chatroom black success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}*/
}
static void testRobot() throws Exception {
@@ -5,21 +5,37 @@ import cn.wildfirechat.pojos.*;
import cn.wildfirechat.sdk.model.IMResult;
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
public class FriendAdmin {
public static IMResult<Void> updateFriendStatus(String operator, String targetId, int status) throws Exception {
public class RelationAdmin {
public static IMResult<Void> setUserFriend(String userId, String targetId, boolean isFriend, String extra) throws Exception {
String path = APIPath.Friend_Update_Status;
InputFriendRequest input = new InputFriendRequest();
input.setUserId(operator);
input.setUserId(userId);
input.setFriendUid(targetId);
input.setStatus(status);
input.setStatus(isFriend ? 0 : 1); //历史遗留问题,在IM数据库中0是好友,1是好友被删除。
input.setExtra(extra);
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
}
public static IMResult<OutputStringList> getFriendStatusList(String operator, int status) throws Exception {
public static IMResult<OutputStringList> getFriendList(String userId) throws Exception {
String path = APIPath.Friend_Get_List;
InputGetFriendList input = new InputGetFriendList();
input.setUserId(operator);
input.setStatus(status);
InputUserId input = new InputUserId();
input.setUserId(userId);
return AdminHttpUtils.httpJsonPost(path, input, OutputStringList.class);
}
public static IMResult<Void> setUserBlacklist(String userId, String targetId, boolean isBlacklist) throws Exception {
String path = APIPath.Blacklist_Update_Status;
InputBlacklistRequest input = new InputBlacklistRequest();
input.setUserId(userId);
input.setTargetUid(targetId);
input.setStatus(isBlacklist ? 2 : 1);
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
}
public static IMResult<OutputStringList> getUserBlacklist(String userId) throws Exception {
String path = APIPath.Blacklist_Get_List;
InputUserId input = new InputUserId();
input.setUserId(userId);
return AdminHttpUtils.httpJsonPost(path, input, OutputStringList.class);
}
@@ -21,4 +21,16 @@ public class RobotService {
InputGetUserInfo getUserInfo = new InputGetUserInfo(userId, null, null);
return RobotHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
}
public static IMResult<InputOutputUserInfo> getUserInfoByMobile(String phone) throws Exception {
String path = APIPath.Robot_User_Info;
InputGetUserInfo getUserInfo = new InputGetUserInfo(null, null, phone);
return RobotHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
}
public static IMResult<InputOutputUserInfo> getUserInfoByName(String userName) throws Exception {
String path = APIPath.Robot_User_Info;
InputGetUserInfo getUserInfo = new InputGetUserInfo(null, userName, null);
return RobotHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
}
}
@@ -58,6 +58,12 @@ public class UserAdmin {
return AdminHttpUtils.httpJsonPost(path, null, OutputUserBlockStatusList.class);
}
public static IMResult<OutputCheckUserOnline> checkUserOnlineStatus(String userId) throws Exception {
String path = APIPath.User_Get_Online_Status;
InputGetUserInfo getUserInfo = new InputGetUserInfo(userId, null, null);
return AdminHttpUtils.httpJsonPost(path, getUserInfo, OutputCheckUserOnline.class);
}
public static IMResult<Void> destroyUser(String userId) throws Exception {
String path = APIPath.Destroy_User;
InputDestroyUser inputDestroyUser = new InputDestroyUser();
@@ -31,9 +31,13 @@ public class AdminHttpUtils {
}
public static <T> IMResult<T> httpJsonPost(String path, Object object, Class<T> clazz) throws Exception{
if (isNullOrEmpty(adminUrl) || isNullOrEmpty(path)) {
LOG.error("Not init IM SDK correctly. Do you forget init it?");
throw new Exception("SDK url or secret lack!");
if (isNullOrEmpty(adminUrl) || isNullOrEmpty(adminSecret)) {
LOG.error("野火IM Server SDK必须先初始化才能使用,是不是忘记初始化了!!!!");
throw new Exception("SDK没有初始化");
}
if (isNullOrEmpty(path)) {
throw new Exception("路径缺失");
}
String url = adminUrl + path;