Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ade58efc11 | ||
|
|
d45da9674e | ||
|
|
f603a677ea | ||
|
|
03894aea9a | ||
|
|
8635153e59 | ||
|
|
3d98d17b0d | ||
|
|
0549bc502f | ||
|
|
1b8cf3e5f9 | ||
|
|
f3f08b3026 | ||
|
|
78e6efce14 | ||
|
|
462423a6f3 | ||
|
|
55190a4f76 | ||
|
|
4ed21ecb03 | ||
|
|
1ff3b592bd | ||
|
|
fbc2351d82 | ||
|
|
dd1783d4ac | ||
|
|
845e6ff8aa | ||
|
|
6d91f3869e | ||
|
|
d100bd5fb1 | ||
|
|
bf22b365a8 | ||
|
|
f1298a51ae | ||
|
|
41f62c6354 | ||
|
|
a45de0ecd1 | ||
|
|
fc35865478 | ||
|
|
b1f59498e5 | ||
|
|
04f5471385 | ||
|
|
291fdfb08d | ||
|
|
52de13e20d | ||
|
|
c1d353bce9 | ||
|
|
9d83f8e3fa | ||
|
|
94833780ef | ||
|
|
d0fdf55db4 | ||
|
|
ea00ef6b7f | ||
|
|
a11cf3c564 | ||
|
|
f5af956298 | ||
|
|
4005a4babe | ||
|
|
6ef8b78452 | ||
|
|
100a1bd44c | ||
|
|
5a213704c5 | ||
|
|
5a52a7d553 | ||
|
|
d751a7080b | ||
|
|
68ae7dbd58 | ||
|
|
10fce4baad | ||
|
|
c69906e249 | ||
|
|
1aed4b1d37 | ||
|
|
f2601fc65d | ||
|
|
4895f03a68 | ||
|
|
1d234a3575 | ||
|
|
386d0b9c57 | ||
|
|
3ab1c7553d | ||
|
|
85a4c806c1 | ||
|
|
9aac87b7a1 | ||
|
|
ce21441772 |
@@ -7,9 +7,9 @@
|
||||
* 性能强大,专业版IM服务支持百万在线和集群部署,业内顶尖性能水平,详情参考野火性能报告。
|
||||
* 部署运维简单,依赖服务少,稍加配置一键启动。
|
||||
* 安全加密。网络连接AES加密。客户端数据库SqlCipher加密。安全无小事。
|
||||
* 全平台客户端,支持Android、iOS、Web、小程序、UniApp、Flutter、Windows、Mac OS、Linux等所有常见平台。
|
||||
* 全平台客户端,支持Android、iOS、鸿蒙、Web、小程序、UniApp、Flutter、Windows、Mac OS、Linux等所有常见平台。
|
||||
* 四端同时在线(移动端,pc端,web端和小程序端),数据和状态多端完美同步。
|
||||
* 支持国产化。支持国产化操作系统、国产化芯片和国产操作系统。支持国密加密。
|
||||
* 支持国产化。支持国产化操作系统、国产化芯片和国产数据库。支持国密加密。
|
||||
* 客户端使用微信[mars](https://github.com/tencent/mars)连接库,野火IM可能是最适应中国网络国情的即时通讯服务。
|
||||
* 支持加速点加速,即可用于全球应用,也可用于政企内外双网复杂的网络环境。
|
||||
* 支持阅读回执和在线状态功能,适用于办公环境。
|
||||
@@ -22,9 +22,10 @@
|
||||
* API丰富,方便与其它服务系统的对接。
|
||||
* 拥有机器人和公众号功能,免费的频道(公众号)管理后台。
|
||||
* 超级群组功能,可以支持万人大群。
|
||||
* 支持多个IM服务组网互通,打破孤岛,适用于集团公司下多个分公司互联互通。
|
||||
* 社区版IM服务和移动端免费商用,可以免费构建出完备的移动互联网应用。
|
||||
* 收费项目非常便宜,野火独有的试用模式,可以先部署到客户环境试用6个月,试用满意后再购买,避免上当受骗。
|
||||
* 技术支持专业和高效,核心研发人员及时处理issue和论坛回复。
|
||||
* 技术支持专业高效,***核心研发***及时处理issue和工单,能最快解决用户的技术难题。技术支持不收费,让客户顺利使用是我们最大的愿望。
|
||||
|
||||
## 野火开源项目
|
||||
主要包括以下项目:
|
||||
@@ -119,6 +120,19 @@ mvn clean package
|
||||
|
||||
修改之后运行编译命令```mvn clean package```,rpm包生成在```distribution/target```目录下。
|
||||
|
||||
## Epoll
|
||||
在linux系统中打开Epoll开关可以提高性能,默认软件包内打包的是x86_64的epoll native sdk。如果是arm64的机器,可以把[broker pom](./broker/pom.xml)文件中修改如下:
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>io.netty</groupId>
|
||||
<artifactId>netty-transport-native-epoll</artifactId>
|
||||
<version>${netty.version}</version>
|
||||
<!-- <classifier>linux-x86_64</classifier>-->
|
||||
<classifier>linux-aarch_64</classifier>
|
||||
</dependency>
|
||||
```
|
||||
然后重新打包。专业版IM服务软件包中有arm64架构的sdk,可以直接替换。epoll只支持x86_64和arm64两个架构,其他架构不要把epoll开关打开。
|
||||
|
||||
## 升级说明
|
||||
1. 从0.42 版本增加了群成员数限制,默认为2000。如果您从之前的版本升级到这个版本或以后,需要注意到群成员数的限制。升级之后超出限制的群不受影响,但不能继续加人,如果您想修改默认值,可以在升级版本之后,修改t_setting表,把默认的大小改为您期望的人数。另外修改t_group表,把已经存在的群组max_member_count改成您期望的,然后重启。
|
||||
2. 0.50版本添加了是否允许客户端发送群操作通知的配置。如果您在客户端自定义群通知,需要在服务器端配置允许,没有使用自定义群操作通知的不受影响。***
|
||||
@@ -143,6 +157,9 @@ mvn clean package
|
||||
## 服务对象
|
||||
因为野火的使用范围比较广,难免被一些不法分子利用,国内反诈反赌力度很大,所以国内多地警方都跟我们都有过联系。***为了预防我们的产品被用于非法目的,试用及购买只能支持境内法人单位,不接受个人或者境外团体。如果我们发现产品被用于非法目的,我们会立即停止技术支持服务并且报警和配合警方调查。请用于非法目的用户绕行!***
|
||||
|
||||
## 常见问题
|
||||
请参考文档[常见问题](https://docs.wildfirechat.cn/faq/server.html)
|
||||
|
||||
## 应用截图
|
||||
登录界面
|
||||
|
||||
|
||||
@@ -68,6 +68,10 @@ token.key testim
|
||||
##是否使用AES256加密。默认客户端和服务器都是AES128加密,如果需要开启AES256,需要客户端和IM服务同时开通。
|
||||
#encrypt.use_aes256 true
|
||||
|
||||
##当创建一个对象时(用户,群组,频道,机器人等),如果没有传入ID,野火会为这个对象生成一个ID。如果id.use_uuid为true,会使用uuid作为对象ID,否则会使用野火短ID,默认为false。
|
||||
## 短ID有个很大的风险是容易被人穷举进行攻击。建议用UUID。
|
||||
id.use_uuid true
|
||||
|
||||
##首次登录,是否接收之前的历史消息。
|
||||
##0 不接收历史消息,只接收${message.compensate_time_limit}毫秒以内的消息,由于服务器没有保存已经收取记录,所以如果有超过${message.compensate_time_limit}毫秒之前未收取的消息也不会收取下拉;
|
||||
##1接收,会接收 message.max_queue 配置的条数的历史消息
|
||||
@@ -91,9 +95,15 @@ message.disable_stranger_chat false
|
||||
##当禁止陌生人聊天时,允许聊天的用户id,比如管理员或者文件传输助手等。用户id以英文逗号分割。
|
||||
message.allow_stranger_chat_list admin,FireRobot,wfc_file_transfer
|
||||
|
||||
##当禁止陌生人聊天时,允许聊天的线路。
|
||||
#message.allow_stranger_line 100,101
|
||||
|
||||
##黑名单策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃
|
||||
message.blacklist.strategy 0
|
||||
|
||||
##拉黑对方后,对方不能发送消息给你。这个开关确定拉黑对方后你还能不能给对方发送消息。
|
||||
message.blacklist.allow_send_to_black false
|
||||
|
||||
##是否禁止服务器端消息搜索,该功能暂未实现。目前的影响是如果打开,则存储消息时不单独保存_searchable_content字段
|
||||
message.disable_remote_search false
|
||||
|
||||
@@ -148,6 +158,10 @@ robot.callback_with_client_info false
|
||||
## 频道回调信息是否带上用户clientId和平台类型。
|
||||
channel.callback_with_client_info false
|
||||
|
||||
## 频道回调新方式,在新方式下,如果有callback地址就会总是回调客户端发送的消息(包括owner和订阅者)。automatic属性控制订阅者发送的消息是否发给owner, 0发,1不发。
|
||||
## 旧的方式是,automatic为0时,订阅者的消息发给owner,不转发消息到callback地址。为1时,把订阅者的消息转发给callback地址,不发给owner。
|
||||
channel.new_callback_feature true
|
||||
|
||||
##禁止搜索用户
|
||||
friend.disable_search false
|
||||
|
||||
@@ -169,6 +183,9 @@ friend.reject_request_duration 2592000000
|
||||
##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。
|
||||
friend.request_expiration_duration 604800000
|
||||
|
||||
##好友请求限制频率,一个用户24小时之内允许请求好友的次数,默认不限频。
|
||||
friend.request_rate_limit 30
|
||||
|
||||
##请求添加机器人为好友时,机器人是否自动接受,默认为true
|
||||
friend.robot_auto_accept true
|
||||
|
||||
@@ -250,15 +267,6 @@ client.request_rate_limit 100
|
||||
##关于对象存储的详细信息请参考:https://docs.wildfirechat.cn/server/oss.html
|
||||
media.server.use_qiniu 0
|
||||
|
||||
##媒体类型分类
|
||||
#Media_Type_GENERAL = 0,
|
||||
#Media_Type_IMAGE = 1,
|
||||
#Media_Type_VOICE = 2,
|
||||
#Media_Type_VIDEO = 3,
|
||||
#Media_Type_FILE = 4,
|
||||
#Media_Type_PORTRAIT = 5,
|
||||
#Media_Type_FAVORITE = 6
|
||||
|
||||
# qiniu media server configuration
|
||||
qiniu.server_url http://up.qbox.me
|
||||
qiniu.access_key tU3vdBK5BL5j4N7jI5N5uZgq_HQDo170w5C9Amnn
|
||||
@@ -282,11 +290,21 @@ qiniu.bucket_portrait_domain http://cdn2.wildfirechat.cn
|
||||
qiniu.bucket_favorite_name storage
|
||||
qiniu.bucket_favorite_domain http://cdn2.wildfirechat.cn
|
||||
|
||||
##媒体类型分类
|
||||
#Media_Type_GENERAL = 0,
|
||||
#Media_Type_IMAGE = 1,
|
||||
#Media_Type_VOICE = 2,
|
||||
#Media_Type_VIDEO = 3,
|
||||
#Media_Type_FILE = 4,
|
||||
#Media_Type_PORTRAIT = 5,
|
||||
#Media_Type_FAVORITE = 6,
|
||||
#Media_Type_STICKER = 7,
|
||||
#Media_Type_MOMENTS = 8
|
||||
|
||||
# local media server configuration
|
||||
# 本地媒体服务器配置。
|
||||
local.media.storage.root media
|
||||
# 如果使用内置文件存储,文件上传后地址默认为 http://server.ip:http_port/fs/5/2021/03/27/08/filename。
|
||||
# 如果使用内置文件存储,文件上传后地址默认为 http://server.ip:http_port/fs/5/2021/03/27/08/filename。fs目录下按照类型存放文件,媒体类型见上面注释,比如5就是Media_Type_PORTRAIT,是客户端的头像文件。
|
||||
# 如果需要使用nginx添加https支持,请打开下面配置,这样客户端得到的文件地址为 https://example.com/media/fs/5/2021/03/27/08/filename。
|
||||
# 需要nginx把请求从https://example.com/media/fs 转到 http://server.ip:http_port/fs。注意需要带上所有header。
|
||||
# 尽管内置文件存储可以使用,但是我们还是建议使用专业级别的对象存储服务,社区版可以使用七牛,专业版另外支持阿里云和也是私有对象存储。详情请参考 https://docs.wildfirechat.cn/server/oss.html
|
||||
@@ -312,7 +330,7 @@ server.mobile_default_silent_when_pc_online true
|
||||
|
||||
## 客户端是否支持kickoff事件。当客户端被其他端登录踢出时,如果此开关为false时,客户端协议栈上报secret_mismatch。如果此开关为ture时,客户端协议栈上报kicked_off。
|
||||
## 客户端被踢时上报kicked_off是在2021.9.15之后才加上的。如果客户端协议栈全部为此日期之后的版本才可以打开此开关。
|
||||
server.client_support_kickoff_event false
|
||||
server.client_support_kickoff_event true
|
||||
|
||||
#*********************************************************************
|
||||
# Push server configuration
|
||||
@@ -326,6 +344,10 @@ push.android.server.address http://localhost:8085/android/push
|
||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||
push.ios.server.address http://localhost:8085/ios/push
|
||||
|
||||
##鸿蒙推送服务器地址
|
||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||
push.harmony.server.address http://localhost:8085/harmony/push
|
||||
|
||||
#*********************************************************************
|
||||
# 监控配置
|
||||
#*********************************************************************
|
||||
|
||||
Executable
+13
@@ -0,0 +1,13 @@
|
||||
DROP TABLE IF EXISTS `t_domain`;
|
||||
CREATE TABLE `t_domain` (
|
||||
`_domain_id` varchar(64) NOT NULL PRIMARY KEY,
|
||||
`_name` varchar(64) NOT NULL,
|
||||
`_desc` varchar(256) DEFAULT '',
|
||||
`_email` varchar(64) DEFAULT '',
|
||||
`_tel` varchar(64) DEFAULT '',
|
||||
`_address` varchar(64) DEFAULT '',
|
||||
`_extra` varchar(1024) DEFAULT '',
|
||||
`_dt` bigint(20) NOT NULL
|
||||
);
|
||||
|
||||
alter table `t_user` add column `_external` tinyint DEFAULT 0;
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
DROP TABLE IF EXISTS `t_domain`;
|
||||
CREATE TABLE `t_domain` (
|
||||
`_domain_id` varchar(128) NOT NULL PRIMARY KEY,
|
||||
`_name` varchar(64) NOT NULL,
|
||||
`_desc` varchar(256) DEFAULT '',
|
||||
`_email` varchar(64) DEFAULT '',
|
||||
`_tel` varchar(64) DEFAULT '',
|
||||
`_address` varchar(64) DEFAULT '',
|
||||
`_extra` varchar(1024) DEFAULT '',
|
||||
`_dt` bigint(20) NOT NULL
|
||||
)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARACTER SET = utf8mb4
|
||||
COLLATE = utf8mb4_unicode_ci;
|
||||
|
||||
alter table `t_user` add column `_external` tinyint DEFAULT 0;
|
||||
+2
-4
@@ -5,7 +5,7 @@
|
||||
<relativePath>../</relativePath>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>1.2.5</version>
|
||||
<version>1.3.2</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>moquette-broker</artifactId>
|
||||
@@ -124,9 +124,7 @@
|
||||
<artifactId>netty-transport-native-epoll</artifactId>
|
||||
<version>${netty.version}</version>
|
||||
<classifier>linux-x86_64</classifier>
|
||||
<!--
|
||||
<classifier>${os.detected.name}-${os.detected.arch}</classifier>
|
||||
-->
|
||||
<!-- <classifier>linux-aarch_64</classifier>-->
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
||||
@@ -34,6 +34,7 @@ public class PushMessage {
|
||||
public String voipDeviceToken;
|
||||
public boolean isHiddenDetail;
|
||||
public String language;
|
||||
public boolean republish;
|
||||
public long messageId;
|
||||
|
||||
public PushMessage(String sender, int conversationType, String target, int line, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionedType, boolean isHiddenDetail, String language) {
|
||||
@@ -65,6 +66,7 @@ public class PushMessage {
|
||||
this.mentionedType = mentionedType;
|
||||
this.isHiddenDetail = isHiddenDetail;
|
||||
this.language = language;
|
||||
this.republish = messageContentType == 80 || messageContentType == 81;
|
||||
}
|
||||
public PushMessage(String sender, String target, long serverTime, String senderName, int unReceivedMsg, String language, int pushMessageType) {
|
||||
this.sender = sender;
|
||||
|
||||
@@ -24,8 +24,7 @@ import win.liyufan.im.Utility;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
import static io.moquette.BrokerConstants.PUSH_ANDROID_SERVER_ADDRESS;
|
||||
import static io.moquette.BrokerConstants.PUSH_IOS_SERVER_ADDRESS;
|
||||
import static io.moquette.BrokerConstants.*;
|
||||
import static win.liyufan.im.HttpUtils.HttpPostType.POST_TYPE_Push;
|
||||
|
||||
public class PushServer {
|
||||
@@ -47,6 +46,7 @@ public class PushServer {
|
||||
|
||||
private String androidPushServerUrl;
|
||||
private String iOSPushServerUrl;
|
||||
private String harmonyPushServerUrl;
|
||||
|
||||
private PushServer() {
|
||||
}
|
||||
@@ -59,6 +59,7 @@ public class PushServer {
|
||||
this.sessionsStore = sessionsStore;
|
||||
this.androidPushServerUrl = config.getProperty(PUSH_ANDROID_SERVER_ADDRESS);
|
||||
this.iOSPushServerUrl = config.getProperty(PUSH_IOS_SERVER_ADDRESS);
|
||||
this.harmonyPushServerUrl = config.getProperty(PUSH_HARMONY_SERVER_ADDRESS);
|
||||
}
|
||||
|
||||
public void pushMessage(PushMessage pushMessage, String deviceId, String pushContent) {
|
||||
@@ -106,6 +107,8 @@ public class PushServer {
|
||||
if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS || session.getPlatform() == ProtoConstants.Platform.Platform_iPad) {
|
||||
url = iOSPushServerUrl;
|
||||
pushMessage.voipDeviceToken = session.getVoipDeviceToken();
|
||||
} else if (session.getPlatform() == ProtoConstants.Platform.Platform_Harmony || session.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPad) {
|
||||
url = harmonyPushServerUrl;
|
||||
}
|
||||
HttpUtils.httpJsonPost(url, gson.toJson(pushMessage, pushMessage.getClass()), POST_TYPE_Push);
|
||||
} else {
|
||||
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.admin;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.*;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Route(APIPath.User_Batch_Get_Infos)
|
||||
@HttpMethod("POST")
|
||||
public class GetBatchUserAction extends AdminAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputStringList inputUserId = getRequestBody(request.getNettyRequest(), InputStringList.class);
|
||||
if (inputUserId != null && inputUserId.getList() != null && !inputUserId.getList().isEmpty()) {
|
||||
|
||||
OutputUserInfoList res = new OutputUserInfoList();
|
||||
res.userInfos = new ArrayList<>();
|
||||
for (String userId : inputUserId.getList()) {
|
||||
WFCMessage.User user = messagesStore.getUserInfo(userId);
|
||||
if(user == null || StringUtil.isNullOrEmpty(user.getName())) {
|
||||
continue;
|
||||
}
|
||||
InputOutputUserInfo inputOutputUserInfo = InputOutputUserInfo.fromPbUser(user);
|
||||
res.userInfos.add(inputOutputUserInfo);
|
||||
}
|
||||
RestResult result = RestResult.ok(res);
|
||||
setResponseContent(result, response);
|
||||
} else {
|
||||
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -53,6 +53,7 @@ public class GetGroupInfoAction extends AdminAction {
|
||||
pojoGroupInfo.setPortrait(groupInfo.getPortrait());
|
||||
pojoGroupInfo.setTarget_id(groupInfo.getTargetId());
|
||||
pojoGroupInfo.setType(groupInfo.getType());
|
||||
pojoGroupInfo.setMember_count(groupInfo.getMemberCount());
|
||||
pojoGroupInfo.setMute(groupInfo.getMute());
|
||||
pojoGroupInfo.setJoin_type(groupInfo.getJoinType());
|
||||
pojoGroupInfo.setPrivate_chat(groupInfo.getPrivateChat());
|
||||
@@ -61,6 +62,8 @@ public class GetGroupInfoAction extends AdminAction {
|
||||
pojoGroupInfo.setHistory_message(groupInfo.getHistoryMessage());
|
||||
pojoGroupInfo.setSuper_group(groupInfo.getSuperGroup()>0);
|
||||
pojoGroupInfo.setDeleted(groupInfo.getDeleted()>0);
|
||||
pojoGroupInfo.setUpdate_dt(groupInfo.getUpdateDt());
|
||||
pojoGroupInfo.setMember_update_dt(groupInfo.getMemberUpdateDt());
|
||||
result = RestResult.ok(pojoGroupInfo);
|
||||
}
|
||||
setResponseContent(result, response);
|
||||
|
||||
@@ -52,6 +52,7 @@ public class GetGroupInfoAction extends RobotAction {
|
||||
pojoGroupInfo.setPortrait(groupInfo.getPortrait());
|
||||
pojoGroupInfo.setTarget_id(groupInfo.getTargetId());
|
||||
pojoGroupInfo.setType(groupInfo.getType());
|
||||
pojoGroupInfo.setMember_count(groupInfo.getMemberCount());
|
||||
pojoGroupInfo.setMute(groupInfo.getMute());
|
||||
pojoGroupInfo.setJoin_type(groupInfo.getJoinType());
|
||||
pojoGroupInfo.setPrivate_chat(groupInfo.getPrivateChat());
|
||||
@@ -60,6 +61,8 @@ public class GetGroupInfoAction extends RobotAction {
|
||||
pojoGroupInfo.setHistory_message(groupInfo.getHistoryMessage());
|
||||
pojoGroupInfo.setSuper_group(groupInfo.getSuperGroup()>0);
|
||||
pojoGroupInfo.setDeleted(groupInfo.getDeleted()>0);
|
||||
pojoGroupInfo.setUpdate_dt(groupInfo.getUpdateDt());
|
||||
pojoGroupInfo.setMember_update_dt(groupInfo.getMemberUpdateDt());
|
||||
result = RestResult.ok(pojoGroupInfo);
|
||||
}
|
||||
setResponseContent(result, response);
|
||||
|
||||
@@ -80,6 +80,7 @@ public class UpdateProfileAction extends RobotAction {
|
||||
RestResult result = RestResult.ok();
|
||||
if(modified) {
|
||||
try {
|
||||
builder.setUpdateDt(System.currentTimeMillis());
|
||||
messagesStore.updateUserInfo(builder.build());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -90,6 +90,7 @@ public final class BrokerConstants {
|
||||
|
||||
public static final String PUSH_ANDROID_SERVER_ADDRESS = "push.android.server.address";
|
||||
public static final String PUSH_IOS_SERVER_ADDRESS = "push.ios.server.address";
|
||||
public static final String PUSH_HARMONY_SERVER_ADDRESS = "push.harmony.server.address";
|
||||
|
||||
public static final String MONITOR_Exception_Event_Address = "monitor.exception_event_address";
|
||||
|
||||
@@ -115,6 +116,8 @@ public final class BrokerConstants {
|
||||
public static final String CONNECT_CLIENT_SIGNATURE_LIST = "connect.client_signature_list";
|
||||
public static final String CONNECT_REJECT_EMPTY_SIGNATURE = "connect.reject_empty_signature";
|
||||
|
||||
public static final String ID_USE_UUID = "id.use_uuid";
|
||||
|
||||
public static final String EMBED_DB_PROPERTY_NAME = "embed.db";
|
||||
public static final String DB_AUTO_CLEAN_HISTORY_MESSAGES = "db.auto_clean_history_messages";
|
||||
public static final String H2DB_PATH = "h2db.path";
|
||||
@@ -149,8 +152,10 @@ public final class BrokerConstants {
|
||||
|
||||
public static final String MESSAGE_Disable_Stranger_Chat = "message.disable_stranger_chat";
|
||||
public static final String MESSAGE_Allow_Stranger_Chat_List = "message.allow_stranger_chat_list";
|
||||
public static final String MESSAGE_Allow_Stranger_Line = "message.allow_stranger_line";
|
||||
|
||||
public static final String MESSAGE_Blacklist_Strategy = "message.blacklist.strategy";
|
||||
public static final String MESSAGE_Blacklist_Allow_Send = "message.blacklist.allow_send_to_black";
|
||||
|
||||
public static final String MESSAGE_NO_Forward_Admin_Message = "message.no_forward_admin_message";
|
||||
|
||||
@@ -163,6 +168,8 @@ public final class BrokerConstants {
|
||||
|
||||
public static final String ROBOT_Callback_With_Client_Info = "robot.callback_with_client_info";
|
||||
public static final String CHANNEL_Callback_With_Client_Info = "channel.callback_with_client_info";
|
||||
public static final String CHANNEL_New_Callback_Feature = "channel.new_callback_feature";
|
||||
|
||||
|
||||
public static final String FRIEND_Disable_Search = "friend.disable_search";
|
||||
public static final String FRIEND_Disable_NickName_Search = "friend.disable_nick_name_search";
|
||||
@@ -171,6 +178,7 @@ public final class BrokerConstants {
|
||||
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 FRIEND_Request_Rate_Limit = "friend.request_rate_limit";
|
||||
public static final String FRIEND_Request_Robot_Auto_Accept = "friend.robot_auto_accept";
|
||||
|
||||
|
||||
|
||||
@@ -24,7 +24,8 @@ public class AddFriendHandler extends GroupHandler<WFCMessage.AddFriendRequest>
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.AddFriendRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||
long[] head = new long[1];
|
||||
boolean isAdmin = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Admin;
|
||||
ErrorCode errorCode = m_messagesStore.saveAddFriendRequest(fromUser, request, head, isAdmin);
|
||||
boolean isRobot = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Robot;
|
||||
ErrorCode errorCode = m_messagesStore.saveAddFriendRequest(fromUser, request, head, isAdmin, isRobot);
|
||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||
WFCMessage.User user = m_messagesStore.getUserInfo(request.getTargetUid());
|
||||
if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) {
|
||||
|
||||
@@ -43,7 +43,7 @@ public class AddGroupMember extends GroupHandler<WFCMessage.AddGroupMemberReques
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, getMemberIdList(request.getAddedMemberList())).getAddGroupNotifyContent();
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, getMemberIdList(request.getAddedMemberList())).setExtra(request.getExtra()).getAddGroupNotifyContent();
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupReque
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, groupInfo.getName(), "").getCreateGroupNotifyContent();
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, groupInfo.getName(), "").setExtra(request.getMemberExtra()).getCreateGroupNotifyContent();
|
||||
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), content);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,13 +43,13 @@ public class QuitGroupHandler extends GroupHandler<WFCMessage.QuitGroupRequest>
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").getQuitGroupNotifyContent();
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getKeepMsg()>0?"1":"0", "").getQuitGroupNotifyContent();
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
|
||||
}
|
||||
|
||||
if((m_messagesStore.getVisibleQuitKickoffNotification() & 0x01) > 0) {
|
||||
Set<String> toUsers = m_messagesStore.getGroupManagers(request.getGroupId(), true);
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").getQuitVisibleGroupNotifyContent();
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getKeepMsg()>0?"1":"0", "").getQuitVisibleGroupNotifyContent();
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content, toUsers);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
private Set<Integer> mForwardExcludeMessageTypes = new HashSet<>();
|
||||
private String mMentionForwardUrl = null;
|
||||
private int mBlacklistStrategy = 0; //黑名单中时,0失败,1吞掉。
|
||||
private boolean mBlacklistAllowSend2Black = true;
|
||||
private boolean mNoForwardAdminMessage = false;
|
||||
|
||||
private String mRemoteSensitiveServerUrl = null;
|
||||
@@ -69,6 +70,12 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
|
||||
try {
|
||||
mBlacklistAllowSend2Black = Boolean.parseBoolean(mServer.getConfig().getProperty(BrokerConstants.MESSAGE_Blacklist_Allow_Send, "true"));
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
try {
|
||||
mRemoteSensitiveServerUrl = mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Remote_Server_URL);
|
||||
if(!StringUtil.isNullOrEmpty(mRemoteSensitiveServerUrl)) {
|
||||
@@ -145,7 +152,7 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
|
||||
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||
if(!m_messagesStore.getBlackListExceptionTypes().contains(message.getContent().getType())) {
|
||||
errorCode = m_messagesStore.isAllowUserMessage(message.getConversation().getTarget(), fromUser);
|
||||
errorCode = m_messagesStore.isAllowUserMessage(message.getConversation().getTarget(), fromUser, message.getConversation().getLine());
|
||||
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
if (errorCode == ErrorCode.ERROR_CODE_IN_BLACK_LIST && mBlacklistStrategy != ProtoConstants.BlacklistStrategy.Message_Reject) {
|
||||
ignoreMsg = true;
|
||||
@@ -154,6 +161,13 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
return errorCode;
|
||||
}
|
||||
}
|
||||
|
||||
if(!mBlacklistAllowSend2Black) {
|
||||
errorCode = m_messagesStore.isBlacked(fromUser, message.getConversation().getTarget());
|
||||
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
return errorCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
userStatus = m_messagesStore.getUserStatus(message.getConversation().getTarget());
|
||||
|
||||
@@ -1136,7 +1136,16 @@ public class DatabaseStore {
|
||||
}
|
||||
|
||||
if (!expired) {
|
||||
messages.add(message);
|
||||
boolean duplicated = false;
|
||||
for (WFCMessage.Message msg : messages) {
|
||||
if(message.getMessageId() == msg.getMessageId()) {
|
||||
duplicated = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!duplicated) {
|
||||
messages.add(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2194,6 +2203,7 @@ public class DatabaseStore {
|
||||
", `_join_type`" +
|
||||
", `_private_chat`" +
|
||||
", `_searchable`" +
|
||||
", _deleted" +
|
||||
" from t_group where `_gid` = ?";
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
@@ -2250,6 +2260,9 @@ public class DatabaseStore {
|
||||
intValue = rs.getInt(index++);
|
||||
builder.setSearchable(intValue);
|
||||
|
||||
intValue = rs.getInt(index++);
|
||||
builder.setDeleted(intValue);
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
@@ -3758,7 +3771,11 @@ public class DatabaseStore {
|
||||
sql += " where `_name` = ?";
|
||||
}
|
||||
|
||||
sql += " and _status = 0";
|
||||
sql += " and _status <> 64";
|
||||
sql += " and _status <> 16";
|
||||
sql += " and _status <> 17";
|
||||
sql += " and _status <> 24";
|
||||
sql += " and _status <> 25";
|
||||
|
||||
sql += " limit 20";
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ 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 cn.wildfirechat.pojos.MyInfoType.*;
|
||||
import static win.liyufan.im.UserSettingScope.kUserSettingAddFriendNoVerify;
|
||||
import static win.liyufan.im.UserSettingScope.kUserSettingAddFriendStrategy;
|
||||
import static win.liyufan.im.UserSettingScope.kUserSettingPCOnline;
|
||||
|
||||
public class MemoryMessagesStore implements IMessagesStore {
|
||||
@@ -155,6 +155,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
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 RateLimiter mFriendRateLimiter;
|
||||
private boolean mFriendRobotAutoAccept = true;
|
||||
|
||||
private long mPushExpiredTimes = 604800000L;
|
||||
@@ -164,8 +165,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
private boolean mMobileDefaultSilentWhenPCOnline = true;
|
||||
private boolean mDisableStrangerChat = false;
|
||||
private Set<String> mAllowStrangerChatSet = new HashSet<>();
|
||||
private Set<Integer> mAllowStrangerLineSet = new HashSet<>();
|
||||
private boolean mDisableStrangerAddGroup = false;
|
||||
|
||||
private boolean mIDUseUUID = true;
|
||||
|
||||
private Set<String> mClientSignatureSet = new HashSet<>();
|
||||
private boolean mRejectEmptySignature = true;
|
||||
|
||||
@@ -203,6 +207,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
private boolean mForwardMessageWithClientInfo = false;
|
||||
private boolean mRobotCallbackWithClientInfo = false;
|
||||
private boolean mChannelCallbackWithClientInfo = false;
|
||||
private boolean mChannelNewCallbackFeature = true;
|
||||
|
||||
private Set<Integer> mUserHideProperties = new HashSet<>();
|
||||
|
||||
@@ -261,6 +266,18 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
try {
|
||||
String allowStrangerList = m_Server.getConfig().getProperty(BrokerConstants.MESSAGE_Allow_Stranger_Line);
|
||||
if(!StringUtil.isNullOrEmptyAfterTrim(allowStrangerList)) {
|
||||
allowStrangerList = allowStrangerList.replace(",", ",");
|
||||
for (String s : allowStrangerList.split(",")) {
|
||||
mAllowStrangerLineSet.add(Integer.parseInt(s.trim()));
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
try {
|
||||
String forcePushTypes = m_Server.getConfig().getProperty(BrokerConstants.MESSAGE_Force_Push_Types);
|
||||
if(!StringUtil.isNullOrEmptyAfterTrim(forcePushTypes)) {
|
||||
@@ -341,6 +358,13 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
printMissConfigLog(FRIEND_Request_Expiration_Duration, mFriendRequestExpiration + "");
|
||||
}
|
||||
|
||||
try {
|
||||
int friendRequestRateLimit = Integer.parseInt(m_Server.getConfig().getProperty(FRIEND_Request_Rate_Limit, "0"));
|
||||
if(friendRequestRateLimit > 0) {
|
||||
mFriendRateLimiter = new RateLimiter(86400, friendRequestRateLimit);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
try {
|
||||
mFriendRobotAutoAccept = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Request_Robot_Auto_Accept, "true"));
|
||||
@@ -602,13 +626,22 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
try {
|
||||
mChannelCallbackWithClientInfo = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.CHANNEL_Callback_With_Client_Info, "false"));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
try {
|
||||
mChannelNewCallbackFeature = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.CHANNEL_New_Callback_Feature, "true"));
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
try {
|
||||
mRecallForwardUrl = server.getConfig().getProperty(BrokerConstants.MESSAGE_RecallMsg_Forward_Url);
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
mIDUseUUID = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.ID_USE_UUID, "false"));
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
|
||||
private void printMissConfigLog(String config, String defaultValue) {
|
||||
@@ -713,7 +746,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
pullType = ProtoConstants.PullType.Pull_Normal;
|
||||
} else if (type == ProtoConstants.ConversationType.ConversationType_ChatRoom) {
|
||||
boolean isDirect = !StringUtil.isNullOrEmpty(message.getToUser());
|
||||
boolean isDirect = !StringUtil.isNullOrEmpty(message.getToUser()) || !message.getToList().isEmpty();
|
||||
Collection<UserClientEntry> entries = getChatroomMembers(message.getConversation().getTarget());
|
||||
for (UserClientEntry entry : entries) {
|
||||
if (isDirect) {
|
||||
@@ -721,6 +754,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
notifyReceivers.add(message.getToUser());
|
||||
break;
|
||||
}
|
||||
if (message.getToList().contains(entry.userId)) {
|
||||
notifyReceivers.add(entry.userId);
|
||||
}
|
||||
} else {
|
||||
notifyReceivers.add(entry.userId);
|
||||
}
|
||||
@@ -732,7 +768,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
if (channelInfo != null) {
|
||||
if (channelInfo.getOwner().equals(fromUser)) {
|
||||
if(requestSourceType == ProtoConstants.RequestSourceType.Request_From_Channel
|
||||
&& channelInfo.getAutomatic() != 0) {
|
||||
&& channelInfo.getAutomatic() != 0 && !isChannelNewCallbackFeature()) {
|
||||
LOG.info("Channel api message not send to the owner when automatic");
|
||||
} else {
|
||||
notifyReceivers.add(fromUser);
|
||||
@@ -762,7 +798,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
} else {
|
||||
notifyReceivers.add(fromUser);
|
||||
if (channelInfo.getAutomatic() == 0) {
|
||||
if (channelInfo.getAutomatic() == 0 || isChannelNewCallbackFeature()) {
|
||||
notifyReceivers.add(channelInfo.getOwner());
|
||||
} else {
|
||||
LOG.info("Channel api message not send to the owner when automatic");
|
||||
@@ -1720,8 +1756,19 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
WFCMessage.GroupMember newOwner = null;
|
||||
for (WFCMessage.GroupMember member :members) {
|
||||
if (!member.getMemberId().equals(operator) && member.getType() != GroupMemberType_Removed) {
|
||||
newOwner = member;
|
||||
break;
|
||||
if(newOwner == null) {
|
||||
newOwner = member;
|
||||
} else {
|
||||
if(newOwner.getType() == GroupMemberType_Silent && member.getType() != GroupMemberType_Silent) {
|
||||
newOwner = member;
|
||||
} else if(newOwner.getType() != GroupMemberType_Manager && member.getType() == GroupMemberType_Manager) {
|
||||
newOwner = member;
|
||||
} else if(newOwner.getType() == member.getType()) {
|
||||
if(newOwner.getCreateDt() > member.getCreateDt() && member.getCreateDt() > 0) {
|
||||
newOwner = member;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2088,8 +2135,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
for (WFCMessage.UserRequest request : requests) {
|
||||
WFCMessage.GroupInfo groupInfo = mIMap.get(request.getUid());
|
||||
if (groupInfo != null && groupInfo.getUpdateDt() > request.getUpdateDt()) {
|
||||
if(!isAdmin && !StringUtil.isNullOrEmpty(fromUser)) {
|
||||
if(!isAdmin && !StringUtil.isNullOrEmpty(fromUser) && groupInfo.getDeleted() == 0) {
|
||||
WFCMessage.GroupMember gm = getGroupMember(groupInfo.getTargetId(), fromUser);
|
||||
if((gm == null || gm.getType() == GroupMemberType_Removed) && request.getUpdateDt() > 0) {
|
||||
continue;
|
||||
}
|
||||
if(gm == null) {
|
||||
groupInfo = groupInfo.toBuilder().setMemberUpdateDt(-1).build();
|
||||
} else if(gm.getType() == GroupMemberType_Removed) {
|
||||
@@ -2402,7 +2452,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
WFCMessage.GroupInfo groupInfo = groupMap.get(message.getConversation().getTarget());
|
||||
if (groupInfo == null) {
|
||||
return ErrorCode.ERROR_CODE_RECALL_TIME_EXPIRED;
|
||||
LOG.info("recall message failure, group {} not exist", message.getConversation().getTarget());
|
||||
return ErrorCode.ERROR_CODE_NOT_EXIST;
|
||||
}
|
||||
if (operatorId.equals(groupInfo.getOwner())) {
|
||||
if(operatorId.equals(message.getFromUser())) {
|
||||
@@ -2839,7 +2890,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
IMap<String, Integer> mUserMap = hzInstance.getMap(USER_STATUS);
|
||||
ArrayList<InputOutputUserBlockStatus> out = new ArrayList<>();
|
||||
for (Map.Entry<String, Integer> entry : mUserMap.entrySet()) {
|
||||
out.add(new InputOutputUserBlockStatus(entry.getKey(), entry.getValue()));
|
||||
if(entry.getValue() > 0) {
|
||||
out.add(new InputOutputUserBlockStatus(entry.getKey(), entry.getValue()));
|
||||
}
|
||||
}
|
||||
return out;
|
||||
}
|
||||
@@ -3156,7 +3209,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ErrorCode isAllowUserMessage(String targetUser, String fromUser) {
|
||||
public ErrorCode isAllowUserMessage(String targetUser, String fromUser, int line) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||
|
||||
@@ -3183,7 +3236,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
if (mDisableStrangerChat) {
|
||||
//在禁止私聊时,是否是允许私聊的用户id
|
||||
if(mAllowStrangerChatSet.contains(targetUser) || mAllowStrangerChatSet.contains(fromUser)) {
|
||||
if(mAllowStrangerChatSet.contains(targetUser) || mAllowStrangerChatSet.contains(fromUser) || mAllowStrangerLineSet.contains(line)) {
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -3207,6 +3260,30 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ErrorCode isBlacked(String fromUser, String userId) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||
|
||||
Collection<FriendData> friendDatas = friendsMap.get(fromUser);
|
||||
|
||||
if (friendDatas == null || friendDatas.size() == 0) {
|
||||
friendDatas = loadFriend(friendsMap, fromUser);
|
||||
}
|
||||
|
||||
for (FriendData friendData : friendDatas) {
|
||||
if (friendData.getFriendUid().equals(userId)) {
|
||||
if (friendData.getBlacked() == 1) {
|
||||
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
synchronized Collection<FriendData> loadFriend(MultiMap<String, FriendData> friendsMap, String userId) {
|
||||
Collection<FriendData> friends = databaseStore.getPersistFriends(userId);
|
||||
if (friends != null) {
|
||||
@@ -3324,16 +3401,28 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin) {
|
||||
public ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin, boolean isRobot) {
|
||||
if (!isAdmin && mDisableFriendRequest) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
if(!isRobot && !isAdmin && mFriendRateLimiter != null) {
|
||||
if(!mFriendRateLimiter.isGranted(userId)) {
|
||||
LOG.error("User {} request add friend over frequency", userId);
|
||||
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
||||
}
|
||||
}
|
||||
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
MultiMap<String, WFCMessage.FriendRequest> requestMap = hzInstance.getMultiMap(USER_FRIENDS_REQUEST);
|
||||
|
||||
WFCMessage.UserSettingEntry userSettingData = getUserSetting(request.getTargetUid(), kUserSettingAddFriendNoVerify, "");
|
||||
WFCMessage.UserSettingEntry userSettingData = getUserSetting(request.getTargetUid(), kUserSettingAddFriendStrategy, "");
|
||||
boolean noVerify = userSettingData != null && "1".equals(userSettingData.getValue());
|
||||
boolean noAllow = userSettingData != null && "2".equals(userSettingData.getValue());
|
||||
|
||||
if(noAllow) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
Collection<WFCMessage.FriendRequest> requests = requestMap.get(userId);
|
||||
if (requests == null || requests.size() == 0) {
|
||||
@@ -4631,6 +4720,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return mChannelCallbackWithClientInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChannelNewCallbackFeature() {
|
||||
return mChannelNewCallbackFeature;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRobotAutoAcceptFriendRequest() {
|
||||
return mFriendRobotAutoAccept;
|
||||
@@ -4764,9 +4858,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
@Override
|
||||
public String getShortUUID(){
|
||||
int id = databaseStore.getGeneratedId();
|
||||
if (id > 0) {
|
||||
return IDUtils.toUid(id);
|
||||
if(!mIDUseUUID) {
|
||||
int id = databaseStore.getGeneratedId();
|
||||
if (id > 0) {
|
||||
return IDUtils.toUid(id);
|
||||
}
|
||||
}
|
||||
return UUIDGenerator.getUUID();
|
||||
}
|
||||
|
||||
@@ -140,7 +140,7 @@ public class Server {
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(instance::stopServer));
|
||||
Runtime.getRuntime().addShutdownHook(new Thread(httpServer::shutdown));
|
||||
|
||||
System.out.println("Wildfire IM server start success...");
|
||||
System.out.println("Wildfire IM server start success.");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -135,7 +135,6 @@ public class NettyAcceptor implements ServerAcceptor {
|
||||
}
|
||||
}
|
||||
})
|
||||
.option(ChannelOption.SO_BACKLOG, 10240) // 服务端可连接队列大小
|
||||
.option(ChannelOption.SO_BACKLOG, nettySoBacklog)
|
||||
.option(ChannelOption.SO_REUSEADDR, nettySoReuseaddr)
|
||||
.childOption(ChannelOption.TCP_NODELAY, nettyTcpNodelay)
|
||||
|
||||
@@ -179,13 +179,14 @@ public interface IMessagesStore {
|
||||
void clearUserFriend(String userId);
|
||||
List<WFCMessage.FriendRequest> getFriendRequestList(String userId, long version);
|
||||
|
||||
ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin);
|
||||
ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin, boolean isRobot);
|
||||
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 isAllowUserMessage(String fromUser, String userId, int line);
|
||||
ErrorCode isBlacked(String fromUser, String userId);
|
||||
ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] head);
|
||||
ErrorCode setFriendExtraRequest(String fromUser, String targetUserId, String extra, long[] head);
|
||||
|
||||
@@ -243,6 +244,7 @@ public interface IMessagesStore {
|
||||
boolean isForwardMessageWithClientInfo();
|
||||
boolean isRobotCallbackWithClientInfo();
|
||||
boolean isChannelCallbackWithClientInfo();
|
||||
boolean isChannelNewCallbackFeature();
|
||||
|
||||
boolean isRobotAutoAcceptFriendRequest();
|
||||
|
||||
|
||||
@@ -451,6 +451,7 @@ public class MessagesPublisher {
|
||||
WFCMessage.Message message = m_messagesStore.getMessage(messageHead);
|
||||
|
||||
if (message != null) {
|
||||
message = message.toBuilder().setMessageId(0).build();
|
||||
for (String user : receivers) {
|
||||
Collection<Session> sessions = m_sessionsStore.sessionForUser(user);
|
||||
|
||||
@@ -668,7 +669,15 @@ public class MessagesPublisher {
|
||||
public void publish2Receivers(WFCMessage.Message message, Set<String> receivers, String exceptClientId, int pullType) {
|
||||
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Channel) {
|
||||
WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(message.getConversation().getTarget());
|
||||
if (channelInfo != null && !StringUtil.isNullOrEmpty(channelInfo.getCallback()) && channelInfo.getAutomatic() == 1 && !message.getFromUser().equals(channelInfo.getOwner())) {
|
||||
|
||||
boolean forwardMsg;
|
||||
if(m_messagesStore.isChannelNewCallbackFeature()) {
|
||||
forwardMsg = channelInfo != null && !StringUtil.isNullOrEmpty(channelInfo.getCallback()) && !StringUtil.isNullOrEmpty(exceptClientId);
|
||||
} else {
|
||||
forwardMsg = channelInfo != null && !StringUtil.isNullOrEmpty(channelInfo.getCallback()) && channelInfo.getAutomatic() == 1 && !message.getFromUser().equals(channelInfo.getOwner());
|
||||
}
|
||||
|
||||
if (forwardMsg) {
|
||||
OutputClient outputClient = null;
|
||||
if(m_messagesStore.isChannelCallbackWithClientInfo() && !StringUtil.isNullOrEmpty(exceptClientId)) {
|
||||
Session session = m_sessionsStore.getSession(exceptClientId);
|
||||
@@ -767,7 +776,10 @@ public class MessagesPublisher {
|
||||
}
|
||||
|
||||
public void notifyChannelListenStatusChanged(WFCMessage.ChannelInfo channelInfo, String user, boolean listen) {
|
||||
if (channelInfo == null || StringUtil.isNullOrEmpty(channelInfo.getCallback()) || channelInfo.getAutomatic() == 0) {
|
||||
if (channelInfo == null || StringUtil.isNullOrEmpty(channelInfo.getCallback())) {
|
||||
return;
|
||||
}
|
||||
if(!m_messagesStore.isChannelNewCallbackFeature() && channelInfo.getAutomatic() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ public class HttpUtils {
|
||||
if(httpCallback != null) {
|
||||
int code = response.code();
|
||||
if(code == 200) {
|
||||
if(response.body() != null && response.body().contentLength() > 0) {
|
||||
if(response.body() != null) {
|
||||
httpCallback.onSuccess(response.body().string());
|
||||
} else {
|
||||
httpCallback.onSuccess(null);
|
||||
|
||||
@@ -20,5 +20,5 @@ public interface UserSettingScope {
|
||||
int kUserSettingPttSilent = 25;
|
||||
int kUserSettingGroupRemark = 26;
|
||||
int kUserSettingPrivacySearchable = 27;
|
||||
int kUserSettingAddFriendNoVerify = 28;
|
||||
int kUserSettingAddFriendStrategy = 28;
|
||||
}
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>1.2.5</version>
|
||||
<version>1.3.2</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -17,9 +17,15 @@ public interface APIPath {
|
||||
String Sensitive_Del = "/admin/sensitive/del";
|
||||
String Sensitive_Query = "/admin/sensitive/query";
|
||||
|
||||
String Create_Domain = "/admin/domain/create";
|
||||
String Get_Domain = "/admin/domain/get";
|
||||
String Destroy_Domain = "/admin/domain/destroy";
|
||||
String List_Domain = "/admin/domain/list";
|
||||
|
||||
String Create_User = "/admin/user/create";
|
||||
String Update_User = "/admin/user/update";
|
||||
String Destroy_User = "/admin/user/destroy";
|
||||
String Search_User = "/admin/user/search_user";
|
||||
String Create_Robot = "/admin/robot/create";
|
||||
String CreateOrUpdate_Device = "/admin/device/create";
|
||||
String Get_Device = "/admin/device/get";
|
||||
@@ -27,6 +33,7 @@ public interface APIPath {
|
||||
String User_Get_Token = "/admin/user/get_token";
|
||||
String User_Update_Block_Status = "/admin/user/update_block_status";
|
||||
String User_Get_Info = "/admin/user/get_info";
|
||||
String User_Batch_Get_Infos = "/admin/user/batch_get_infos";
|
||||
String User_Get_Email_Info = "/admin/user/get_info_by_email";
|
||||
String User_Get_All = "/admin/user/all";
|
||||
String User_Get_Robot_Info = "/admin/user/get_robot_info";
|
||||
@@ -52,7 +59,10 @@ public interface APIPath {
|
||||
String Friend_Get_Requests = "/admin/friend/get_requests";
|
||||
String Relation_Get = "/admin/relation/get";
|
||||
|
||||
String Handle_Friend_Send_Request = "/admin/friend/handle_send_request";
|
||||
|
||||
String Msg_Send = "/admin/message/send";
|
||||
String Msg_Publish = "/admin/message/publish";
|
||||
String Msg_Recall = "/admin/message/recall";
|
||||
String Msg_Delete = "/admin/message/delete";
|
||||
String Msg_Update = "/admin/message/update";
|
||||
@@ -61,6 +71,8 @@ public interface APIPath {
|
||||
String Msg_Multicast = "/admin/message/multicast";
|
||||
String Msg_RecallBroadCast = "/admin/message/recall_broadcast";
|
||||
String Msg_RecallMultiCast = "/admin/message/recall_multicast";
|
||||
String Msg_DeleteBroadCast = "/admin/message/delete_broadcast";
|
||||
String Msg_DeleteMultiCast = "/admin/message/delete_multicast";
|
||||
String Msg_ConvRead = "/admin/message/conv_read";
|
||||
String Msg_Delivery = "/admin/message/delivery";
|
||||
String Conversation_Delete = "/admin/conversation/delete";
|
||||
@@ -70,6 +82,7 @@ public interface APIPath {
|
||||
String Group_Dismiss = "/admin/group/del";
|
||||
String Group_Transfer = "/admin/group/transfer";
|
||||
String Group_Get_Info = "/admin/group/get_info";
|
||||
String Group_Batch_Info = "/admin/group/batch_infos";
|
||||
String Group_Modify_Info = "/admin/group/modify";
|
||||
String Group_Member_List = "/admin/group/member/list";
|
||||
String Group_Member_Get = "/admin/group/member/get";
|
||||
@@ -85,6 +98,10 @@ public interface APIPath {
|
||||
String Group_Set_Member_Extra = "/admin/group/member/set_extra";
|
||||
String Get_Common_Groups = "/admin/group/common_group";
|
||||
|
||||
String Sync_Group = "/admin/mesh/group_sync";
|
||||
String Conference_User_Request = "/admin/conference/user_request";
|
||||
String Conference_User_Event = "/admin/conference/user_event";
|
||||
|
||||
String Create_Channel = "/admin/channel/create";
|
||||
String Destroy_Channel = "/admin/channel/destroy";
|
||||
String Get_Channel_Info = "/admin/channel/get";
|
||||
@@ -140,5 +157,17 @@ public interface APIPath {
|
||||
String Robot_Group_Transfer = "/robot/group/transfer";
|
||||
String Robot_Group_Set_Manager = "/robot/group/manager/set";
|
||||
|
||||
String Robot_Moments_Post_Feed = "/robot/moments/feed/post";
|
||||
String Robot_Moments_Pull_Feeds = "/robot/moments/feed/pull";
|
||||
String Robot_Moments_Update_Feed = "/robot/moments/feed/update";
|
||||
String Robot_Moments_Post_Comment = "/robot/moments/comment/post";
|
||||
String Robot_Moments_Pull_Comment = "/robot/moments/comment/pull";
|
||||
String Robot_Moments_Fetch_Feed = "/robot/moments/feed/pull_one";
|
||||
String Robot_Moments_Fetch_Profiles = "/robot/moments/profiles/pull";
|
||||
String Robot_Moments_Recall_Comment = "/robot/moments/comment/recall";
|
||||
String Robot_Moments_Recall_Feed = "/robot/moments/feed/recall";
|
||||
String Robot_Moments_Update_Profiles_List_Value = "/robot/moments/profiles/list/push";
|
||||
String Robot_Moments_Update_Profiles_Value = "/robot/moments/profiles/value/push";
|
||||
|
||||
String Robot_Conference_Request = "/robot/conference/request";
|
||||
}
|
||||
|
||||
-19
@@ -1,19 +0,0 @@
|
||||
package cn.wildfirechat.messagecontentbuilder;
|
||||
|
||||
import cn.wildfirechat.pojos.MessagePayload;
|
||||
|
||||
abstract public class MediaMessageContentBuilder extends MessageContentBuilder{
|
||||
private String remoteMediaUrl;
|
||||
|
||||
public MediaMessageContentBuilder remoteMediaUrl(String remoteMediaUrl) {
|
||||
this.remoteMediaUrl = remoteMediaUrl;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MessagePayload encodeBase() {
|
||||
MessagePayload payload = super.encodeBase();
|
||||
payload.setRemoteMediaUrl(remoteMediaUrl);
|
||||
return payload;
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
package cn.wildfirechat.messagecontentbuilder;
|
||||
|
||||
import cn.wildfirechat.pojos.MessagePayload;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public abstract class MessageContentBuilder {
|
||||
private int mentionedType;
|
||||
private List<String> mentionedTargets;
|
||||
private String extra;
|
||||
public MessageContentBuilder mentionedType(int mentionedType) {
|
||||
this.mentionedType = mentionedType;
|
||||
return this;
|
||||
}
|
||||
public MessageContentBuilder mentionedTargets(List<String> mentionedTargets) {
|
||||
this.mentionedTargets = mentionedTargets;
|
||||
return this;
|
||||
}
|
||||
|
||||
public MessageContentBuilder extra(String extra) {
|
||||
this.extra = extra;
|
||||
return this;
|
||||
}
|
||||
|
||||
protected MessagePayload encodeBase() {
|
||||
MessagePayload payload = new MessagePayload();
|
||||
payload.setMentionedType(mentionedType);
|
||||
payload.setMentionedTarget(mentionedTargets);
|
||||
payload.setExtra(extra);
|
||||
return payload;
|
||||
}
|
||||
abstract public MessagePayload build();
|
||||
}
|
||||
-25
@@ -1,25 +0,0 @@
|
||||
package cn.wildfirechat.messagecontentbuilder;
|
||||
|
||||
import cn.wildfirechat.pojos.MessagePayload;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class SoundMessageContentBuilder extends MediaMessageContentBuilder {
|
||||
private int duration;
|
||||
public static SoundMessageContentBuilder newBuilder(int duration) {
|
||||
SoundMessageContentBuilder builder = new SoundMessageContentBuilder();
|
||||
builder.duration = duration;
|
||||
return builder;
|
||||
}
|
||||
@Override
|
||||
public MessagePayload build() {
|
||||
MessagePayload payload = encodeBase();
|
||||
payload.setType(ProtoConstants.ContentType.Voice);
|
||||
payload.setMediaType(ProtoConstants.MessageMediaType.VOICE);
|
||||
payload.setPersistFlag(ProtoConstants.PersistFlag.Persist_And_Count);
|
||||
JSONObject jsonObject = new JSONObject();
|
||||
jsonObject.put("duration", duration);
|
||||
payload.setContent(jsonObject.toJSONString());
|
||||
return payload;
|
||||
}
|
||||
}
|
||||
-48
@@ -1,48 +0,0 @@
|
||||
package cn.wildfirechat.messagecontentbuilder;
|
||||
|
||||
import cn.wildfirechat.pojos.MessagePayload;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import com.google.gson.Gson;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Base64;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class StreamingTextMessageContentBuilder extends MessageContentBuilder{
|
||||
private String text;
|
||||
private String streamId;
|
||||
private boolean generating;
|
||||
public static StreamingTextMessageContentBuilder newBuilder(String streamId) {
|
||||
StreamingTextMessageContentBuilder builder = new StreamingTextMessageContentBuilder();
|
||||
builder.generating = false;
|
||||
builder.streamId = streamId;
|
||||
return builder;
|
||||
}
|
||||
public StreamingTextMessageContentBuilder text(String text) {
|
||||
this.text = text;
|
||||
return this;
|
||||
}
|
||||
|
||||
public StreamingTextMessageContentBuilder generating(boolean generating) {
|
||||
this.generating = generating;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessagePayload build() {
|
||||
MessagePayload payload = encodeBase();
|
||||
payload.setSearchableContent(text);
|
||||
payload.setContent(streamId);
|
||||
if(generating) {
|
||||
//正在生成消息的类型是14,存储标记位为透传为4。
|
||||
payload.setType(14);
|
||||
payload.setPersistFlag(4);
|
||||
} else {
|
||||
//已经生成消息的类型是15,存储标记位为透传为3。
|
||||
payload.setType(15);
|
||||
payload.setPersistFlag(3);
|
||||
}
|
||||
return payload;
|
||||
}
|
||||
}
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
package cn.wildfirechat.messagecontentbuilder;
|
||||
|
||||
import cn.wildfirechat.pojos.MessagePayload;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
|
||||
public class TextMessageContentBuilder extends MessageContentBuilder{
|
||||
private String text;
|
||||
public static TextMessageContentBuilder newBuilder(String text) {
|
||||
TextMessageContentBuilder builder = new TextMessageContentBuilder();
|
||||
builder.text = text;
|
||||
return builder;
|
||||
}
|
||||
@Override
|
||||
public MessagePayload build() {
|
||||
MessagePayload payload = encodeBase();
|
||||
payload.setType(ProtoConstants.ContentType.Text);
|
||||
payload.setPersistFlag(ProtoConstants.PersistFlag.Persist_And_Count);
|
||||
payload.setSearchableContent(text);
|
||||
return payload;
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
import com.google.gson.GsonBuilder;
|
||||
import com.google.protobuf.ByteString;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -32,6 +33,8 @@ public class GroupNotificationBinaryContent {
|
||||
//value2(member or something)
|
||||
private String m;
|
||||
|
||||
private String extra;
|
||||
|
||||
public GroupNotificationBinaryContent() {
|
||||
}
|
||||
|
||||
@@ -89,8 +92,18 @@ public class GroupNotificationBinaryContent {
|
||||
this.ms = ms;
|
||||
}
|
||||
|
||||
public GroupNotificationBinaryContent setExtra(String extra) {
|
||||
this.extra = extra;
|
||||
return this;
|
||||
}
|
||||
|
||||
public WFCMessage.MessageContent getGroupNotifyContent(int groupContentType) {
|
||||
return WFCMessage.MessageContent.newBuilder().setType(groupContentType).setData(ByteString.copyFromUtf8(new GsonBuilder().disableHtmlEscaping().create().toJson(this))).build();
|
||||
WFCMessage.MessageContent.Builder builder = WFCMessage.MessageContent.newBuilder().setType(groupContentType).setData(ByteString.copyFromUtf8(new GsonBuilder().disableHtmlEscaping().create().toJson(this)));
|
||||
if(!StringUtil.isNullOrEmpty(extra)) {
|
||||
builder.setExtra(extra);
|
||||
}
|
||||
return builder.build();
|
||||
|
||||
}
|
||||
|
||||
public WFCMessage.MessageContent getAddGroupNotifyContent() {
|
||||
|
||||
@@ -17,6 +17,7 @@ import java.util.List;
|
||||
public class InputAddGroupMember extends InputGroupBase {
|
||||
private String group_id;
|
||||
private List<PojoGroupMember> members;
|
||||
private String member_extra;
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
@@ -34,6 +35,14 @@ public class InputAddGroupMember extends InputGroupBase {
|
||||
this.members = members;
|
||||
}
|
||||
|
||||
public String getMember_extra() {
|
||||
return member_extra;
|
||||
}
|
||||
|
||||
public void setMemberExtra(String extra) {
|
||||
this.member_extra = extra;
|
||||
}
|
||||
|
||||
public boolean isValide() {
|
||||
return true;
|
||||
}
|
||||
@@ -41,6 +50,9 @@ public class InputAddGroupMember extends InputGroupBase {
|
||||
public WFCMessage.AddGroupMemberRequest toProtoGroupRequest() {
|
||||
WFCMessage.AddGroupMemberRequest.Builder addGroupBuilder = WFCMessage.AddGroupMemberRequest.newBuilder();
|
||||
addGroupBuilder.setGroupId(group_id);
|
||||
if(!StringUtil.isNullOrEmpty(member_extra)) {
|
||||
addGroupBuilder.setExtra(member_extra);
|
||||
}
|
||||
for (PojoGroupMember pojoGroupMember : getMembers()) {
|
||||
WFCMessage.GroupMember.Builder groupMemberBuilder = WFCMessage.GroupMember.newBuilder().setMemberId(pojoGroupMember.getMember_id());
|
||||
if (!StringUtil.isNullOrEmpty(pojoGroupMember.getAlias())) {
|
||||
|
||||
@@ -16,9 +16,10 @@ import java.util.List;
|
||||
|
||||
public class InputCreateGroup extends InputGroupBase {
|
||||
private PojoGroup group;
|
||||
private String member_extra;
|
||||
|
||||
public boolean isValide() {
|
||||
return true;
|
||||
return !StringUtil.isNullOrEmpty(operator) && group != null;
|
||||
}
|
||||
|
||||
public WFCMessage.CreateGroupRequest toProtoGroupRequest() {
|
||||
@@ -87,6 +88,9 @@ public class InputCreateGroup extends InputGroupBase {
|
||||
|
||||
WFCMessage.CreateGroupRequest.Builder createGroupReqBuilder = WFCMessage.CreateGroupRequest.newBuilder();
|
||||
createGroupReqBuilder.setGroup(groupBuilder);
|
||||
if(!StringUtil.isNullOrEmpty(member_extra)) {
|
||||
createGroupReqBuilder.setMemberExtra(member_extra);
|
||||
}
|
||||
if (to_lines != null) {
|
||||
for (Integer line : to_lines
|
||||
) {
|
||||
@@ -107,4 +111,12 @@ public class InputCreateGroup extends InputGroupBase {
|
||||
public void setGroup(PojoGroup group) {
|
||||
this.group = group;
|
||||
}
|
||||
|
||||
public String getMember_extra() {
|
||||
return member_extra;
|
||||
}
|
||||
|
||||
public void setMember_extra(String member_extra) {
|
||||
this.member_extra = member_extra;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ public class InputGroupBase {
|
||||
public String operator;
|
||||
public List<Integer> to_lines;
|
||||
public MessagePayload notify_message;
|
||||
private boolean isMeshMessage;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
@@ -39,4 +40,12 @@ public class InputGroupBase {
|
||||
public void setNotify_message(MessagePayload notify_message) {
|
||||
this.notify_message = notify_message;
|
||||
}
|
||||
|
||||
public boolean isMeshMessage() {
|
||||
return isMeshMessage;
|
||||
}
|
||||
|
||||
public void setMeshMessage(boolean meshMessage) {
|
||||
isMeshMessage = meshMessage;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* 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 InputHandleFriendRequest {
|
||||
private String userId;
|
||||
private String friendUid;
|
||||
private int status;
|
||||
private boolean force;
|
||||
|
||||
|
||||
public String getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(String userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public String getFriendUid() {
|
||||
return friendUid;
|
||||
}
|
||||
|
||||
public void setFriendUid(String friendUid) {
|
||||
this.friendUid = friendUid;
|
||||
}
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public boolean isForce() {
|
||||
return force;
|
||||
}
|
||||
|
||||
public void setForce(boolean force) {
|
||||
this.force = force;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
public class InputIntValue {
|
||||
public int value;
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(int value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* 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 InputOutputDomainInfo {
|
||||
public String domainId;
|
||||
public String name;
|
||||
public String desc;
|
||||
public String email;
|
||||
public String tel;
|
||||
public String address;
|
||||
public String extra;
|
||||
public long dt;
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDesc(String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public String getTel() {
|
||||
return tel;
|
||||
}
|
||||
|
||||
public void setTel(String tel) {
|
||||
this.tel = tel;
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public void setAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public String getExtra() {
|
||||
return extra;
|
||||
}
|
||||
|
||||
public void setExtra(String extra) {
|
||||
this.extra = extra;
|
||||
}
|
||||
|
||||
public long getDt() {
|
||||
return dt;
|
||||
}
|
||||
|
||||
public void setDt(long dt) {
|
||||
this.dt = dt;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class InputOutputDomainInfoList {
|
||||
public List<InputOutputDomainInfo> infos;
|
||||
|
||||
public List<InputOutputDomainInfo> getInfos() {
|
||||
return infos;
|
||||
}
|
||||
|
||||
public void setInfos(List<InputOutputDomainInfo> infos) {
|
||||
this.infos = infos;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class InputStringList {
|
||||
private List<String> list;
|
||||
|
||||
public InputStringList() {
|
||||
}
|
||||
|
||||
public InputStringList(List<String> list) {
|
||||
this.list = list;
|
||||
}
|
||||
|
||||
public List<String> getList() {
|
||||
return list;
|
||||
}
|
||||
|
||||
public void setList(List<String> list) {
|
||||
this.list = list;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
public class InputStringValue {
|
||||
public String value;
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@ public class PojoGroupInfo {
|
||||
String portrait;
|
||||
String owner;
|
||||
int type;
|
||||
int member_count;
|
||||
String extra;
|
||||
int mute;
|
||||
int join_type;
|
||||
@@ -23,6 +24,8 @@ public class PojoGroupInfo {
|
||||
int history_message;
|
||||
boolean super_group;
|
||||
boolean deleted;
|
||||
long update_dt;
|
||||
long member_update_dt;
|
||||
|
||||
public String getTarget_id() {
|
||||
return target_id;
|
||||
@@ -135,4 +138,28 @@ public class PojoGroupInfo {
|
||||
public void setDeleted(boolean deleted) {
|
||||
this.deleted = deleted;
|
||||
}
|
||||
|
||||
public long getUpdate_dt() {
|
||||
return update_dt;
|
||||
}
|
||||
|
||||
public void setUpdate_dt(long update_dt) {
|
||||
this.update_dt = update_dt;
|
||||
}
|
||||
|
||||
public int getMember_count() {
|
||||
return member_count;
|
||||
}
|
||||
|
||||
public void setMember_count(int member_count) {
|
||||
this.member_count = member_count;
|
||||
}
|
||||
|
||||
public long getMember_update_dt() {
|
||||
return member_update_dt;
|
||||
}
|
||||
|
||||
public void setMember_update_dt(long member_update_dt) {
|
||||
this.member_update_dt = member_update_dt;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoGroupInfoList {
|
||||
public List<PojoGroupInfo> groupInfoList;
|
||||
|
||||
public List<PojoGroupInfo> getGroupInfoList() {
|
||||
return groupInfoList;
|
||||
}
|
||||
|
||||
public void setGroupInfoList(List<PojoGroupInfo> groupInfoList) {
|
||||
this.groupInfoList = groupInfoList;
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ public class PojoGroupMember {
|
||||
String alias;
|
||||
int type;
|
||||
String extra;
|
||||
long updateDt;
|
||||
long createDt;
|
||||
|
||||
public String getMember_id() {
|
||||
@@ -47,6 +48,14 @@ public class PojoGroupMember {
|
||||
this.extra = extra;
|
||||
}
|
||||
|
||||
public long getUpdateDt() {
|
||||
return updateDt;
|
||||
}
|
||||
|
||||
public void setUpdateDt(long updateDt) {
|
||||
this.updateDt = updateDt;
|
||||
}
|
||||
|
||||
public long getCreateDt() {
|
||||
return createDt;
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import io.netty.util.internal.StringUtil;
|
||||
public class RecallMessageData {
|
||||
private String operator;
|
||||
private long messageUid;
|
||||
private boolean isUserRecall;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
@@ -30,4 +31,12 @@ public class RecallMessageData {
|
||||
public void setMessageUid(long messageUid) {
|
||||
this.messageUid = messageUid;
|
||||
}
|
||||
|
||||
public boolean isUserRecall() {
|
||||
return isUserRecall;
|
||||
}
|
||||
|
||||
public void setUserRecall(boolean userRecall) {
|
||||
isUserRecall = userRecall;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ public class SendMessageData {
|
||||
private Conversation conv;
|
||||
private MessagePayload payload;
|
||||
private List<String> toUsers;
|
||||
private boolean isMeshMessage;
|
||||
|
||||
public String getSender() {
|
||||
return sender;
|
||||
@@ -52,6 +53,14 @@ public class SendMessageData {
|
||||
this.toUsers = toUsers;
|
||||
}
|
||||
|
||||
public boolean isMeshMessage() {
|
||||
return isMeshMessage;
|
||||
}
|
||||
|
||||
public void setMeshMessage(boolean meshMessage) {
|
||||
isMeshMessage = meshMessage;
|
||||
}
|
||||
|
||||
public static boolean isValide(SendMessageData sendMessageData) {
|
||||
if(sendMessageData == null ||
|
||||
sendMessageData.getConv() == null ||
|
||||
|
||||
@@ -14,6 +14,7 @@ public class UpdateMessageContentData {
|
||||
private MessagePayload payload;
|
||||
private int distribute;
|
||||
private int updateTimestamp;
|
||||
private int meshLocal;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
@@ -54,4 +55,12 @@ public class UpdateMessageContentData {
|
||||
public void setUpdateTimestamp(int updateTimestamp) {
|
||||
this.updateTimestamp = updateTimestamp;
|
||||
}
|
||||
|
||||
public int getMeshLocal() {
|
||||
return meshLocal;
|
||||
}
|
||||
|
||||
public void setMeshLocal(int meshLocal) {
|
||||
this.meshLocal = meshLocal;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
|
||||
public class MeshRestResult<T> {
|
||||
private static Gson gson = new Gson();
|
||||
public enum MeshRestCode {
|
||||
SUCCESS(0, "success"),
|
||||
ERROR_INVALID_MOBILE(1, "无效的电话号码"),
|
||||
ERROR_SEND_SMS_OVER_FREQUENCY(3, "请求验证码太频繁"),
|
||||
ERROR_SERVER_ERROR(4, "服务器异常"),
|
||||
ERROR_CODE_EXPIRED(5, "验证码已过期"),
|
||||
ERROR_CODE_INCORRECT(6, "验证码或密码错误"),
|
||||
ERROR_SERVER_CONFIG_ERROR(7, "服务器配置错误"),
|
||||
ERROR_SESSION_EXPIRED(8, "会话不存在或已过期"),
|
||||
ERROR_SESSION_NOT_VERIFIED(9, "会话没有验证"),
|
||||
ERROR_SESSION_NOT_SCANED(10, "会话没有被扫码"),
|
||||
ERROR_SERVER_NOT_IMPLEMENT(11, "功能没有实现"),
|
||||
ERROR_GROUP_ANNOUNCEMENT_NOT_EXIST(12, "群公告不存在"),
|
||||
ERROR_NOT_LOGIN(13, "没有登录"),
|
||||
ERROR_NO_RIGHT(14, "没有权限"),
|
||||
ERROR_INVALID_PARAMETER(15, "无效参数"),
|
||||
ERROR_NOT_EXIST(16, "对象不存在"),
|
||||
ERROR_USER_NAME_ALREADY_EXIST(17, "用户名已经存在"),
|
||||
ERROR_SESSION_CANCELED(18, "会话已经取消"),
|
||||
ERROR_PASSWORD_INCORRECT(19, "密码错误"),
|
||||
ERROR_FAILURE_TOO_MUCH_TIMES(20, "密码错误次数太多,请等5分钟再试试"),
|
||||
ERROR_USER_FORBIDDEN(21, "用户被封禁");
|
||||
public int code;
|
||||
public String msg;
|
||||
|
||||
MeshRestCode(int code, String msg) {
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
}
|
||||
private int remote_im_code;
|
||||
private int remote_mesh_code;
|
||||
private int local_mesh_code;
|
||||
private String error_message;
|
||||
private T result;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return gson.toJson(this);
|
||||
}
|
||||
|
||||
public static MeshRestResult ok() {
|
||||
return new MeshRestResult();
|
||||
}
|
||||
|
||||
public static MeshRestResult ok(Object object) {
|
||||
return new MeshRestResult(object);
|
||||
}
|
||||
|
||||
public static MeshRestResult remoteIMError(int code, String message) {
|
||||
MeshRestResult r = new MeshRestResult();
|
||||
r.remote_im_code = code;
|
||||
r.error_message = message;
|
||||
return r;
|
||||
}
|
||||
|
||||
public static MeshRestResult remoteMeshError(int code, String message) {
|
||||
MeshRestResult r = new MeshRestResult();
|
||||
r.remote_mesh_code = code;
|
||||
r.error_message = message;
|
||||
return r;
|
||||
}
|
||||
|
||||
public MeshRestResult addRemoteMeshError(int code, String message) {
|
||||
MeshRestResult r = new MeshRestResult();
|
||||
remote_mesh_code = code;
|
||||
error_message = message;
|
||||
return this;
|
||||
}
|
||||
|
||||
public static MeshRestResult localMeshError(int code, String message) {
|
||||
MeshRestResult r = new MeshRestResult();
|
||||
r.local_mesh_code = code;
|
||||
r.error_message = message;
|
||||
return r;
|
||||
}
|
||||
|
||||
public MeshRestResult addLocalMeshError(int code, String message) {
|
||||
local_mesh_code = code;
|
||||
error_message = message;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public MeshRestResult() {
|
||||
|
||||
}
|
||||
|
||||
public MeshRestResult(T object) {
|
||||
result = object;
|
||||
}
|
||||
|
||||
public T getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
public void setResult(T result) {
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
public int getRemote_im_code() {
|
||||
return remote_im_code;
|
||||
}
|
||||
|
||||
public void setRemote_im_code(int remote_im_code) {
|
||||
this.remote_im_code = remote_im_code;
|
||||
}
|
||||
|
||||
public int getRemote_mesh_code() {
|
||||
return remote_mesh_code;
|
||||
}
|
||||
|
||||
public void setRemote_mesh_code(int remote_mesh_code) {
|
||||
this.remote_mesh_code = remote_mesh_code;
|
||||
}
|
||||
|
||||
public int getLocal_mesh_code() {
|
||||
return local_mesh_code;
|
||||
}
|
||||
|
||||
public void setLocal_mesh_code(int local_mesh_code) {
|
||||
this.local_mesh_code = local_mesh_code;
|
||||
}
|
||||
|
||||
public String getError_message() {
|
||||
return error_message;
|
||||
}
|
||||
|
||||
public void setError_message(String error_message) {
|
||||
this.error_message = error_message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoAddFriendReq {
|
||||
public String fromUserId;
|
||||
public String reason;
|
||||
public String targetUserId;
|
||||
public String domainId;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import cn.wildfirechat.pojos.PojoGroupMember;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoAddGroupMember {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String group_id;
|
||||
public List<PojoGroupMember> members;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public List<PojoGroupMember> getMembers() {
|
||||
return members;
|
||||
}
|
||||
|
||||
public void setMembers(List<PojoGroupMember> members) {
|
||||
this.members = members;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoDeleteFriend {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String friendUid;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getFriendUid() {
|
||||
return friendUid;
|
||||
}
|
||||
|
||||
public void setFriendUid(String friendUid) {
|
||||
this.friendUid = friendUid;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoDismissGroup {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String group_id;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import cn.wildfirechat.pojos.PojoGroupInfo;
|
||||
import cn.wildfirechat.pojos.PojoGroupMember;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoGroupUpdated {
|
||||
public List<String> domainIds;
|
||||
public PojoGroupInfo groupInfo;
|
||||
public List<PojoGroupMember> members;
|
||||
|
||||
public List<String> getDomainIds() {
|
||||
return domainIds;
|
||||
}
|
||||
|
||||
public void setDomainIds(List<String> domainIds) {
|
||||
this.domainIds = domainIds;
|
||||
}
|
||||
|
||||
public PojoGroupInfo getGroupInfo() {
|
||||
return groupInfo;
|
||||
}
|
||||
|
||||
public void setGroupInfo(PojoGroupInfo groupInfo) {
|
||||
this.groupInfo = groupInfo;
|
||||
}
|
||||
|
||||
public List<PojoGroupMember> getMembers() {
|
||||
return members;
|
||||
}
|
||||
|
||||
public void setMembers(List<PojoGroupMember> members) {
|
||||
this.members = members;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoHandleFriendRequestReq {
|
||||
public String userId;
|
||||
public int status;
|
||||
public String targetUserId;
|
||||
public String domainId;
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoKickoffGroupMember {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String group_id;
|
||||
public List<String> members;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
|
||||
public List<String> getMembers() {
|
||||
return members;
|
||||
}
|
||||
|
||||
public void setMembers(List<String> members) {
|
||||
this.members = members;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoModifyGroupInfo {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String group_id;
|
||||
public int type;
|
||||
public String value;
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(int type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import cn.wildfirechat.pojos.SendMessageData;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoPublishMessageReq {
|
||||
public SendMessageData messageData;
|
||||
public List<String> receivers;
|
||||
public String domainId;
|
||||
public long messageId;
|
||||
public boolean republish;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoQuitGroup {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String group_id;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoRecallMessageReq {
|
||||
public String domainId;
|
||||
public long messageId;
|
||||
public String operator;
|
||||
public boolean isSenderRecall;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoSearchUserReq {
|
||||
public String keyword;
|
||||
public int searchType;
|
||||
public int page;
|
||||
public String domainId;
|
||||
|
||||
public String getKeyword() {
|
||||
return keyword;
|
||||
}
|
||||
|
||||
public void setKeyword(String keyword) {
|
||||
this.keyword = keyword;
|
||||
}
|
||||
|
||||
public int getSearchType() {
|
||||
return searchType;
|
||||
}
|
||||
|
||||
public void setSearchType(int searchType) {
|
||||
this.searchType = searchType;
|
||||
}
|
||||
|
||||
public int getPage() {
|
||||
return page;
|
||||
}
|
||||
|
||||
public void setPage(int page) {
|
||||
this.page = page;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import cn.wildfirechat.pojos.InputOutputUserInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoSearchUserRes {
|
||||
public List<InputOutputUserInfo> userInfos;
|
||||
public String keyword;
|
||||
|
||||
public List<InputOutputUserInfo> getUserInfos() {
|
||||
return userInfos;
|
||||
}
|
||||
|
||||
public void setUserInfos(List<InputOutputUserInfo> userInfos) {
|
||||
this.userInfos = userInfos;
|
||||
}
|
||||
|
||||
public String getKeyword() {
|
||||
return keyword;
|
||||
}
|
||||
|
||||
public void setKeyword(String keyword) {
|
||||
this.keyword = keyword;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import cn.wildfirechat.pojos.SendMessageData;
|
||||
|
||||
public class PojoSendMessageReq {
|
||||
public SendMessageData messageData;
|
||||
public String clientId;
|
||||
public String domainId;
|
||||
public long messageId;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoString {
|
||||
public String domainId;
|
||||
public String string;
|
||||
|
||||
public String getString() {
|
||||
return string;
|
||||
}
|
||||
|
||||
public void setString(String string) {
|
||||
this.string = string;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoStringList {
|
||||
public String domainId;
|
||||
public List<String> stringList;
|
||||
|
||||
public List<String> getStringList() {
|
||||
return stringList;
|
||||
}
|
||||
|
||||
public void setStringList(List<String> stringList) {
|
||||
this.stringList = stringList;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoTransferGroup {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String newOwner;
|
||||
public String group_id;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public String getNewOwner() {
|
||||
return newOwner;
|
||||
}
|
||||
|
||||
public void setNewOwner(String newOwner) {
|
||||
this.newOwner = newOwner;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoUserConferenceEvent {
|
||||
public String domainId;
|
||||
public String data;
|
||||
public String userId;
|
||||
public String clientId;
|
||||
public boolean isRobot;
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoUserConferenceRequest {
|
||||
public String domainId;
|
||||
public String clientID;
|
||||
public String fromUser;
|
||||
public String request;
|
||||
public long sessionId;
|
||||
public String roomId;
|
||||
public String data;
|
||||
public boolean advanced;
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoUserConferenceResponse {
|
||||
public String data;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class CommentMsgPojo {
|
||||
//commentId;
|
||||
public long commentId;
|
||||
|
||||
//sender;
|
||||
public String sender;
|
||||
|
||||
//timestamp
|
||||
public long serverTime;
|
||||
|
||||
//feedId
|
||||
public long feedId;
|
||||
|
||||
//type
|
||||
public int type;
|
||||
|
||||
//content
|
||||
public String text;
|
||||
|
||||
//to replyTo
|
||||
public String replyTo;
|
||||
|
||||
//extra
|
||||
public String extra;
|
||||
|
||||
public int ftype;
|
||||
|
||||
public String fcontent;
|
||||
|
||||
public String fsender;
|
||||
|
||||
public List<MediaEntry> fmedias;
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
public class CommentPojo {
|
||||
//commentId;
|
||||
public long commentId;
|
||||
|
||||
//replyId;
|
||||
public long replyId;
|
||||
|
||||
//sender;
|
||||
public String sender;
|
||||
|
||||
//timestamp
|
||||
public long timestamp;
|
||||
|
||||
//feedId
|
||||
public long feedId;
|
||||
|
||||
//type
|
||||
public int type;
|
||||
|
||||
//content
|
||||
public String text;
|
||||
|
||||
//to replyTo
|
||||
public String replyTo;
|
||||
|
||||
//extra
|
||||
public String extra;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class FeedPojo {
|
||||
//feedid
|
||||
public long feedId;
|
||||
|
||||
//sender
|
||||
public String sender;
|
||||
|
||||
//timestamp
|
||||
public long timestamp;
|
||||
|
||||
//type
|
||||
public int type;
|
||||
|
||||
//content
|
||||
public String text;
|
||||
|
||||
//media urls
|
||||
public List<MediaEntry> medias;
|
||||
|
||||
//to users
|
||||
public List<String> to;
|
||||
|
||||
//excloud users
|
||||
public List<String> ex;
|
||||
|
||||
//mentioned users
|
||||
public List<String> mu;
|
||||
|
||||
//extra
|
||||
public String extra;
|
||||
|
||||
public List<CommentPojo> comments;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class FeedsPojo {
|
||||
public List<FeedPojo> feeds;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
public class IdPojo {
|
||||
//feedid
|
||||
public long id;
|
||||
|
||||
//feedid
|
||||
public long id2;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
public class MediaEntry {
|
||||
public String m;
|
||||
public String t;
|
||||
public int w;
|
||||
public int h;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class MomentProfilePojo {
|
||||
public String bgUrl;
|
||||
public List<String> blackList;
|
||||
public List<String> blockList;
|
||||
//stranger visiable count
|
||||
public int svc;
|
||||
public int visiableScope;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
public class PostFeedResult {
|
||||
public long id;
|
||||
public long timestamp;
|
||||
|
||||
public PostFeedResult(long id, long timestamp) {
|
||||
this.id = id;
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PullCommentsRequestPojo {
|
||||
public static class IdPair {
|
||||
public long fid;
|
||||
public long cid;
|
||||
}
|
||||
public List<IdPair> ids;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
public class PullFeedRequestPojo {
|
||||
//feedid
|
||||
public long feedId;
|
||||
public int count;
|
||||
public String user;
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
public class PullOneFeedRequestPojo {
|
||||
public long feedId;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
public class PullProfileRequestPojo {
|
||||
//userId
|
||||
public String u;
|
||||
|
||||
//update date
|
||||
public long d;
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PushProfileListRequestPojo {
|
||||
//block or black
|
||||
public boolean b;
|
||||
|
||||
//add user list
|
||||
public List<String> al;
|
||||
|
||||
//remove user list
|
||||
public List<String> rl;
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package cn.wildfirechat.pojos.moments;
|
||||
|
||||
public class PushProfileValueRequestPojo {
|
||||
/*
|
||||
WFMUpdateUserProfileType_BackgroudUrl,
|
||||
WFMUpdateUserProfileType_StrangerVisiableCount,
|
||||
WFMUpdateUserProfileType_VisiableScope
|
||||
*/
|
||||
public int t;
|
||||
|
||||
//string value depends on t
|
||||
public String v;
|
||||
|
||||
//int value depends on t
|
||||
public int i;
|
||||
}
|
||||
@@ -97,6 +97,10 @@ public class ProtoConstants {
|
||||
int Composited = 11;
|
||||
int Rich_Notification = 12;
|
||||
int Articles = 13;
|
||||
int StreamingText_Generationg = 14;
|
||||
int StreamingText_Generated = 15;
|
||||
int Not_Delivered = 16;
|
||||
int Ptt_Voice = 23;
|
||||
int Enter_Channel_Chat = 71;
|
||||
int Leave_Channel_Chat = 72;
|
||||
int Recall = 80;
|
||||
@@ -126,6 +130,12 @@ public class ProtoConstants {
|
||||
int Quit_Group_Visible_Notification = 121;
|
||||
int Modify_Group_Extra = 122;
|
||||
int Modify_Group_Member_Extra = 123;
|
||||
|
||||
int Call_Start = 400;
|
||||
int Call_Accept = 401;
|
||||
int Call_End = 402;
|
||||
int Call_Add_Participant = 406;
|
||||
int Call_Multi_Call_Ongoing = 416;
|
||||
}
|
||||
|
||||
public interface MessagePersistFlag {
|
||||
@@ -337,6 +347,25 @@ public class ProtoConstants {
|
||||
int Forbidden_Mute_Group_Member = 0x800;
|
||||
}
|
||||
|
||||
public interface MomentsContentType {
|
||||
int Moments_Content_Text_Type = 0;
|
||||
int Moments_Content_Image_Type = 1;
|
||||
int Moments_Content_Video_Type = 2;
|
||||
int Moments_Content_Link_Type = 3;
|
||||
}
|
||||
|
||||
public interface MomentsCommentType {
|
||||
int Moments_Comment_Text_Type = 0;
|
||||
int Moments_Comment_Thumbup_Type = 1;
|
||||
}
|
||||
|
||||
public interface MomentsVisibleScope {
|
||||
int Moments_VisibleScope_NoLimit = 0;
|
||||
int Moments_VisibleScope_3Days = 1;
|
||||
int Moments_VisibleScope_1Month = 2;
|
||||
int Moments_VisibleScope_6Months = 3;
|
||||
};
|
||||
|
||||
public static final int MESSAGE_CONTENT_TYPE_CREATE_GROUP = 104;
|
||||
public static final int MESSAGE_CONTENT_TYPE_ADD_GROUP_MEMBER = 105;
|
||||
public static final int MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER = 106;
|
||||
|
||||
@@ -41874,6 +41874,16 @@ public final class WFCMessage {
|
||||
* <code>optional .MessageContent notify_content = 3;</code>
|
||||
*/
|
||||
cn.wildfirechat.proto.WFCMessage.MessageContentOrBuilder getNotifyContentOrBuilder();
|
||||
|
||||
// optional int32 keep_msg = 4;
|
||||
/**
|
||||
* <code>optional int32 keep_msg = 4;</code>
|
||||
*/
|
||||
boolean hasKeepMsg();
|
||||
/**
|
||||
* <code>optional int32 keep_msg = 4;</code>
|
||||
*/
|
||||
int getKeepMsg();
|
||||
}
|
||||
/**
|
||||
* Protobuf type {@code QuitGroupRequest}
|
||||
@@ -41965,6 +41975,11 @@ public final class WFCMessage {
|
||||
bitField0_ |= 0x00000002;
|
||||
break;
|
||||
}
|
||||
case 32: {
|
||||
bitField0_ |= 0x00000004;
|
||||
keepMsg_ = input.readInt32();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
||||
@@ -42096,10 +42111,27 @@ public final class WFCMessage {
|
||||
return notifyContent_;
|
||||
}
|
||||
|
||||
// optional int32 keep_msg = 4;
|
||||
public static final int KEEP_MSG_FIELD_NUMBER = 4;
|
||||
private int keepMsg_;
|
||||
/**
|
||||
* <code>optional int32 keep_msg = 4;</code>
|
||||
*/
|
||||
public boolean hasKeepMsg() {
|
||||
return ((bitField0_ & 0x00000004) == 0x00000004);
|
||||
}
|
||||
/**
|
||||
* <code>optional int32 keep_msg = 4;</code>
|
||||
*/
|
||||
public int getKeepMsg() {
|
||||
return keepMsg_;
|
||||
}
|
||||
|
||||
private void initFields() {
|
||||
groupId_ = "";
|
||||
toLine_ = java.util.Collections.emptyList();
|
||||
notifyContent_ = cn.wildfirechat.proto.WFCMessage.MessageContent.getDefaultInstance();
|
||||
keepMsg_ = 0;
|
||||
}
|
||||
private byte memoizedIsInitialized = -1;
|
||||
public final boolean isInitialized() {
|
||||
@@ -42132,6 +42164,9 @@ public final class WFCMessage {
|
||||
if (((bitField0_ & 0x00000002) == 0x00000002)) {
|
||||
output.writeMessage(3, notifyContent_);
|
||||
}
|
||||
if (((bitField0_ & 0x00000004) == 0x00000004)) {
|
||||
output.writeInt32(4, keepMsg_);
|
||||
}
|
||||
getUnknownFields().writeTo(output);
|
||||
}
|
||||
|
||||
@@ -42158,6 +42193,10 @@ public final class WFCMessage {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeMessageSize(3, notifyContent_);
|
||||
}
|
||||
if (((bitField0_ & 0x00000004) == 0x00000004)) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeInt32Size(4, keepMsg_);
|
||||
}
|
||||
size += getUnknownFields().getSerializedSize();
|
||||
memoizedSerializedSize = size;
|
||||
return size;
|
||||
@@ -42285,6 +42324,8 @@ public final class WFCMessage {
|
||||
notifyContentBuilder_.clear();
|
||||
}
|
||||
bitField0_ = (bitField0_ & ~0x00000004);
|
||||
keepMsg_ = 0;
|
||||
bitField0_ = (bitField0_ & ~0x00000008);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -42330,6 +42371,10 @@ public final class WFCMessage {
|
||||
} else {
|
||||
result.notifyContent_ = notifyContentBuilder_.build();
|
||||
}
|
||||
if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
|
||||
to_bitField0_ |= 0x00000004;
|
||||
}
|
||||
result.keepMsg_ = keepMsg_;
|
||||
result.bitField0_ = to_bitField0_;
|
||||
onBuilt();
|
||||
return result;
|
||||
@@ -42364,6 +42409,9 @@ public final class WFCMessage {
|
||||
if (other.hasNotifyContent()) {
|
||||
mergeNotifyContent(other.getNotifyContent());
|
||||
}
|
||||
if (other.hasKeepMsg()) {
|
||||
setKeepMsg(other.getKeepMsg());
|
||||
}
|
||||
this.mergeUnknownFields(other.getUnknownFields());
|
||||
return this;
|
||||
}
|
||||
@@ -42658,6 +42706,39 @@ public final class WFCMessage {
|
||||
return notifyContentBuilder_;
|
||||
}
|
||||
|
||||
// optional int32 keep_msg = 4;
|
||||
private int keepMsg_ ;
|
||||
/**
|
||||
* <code>optional int32 keep_msg = 4;</code>
|
||||
*/
|
||||
public boolean hasKeepMsg() {
|
||||
return ((bitField0_ & 0x00000008) == 0x00000008);
|
||||
}
|
||||
/**
|
||||
* <code>optional int32 keep_msg = 4;</code>
|
||||
*/
|
||||
public int getKeepMsg() {
|
||||
return keepMsg_;
|
||||
}
|
||||
/**
|
||||
* <code>optional int32 keep_msg = 4;</code>
|
||||
*/
|
||||
public Builder setKeepMsg(int value) {
|
||||
bitField0_ |= 0x00000008;
|
||||
keepMsg_ = value;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>optional int32 keep_msg = 4;</code>
|
||||
*/
|
||||
public Builder clearKeepMsg() {
|
||||
bitField0_ = (bitField0_ & ~0x00000008);
|
||||
keepMsg_ = 0;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
|
||||
// @@protoc_insertion_point(builder_scope:QuitGroupRequest)
|
||||
}
|
||||
|
||||
@@ -67490,76 +67571,77 @@ public final class WFCMessage {
|
||||
"\003\"0\n\017PullUserRequest\022\035\n\007request\030\001 \003(\0132\014." +
|
||||
"UserRequest\"/\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\006result\030\001 \003(\0132\013.UserResult\"^\n\020QuitGroup" +
|
||||
"\n\006result\030\001 \003(\0132\013.UserResult\"p\n\020QuitGroup" +
|
||||
"Request\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.MessageCont" +
|
||||
"ent\"~\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.Mes" +
|
||||
"sageContent\"u\n\024TransferGroupRequest\022\020\n\010g" +
|
||||
"roup_id\030\001 \002(\t\022\021\n\tnew_owner\030\002 \002(\t\022\017\n\007to_l" +
|
||||
"ine\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.Mess" +
|
||||
"ageContent\"\206\001\n\026ModifyGroupMemberAlias\022\020\n" +
|
||||
"\010group_id\030\001 \002(\t\022\r\n\005alias\030\002 \002(\t\022\017\n\007to_lin" +
|
||||
"e\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.Messag",
|
||||
"eContent\022\021\n\tmember_id\030\005 \001(\t\"\206\001\n\026ModifyGr" +
|
||||
"oupMemberExtra\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to_l" +
|
||||
"ine\030\002 \003(\005\022\'\n\016notify_content\030\003 \001(\0132\017.Mess" +
|
||||
"ageContent\022\r\n\005extra\030\004 \001(\t\022\021\n\tmember_id\030\005" +
|
||||
" \001(\t\"P\n\020UserSettingEntry\022\r\n\005scope\030\001 \002(\005\022" +
|
||||
"\013\n\003key\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\007Ver" +
|
||||
"sion\022\017\n\007version\030\001 \002(\003\"8\n\024GetUserSettingR" +
|
||||
"esult\022 \n\005entry\030\001 \003(\0132\021.UserSettingEntry\"",
|
||||
"f\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\007black" +
|
||||
"ed\030\005 \001(\005\022\r\n\005extra\030\006 \001(\t\"*\n\020GetFriendsRes" +
|
||||
"ult\022\026\n\005entry\030\001 \003(\0132\007.Friend\"7\n\026GetFriend" +
|
||||
"RequestResult\022\035\n\005entry\030\001 \003(\0132\016.FriendReq" +
|
||||
"uest\"\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_h" +
|
||||
"ead\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\013server_" +
|
||||
"time\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\004data\030\004 \001(\014\"A\n\021SearchUserRequest\022\017\n\007key" +
|
||||
"word\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.Use" +
|
||||
"r\"@\n\026GetChatroomInfoRequest\022\023\n\013chatroom_" +
|
||||
"id\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"\227\001\n\014Chatroom" +
|
||||
"Info\022\r\n\005title\030\001 \002(\t\022\014\n\004desc\030\002 \001(\t\022\020\n\010por" +
|
||||
"trait\030\003 \001(\t\022\024\n\014member_count\030\004 \001(\005\022\021\n\tcre" +
|
||||
"ate_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\034GetChatroomMemb",
|
||||
"erInfoRequest\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tma" +
|
||||
"x_count\030\002 \001(\005\";\n\022ChatroomMemberInfo\022\024\n\014m" +
|
||||
"ember_count\030\001 \001(\005\022\017\n\007members\030\002 \003(\t\"\026\n\010IN" +
|
||||
"T64Buf\022\n\n\002id\030\001 \002(\003\"4\n\023NotifyRecallMessag" +
|
||||
"e\022\n\n\002id\030\001 \002(\003\022\021\n\tfrom_user\030\002 \002(\t\"/\n\020Blac" +
|
||||
"kUserRequest\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\010platf" +
|
||||
"orm\030\002 \001(\005\022\021\n\tpush_type\030\003 \001(\005\022\023\n\013device_n" +
|
||||
"ame\030\004 \001(\t\022\026\n\016device_version\030\005 \001(\t\022\022\n\npho" +
|
||||
"ne_name\030\006 \001(\t\022\020\n\010language\030\007 \001(\t\022\024\n\014carri",
|
||||
"er_name\030\010 \001(\t\022\023\n\013app_version\030\t \001(\t\022\023\n\013sd" +
|
||||
"k_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\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\"r" +
|
||||
"\n\022LoadRemoteMessages\022#\n\014conversation\030\001 \002" +
|
||||
"(\0132\r.Conversation\022\022\n\nbefore_uid\030\002 \002(\003\022\r\n" +
|
||||
"\005count\030\003 \002(\005\022\024\n\014content_type\030\004 \003(\005\"a\n\020Mu" +
|
||||
"ltiCastMessage\022\021\n\tfrom_user\030\001 \002(\t\022 \n\007con" +
|
||||
"tent\030\002 \002(\0132\017.MessageContent\022\n\n\002to\030\003 \003(\t\022",
|
||||
"\014\n\004line\030\004 \002(\005\"E\n\035RecallMultiCastMessageR" +
|
||||
"equest\022\022\n\nmessage_id\030\001 \002(\003\022\020\n\010receiver\030\002" +
|
||||
" \003(\t\"@\n\017AuthCodeRequest\022\021\n\ttarget_id\030\001 \002" +
|
||||
"(\t\022\014\n\004type\030\002 \002(\005\022\014\n\004host\030\003 \002(\t\"o\n\030Applic" +
|
||||
"ationConfigRequest\022\r\n\005appId\030\001 \002(\t\022\017\n\007app" +
|
||||
"Type\030\002 \002(\005\022\021\n\ttimestamp\030\003 \002(\003\022\r\n\005nonce\030\004" +
|
||||
" \002(\t\022\021\n\tsignature\030\005 \002(\tB/\n\025cn.wildfirech" +
|
||||
"at.protoB\nWFCMessageZ\n./go;proto"
|
||||
"ent\022\020\n\010keep_msg\030\004 \001(\005\"~\n\030RemoveGroupMemb" +
|
||||
"erRequest\022\020\n\010group_id\030\001 \002(\t\022\026\n\016removed_m" +
|
||||
"ember\030\002 \003(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_c" +
|
||||
"ontent\030\004 \001(\0132\017.MessageContent\"u\n\024Transfe" +
|
||||
"rGroupRequest\022\020\n\010group_id\030\001 \002(\t\022\021\n\tnew_o" +
|
||||
"wner\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_co" +
|
||||
"ntent\030\004 \001(\0132\017.MessageContent\"\206\001\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\022\021\n\tmember_id\030" +
|
||||
"\005 \001(\t\"\206\001\n\026ModifyGroupMemberExtra\022\020\n\010grou" +
|
||||
"p_id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n\016notify_co" +
|
||||
"ntent\030\003 \001(\0132\017.MessageContent\022\r\n\005extra\030\004 " +
|
||||
"\001(\t\022\021\n\tmember_id\030\005 \001(\t\"P\n\020UserSettingEnt" +
|
||||
"ry\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005value\030" +
|
||||
"\003 \002(\t\022\021\n\tupdate_dt\030\004 \002(\003\"A\n\024ModifyUserSe" +
|
||||
"ttingReq\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005" +
|
||||
"value\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\"f\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\005al" +
|
||||
"ias\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.F" +
|
||||
"riend\"7\n\026GetFriendRequestResult\022\035\n\005entry" +
|
||||
"\030\001 \003(\0132\016.FriendRequest\"\243\001\n\021ConnectAckPay" +
|
||||
"load\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_h" +
|
||||
"ead\030\004 \001(\003\022\021\n\tnode_addr\030\005 \001(\t\022\021\n\tnode_por" +
|
||||
"t\030\006 \001(\005\022\023\n\013server_time\030\007 \001(\003\"P\n\rIMHttpWr",
|
||||
"apper\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\004data\030\004 \001(\014\"A\n\021Search" +
|
||||
"UserRequest\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\026GetChatroomInfoRe" +
|
||||
"quest\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tupdate_dt\030" +
|
||||
"\002 \001(\003\"\227\001\n\014ChatroomInfo\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\034GetChatroomMemberInfoRequest\022\023\n\013chatr" +
|
||||
"oom_id\030\001 \002(\t\022\021\n\tmax_count\030\002 \001(\005\";\n\022Chatr" +
|
||||
"oomMemberInfo\022\024\n\014member_count\030\001 \001(\005\022\017\n\007m" +
|
||||
"embers\030\002 \003(\t\"\026\n\010INT64Buf\022\n\n\002id\030\001 \002(\003\"4\n\023" +
|
||||
"NotifyRecallMessage\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\006status\030\002 \002(\005\"\323\001\n\014RouteRequest\022\013\n\003" +
|
||||
"app\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_ve" +
|
||||
"rsion\030\005 \001(\t\022\022\n\nphone_name\030\006 \001(\t\022\020\n\010langu",
|
||||
"age\030\007 \001(\t\022\024\n\014carrier_name\030\010 \001(\t\022\023\n\013app_v" +
|
||||
"ersion\030\t \001(\t\022\023\n\013sdk_version\030\n \001(\t\"D\n\rRou" +
|
||||
"teResponse\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\017GetTokenReque" +
|
||||
"st\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\"r\n\022LoadRemoteMessages\022#" +
|
||||
"\n\014conversation\030\001 \002(\0132\r.Conversation\022\022\n\nb" +
|
||||
"efore_uid\030\002 \002(\003\022\r\n\005count\030\003 \002(\005\022\024\n\014conten" +
|
||||
"t_type\030\004 \003(\005\"a\n\020MultiCastMessage\022\021\n\tfrom" +
|
||||
"_user\030\001 \002(\t\022 \n\007content\030\002 \002(\0132\017.MessageCo",
|
||||
"ntent\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 \002(\005\"E\n\035Recal" +
|
||||
"lMultiCastMessageRequest\022\022\n\nmessage_id\030\001" +
|
||||
" \002(\003\022\020\n\010receiver\030\002 \003(\t\"@\n\017AuthCodeReques" +
|
||||
"t\022\021\n\ttarget_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\014\n\004ho" +
|
||||
"st\030\003 \002(\t\"o\n\030ApplicationConfigRequest\022\r\n\005" +
|
||||
"appId\030\001 \002(\t\022\017\n\007appType\030\002 \002(\005\022\021\n\ttimestam" +
|
||||
"p\030\003 \002(\003\022\r\n\005nonce\030\004 \002(\t\022\021\n\tsignature\030\005 \002(" +
|
||||
"\tB/\n\025cn.wildfirechat.protoB\nWFCMessageZ\n" +
|
||||
"./go;proto"
|
||||
};
|
||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
||||
@@ -67841,7 +67923,7 @@ public final class WFCMessage {
|
||||
internal_static_QuitGroupRequest_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_QuitGroupRequest_descriptor,
|
||||
new java.lang.String[] { "GroupId", "ToLine", "NotifyContent", });
|
||||
new java.lang.String[] { "GroupId", "ToLine", "NotifyContent", "KeepMsg", });
|
||||
internal_static_RemoveGroupMemberRequest_descriptor =
|
||||
getDescriptor().getMessageTypes().get(46);
|
||||
internal_static_RemoveGroupMemberRequest_fieldAccessorTable = new
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<!--<relativePath>../pom.xml</relativePath>-->
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>1.2.5</version>
|
||||
<version>1.3.2</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>distribution</artifactId>
|
||||
|
||||
@@ -66,6 +66,10 @@ token.key testim
|
||||
##是否使用AES256加密。默认客户端和服务器都是AES128加密,如果需要开启AES256,需要客户端和IM服务同时开通。
|
||||
#encrypt.use_aes256 true
|
||||
|
||||
##当创建一个对象时(用户,群组,频道,机器人等),如果没有传入ID,野火会为这个对象生成一个ID。如果id.use_uuid为true,会使用uuid作为对象ID,否则会使用野火短ID,默认为false。
|
||||
## 短ID有个很大的风险是容易被人穷举进行攻击。建议用UUID。
|
||||
id.use_uuid true
|
||||
|
||||
##首次登录,是否接收之前的历史消息。
|
||||
##0 不接收历史消息,只接收${message.compensate_time_limit}毫秒以内的消息,由于服务器没有保存已经收取记录,所以如果有超过${message.compensate_time_limit}毫秒之前未收取的消息也不会收取下拉;
|
||||
##1接收,会接收 message.max_queue 配置的条数的历史消息
|
||||
@@ -89,6 +93,9 @@ message.disable_stranger_chat false
|
||||
##当禁止陌生人聊天时,允许聊天的用户id,比如管理员或者文件传输助手等。用户id以英文逗号分割。
|
||||
message.allow_stranger_chat_list admin,FireRobot,wfc_file_transfer
|
||||
|
||||
##当禁止陌生人聊天时,允许聊天的线路。
|
||||
#message.allow_stranger_line 100,101
|
||||
|
||||
##黑名单策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃
|
||||
message.blacklist.strategy 0
|
||||
|
||||
@@ -146,6 +153,10 @@ robot.callback_with_client_info false
|
||||
## 频道回调信息是否带上用户clientId和平台类型。
|
||||
channel.callback_with_client_info false
|
||||
|
||||
## 频道回调新方式,在新方式下,如果有callback地址就会总是回调客户端发送的消息(包括owner和订阅者)。automatic属性控制订阅者发送的消息是否发给owner, 0发,1不发。
|
||||
## 旧的方式是,automatic为0时,订阅者的消息发给owner,不转发消息到callback地址。为1时,把订阅者的消息转发给callback地址,不发给owner。
|
||||
channel.new_callback_feature true
|
||||
|
||||
##禁止搜索用户
|
||||
friend.disable_search false
|
||||
|
||||
@@ -167,6 +178,9 @@ friend.reject_request_duration 2592000000
|
||||
##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。
|
||||
friend.request_expiration_duration 604800000
|
||||
|
||||
##好友请求限制频率,一个用户24小时之内允许请求好友的次数,默认不限频。
|
||||
#friend.request_rate_limit 30
|
||||
|
||||
##请求添加机器人为好友时,机器人是否自动接受,默认为true
|
||||
friend.robot_auto_accept true
|
||||
|
||||
@@ -246,15 +260,6 @@ client.request_rate_limit 100
|
||||
##关于对象存储的详细信息请参考:https://docs.wildfirechat.cn/server/oss.html
|
||||
media.server.use_qiniu 0
|
||||
|
||||
##媒体类型分类
|
||||
#Media_Type_GENERAL = 0,
|
||||
#Media_Type_IMAGE = 1,
|
||||
#Media_Type_VOICE = 2,
|
||||
#Media_Type_VIDEO = 3,
|
||||
#Media_Type_FILE = 4,
|
||||
#Media_Type_PORTRAIT = 5,
|
||||
#Media_Type_FAVORITE = 6
|
||||
|
||||
# qiniu media server configuration
|
||||
## 上传地址,不同的区域,上传地址也不同,请注意现在正确的地址
|
||||
qiniu.server_url http://up.qbox.me
|
||||
@@ -280,11 +285,21 @@ qiniu.bucket_portrait_domain http://cdn2.wildfirechat.cn
|
||||
qiniu.bucket_favorite_name storage
|
||||
qiniu.bucket_favorite_domain http://cdn2.wildfirechat.cn
|
||||
|
||||
##媒体类型分类
|
||||
#Media_Type_GENERAL = 0,
|
||||
#Media_Type_IMAGE = 1,
|
||||
#Media_Type_VOICE = 2,
|
||||
#Media_Type_VIDEO = 3,
|
||||
#Media_Type_FILE = 4,
|
||||
#Media_Type_PORTRAIT = 5,
|
||||
#Media_Type_FAVORITE = 6,
|
||||
#Media_Type_STICKER = 7,
|
||||
#Media_Type_MOMENTS = 8
|
||||
|
||||
# local media server configuration
|
||||
# 本地媒体服务器配置。
|
||||
local.media.storage.root ./media
|
||||
# 如果使用内置文件存储,文件上传后地址默认为 http://server.ip:http_port/fs/5/2021/03/27/08/filename。
|
||||
local.media.storage.root media
|
||||
# 如果使用内置文件存储,文件上传后地址默认为 http://server.ip:http_port/fs/5/2021/03/27/08/filename。fs目录下按照类型存放文件,媒体类型见上面注释,比如5就是Media_Type_PORTRAIT,是客户端的头像文件。
|
||||
# 如果需要使用nginx添加https支持,请打开下面配置,这样客户端得到的文件地址为 https://example.com/media/fs/5/2021/03/27/08/filename。
|
||||
# 需要nginx把请求从https://example.com/media/fs 转到 http://server.ip:http_port/fs。注意需要带上所有header。
|
||||
# 尽管内置文件存储可以使用,但是我们还是建议使用专业级别的对象存储服务,社区版可以使用七牛,专业版另外支持阿里云和也是私有对象存储。详情请参考 https://docs.wildfirechat.cn/server/oss.html
|
||||
@@ -310,7 +325,7 @@ server.mobile_default_silent_when_pc_online true
|
||||
|
||||
## 客户端是否支持kickoff事件。当客户端被其他端登录踢出时,如果此开关为false时,客户端协议栈上报secret_mismatch。如果此开关为ture时,客户端协议栈上报kicked_off。
|
||||
## 客户端被踢时上报kicked_off是在2021.9.15之后才加上的。如果客户端协议栈全部为此日期之后的版本才可以打开此开关。
|
||||
server.client_support_kickoff_event false
|
||||
server.client_support_kickoff_event true
|
||||
|
||||
#*********************************************************************
|
||||
# Push server configuration
|
||||
@@ -324,6 +339,10 @@ push.android.server.address http://localhost:8085/android/push
|
||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||
push.ios.server.address http://localhost:8085/ios/push
|
||||
|
||||
##鸿蒙推送服务器地址
|
||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||
push.harmony.server.address http://localhost:8085/harmony/push
|
||||
|
||||
#*********************************************************************
|
||||
# 监控配置
|
||||
#*********************************************************************
|
||||
@@ -398,7 +417,7 @@ push.ios.server.address http://localhost:8085/ios/push
|
||||
# gain and reduced GC.
|
||||
# http://netty.io/wiki/native-transports.html for more information
|
||||
#*********************************************************************
|
||||
# 如果是linux系统,一定要打开下面这个参数,能大幅度提高性能
|
||||
# 如果是linux系统,一定要打开下面这个参数,能大幅度提高性能。默认只支持x86_64架构。如果是arm64架构,可以按照项目说明来更新epoll SDK。其他架构不支持epoll。
|
||||
#netty.epoll true
|
||||
|
||||
#*********************************************************************
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
|
||||
<packaging>pom</packaging>
|
||||
<version>1.2.5</version>
|
||||
<version>1.3.2</version>
|
||||
<name>Wildfire Chat</name>
|
||||
<description>Wildfire Chat Server</description>
|
||||
<inceptionYear>2019</inceptionYear>
|
||||
|
||||
@@ -12,6 +12,56 @@
|
||||
|
||||
# 更新记录
|
||||
|
||||
--------------
|
||||
Release note 1.3.2:
|
||||
1. 机器人Server SDK添加朋友圈相关接口。
|
||||
2. Server API添加批量获取用户接口。
|
||||
3. 解决聊天室定向消息无效的问题。
|
||||
4. 添加配置,可以在禁止私聊时添加例外聊天线路。
|
||||
|
||||
--------------
|
||||
Release note 1.3.1:
|
||||
1. 透传消息去掉消息ID,减少消息传输大小。
|
||||
2. 修改添加好友策略,可以设置禁止加自己好友。
|
||||
3. Server API创建群组时,检查是否设置operator。
|
||||
4. SDK添加删除广播和组播消息接口
|
||||
|
||||
--------------
|
||||
Release note 1.3.0:
|
||||
1. 推送信息中添加republish参数,用于标识消息是重新发布的。
|
||||
2. 添加好友请求限频功能,在IM服务配置中可以配置每天限制添加的好友数。
|
||||
3. 添加配置,是否允许用户发送消息给被拉黑的用户。
|
||||
4. 添加鸿蒙回调地址。
|
||||
5. 创建群组或者添加群组成员时,群组成员的Extra会放到通知消息的extra中,这样便于业务处理通知消息。
|
||||
|
||||
--------------
|
||||
Release note 1.2.9:
|
||||
1. 解决server api获取群组信息不全的问题。
|
||||
2. 添加配置使用uuid作为用户群组等ID。
|
||||
|
||||
--------------
|
||||
Release note 1.2.8:
|
||||
1. server api获取被封禁用户时,过滤掉正常用户。
|
||||
2. 解决群组标记删除错误。
|
||||
3. SDK中添加发送消息的示例。
|
||||
4. 群解散后撤回群中的消息应该失败。
|
||||
5. 解决某些时候http请求返回信息无法读取问题。
|
||||
|
||||
--------------
|
||||
Release note 1.2.7:
|
||||
1. 解决搜索频道时某些类型的频道无法被搜索的问题。
|
||||
2. 添加频道回调新特性,方便使用。
|
||||
3. 解决机器人API修改机器人用户信息客户端没有更新的问题。
|
||||
4. Server SDK中关于频道的接口放到ChannelAdmin中。
|
||||
5. 添加Mesh功能的SDK。
|
||||
|
||||
--------------
|
||||
Release note 1.2.6:
|
||||
1. 群主强制被退群时(销毁账号/server api强制退群),调整新群主选择,群管理优先,先加入群组优先。
|
||||
2. 拉取远程消息时,过滤掉可能重复的消息。
|
||||
3. 退群时添加是否保留消息的参数,可以退群后保留原有消息。
|
||||
4. 如果不在群组中,当获取群组信息时不更新数据。
|
||||
|
||||
--------------
|
||||
Release note 1.2.5:
|
||||
1. Server API添加通过邮箱获取用户信息的接口。
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
<parent>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>1.2.5</version>
|
||||
<version>1.3.2</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package cn.wildfirechat.sdk;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.pojos.*;
|
||||
import cn.wildfirechat.sdk.model.IMResult;
|
||||
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
|
||||
|
||||
public class ChannelAdmin {
|
||||
public static IMResult<OutputCreateChannel> createChannel(InputCreateChannel inputCreateChannel) throws Exception {
|
||||
String path = APIPath.Create_Channel;
|
||||
return AdminHttpUtils.httpJsonPost(path, inputCreateChannel, OutputCreateChannel.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> destroyChannel(String channelId) throws Exception {
|
||||
String path = APIPath.Destroy_Channel;
|
||||
InputChannelId inputChannelId = new InputChannelId(channelId);
|
||||
return AdminHttpUtils.httpJsonPost(path, inputChannelId, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<OutputGetChannelInfo> getChannelInfo(String channelId) throws Exception {
|
||||
String path = APIPath.Get_Channel_Info;
|
||||
InputChannelId inputChannelId = new InputChannelId(channelId);
|
||||
return AdminHttpUtils.httpJsonPost(path, inputChannelId, OutputGetChannelInfo.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> subscribeChannel(String channelId, String userId) throws Exception {
|
||||
String path = APIPath.Subscribe_Channel;
|
||||
InputSubscribeChannel input = new InputSubscribeChannel(channelId, userId, 1);
|
||||
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> unsubscribeChannel(String channelId, String userId) throws Exception {
|
||||
String path = APIPath.Subscribe_Channel;
|
||||
InputSubscribeChannel input = new InputSubscribeChannel(channelId, userId, 0);
|
||||
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<OutputBooleanValue> isUserSubscribedChannel(String userId, String channelId) throws Exception {
|
||||
String path = APIPath.Check_User_Subscribe_Channel;
|
||||
InputSubscribeChannel input = new InputSubscribeChannel(channelId, userId, 0);
|
||||
return AdminHttpUtils.httpJsonPost(path, input, OutputBooleanValue.class);
|
||||
}
|
||||
}
|
||||
@@ -22,35 +22,59 @@ public class GeneralAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 请使用 {@link cn.wildfirechat.sdk.ChannelAdmin#createChannel(InputCreateChannel inputCreateChannel)} 代替此方法,因为它将在未来的版本中被移除。
|
||||
*/
|
||||
@Deprecated
|
||||
public static IMResult<OutputCreateChannel> createChannel(InputCreateChannel inputCreateChannel) throws Exception {
|
||||
String path = APIPath.Create_Channel;
|
||||
return AdminHttpUtils.httpJsonPost(path, inputCreateChannel, OutputCreateChannel.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 请使用 {@link cn.wildfirechat.sdk.ChannelAdmin#destroyChannel(String channelId)} 代替此方法,因为它将在未来的版本中被移除。
|
||||
*/
|
||||
@Deprecated
|
||||
public static IMResult<Void> destroyChannel(String channelId) throws Exception {
|
||||
String path = APIPath.Destroy_Channel;
|
||||
InputChannelId inputChannelId = new InputChannelId(channelId);
|
||||
return AdminHttpUtils.httpJsonPost(path, inputChannelId, Void.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 请使用 {@link cn.wildfirechat.sdk.ChannelAdmin#getChannelInfo(String channelId)} 代替此方法,因为它将在未来的版本中被移除。
|
||||
*/
|
||||
@Deprecated
|
||||
public static IMResult<OutputGetChannelInfo> getChannelInfo(String channelId) throws Exception {
|
||||
String path = APIPath.Get_Channel_Info;
|
||||
InputChannelId inputChannelId = new InputChannelId(channelId);
|
||||
return AdminHttpUtils.httpJsonPost(path, inputChannelId, OutputGetChannelInfo.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 请使用 {@link cn.wildfirechat.sdk.ChannelAdmin#subscribeChannel(String userId, String channelId)} 代替此方法,因为它将在未来的版本中被移除。
|
||||
*/
|
||||
@Deprecated
|
||||
public static IMResult<Void> subscribeChannel(String channelId, String userId) throws Exception {
|
||||
String path = APIPath.Subscribe_Channel;
|
||||
InputSubscribeChannel input = new InputSubscribeChannel(channelId, userId, 1);
|
||||
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 请使用 {@link cn.wildfirechat.sdk.ChannelAdmin#unsubscribeChannel(String userId, String channelId)} 代替此方法,因为它将在未来的版本中被移除。
|
||||
*/
|
||||
@Deprecated
|
||||
public static IMResult<Void> unsubscribeChannel(String channelId, String userId) throws Exception {
|
||||
String path = APIPath.Subscribe_Channel;
|
||||
InputSubscribeChannel input = new InputSubscribeChannel(channelId, userId, 0);
|
||||
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated 请使用 {@link cn.wildfirechat.sdk.ChannelAdmin#isUserSubscribedChannel(String userId, String channelId)} 代替此方法,因为它将在未来的版本中被移除。
|
||||
*/
|
||||
@Deprecated
|
||||
public static IMResult<OutputBooleanValue> isUserSubscribedChannel(String userId, String channelId) throws Exception {
|
||||
String path = APIPath.Check_User_Subscribe_Channel;
|
||||
InputSubscribeChannel input = new InputSubscribeChannel(channelId, userId, 0);
|
||||
|
||||
@@ -0,0 +1,361 @@
|
||||
package cn.wildfirechat.sdk;
|
||||
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.*;
|
||||
import cn.wildfirechat.sdk.model.IMResult;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.ConcurrentSkipListSet;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
/**
|
||||
* 生成测试数据。本应用生成以下数据:
|
||||
* 1. 创建${totalUserCount}个用户
|
||||
* 2. 每个用户同其他${friendCount}个用户建立好友关系
|
||||
* 3. 确保每个人都加入${smallGroupCount}个群组成员数为${smallGroupMemberSize}的小群组
|
||||
* 4. 确保每个人都加入${middleGroupCount}个群组成员数为${middleGroupMemberSize}的中群组
|
||||
* 5. 确保每个人都加入${bigGroupCount}个群组成员数为${bigGroupMemberSize}的大群组
|
||||
* 6. 把数据分片${splitFileCount}个保存在文件中
|
||||
*
|
||||
* 好友关系和群组关系都是随机生成,有可能会出现最后几个用户无法满足精确好友数或者群组数的问题,但绝大部分数据都能满足需求。
|
||||
*/
|
||||
public class GenerateTestData {
|
||||
//IM服务Server API
|
||||
private static String AdminUrl = "http://10.206.0.5:18080";
|
||||
private static String AdminSecret = "123456";
|
||||
|
||||
private static int totalUserCount = 20000;
|
||||
|
||||
//每个用户的好友数
|
||||
private static int friendCount = 100;
|
||||
|
||||
//每个用户拥有的小群数,和小群的大小。
|
||||
private static int smallGroupCount = 100;
|
||||
private static int smallGroupMemberSize = 20;
|
||||
|
||||
//每个用户拥有的中群数,和中群的大小。
|
||||
private static int middleGroupCount = 100;
|
||||
private static int middleGroupMemberSize = 100;
|
||||
|
||||
//每个用户拥有的大群数,和大群的大小。
|
||||
private static int bigGroupCount = 20;
|
||||
private static int bigGroupMemberSize = 1000;
|
||||
|
||||
//数据文件分割成几个文件存储。
|
||||
private static int splitFileCount = 1;
|
||||
|
||||
|
||||
//统计添加好友数和创建群组数。
|
||||
private static AtomicInteger addFriendCount = new AtomicInteger(0);
|
||||
private static AtomicInteger createGroupCount = new AtomicInteger(0);
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
AdminConfig.initAdmin(AdminUrl, AdminSecret);
|
||||
int addFriendRequestCount = friendCount*totalUserCount/2;
|
||||
int createSmallGroupCount = smallGroupCount * totalUserCount / smallGroupMemberSize;
|
||||
int createMiddleGroupCount = middleGroupCount * totalUserCount / middleGroupMemberSize;
|
||||
int createBigGroupCount = bigGroupCount * totalUserCount / bigGroupMemberSize;
|
||||
System.out.println("根据当前的参数,将创建 " + totalUserCount + " 名用户");
|
||||
System.out.println("添加大概 " + addFriendRequestCount + " 次好友请求");
|
||||
System.out.println("创建大概 " + createSmallGroupCount + " 个小型群组");
|
||||
System.out.println("创建大概 " + createMiddleGroupCount + " 个中等群组");
|
||||
System.out.println("创建大概 " + createBigGroupCount + " 个大型群组");
|
||||
System.out.println("等待10秒开始");
|
||||
Thread.sleep(10*1000);
|
||||
|
||||
List<String> userIds = generateUserIds(totalUserCount);
|
||||
|
||||
CountDownLatch latch = new CountDownLatch(5);
|
||||
|
||||
new Thread(() -> {
|
||||
createUsers(userIds);
|
||||
latch.countDown();
|
||||
}).start();
|
||||
|
||||
Map<String, Integer> unfulfilledFriendMap = new HashMap<>();
|
||||
new Thread(() -> {
|
||||
addFriends(userIds, friendCount, unfulfilledFriendMap);
|
||||
latch.countDown();
|
||||
}).start();
|
||||
|
||||
Map<String, Set<String>> userSmallGroupMap = new HashMap<>();
|
||||
Map<String, Integer> unfulfilledSmallMap = new HashMap<>();
|
||||
new Thread(() ->{
|
||||
for (String userId : userIds) {
|
||||
createGroup(userId, userIds, userSmallGroupMap, smallGroupCount, smallGroupMemberSize, unfulfilledSmallMap);
|
||||
}
|
||||
latch.countDown();
|
||||
}).start();
|
||||
|
||||
Map<String, Set<String>> userMiddleGroupMap = new HashMap<>();
|
||||
Map<String, Integer> unfulfilledMiddleMap = new HashMap<>();
|
||||
new Thread(() ->{
|
||||
for (String userId : userIds) {
|
||||
createGroup(userId, userIds, userMiddleGroupMap, middleGroupCount, middleGroupMemberSize, unfulfilledMiddleMap);
|
||||
}
|
||||
latch.countDown();
|
||||
}).start();
|
||||
|
||||
Map<String, Set<String>> userBigGroupMap = new HashMap<>();
|
||||
Map<String, Integer> unfulfilledBigMap = new HashMap<>();
|
||||
new Thread(() ->{
|
||||
for (String userId : userIds) {
|
||||
createGroup(userId, userIds, userBigGroupMap, bigGroupCount, bigGroupMemberSize, unfulfilledBigMap);
|
||||
}
|
||||
latch.countDown();
|
||||
}).start();
|
||||
|
||||
latch.await();
|
||||
|
||||
System.out.println("数据初始化结束,实际建立好友关系: " + addFriendCount.get() + " 条。");
|
||||
if (!unfulfilledFriendMap.isEmpty()) {
|
||||
System.out.println("有部分用户没有建立" + friendCount + "个好友关系,分别是:");
|
||||
printUnfulfilledMap(unfulfilledFriendMap);
|
||||
}
|
||||
|
||||
System.out.println("数据初始化结束,创建群组: " + createGroupCount.get() + " 个。");
|
||||
if (!unfulfilledSmallMap.isEmpty()) {
|
||||
System.out.println("有部分用户没有建立" + smallGroupMemberSize + "个群组成员的群,分别是:");
|
||||
printUnfulfilledMap(unfulfilledSmallMap);
|
||||
}
|
||||
if (!unfulfilledMiddleMap.isEmpty()) {
|
||||
System.out.println("有部分用户没有建立" + middleGroupMemberSize + "个群组成员的群,分别是:");
|
||||
printUnfulfilledMap(unfulfilledMiddleMap);
|
||||
}
|
||||
if (!unfulfilledBigMap.isEmpty()) {
|
||||
System.out.println("有部分用户没有建立" + bigGroupMemberSize + "个群组成员的群,分别是:");
|
||||
printUnfulfilledMap(unfulfilledBigMap);
|
||||
}
|
||||
|
||||
|
||||
System.out.println("保存数据到" + splitFileCount + "个文件中。");
|
||||
for (int i = 0; i < splitFileCount; i++) {
|
||||
String filePath = "data"+i+".csv"; // 文件路径
|
||||
BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));
|
||||
int partSize = totalUserCount/splitFileCount;
|
||||
for (int j = 0; j < partSize; j++) {
|
||||
String userId = userIds.get(i*partSize+j);
|
||||
writeDeviceInfo(writer, userId, 3);
|
||||
Set<String> smallGroupIds = userSmallGroupMap.get(userId);
|
||||
writeGroupIds(writer, smallGroupIds);
|
||||
Set<String> middleGroupIds = userMiddleGroupMap.get(userId);
|
||||
writeGroupIds(writer, middleGroupIds);
|
||||
Set<String> bigGroupIds = userBigGroupMap.get(userId);
|
||||
writeGroupIds(writer, bigGroupIds);
|
||||
}
|
||||
|
||||
writer.close();
|
||||
}
|
||||
|
||||
System.out.println("保存结束。");
|
||||
}
|
||||
|
||||
private static void printUnfulfilledMap(Map<String, Integer> map) {
|
||||
if(map.isEmpty())
|
||||
return;
|
||||
|
||||
map.forEach((s, integer) -> System.out.print(s + ":" + integer + " "));
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
private static void writeDeviceInfo(BufferedWriter writer, String userId, int platform) throws IOException {
|
||||
writer.write(userId);
|
||||
writer.write(",");
|
||||
writer.write(UUID.randomUUID().toString());
|
||||
writer.write(",");
|
||||
writer.write(""+platform);
|
||||
writer.write("\n");
|
||||
}
|
||||
|
||||
private static void writeGroupIds(BufferedWriter writer, Set<String> groupIds) throws IOException {
|
||||
int writeCount = 0;
|
||||
for (String bigGroupId : groupIds) {
|
||||
writer.write(bigGroupId);
|
||||
writeCount++;
|
||||
if(writeCount < groupIds.size()) {
|
||||
writer.write(",");
|
||||
} else {
|
||||
writer.write("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
private static void createGroup(String userId, List<String> userIds, Map<String, Set<String>> userGroupMap, int groupCount, int memberSize, Map<String, Integer> unfulfilledUserMap) {
|
||||
Set<String> groupIds = userGroupMap.computeIfAbsent(userId, s -> new HashSet<>());
|
||||
int i = 0;
|
||||
while (groupIds.size() < groupCount){
|
||||
PojoGroupInfo groupInfo = new PojoGroupInfo();
|
||||
groupInfo.setTarget_id(UUID.randomUUID().toString());
|
||||
groupInfo.setOwner(userId);
|
||||
groupInfo.setName("Group_"+userId+i++);
|
||||
groupInfo.setType(2);
|
||||
groupIds.add(groupInfo.getTarget_id());
|
||||
|
||||
List<String> memberCandidates = new ArrayList<>(userIds);
|
||||
List<String> memberIds = new ArrayList<>();
|
||||
memberIds.add(userId);
|
||||
|
||||
while (!memberCandidates.isEmpty() && memberIds.size() < memberSize) {
|
||||
String memberId = memberCandidates.get((int)(Math.random()*memberCandidates.size()));
|
||||
memberCandidates.remove(memberId);
|
||||
if(memberId.equals(userId)) {
|
||||
continue;
|
||||
}
|
||||
if (memberIds.contains(memberId)) {
|
||||
continue;
|
||||
}
|
||||
Set<String> memberGroupIds = userGroupMap.computeIfAbsent(memberId, s -> new HashSet<>());
|
||||
if(memberGroupIds.contains(groupInfo.getTarget_id()) || memberGroupIds.size() >= groupCount) {
|
||||
continue;
|
||||
}
|
||||
memberGroupIds.add(groupInfo.getTarget_id());
|
||||
memberIds.add(memberId);
|
||||
}
|
||||
|
||||
List<PojoGroupMember> members = new ArrayList<>();
|
||||
for (String memberId : memberIds) {
|
||||
PojoGroupMember member1 = new PojoGroupMember();
|
||||
member1.setMember_id(memberId);
|
||||
members.add(member1);
|
||||
}
|
||||
|
||||
try {
|
||||
IMResult<OutputCreateGroupResult> resultCreateGroup = GroupAdmin.createGroup(groupInfo.getOwner(), groupInfo, members, null, null, null);
|
||||
if (resultCreateGroup != null && resultCreateGroup.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("create group success");
|
||||
} else {
|
||||
System.out.println("create group failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println("create group failure:" + e);
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
createGroupCount.incrementAndGet();
|
||||
if(memberIds.size() < memberSize) {
|
||||
unfulfilledUserMap.put(userId + "'s group " + groupInfo.getTarget_id(), memberIds.size());
|
||||
System.out.println("Error, can not find enough user to create group for user:" + userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void addFriends(List<String> userIds, int count, Map<String, Integer> unfulfilledFriendMap) {
|
||||
ConcurrentLinkedQueue<Pair<String, String>> toAddSet = new ConcurrentLinkedQueue<>();
|
||||
Map<String, Set<String>> userFriends = new HashMap<>();
|
||||
for (String userId : userIds) {
|
||||
List<String> candidates = new ArrayList<>(userIds);
|
||||
Set<String> currentUserFriends = userFriends.computeIfAbsent(userId, s -> new HashSet<>());
|
||||
while (!candidates.isEmpty() && currentUserFriends.size() < count) {
|
||||
String friendId = candidates.get((int) (Math.random()*candidates.size()));
|
||||
candidates.remove(friendId);
|
||||
if(friendId.equals(userId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!currentUserFriends.contains(friendId)) {
|
||||
Set<String> targetUserFriends = userFriends.computeIfAbsent(friendId, s -> new HashSet<>());
|
||||
if(targetUserFriends.size() < count) {
|
||||
currentUserFriends.add(friendId);
|
||||
targetUserFriends.add(userId);
|
||||
toAddSet.add(new Pair<>(userId, friendId));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (currentUserFriends.size() < count) {
|
||||
unfulfilledFriendMap.put(userId, currentUserFriends.size());
|
||||
System.out.println("Error, can not find enough user to add friend for user:" + userId);
|
||||
}
|
||||
}
|
||||
int threadNum = 5;
|
||||
CountDownLatch latch = new CountDownLatch(threadNum);
|
||||
for (int i = 0; i < threadNum; i++) {
|
||||
new Thread(() -> {
|
||||
while (true) {
|
||||
Pair<String, String> pair = toAddSet.poll();
|
||||
if(pair == null) {
|
||||
latch.countDown();
|
||||
break;
|
||||
}
|
||||
try {
|
||||
IMResult<Void> result = RelationAdmin.setUserFriend(pair.first, pair.second, true, null);
|
||||
if (result != null && (result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS || result.getErrorCode() == ErrorCode.ERROR_CODE_ALREADY_FRIENDS)) {
|
||||
System.out.println("add friend success");
|
||||
addFriendCount.incrementAndGet();
|
||||
} else {
|
||||
System.out.println("failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println("failure:" + e);
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
try {
|
||||
latch.await();
|
||||
} catch (InterruptedException e) {
|
||||
System.out.println("failure:" + e);
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
private static String generateUserId(int index) {
|
||||
return UUID.randomUUID().toString().replace("-", "");
|
||||
}
|
||||
|
||||
private static List<String> generateUserIds(int count) {
|
||||
List<String> userIds = new ArrayList<>();
|
||||
for (int i = 0; i < count; i++) {
|
||||
userIds.add(generateUserId(i));
|
||||
}
|
||||
return userIds;
|
||||
}
|
||||
|
||||
private static void createUsers(List<String> userIds) {
|
||||
for (int i = 0; i < userIds.size(); i++) {
|
||||
InputOutputUserInfo userInfo = generateUserInfo(userIds.get(i), i);
|
||||
try {
|
||||
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);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.out.println("Create user failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static InputOutputUserInfo generateUserInfo(String userId, int index) {
|
||||
InputOutputUserInfo userInfo = new InputOutputUserInfo();
|
||||
//用户ID,必须保证唯一性
|
||||
userInfo.setUserId(userId);
|
||||
//用户名,一般是用户登录帐号,也必须保证唯一性。也就是说所有用户的userId必须不能重复,所有用户的name必须不能重复,但可以同一个用户的userId和name是同一个,一般建议userId使用一个uuid,name是"微信号"且可以修改,
|
||||
userInfo.setName(userId);
|
||||
userInfo.setMobile((11000000000L+index) + "");
|
||||
userInfo.setDisplayName("User"+index);
|
||||
|
||||
return userInfo;
|
||||
}
|
||||
static class Pair<K, V> {
|
||||
K first;
|
||||
V second;
|
||||
|
||||
public Pair() {
|
||||
}
|
||||
|
||||
public Pair(K first, V second) {
|
||||
this.first = first;
|
||||
this.second = second;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,14 +2,13 @@ package cn.wildfirechat.sdk;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.pojos.*;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.sdk.model.IMResult;
|
||||
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class GroupAdmin {
|
||||
public static IMResult<OutputCreateGroupResult> createGroup(String operator, PojoGroupInfo group_info, List<PojoGroupMember> members, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public static IMResult<OutputCreateGroupResult> createGroup(String operator, PojoGroupInfo group_info, List<PojoGroupMember> members, String member_extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Create_Group;
|
||||
PojoGroup pojoGroup = new PojoGroup();
|
||||
pojoGroup.setGroup_info(group_info);
|
||||
@@ -17,6 +16,7 @@ public class GroupAdmin {
|
||||
InputCreateGroup createGroup = new InputCreateGroup();
|
||||
createGroup.setGroup(pojoGroup);
|
||||
createGroup.setOperator(operator);
|
||||
createGroup.setMember_extra(member_extra);
|
||||
createGroup.setTo_lines(to_lines);
|
||||
createGroup.setNotify_message(notify_message);
|
||||
|
||||
@@ -31,6 +31,11 @@ public class GroupAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, input, PojoGroupInfo.class);
|
||||
}
|
||||
|
||||
public static IMResult<PojoGroupInfoList> batchGroupInfos(List<String> groupIds) throws Exception {
|
||||
String path = APIPath.Group_Batch_Info;
|
||||
return AdminHttpUtils.httpJsonPost(path, groupIds, PojoGroupInfoList.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> dismissGroup(String operator, String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Dismiss;
|
||||
InputDismissGroup dismissGroup = new InputDismissGroup();
|
||||
@@ -80,12 +85,13 @@ public class GroupAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, input, PojoGroupMember.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> addGroupMembers(String operator, String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public static IMResult<Void> addGroupMembers(String operator, String groupId, List<PojoGroupMember> groupMembers, String member_extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Member_Add;
|
||||
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
addGroupMember.setMembers(groupMembers);
|
||||
addGroupMember.setOperator(operator);
|
||||
addGroupMember.setMemberExtra(member_extra);
|
||||
addGroupMember.setTo_lines(to_lines);
|
||||
addGroupMember.setNotify_message(notify_message);
|
||||
return AdminHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,229 @@
|
||||
package cn.wildfirechat.sdk;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.pojos.*;
|
||||
import cn.wildfirechat.pojos.mesh.*;
|
||||
import cn.wildfirechat.sdk.model.IMResult;
|
||||
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class MeshAdmin {
|
||||
public static IMResult<Void> createDomain(InputOutputDomainInfo domainInfo) throws Exception {
|
||||
String path = APIPath.Create_Domain;
|
||||
return AdminHttpUtils.httpJsonPost(path, domainInfo, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<InputOutputDomainInfo> getDomain(String domainId) throws Exception {
|
||||
String path = APIPath.Get_Domain;
|
||||
InputStringValue inputId = new InputStringValue();
|
||||
inputId.setValue(domainId);
|
||||
return AdminHttpUtils.httpJsonPost(path, inputId, InputOutputDomainInfo.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> deleteDomain(String domainId) throws Exception {
|
||||
String path = APIPath.Destroy_Domain;
|
||||
InputStringValue inputId = new InputStringValue();
|
||||
inputId.setValue(domainId);
|
||||
return AdminHttpUtils.httpJsonPost(path, inputId, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<InputOutputDomainInfoList> getAllDomain() throws Exception {
|
||||
String path = APIPath.List_Domain;
|
||||
return AdminHttpUtils.httpJsonPost(path, null, InputOutputDomainInfoList.class);
|
||||
}
|
||||
|
||||
public static IMResult<OutputUserInfoList> getBatchUserInfos(List<String> userIds) throws Exception {
|
||||
String path = APIPath.User_Batch_Get_Infos;
|
||||
OutputStringList getUserInfo = new OutputStringList(userIds);
|
||||
return AdminHttpUtils.httpJsonPost(path, getUserInfo, OutputUserInfoList.class);
|
||||
}
|
||||
|
||||
public static IMResult<PojoSearchUserRes> searchUser(String keyword, int searchType, int page) throws Exception {
|
||||
String path = APIPath.Search_User;
|
||||
PojoSearchUserReq req = new PojoSearchUserReq();
|
||||
req.keyword = keyword;
|
||||
req.searchType = searchType;
|
||||
req.page = page;
|
||||
return AdminHttpUtils.httpJsonPost(path, req, PojoSearchUserRes.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> sendFriendRequest(String userId, String targetId, String reason) throws Exception {
|
||||
String path = APIPath.Friend_Send_Request;
|
||||
InputAddFriendRequest input = new InputAddFriendRequest();
|
||||
input.setUserId(userId);
|
||||
input.setFriendUid(targetId);
|
||||
input.setReason(reason);
|
||||
input.setForce(false);
|
||||
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> handleFriendRequest(String userId, String targetId, int status) throws Exception {
|
||||
String path = APIPath.Handle_Friend_Send_Request;
|
||||
InputHandleFriendRequest input = new InputHandleFriendRequest();
|
||||
input.setUserId(userId);
|
||||
input.setFriendUid(targetId);
|
||||
input.setStatus(status);
|
||||
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<SendMessageResult> sendMessage(String sender, Conversation conversation, MessagePayload payload, List<String> toUsers) throws Exception {
|
||||
String path = APIPath.Msg_Send;
|
||||
SendMessageData messageData = new SendMessageData();
|
||||
messageData.setSender(sender);
|
||||
messageData.setConv(conversation);
|
||||
messageData.setPayload(payload);
|
||||
messageData.setToUsers(toUsers);
|
||||
messageData.setMeshMessage(true);
|
||||
if (payload.getType() == 1 && (payload.getSearchableContent() == null || payload.getSearchableContent().isEmpty())) {
|
||||
System.out.println("Payload错误,Payload格式应该跟客户端消息encode出来的Payload对齐,这样客户端才能正确识别。比如文本消息,文本需要放到searchableContent属性。请与客户端同事确认Payload的格式,或则去 https://gitee.com/wfchat/android-chat/tree/master/client/src/main/java/cn/wildfirechat/message 找到消息encode的实现方法!");
|
||||
}
|
||||
return AdminHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class);
|
||||
}
|
||||
|
||||
public static IMResult<SendMessageResult> publishMessage(SendMessageData messageData, List<String> receivers) throws Exception {
|
||||
String path = APIPath.Msg_Publish;
|
||||
PojoPublishMessageReq req = new PojoPublishMessageReq();
|
||||
req.messageData = messageData;
|
||||
req.receivers = receivers;
|
||||
return AdminHttpUtils.httpJsonPost(path, req, SendMessageResult.class);
|
||||
}
|
||||
|
||||
public static IMResult<String> recallMessage(String operator, long messageId) throws Exception {
|
||||
String path = APIPath.Msg_Recall;
|
||||
RecallMessageData req = new RecallMessageData();
|
||||
req.setOperator(operator);
|
||||
req.setMessageUid(messageId);
|
||||
req.setUserRecall(true);
|
||||
return AdminHttpUtils.httpJsonPost(path, req, String.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> updateMessageContent(String operator, long messageUid, MessagePayload payload, boolean distribute) throws Exception {
|
||||
String path = APIPath.Msg_Update;
|
||||
UpdateMessageContentData updateMessageContentData = new UpdateMessageContentData();
|
||||
updateMessageContentData.setOperator(operator);
|
||||
updateMessageContentData.setMessageUid(messageUid);
|
||||
updateMessageContentData.setPayload(payload);
|
||||
updateMessageContentData.setDistribute(distribute?1:0);
|
||||
updateMessageContentData.setUpdateTimestamp(0);
|
||||
updateMessageContentData.setMeshLocal(1);
|
||||
return AdminHttpUtils.httpJsonPost(path, updateMessageContentData, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> syncGroup(PojoGroupInfo group_info, List<PojoGroupMember> members) throws Exception {
|
||||
String path = APIPath.Sync_Group;
|
||||
PojoGroup pojoGroup = new PojoGroup();
|
||||
pojoGroup.setGroup_info(group_info);
|
||||
pojoGroup.setMembers(members);
|
||||
|
||||
return AdminHttpUtils.httpJsonPost(path, pojoGroup, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<PojoGroupInfo> getGroupInfo(String groupId) throws Exception {
|
||||
return GroupAdmin.getGroupInfo(groupId);
|
||||
}
|
||||
|
||||
public static IMResult<OutputGroupMemberList> getGroupMembers(String groupId) throws Exception {
|
||||
return GroupAdmin.getGroupMembers(groupId);
|
||||
}
|
||||
|
||||
public static IMResult<Void> addGroupMembers(String operator, String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Member_Add;
|
||||
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
addGroupMember.setMembers(groupMembers);
|
||||
addGroupMember.setOperator(operator);
|
||||
addGroupMember.setTo_lines(to_lines);
|
||||
addGroupMember.setNotify_message(notify_message);
|
||||
addGroupMember.setMeshMessage(true);
|
||||
return AdminHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<PojoGroupInfoList> batchGroupInfos(List<String> groupIds) throws Exception {
|
||||
return GroupAdmin.batchGroupInfos(groupIds);
|
||||
}
|
||||
|
||||
public static IMResult<Void> quitGroup(String operator, String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Member_Quit;
|
||||
InputQuitGroup quitGroup = new InputQuitGroup();
|
||||
quitGroup.setGroup_id(groupId);
|
||||
quitGroup.setOperator(operator);
|
||||
quitGroup.setTo_lines(to_lines);
|
||||
quitGroup.setNotify_message(notify_message);
|
||||
quitGroup.setMeshMessage(true);
|
||||
return AdminHttpUtils.httpJsonPost(path, quitGroup, Void.class);
|
||||
}
|
||||
|
||||
|
||||
public static IMResult<Void> dismissGroup(String operator, String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Dismiss;
|
||||
InputDismissGroup dismissGroup = new InputDismissGroup();
|
||||
dismissGroup.setOperator(operator);
|
||||
dismissGroup.setGroup_id(groupId);
|
||||
dismissGroup.setTo_lines(to_lines);
|
||||
dismissGroup.setNotify_message(notify_message);
|
||||
dismissGroup.setMeshMessage(true);
|
||||
return AdminHttpUtils.httpJsonPost(path, dismissGroup, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> kickoffGroupMembers(String operator, String groupId, List<String> groupMemberIds, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Member_Kickoff;
|
||||
InputKickoffGroupMember kickoffGroupMember = new InputKickoffGroupMember();
|
||||
kickoffGroupMember.setGroup_id(groupId);
|
||||
kickoffGroupMember.setMembers(groupMemberIds);
|
||||
kickoffGroupMember.setOperator(operator);
|
||||
kickoffGroupMember.setTo_lines(to_lines);
|
||||
kickoffGroupMember.setMeshMessage(true);
|
||||
kickoffGroupMember.setNotify_message(notify_message);
|
||||
return AdminHttpUtils.httpJsonPost(path, kickoffGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> transferGroup(String operator, String groupId, String newOwner, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Transfer;
|
||||
InputTransferGroup transferGroup = new InputTransferGroup();
|
||||
transferGroup.setGroup_id(groupId);
|
||||
transferGroup.setNew_owner(newOwner);
|
||||
transferGroup.setOperator(operator);
|
||||
transferGroup.setTo_lines(to_lines);
|
||||
transferGroup.setNotify_message(notify_message);
|
||||
transferGroup.setMeshMessage(true);
|
||||
return AdminHttpUtils.httpJsonPost(path, transferGroup, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> modifyGroupInfo(String operator, String groupId, /*ModifyGroupInfoType*/int type, String value, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Modify_Info;
|
||||
InputModifyGroupInfo modifyGroupInfo = new InputModifyGroupInfo();
|
||||
modifyGroupInfo.setGroup_id(groupId);
|
||||
modifyGroupInfo.setOperator(operator);
|
||||
modifyGroupInfo.setTo_lines(to_lines);
|
||||
modifyGroupInfo.setType(type);
|
||||
modifyGroupInfo.setValue(value);
|
||||
modifyGroupInfo.setNotify_message(notify_message);
|
||||
modifyGroupInfo.setMeshMessage(true);
|
||||
return AdminHttpUtils.httpJsonPost(path, modifyGroupInfo, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<PojoUserConferenceResponse> userConferenceRequest(String clientID, String fromUser, String request, long sessionId, String roomId, String data, boolean advanced) throws Exception {
|
||||
String path = APIPath.Conference_User_Request;
|
||||
PojoUserConferenceRequest conferenceRequest = new PojoUserConferenceRequest();
|
||||
conferenceRequest.clientID = clientID;
|
||||
conferenceRequest.fromUser = fromUser;
|
||||
conferenceRequest.request = request;
|
||||
conferenceRequest.sessionId = sessionId;
|
||||
conferenceRequest.roomId = roomId;
|
||||
conferenceRequest.data = data;
|
||||
conferenceRequest.advanced = advanced;
|
||||
return AdminHttpUtils.httpJsonPost(path, conferenceRequest, PojoUserConferenceResponse.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> userConferenceEvent(String data, String userId, String clientId, boolean isRobot) throws Exception {
|
||||
String path = APIPath.Conference_User_Event;
|
||||
PojoUserConferenceEvent event = new PojoUserConferenceEvent();
|
||||
event.data = data;
|
||||
event.userId = userId;
|
||||
event.clientId = clientId;
|
||||
event.isRobot = isRobot;
|
||||
return AdminHttpUtils.httpJsonPost(path, event, Void.class);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -81,13 +81,7 @@ public class MessageAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, inputMessageUid, OutputMessageData.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 撤回群发或者广播的消息
|
||||
* @param operator 操作者
|
||||
* @param messageUid 消息唯一ID
|
||||
* @return
|
||||
* @throws Exception
|
||||
*/
|
||||
//仅专业版支持
|
||||
public static IMResult<Void> recallBroadCastMessage(String operator, long messageUid) throws Exception {
|
||||
String path = APIPath.Msg_RecallBroadCast;
|
||||
RecallMessageData messageData = new RecallMessageData();
|
||||
@@ -102,10 +96,28 @@ public class MessageAdmin {
|
||||
messageData.operator = operator;
|
||||
messageData.messageUid = messageUid;
|
||||
messageData.receivers = receivers;
|
||||
|
||||
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class);
|
||||
}
|
||||
|
||||
//仅专业版支持
|
||||
public static IMResult<Void> deleteBroadCastMessage(String operator, long messageUid) throws Exception {
|
||||
String path = APIPath.Msg_DeleteBroadCast;
|
||||
RecallMessageData messageData = new RecallMessageData();
|
||||
messageData.setOperator(operator);
|
||||
messageData.setMessageUid(messageUid);
|
||||
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> deleteMultiCastMessage(String operator, long messageUid, List<String> receivers) throws Exception {
|
||||
String path = APIPath.Msg_DeleteMultiCast;
|
||||
RecallMultiCastMessageData messageData = new RecallMultiCastMessageData();
|
||||
messageData.operator = operator;
|
||||
messageData.messageUid = messageUid;
|
||||
messageData.receivers = receivers;
|
||||
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class);
|
||||
}
|
||||
|
||||
//仅专业版支持
|
||||
public static IMResult<BroadMessageResult> broadcastMessage(String sender, int line, MessagePayload payload) throws Exception {
|
||||
String path = APIPath.Msg_Broadcast;
|
||||
BroadMessageData messageData = new BroadMessageData();
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package cn.wildfirechat.sdk;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.*;
|
||||
import cn.wildfirechat.pojos.moments.*;
|
||||
import cn.wildfirechat.sdk.model.IMResult;
|
||||
import cn.wildfirechat.sdk.utilities.RobotHttpUtils;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
@@ -96,13 +98,14 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, pojo, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<OutputCreateGroupResult> createGroup(PojoGroupInfo group_info, List<PojoGroupMember> members, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<OutputCreateGroupResult> createGroup(PojoGroupInfo group_info, List<PojoGroupMember> members, String member_extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Create_Group;
|
||||
PojoGroup pojoGroup = new PojoGroup();
|
||||
pojoGroup.setGroup_info(group_info);
|
||||
pojoGroup.setMembers(members);
|
||||
InputCreateGroup createGroup = new InputCreateGroup();
|
||||
createGroup.setGroup(pojoGroup);
|
||||
createGroup.setMember_extra(member_extra);
|
||||
createGroup.setTo_lines(to_lines);
|
||||
createGroup.setNotify_message(notify_message);
|
||||
|
||||
@@ -117,7 +120,7 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, input, PojoGroupInfo.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> dismissGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> dismissGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Dismiss;
|
||||
InputDismissGroup dismissGroup = new InputDismissGroup();
|
||||
dismissGroup.setGroup_id(groupId);
|
||||
@@ -126,7 +129,7 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, dismissGroup, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> transferGroup(String groupId, String newOwner, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> transferGroup(String groupId, String newOwner, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Transfer;
|
||||
InputTransferGroup transferGroup = new InputTransferGroup();
|
||||
transferGroup.setGroup_id(groupId);
|
||||
@@ -136,7 +139,7 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, transferGroup, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> modifyGroupInfo(String groupId, /*ModifyGroupInfoType*/int type, String value, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> modifyGroupInfo(String groupId, /*ModifyGroupInfoType*/int type, String value, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Modify_Info;
|
||||
InputModifyGroupInfo modifyGroupInfo = new InputModifyGroupInfo();
|
||||
modifyGroupInfo.setGroup_id(groupId);
|
||||
@@ -163,17 +166,18 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, input, PojoGroupMember.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> addGroupMembers(String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> addGroupMembers(String groupId, List<PojoGroupMember> groupMembers, String member_extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Member_Add;
|
||||
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
addGroupMember.setMembers(groupMembers);
|
||||
addGroupMember.setMemberExtra(member_extra);
|
||||
addGroupMember.setTo_lines(to_lines);
|
||||
addGroupMember.setNotify_message(notify_message);
|
||||
return robotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> setGroupManager(String groupId, List<String> groupMemberIds, boolean isManager, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> setGroupManager(String groupId, List<String> groupMemberIds, boolean isManager, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Set_Manager;
|
||||
InputSetGroupManager addGroupMember = new InputSetGroupManager();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
@@ -184,7 +188,7 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> muteGroupMember(String groupId, List<String> groupMemberIds, boolean isMute, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> muteGroupMember(String groupId, List<String> groupMemberIds, boolean isMute, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Mute_Member;
|
||||
InputMuteGroupMember addGroupMember = new InputMuteGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
@@ -195,7 +199,7 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> allowGroupMember(String groupId, List<String> groupMemberIds, boolean isAllow, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> allowGroupMember(String groupId, List<String> groupMemberIds, boolean isAllow, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Allow_Member;
|
||||
InputMuteGroupMember addGroupMember = new InputMuteGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
@@ -206,7 +210,7 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> kickoffGroupMembers(String groupId, List<String> groupMemberIds, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> kickoffGroupMembers(String groupId, List<String> groupMemberIds, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Member_Kickoff;
|
||||
InputKickoffGroupMember kickoffGroupMember = new InputKickoffGroupMember();
|
||||
kickoffGroupMember.setGroup_id(groupId);
|
||||
@@ -216,7 +220,7 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, kickoffGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> quitGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> quitGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Member_Quit;
|
||||
InputQuitGroup quitGroup = new InputQuitGroup();
|
||||
quitGroup.setGroup_id(groupId);
|
||||
@@ -225,7 +229,7 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, quitGroup, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> setGroupMemberAlias(String groupId, String memberId, String alias, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> setGroupMemberAlias(String groupId, String memberId, String alias, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Set_Member_Alias;
|
||||
InputSetGroupMemberAlias input = new InputSetGroupMemberAlias();
|
||||
input.setGroup_id(groupId);
|
||||
@@ -236,7 +240,7 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, input, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> setGroupMemberExtra(String groupId, String memberId, String extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public IMResult<Void> setGroupMemberExtra(String groupId, String memberId, String extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Set_Member_Extra;
|
||||
InputSetGroupMemberExtra input = new InputSetGroupMemberExtra();
|
||||
input.setGroup_id(groupId);
|
||||
@@ -274,4 +278,144 @@ public class RobotService {
|
||||
return robotHttpUtils.httpJsonPost(path, input, String.class);
|
||||
}
|
||||
|
||||
public IMResult<FeedPojo> postMomentsFeed(int/*MomentsContentType*/ type, String text, List<MediaEntry> medias, List<String> toUsers, List<String> excludeUsers, List<String> mentionedUsers, String extra) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Post_Feed;
|
||||
FeedPojo feedPojo = new FeedPojo();
|
||||
feedPojo.type = type;
|
||||
feedPojo.text = text;
|
||||
feedPojo.medias = medias;
|
||||
feedPojo.to = toUsers;
|
||||
feedPojo.ex = excludeUsers;
|
||||
feedPojo.mu = mentionedUsers;
|
||||
feedPojo.extra = extra;
|
||||
IMResult<PostFeedResult> imResult = robotHttpUtils.httpJsonPost(path, feedPojo, PostFeedResult.class);
|
||||
IMResult<FeedPojo> feedResult = new IMResult<>();
|
||||
if(imResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
feedPojo.feedId = imResult.result.id;
|
||||
feedPojo.timestamp = imResult.result.timestamp;
|
||||
feedResult.setCode(ErrorCode.ERROR_CODE_SUCCESS.getCode());
|
||||
feedResult.setResult(feedPojo);
|
||||
} else {
|
||||
feedResult.setCode(imResult.getCode());
|
||||
feedResult.setMsg(imResult.getMsg());
|
||||
}
|
||||
return feedResult;
|
||||
}
|
||||
|
||||
public IMResult<Void> updateMomentsFeed(long feedId, int/*MomentsContentType*/ type, String text, List<MediaEntry> medias, List<String> toUsers, List<String> excludeUsers, List<String> mentionedUsers, String extra) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Update_Feed;
|
||||
FeedPojo feedPojo = new FeedPojo();
|
||||
feedPojo.feedId = feedId;
|
||||
feedPojo.type = type;
|
||||
feedPojo.text = text;
|
||||
feedPojo.medias = medias;
|
||||
feedPojo.to = toUsers;
|
||||
feedPojo.ex = excludeUsers;
|
||||
feedPojo.mu = mentionedUsers;
|
||||
feedPojo.extra = extra;
|
||||
return robotHttpUtils.httpJsonPost(path, feedPojo, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<FeedsPojo> getMomentsFeeds(long feedId, int count, String user) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Pull_Feeds;
|
||||
PullFeedRequestPojo requestPojo = new PullFeedRequestPojo();
|
||||
requestPojo.feedId = feedId;
|
||||
requestPojo.count = count;
|
||||
requestPojo.user = user;
|
||||
return robotHttpUtils.httpJsonPost(path, requestPojo, FeedsPojo.class);
|
||||
}
|
||||
|
||||
public IMResult<FeedPojo> getMomentsFeed(long feedId) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Fetch_Feed;
|
||||
PullOneFeedRequestPojo requestPojo = new PullOneFeedRequestPojo();
|
||||
requestPojo.feedId = feedId;
|
||||
return robotHttpUtils.httpJsonPost(path, requestPojo, FeedPojo.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> deleteMomentsFeed(long feedId) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Recall_Feed;
|
||||
IdPojo requestPojo = new IdPojo();
|
||||
requestPojo.id = feedId;
|
||||
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<CommentPojo> postMomentsComment(long feedId, long replyId, int/*MomentsCommentType*/ type, String text, String replyTo, String extra) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Post_Comment;
|
||||
CommentPojo commentPojo = new CommentPojo();
|
||||
commentPojo.type = type;
|
||||
commentPojo.text = text;
|
||||
commentPojo.replyId = replyId;
|
||||
commentPojo.feedId = feedId;
|
||||
commentPojo.replyTo = replyTo;
|
||||
commentPojo.extra = extra;
|
||||
IMResult<PostFeedResult> imResult = robotHttpUtils.httpJsonPost(path, commentPojo, PostFeedResult.class);
|
||||
IMResult<CommentPojo> feedResult = new IMResult<>();
|
||||
if(imResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
commentPojo.commentId = imResult.result.id;
|
||||
commentPojo.timestamp = imResult.result.timestamp;
|
||||
feedResult.setCode(ErrorCode.ERROR_CODE_SUCCESS.getCode());
|
||||
feedResult.setResult(commentPojo);
|
||||
} else {
|
||||
feedResult.setCode(imResult.getCode());
|
||||
feedResult.setMsg(imResult.getMsg());
|
||||
}
|
||||
return feedResult;
|
||||
}
|
||||
|
||||
public IMResult<Void> deleteMomentsComment(long feedId, long commentId) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Recall_Comment;
|
||||
IdPojo requestPojo = new IdPojo();
|
||||
requestPojo.id = commentId;
|
||||
requestPojo.id2 = feedId;
|
||||
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<MomentProfilePojo> getUserMomentsProfile(String userId) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Fetch_Profiles;
|
||||
PullProfileRequestPojo requestPojo = new PullProfileRequestPojo();
|
||||
requestPojo.u = userId;
|
||||
return robotHttpUtils.httpJsonPost(path, requestPojo, MomentProfilePojo.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> updateMomentsBackgroundUrl(String url) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Update_Profiles_Value;
|
||||
PushProfileValueRequestPojo requestPojo = new PushProfileValueRequestPojo();
|
||||
requestPojo.t = 0;
|
||||
requestPojo.v = url;
|
||||
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> updateMomentsStrangerVisibleCount(int count) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Update_Profiles_Value;
|
||||
PushProfileValueRequestPojo requestPojo = new PushProfileValueRequestPojo();
|
||||
requestPojo.t = 1;
|
||||
requestPojo.i = count;
|
||||
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> updateMomentsVisibleScope(int/*MomentsVisibleScope*/ scope) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Update_Profiles_Value;
|
||||
PushProfileValueRequestPojo requestPojo = new PushProfileValueRequestPojo();
|
||||
requestPojo.t = 2;
|
||||
requestPojo.i = scope;
|
||||
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> updateMomentsBlackList(List<String> addList, List<String> removeList) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Update_Profiles_List_Value;
|
||||
PushProfileListRequestPojo requestPojo = new PushProfileListRequestPojo();
|
||||
requestPojo.b = false;
|
||||
requestPojo.al = addList;
|
||||
requestPojo.rl = removeList;
|
||||
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
|
||||
}
|
||||
|
||||
public IMResult<Void> updateMomentsBlockList(List<String> addList, List<String> removeList) throws Exception {
|
||||
String path = APIPath.Robot_Moments_Update_Profiles_List_Value;
|
||||
PushProfileListRequestPojo requestPojo = new PushProfileListRequestPojo();
|
||||
requestPojo.b = true;
|
||||
requestPojo.al = addList;
|
||||
requestPojo.rl = removeList;
|
||||
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ import cn.wildfirechat.pojos.*;
|
||||
import cn.wildfirechat.sdk.model.IMResult;
|
||||
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class UserAdmin {
|
||||
public static IMResult<InputOutputUserInfo> getUserByName(String name) throws Exception {
|
||||
String path = APIPath.User_Get_Info;
|
||||
@@ -37,6 +39,13 @@ public class UserAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, input, OutputGetUserList.class);
|
||||
}
|
||||
|
||||
public static IMResult<OutputUserInfoList> getBatchUsers(List<String> userIds) throws Exception {
|
||||
String path = APIPath.User_Batch_Get_Infos;
|
||||
InputStringList input = new InputStringList();
|
||||
input.setList(userIds);
|
||||
return AdminHttpUtils.httpJsonPost(path, input, OutputUserInfoList.class);
|
||||
}
|
||||
|
||||
public static IMResult<OutputCreateUser> createUser(InputOutputUserInfo user) throws Exception {
|
||||
String path = APIPath.Create_User;
|
||||
return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class);
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
* Copyright (c) 2022 WildFireChat. All rights reserved.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.sdk.messagecontent;
|
||||
|
||||
import cn.wildfirechat.pojos.MessagePayload;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class ArticlesMessageContent extends MessageContent {
|
||||
public Article topArticle;
|
||||
public ArrayList<Article> subArticles;
|
||||
|
||||
@Override
|
||||
public int getContentType() {
|
||||
return ProtoConstants.ContentType.Articles;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPersistFlag() {
|
||||
return ProtoConstants.PersistFlag.Persist_And_Count;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessagePayload encode() {
|
||||
MessagePayload payload = super.encodeBase();
|
||||
payload.setSearchableContent(topArticle.title);
|
||||
JSONObject object = new JSONObject();
|
||||
|
||||
object.put("top", topArticle.toJson());
|
||||
if (subArticles != null) {
|
||||
JSONArray jsonArray = new JSONArray();
|
||||
object.put("subArticles", jsonArray);
|
||||
for (Article article : subArticles) {
|
||||
jsonArray.add(article.toJson());
|
||||
}
|
||||
}
|
||||
payload.setBase64edData(Base64.getEncoder().encodeToString(object.toString().getBytes()));
|
||||
|
||||
|
||||
return payload;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void decode(MessagePayload payload) {
|
||||
try {
|
||||
JSONObject object = (JSONObject) new JSONParser().parse(new String(Base64.getDecoder().decode(payload.getBase64edData())));
|
||||
JSONObject topObj = (JSONObject) object.get("top");
|
||||
this.topArticle = Article.fromJson(topObj);
|
||||
JSONArray jsonArray = (JSONArray) object.get("subArticles");
|
||||
if (jsonArray != null && jsonArray.size() > 0) {
|
||||
this.subArticles = new ArrayList<>();
|
||||
for (int i = 0; i < jsonArray.size(); i++) {
|
||||
subArticles.add(Article.fromJson((JSONObject) jsonArray.get(i)));
|
||||
}
|
||||
}
|
||||
} catch (ParseException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public List<LinkMessageContent> toLinkMessageContent() {
|
||||
List<LinkMessageContent> contents = new ArrayList<>();
|
||||
contents.add(this.topArticle.toLinkMessageContent());
|
||||
if (this.subArticles != null) {
|
||||
for (Article article : subArticles) {
|
||||
contents.add(article.toLinkMessageContent());
|
||||
}
|
||||
}
|
||||
return contents;
|
||||
}
|
||||
|
||||
public static class Article {
|
||||
public String articleId;
|
||||
public String cover;
|
||||
public String title;
|
||||
public String digest;
|
||||
public String url;
|
||||
boolean readReport;
|
||||
|
||||
JSONObject toJson() {
|
||||
JSONObject obj = new JSONObject();
|
||||
obj.put("id", articleId);
|
||||
obj.put("cover", cover);
|
||||
obj.put("title", title);
|
||||
obj.put("digest", digest);
|
||||
obj.put("url", url);
|
||||
obj.put("rr", readReport);
|
||||
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
static Article fromJson(JSONObject obj) {
|
||||
Article article = new Article();
|
||||
article.articleId = (String) obj.get("id");
|
||||
article.cover = (String) obj.get("cover");
|
||||
article.title = (String) obj.get("title");
|
||||
article.digest = (String) obj.get("digest");
|
||||
article.url = (String) obj.get("url");
|
||||
article.readReport = (boolean) obj.get("rr");
|
||||
return article;
|
||||
}
|
||||
|
||||
public LinkMessageContent toLinkMessageContent() {
|
||||
LinkMessageContent content = new LinkMessageContent(this.title, this.url);
|
||||
content.setContentDigest(this.digest);
|
||||
content.setThumbnailUrl(this.cover);
|
||||
return content;
|
||||
}
|
||||
|
||||
public Article() {
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user