Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a53f3eb587 | ||
|
|
d43afb282e | ||
|
|
2f195440cf | ||
|
|
d241acf980 | ||
|
|
debd4f1aea | ||
|
|
5a2ded4b6e | ||
|
|
ca1bdc9ee5 | ||
|
|
b187151683 |
@@ -11,13 +11,13 @@
|
|||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
#服务器的接入IP。给客户端提供是${server.ip}和${http_port}。
|
#服务器的接入IP。给客户端提供是${server.ip}和${http_port}。
|
||||||
#客户端会从${http_port}端口获取到长链接端口。这个地址一定要改成客户端可以访问到的IP地址
|
#客户端会从${http_port}端口获取到长链接端口。这个地址一定要改成客户端可以访问到的IP地址
|
||||||
# (如果您部署云服务器上或者具有独立公网出口的服务器上,请改为对应的公网IP;如果您部署在在内网环境下,在内网使用,这个地方改成内网地址)
|
#(如果您部署云服务器上或者具有独立公网出口的服务器上,请改为对应的公网IP;如果您部署在在内网环境下,在内网使用,这个地方改成内网地址)
|
||||||
server.ip 192.168.3.124
|
server.ip 192.168.3.124
|
||||||
|
|
||||||
##原生客户端长链接端口
|
##原生客户端长链接端口
|
||||||
port 1883
|
port 1883
|
||||||
|
|
||||||
##客户端短链接端口
|
##客户端短链接端口,客户端固定使用80端口,不要修改此端口。
|
||||||
http_port 80
|
http_port 80
|
||||||
|
|
||||||
#管理端口
|
#管理端口
|
||||||
@@ -32,15 +32,15 @@ host 0.0.0.0
|
|||||||
##本地绑定端口
|
##本地绑定端口
|
||||||
local_port 80
|
local_port 80
|
||||||
|
|
||||||
##是否使用内置DB。0使用mysql;1使用h2db;2使用mysql+mongodb。社区版只支持0和1,专业版支持2
|
##是否使用内置DB。0使用mysql;1使用h2db。
|
||||||
embed.db 1
|
embed.db 1
|
||||||
|
|
||||||
## 是否自动清理历史消息记录,当为true时,IM服务会定时扫描t_messages_x和t_user_messages_x表,清除掉3年前的历史消息。
|
## 是否自动清理历史消息记录,当为true时,IM服务会定时扫描t_messages_x和t_user_messages_x表,清除掉3年前的历史消息。
|
||||||
## 如果不开启自动清理,需要手动清理t_messages_x和t_user_messages_x表内的历史数据,保存数据不能超过3年。
|
## 如果不开启自动清理,需要手动清理t_messages_x和t_user_messages_x表内的历史数据,保存数据不能超过3年。
|
||||||
## 使用mongodb时次开关无效(因为mongodb设置了消息过期时间,会自动清理)。
|
## 使用mongodb时次开关无效(因为mongodb设置了消息过期时间,会自动清理,仅专业版支持mongodb)。
|
||||||
db.auto_clean_history_messages true
|
db.auto_clean_history_messages true
|
||||||
|
|
||||||
##服务器管理接口密钥
|
##服务器管理接口密钥。如果修改此端口需要同步修改使用管理API的地方,比如应用服务。
|
||||||
http.admin.secret_key 123456
|
http.admin.secret_key 123456
|
||||||
|
|
||||||
##服务器API接口参数是否检查时间。当设置为false时,所有的请求会检查时间的有效性;当设置为true时,可以在http.admin.secret_key保持不变的情况下,使用固定的服务API签名
|
##服务器API接口参数是否检查时间。当设置为false时,所有的请求会检查时间的有效性;当设置为true时,可以在http.admin.secret_key保持不变的情况下,使用固定的服务API签名
|
||||||
@@ -78,14 +78,17 @@ message.disable_remote_search false
|
|||||||
##如果要避免数据库中明文存储消息内容,请打开这个开关和message.disable_remote_search开关
|
##如果要避免数据库中明文存储消息内容,请打开这个开关和message.disable_remote_search开关
|
||||||
message.encrypt_message_content false
|
message.encrypt_message_content false
|
||||||
|
|
||||||
##允许客户端撤回用户自己发送的消息时限,单位是秒。群组管理员或群主撤回群成员消息、server api不受此限制,可以撤回任意时限内的消息
|
##允许客户端撤回用户自己发送的消息时限,单位是秒。
|
||||||
|
##Server API不受此限制,可以撤回任意时限内的消息
|
||||||
|
##群组管理员或群主撤回群成员消息不受此限制,可以撤回任意时限内的消息。但管理员或群主撤回自己的消息还是需要准守此时间限制。
|
||||||
|
##修改此参数需要同步修改客户端UI,客户端UI代码有判断撤回是否显示的逻辑。
|
||||||
message.recall_time_limit 120
|
message.recall_time_limit 120
|
||||||
|
|
||||||
##禁止群主/群管理员撤回群内消息,关闭时群主/群管理员可以撤回任意时间段内群内成员的消息,群主/群管理员撤回自己发送的消息还是会受到message.recall_time_limit时间限制。
|
##禁止群主/群管理员撤回群内消息,关闭时群主/群管理员可以撤回任意时间段内群内成员的消息。
|
||||||
message.disable_group_manager_recall false
|
message.disable_group_manager_recall false
|
||||||
|
|
||||||
## 禁止客户端发送消息类型,消息类型以逗号分开,下面3个值为示例,可以删除。
|
##禁止客户端发送消息类型,消息类型以逗号分开,下面3个值为示例,可以删除。
|
||||||
## 一般用于重要类型消息,比如交易、充值等,禁止客户端发送,仅限于服务器发送,提高安全性。
|
##一般用于重要类型消息,比如交易、充值等,禁止客户端发送,仅限于服务器发送,提高安全性。
|
||||||
#message.forbidden_client_send_types 3999,4000,4001
|
#message.forbidden_client_send_types 3999,4000,4001
|
||||||
|
|
||||||
## 当禁止发送消息时,允许例外发送的消息。这种一般用户需要被动回应的消息。比如群中被禁言的用户,他无法主动发起音视频,但可以接听未被禁言用户的音视频
|
## 当禁止发送消息时,允许例外发送的消息。这种一般用户需要被动回应的消息。比如群中被禁言的用户,他无法主动发起音视频,但可以接听未被禁言用户的音视频
|
||||||
@@ -118,7 +121,7 @@ friend.request_expiration_duration 604800000
|
|||||||
##添加好友后会发送欢迎消息,比如"你们已经是好友了,可以聊天了"。这个开关控制是用旧的方式还是用新的方式。
|
##添加好友后会发送欢迎消息,比如"你们已经是好友了,可以聊天了"。这个开关控制是用旧的方式还是用新的方式。
|
||||||
##旧的方式会发送notification消息(contenttype是80),内容会根据好友接收者的语言选择对应的语言,如果双方语言不一致会导致另外一方看到的不是本地语言。
|
##旧的方式会发送notification消息(contenttype是80),内容会根据好友接收者的语言选择对应的语言,如果双方语言不一致会导致另外一方看到的不是本地语言。
|
||||||
##新的方式会发送添加好友消息(contenttype是93)和欢迎消息(contenttype是92),需要客户端实现这两种消息。
|
##新的方式会发送添加好友消息(contenttype是93)和欢迎消息(contenttype是92),需要客户端实现这两种消息。
|
||||||
##如果客户端已经实现这两种消息可以打开这个开关
|
##如果客户端已经实现这两种消息可以打开这个开关(客户端2020.6.30添加了此消息类型)。
|
||||||
friend.new_welcome_message true
|
friend.new_welcome_message true
|
||||||
|
|
||||||
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
|
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
|
||||||
@@ -155,7 +158,7 @@ hazelcast.configuration config/hazelcast.xml
|
|||||||
# Media server configuration
|
# Media server configuration
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。默认的七牛账户信息不可用,请在七牛官网申请账户并配置
|
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。默认的七牛账户信息不可用,请在七牛官网申请账户并配置
|
||||||
## https://docs.wildfirechat.cn/server/media_server.html
|
##配置使用七牛请参考:https://docs.wildfirechat.cn/server/media_server.html
|
||||||
media.server.use_qiniu 0
|
media.server.use_qiniu 0
|
||||||
|
|
||||||
##媒体类型分类
|
##媒体类型分类
|
||||||
@@ -200,8 +203,9 @@ local.media.storage.root media
|
|||||||
# 尽管内置文件存储可以使用,但是我们还是建议使用专业级别的对象存储服务,社区版可以使用七牛,专业版另外支持阿里云和也是私有对象存储。详情请参考 https://docs.wildfirechat.cn/server/oss.html
|
# 尽管内置文件存储可以使用,但是我们还是建议使用专业级别的对象存储服务,社区版可以使用七牛,专业版另外支持阿里云和也是私有对象存储。详情请参考 https://docs.wildfirechat.cn/server/oss.html
|
||||||
# local.media.storage.remote_server_url https://example.com/media
|
# local.media.storage.remote_server_url https://example.com/media
|
||||||
|
|
||||||
# 是否支持多端登陆,为true时支持任意平台任意多个客户端同时登录;为false时每个平台只支持一个端登录,但不同平台可以同时登录。
|
# 是否支持任意多端登陆,为true时支持任意平台任意多个客户端同时登录;为false时每个平台只支持一个端登录,但不同平台可以同时登录。
|
||||||
# Android/iOS为移动平台,windows/mac/linux为pc平台,web为web平台,小程序为小程序平台。
|
# Android/iOS为移动平台,windows/mac/linux为pc平台,web为web平台,小程序为小程序平台。
|
||||||
|
# 建议使用false
|
||||||
server.multi_endpoint false
|
server.multi_endpoint false
|
||||||
|
|
||||||
# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或web端登录的通知。
|
# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或web端登录的通知。
|
||||||
@@ -226,6 +230,8 @@ push.ios.server.address http://localhost:8085/ios/push
|
|||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
# 监控配置
|
# 监控配置
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
|
##异常事件产生回调
|
||||||
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
#monitor.exception_event_address http://localhost:8888/im_exception_event/
|
#monitor.exception_event_address http://localhost:8888/im_exception_event/
|
||||||
|
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
@@ -285,7 +291,7 @@ sensitive.filter.type 0
|
|||||||
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
|
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
|
||||||
## 需要进行敏感词审核的消息类型,当有多个时以英文逗号分割
|
## 需要进行敏感词审核的消息类型,当有多个时以英文逗号分割
|
||||||
#sensitive.remote_sensitive_message_type 1,2,3
|
#sensitive.remote_sensitive_message_type 1,2,3
|
||||||
## 如果远程审核服务返回403,返回给发送端发送失败还是成功?实际上这个值影响发送响应是否等待审核结果,当为false时,消息发送给审核服务就立即返回
|
## 如果远程审核服务返回403,返回给发送端发送失败还是成功?实际上这个值影响发送响应是否等待审核结果,当为false时,消息发送给审核服务就立即返回成功给客户端。
|
||||||
## 成功给客户端。当为true时,消息发送给审核服务,等待审核结果,如果结果为继续发送就返回给客户端为成功,结果为禁止发送就返回失败给客户端。
|
## 当为true时,消息发送给审核服务,等待审核结果,如果结果为继续发送就返回给客户端为成功,结果为禁止发送就返回失败给客户端。
|
||||||
## 客户端操作的超时一般为10s左右,且考虑到复杂的网络情况,建议处理时间不要超过3s。建议这个值为false。
|
## 客户端操作的超时一般为10s左右,且考虑到复杂的网络情况,建议处理时间不要超过3s。建议这个值为false。
|
||||||
#sensitive.remote_fail_when_matched false
|
#sensitive.remote_fail_when_matched false
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<relativePath>../</relativePath>
|
<relativePath>../</relativePath>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.68</version>
|
<version>0.69</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>moquette-broker</artifactId>
|
<artifactId>moquette-broker</artifactId>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
package com.xiaoleilu.loServer.action.admin;
|
package com.xiaoleilu.loServer.action.admin;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.APIPath;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.xiaoleilu.loServer.RestResult;
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
import com.xiaoleilu.loServer.action.Action;
|
import com.xiaoleilu.loServer.action.Action;
|
||||||
@@ -46,7 +47,11 @@ abstract public class AdminAction extends Action {
|
|||||||
if (!mLimitCounter.isGranted("admin")) {
|
if (!mLimitCounter.isGranted("admin")) {
|
||||||
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(APIPath.Health.equals(request.getUri())) {
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
String nonce = request.getHeader("nonce");
|
String nonce = request.getHeader("nonce");
|
||||||
if (StringUtil.isNullOrEmpty(nonce)) {
|
if (StringUtil.isNullOrEmpty(nonce)) {
|
||||||
nonce = request.getHeader("Nonce");
|
nonce = request.getHeader("Nonce");
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Wildfire Chat package.
|
||||||
|
* (c) Heavyrain2012 <[email protected]>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.xiaoleilu.loServer.action.admin;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.APIPath;
|
||||||
|
import cn.wildfirechat.pojos.OutputUserBlockStatusList;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
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 org.json.simple.JSONArray;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.lang.management.OperatingSystemMXBean;
|
||||||
|
|
||||||
|
import static java.lang.management.ManagementFactory.getOperatingSystemMXBean;
|
||||||
|
|
||||||
|
@Route(APIPath.Health)
|
||||||
|
public class HealthAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
JSONObject jsonObject = new JSONObject();
|
||||||
|
|
||||||
|
jsonObject.put("node", "1");
|
||||||
|
|
||||||
|
JSONObject cpuObject = new JSONObject();
|
||||||
|
jsonObject.put("cpu", cpuObject);
|
||||||
|
|
||||||
|
JSONObject memoryObject = new JSONObject();
|
||||||
|
jsonObject.put("memory", memoryObject);
|
||||||
|
|
||||||
|
JSONObject fileObject = new JSONObject();
|
||||||
|
jsonObject.put("disk", fileObject);
|
||||||
|
|
||||||
|
if (getOperatingSystemMXBean() instanceof OperatingSystemMXBean) {
|
||||||
|
double load = getOperatingSystemMXBean().getSystemLoadAverage();
|
||||||
|
cpuObject.put("load", load);
|
||||||
|
}
|
||||||
|
cpuObject.put("cores", Runtime.getRuntime().availableProcessors());
|
||||||
|
|
||||||
|
memoryObject.put("free", Runtime.getRuntime().freeMemory());
|
||||||
|
memoryObject.put("max", Runtime.getRuntime().maxMemory());
|
||||||
|
memoryObject.put("avail", Runtime.getRuntime().totalMemory());
|
||||||
|
|
||||||
|
File root = new File("/");
|
||||||
|
fileObject.put("space", root.getTotalSpace());
|
||||||
|
fileObject.put("free", root.getFreeSpace());
|
||||||
|
fileObject.put("usable", root.getUsableSpace());
|
||||||
|
|
||||||
|
JSONArray out = new JSONArray();
|
||||||
|
out.add(jsonObject);
|
||||||
|
RestResult result = RestResult.ok(out);
|
||||||
|
setResponseContent(result, response);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -49,7 +49,6 @@ public final class BrokerConstants {
|
|||||||
public static final String DISABLED_PORT_BIND = "disabled";
|
public static final String DISABLED_PORT_BIND = "disabled";
|
||||||
public static final String HOST = "0.0.0.0";
|
public static final String HOST = "0.0.0.0";
|
||||||
public static final String NEED_CLIENT_AUTH = "need_client_auth";
|
public static final String NEED_CLIENT_AUTH = "need_client_auth";
|
||||||
public static final String HAZELCAST_CONFIGURATION = "hazelcast.configuration";
|
|
||||||
public static final String HAZELCAST_CLIENT_IP = "hazelcast.client.ip";
|
public static final String HAZELCAST_CLIENT_IP = "hazelcast.client.ip";
|
||||||
public static final String HAZELCAST_CLIENT_PORT = "hazelcast.client.port";
|
public static final String HAZELCAST_CLIENT_PORT = "hazelcast.client.port";
|
||||||
public static final String NETTY_SO_BACKLOG_PROPERTY_NAME = "netty.so_backlog";
|
public static final String NETTY_SO_BACKLOG_PROPERTY_NAME = "netty.so_backlog";
|
||||||
|
|||||||
@@ -362,7 +362,7 @@ public class Server {
|
|||||||
LOG.info("Configuring embedded Hazelcast instance");
|
LOG.info("Configuring embedded Hazelcast instance");
|
||||||
String serverIp = getServerIp(config);
|
String serverIp = getServerIp(config);
|
||||||
|
|
||||||
String hzConfigPath = config.getProperty(BrokerConstants.HAZELCAST_CONFIGURATION);
|
String hzConfigPath = "config/hazelcast.xml";
|
||||||
String hzClientIp = config.getProperty(BrokerConstants.HAZELCAST_CLIENT_IP, "localhost");
|
String hzClientIp = config.getProperty(BrokerConstants.HAZELCAST_CLIENT_IP, "localhost");
|
||||||
String hzClientPort = config.getProperty(BrokerConstants.HAZELCAST_CLIENT_PORT, "5703");
|
String hzClientPort = config.getProperty(BrokerConstants.HAZELCAST_CLIENT_PORT, "5703");
|
||||||
|
|
||||||
|
|||||||
@@ -84,34 +84,37 @@ class ConfigurationParser {
|
|||||||
String line;
|
String line;
|
||||||
try {
|
try {
|
||||||
while ((line = br.readLine()) != null) {
|
while ((line = br.readLine()) != null) {
|
||||||
|
line = line.trim();
|
||||||
int commentMarker = line.indexOf('#');
|
int commentMarker = line.indexOf('#');
|
||||||
if (commentMarker != -1) {
|
if (commentMarker != -1) {
|
||||||
if (commentMarker == 0) {
|
if (commentMarker == 0) {
|
||||||
// skip its a comment
|
// skip its a comment
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
// it's a malformed comment
|
String[] ss = line.split(" ");
|
||||||
throw new ParseException(line, commentMarker);
|
if(ss.length != 2) {
|
||||||
|
throw new ParseException(line, commentMarker);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (line.isEmpty() || line.matches("^\\s*$")) {
|
if (line.isEmpty() || line.matches("^\\s*$")) {
|
||||||
// skip it's a black line
|
// skip it's a black line
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// split till the first space
|
|
||||||
int delimiterIdx = line.indexOf(' ');
|
|
||||||
String key;
|
|
||||||
String value = "";
|
|
||||||
if (delimiterIdx > 0) {
|
|
||||||
key = line.substring(0, delimiterIdx).trim();
|
|
||||||
value = line.substring(delimiterIdx).trim();
|
|
||||||
} else {
|
|
||||||
key = line.trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_properties.put(key, value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// split till the first space
|
||||||
|
int delimiterIdx = line.indexOf(' ');
|
||||||
|
String key;
|
||||||
|
String value = "";
|
||||||
|
if (delimiterIdx > 0) {
|
||||||
|
key = line.substring(0, delimiterIdx).trim();
|
||||||
|
value = line.substring(delimiterIdx).trim();
|
||||||
|
} else {
|
||||||
|
key = line.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_properties.put(key, value);
|
||||||
}
|
}
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
throw new ParseException("Failed to read", 1);
|
throw new ParseException("Failed to read", 1);
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.68</version>
|
<version>0.69</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,8 @@ public interface APIPath {
|
|||||||
String Get_System_Setting = "/admin/system/get_setting";
|
String Get_System_Setting = "/admin/system/get_setting";
|
||||||
String Put_System_Setting = "/admin/system/put_setting";
|
String Put_System_Setting = "/admin/system/put_setting";
|
||||||
|
|
||||||
|
String Health = "/admin/health";
|
||||||
|
|
||||||
String Conference_List = "/admin/conference/list";
|
String Conference_List = "/admin/conference/list";
|
||||||
String Conference_List_Participant = "/admin/conference/list_participant";
|
String Conference_List_Participant = "/admin/conference/list_participant";
|
||||||
String Conference_Create = "/admin/conference/create";
|
String Conference_Create = "/admin/conference/create";
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ public enum ErrorCode {
|
|||||||
ERROR_CODE_RECALL_TIME_EXPIRED(24, "time expired"),
|
ERROR_CODE_RECALL_TIME_EXPIRED(24, "time expired"),
|
||||||
ERROR_CODE_CONFERENCE_ROOM_NOT_EXIST(60, "conference room not exist"),
|
ERROR_CODE_CONFERENCE_ROOM_NOT_EXIST(60, "conference room not exist"),
|
||||||
|
|
||||||
|
ERROR_CODE_USER_NOT_PREPARED(238, "user not prepared"),
|
||||||
ERROR_CODE_API_NOT_SIGNED(239, "api not signed or sign parameter not completion"),
|
ERROR_CODE_API_NOT_SIGNED(239, "api not signed or sign parameter not completion"),
|
||||||
ERROR_CODE_GROUP_EXCEED_MAX_MEMBER_COUNT(240, "group exceed max member count"),
|
ERROR_CODE_GROUP_EXCEED_MAX_MEMBER_COUNT(240, "group exceed max member count"),
|
||||||
ERROR_CODE_GROUP_MUTED(241, "group is muted"),
|
ERROR_CODE_GROUP_MUTED(241, "group is muted"),
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ public class IMExceptionEvent {
|
|||||||
int ROBOT_API_Exception = 7;
|
int ROBOT_API_Exception = 7;
|
||||||
int SHORT_LINK_Exception = 8;
|
int SHORT_LINK_Exception = 8;
|
||||||
int EVENT_CALLBACK_Exception = 9;
|
int EVENT_CALLBACK_Exception = 9;
|
||||||
|
int CONFERENCE_Exception = 10;
|
||||||
int HEART_BEAT = 100;
|
int HEART_BEAT = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package cn.wildfirechat.pojos;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class HealthCheckResult extends ArrayList<HealthCheckResult.Node>
|
||||||
|
{
|
||||||
|
public static class Node {
|
||||||
|
public String node;
|
||||||
|
public CPU cpu;
|
||||||
|
public Memory memory;
|
||||||
|
public Disk disk;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Memory {
|
||||||
|
public long avail;
|
||||||
|
public long max;
|
||||||
|
public long free;
|
||||||
|
}
|
||||||
|
public static class Disk {
|
||||||
|
public long usable;
|
||||||
|
public long free;
|
||||||
|
public long space;
|
||||||
|
}
|
||||||
|
public static class CPU {
|
||||||
|
public int cores;
|
||||||
|
public double load;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package cn.wildfirechat.pojos;
|
||||||
|
|
||||||
|
public class PojoConferenceRoomId {
|
||||||
|
public String roomId;
|
||||||
|
public boolean advance;
|
||||||
|
|
||||||
|
public PojoConferenceRoomId() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public PojoConferenceRoomId(String roomId, boolean advance) {
|
||||||
|
this.roomId = roomId;
|
||||||
|
this.advance = advance;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
<!--<relativePath>../pom.xml</relativePath>-->
|
<!--<relativePath>../pom.xml</relativePath>-->
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.68</version>
|
<version>0.69</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>distribution</artifactId>
|
<artifactId>distribution</artifactId>
|
||||||
|
|||||||
@@ -7,13 +7,13 @@
|
|||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
#服务器的接入IP。给客户端提供是${server.ip}和${http_port}。
|
#服务器的接入IP。给客户端提供是${server.ip}和${http_port}。
|
||||||
#客户端会从${http_port}端口获取到长链接端口。这个地址一定要改成客户端可以访问到的IP地址
|
#客户端会从${http_port}端口获取到长链接端口。这个地址一定要改成客户端可以访问到的IP地址
|
||||||
# (如果您部署云服务器上或者具有独立公网出口的服务器上,请改为对应的公网IP;如果您部署在在内网环境下,在内网使用,这个地方改成内网地址)
|
#(如果您部署云服务器上或者具有独立公网出口的服务器上,请改为对应的公网IP;如果您部署在在内网环境下,在内网使用,这个地方改成内网地址)
|
||||||
server.ip 0.0.0.0
|
server.ip 0.0.0.0
|
||||||
|
|
||||||
##原生客户端长链接端口。如果使用4层的反向代理或者类似组件,需要设置长链接保持时间为10分钟。
|
##原生客户端长链接端口。如果使用4层的反向代理或者类似组件,需要设置长链接保持时间为10分钟。
|
||||||
port 1883
|
port 1883
|
||||||
|
|
||||||
##客户端短链接端口
|
##客户端短链接端口,客户端固定使用80端口,不要修改此端口。
|
||||||
http_port 80
|
http_port 80
|
||||||
|
|
||||||
#管理端口
|
#管理端口
|
||||||
@@ -28,15 +28,15 @@ host 0.0.0.0
|
|||||||
##本地绑定端口
|
##本地绑定端口
|
||||||
local_port 80
|
local_port 80
|
||||||
|
|
||||||
##是否使用内置DB。0使用mysql;1使用h2db;2使用mysql+mongodb。社区版只支持0和1,专业版支持2
|
##是否使用内置DB。0使用mysql;1使用h2db。
|
||||||
embed.db 1
|
embed.db 1
|
||||||
|
|
||||||
## 是否自动清理历史消息记录,当为true时,IM服务会定时扫描t_messages_x和t_user_messages_x表,清除掉3年前的历史消息。
|
## 是否自动清理历史消息记录,当为true时,IM服务会定时扫描t_messages_x和t_user_messages_x表,清除掉3年前的历史消息。
|
||||||
## 如果不开启自动清理,需要手动清理t_messages_x和t_user_messages_x表内的历史数据,保存数据不能超过3年。
|
## 如果不开启自动清理,需要手动清理t_messages_x和t_user_messages_x表内的历史数据,保存数据不能超过3年。
|
||||||
## 使用mongodb时次开关无效(因为mongodb设置了消息过期时间,会自动清理)。
|
## 使用mongodb时次开关无效(因为mongodb设置了消息过期时间,会自动清理,仅专业版支持mongodb)。
|
||||||
db.auto_clean_history_messages true
|
db.auto_clean_history_messages true
|
||||||
|
|
||||||
##服务器管理接口密钥
|
##服务器管理接口密钥。如果修改此端口需要同步修改使用管理API的地方,比如应用服务。
|
||||||
http.admin.secret_key 123456
|
http.admin.secret_key 123456
|
||||||
|
|
||||||
##服务器API接口参数是否检查时间。当设置为false时,所有的请求会检查时间的有效性;当设置为true时,可以在http.admin.secret_key保持不变的情况下,使用固定的服务API签名
|
##服务器API接口参数是否检查时间。当设置为false时,所有的请求会检查时间的有效性;当设置为true时,可以在http.admin.secret_key保持不变的情况下,使用固定的服务API签名
|
||||||
@@ -73,14 +73,17 @@ message.disable_remote_search false
|
|||||||
##如果要避免数据库中明文存储消息内容,请打开这个开关和message.disable_remote_search开关
|
##如果要避免数据库中明文存储消息内容,请打开这个开关和message.disable_remote_search开关
|
||||||
message.encrypt_message_content false
|
message.encrypt_message_content false
|
||||||
|
|
||||||
##允许客户端撤回用户自己发送的消息时限,单位是秒。群组管理员或群主撤回群成员消息、server api不受此限制,可以撤回任意时限内的消息
|
##允许客户端撤回用户自己发送的消息时限,单位是秒。
|
||||||
|
##Server API不受此限制,可以撤回任意时限内的消息
|
||||||
|
##群组管理员或群主撤回群成员消息不受此限制,可以撤回任意时限内的消息。但管理员或群主撤回自己的消息还是需要准守此时间限制。
|
||||||
|
##修改此参数需要同步修改客户端UI,客户端UI代码有判断撤回是否显示的逻辑。
|
||||||
message.recall_time_limit 120
|
message.recall_time_limit 120
|
||||||
|
|
||||||
##禁止群主/群管理员撤回群内消息,关闭时群主/群管理员可以撤回任意时间段内群内成员的消息,群主/群管理员撤回自己发送的消息还是会受到message.recall_time_limit时间限制。
|
##禁止群主/群管理员撤回群内消息,关闭时群主/群管理员可以撤回任意时间段内群内成员的消息。
|
||||||
message.disable_group_manager_recall false
|
message.disable_group_manager_recall false
|
||||||
|
|
||||||
## 禁止客户端发送消息类型,消息类型以逗号分开,下面3个值为示例,可以删除。
|
##禁止客户端发送消息类型,消息类型以逗号分开,下面3个值为示例,可以删除。
|
||||||
## 一般用于重要类型消息,比如交易、充值等,禁止客户端发送,仅限于服务器发送,提高安全性。
|
##一般用于重要类型消息,比如交易、充值等,禁止客户端发送,仅限于服务器发送,提高安全性。
|
||||||
#message.forbidden_client_send_types 3999,4000,4001
|
#message.forbidden_client_send_types 3999,4000,4001
|
||||||
|
|
||||||
## 当禁止发送消息时,允许例外发送的消息。这种一般用户需要被动回应的消息。比如群中被禁言的用户,他无法主动发起音视频,但可以接听未被禁言用户的音视频
|
## 当禁止发送消息时,允许例外发送的消息。这种一般用户需要被动回应的消息。比如群中被禁言的用户,他无法主动发起音视频,但可以接听未被禁言用户的音视频
|
||||||
@@ -112,7 +115,7 @@ friend.request_expiration_duration 604800000
|
|||||||
##添加好友后会发送欢迎消息,比如"你们已经是好友了,可以聊天了"。这个开关控制是用旧的方式还是用新的方式。
|
##添加好友后会发送欢迎消息,比如"你们已经是好友了,可以聊天了"。这个开关控制是用旧的方式还是用新的方式。
|
||||||
##旧的方式会发送notification消息(contenttype是80),内容会根据好友接收者的语言选择对应的语言,如果双方语言不一致会导致另外一方看到的不是本地语言。
|
##旧的方式会发送notification消息(contenttype是80),内容会根据好友接收者的语言选择对应的语言,如果双方语言不一致会导致另外一方看到的不是本地语言。
|
||||||
##新的方式会发送添加好友消息(contenttype是93)和欢迎消息(contenttype是92),需要客户端实现这两种消息。
|
##新的方式会发送添加好友消息(contenttype是93)和欢迎消息(contenttype是92),需要客户端实现这两种消息。
|
||||||
##如果客户端已经实现这两种消息可以打开这个开关
|
##如果客户端已经实现这两种消息可以打开这个开关(客户端2020.6.30添加了此消息类型)。
|
||||||
friend.new_welcome_message true
|
friend.new_welcome_message true
|
||||||
|
|
||||||
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
|
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
|
||||||
@@ -150,7 +153,7 @@ hazelcast.configuration config/hazelcast.xml
|
|||||||
# Media server configuration
|
# Media server configuration
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。默认的七牛账户信息不可用,请在七牛官网申请账户并配置
|
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。默认的七牛账户信息不可用,请在七牛官网申请账户并配置
|
||||||
## https://docs.wildfirechat.cn/server/media_server.html
|
##配置使用七牛请参考:https://docs.wildfirechat.cn/server/media_server.html
|
||||||
media.server.use_qiniu 0
|
media.server.use_qiniu 0
|
||||||
|
|
||||||
##媒体类型分类
|
##媒体类型分类
|
||||||
@@ -197,8 +200,9 @@ local.media.storage.root ./media
|
|||||||
# 尽管内置文件存储可以使用,但是我们还是建议使用专业级别的对象存储服务,社区版可以使用七牛,专业版另外支持阿里云和也是私有对象存储。详情请参考 https://docs.wildfirechat.cn/server/oss.html
|
# 尽管内置文件存储可以使用,但是我们还是建议使用专业级别的对象存储服务,社区版可以使用七牛,专业版另外支持阿里云和也是私有对象存储。详情请参考 https://docs.wildfirechat.cn/server/oss.html
|
||||||
# local.media.storage.remote_server_url https://example.com/media
|
# local.media.storage.remote_server_url https://example.com/media
|
||||||
|
|
||||||
# 是否支持多端登陆,为true时支持任意平台任意多个客户端同时登录;为false时每个平台只支持一个端登录,但不同平台可以同时登录。
|
# 是否支持任意多端登陆,为true时支持任意平台任意多个客户端同时登录;为false时每个平台只支持一个端登录,但不同平台可以同时登录。
|
||||||
# Android/iOS为移动平台,windows/mac/linux为pc平台,web为web平台,小程序为小程序平台。
|
# Android/iOS为移动平台,windows/mac/linux为pc平台,web为web平台,小程序为小程序平台。
|
||||||
|
# 建议使用false
|
||||||
server.multi_endpoint false
|
server.multi_endpoint false
|
||||||
|
|
||||||
# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或web端登录的通知。
|
# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或web端登录的通知。
|
||||||
@@ -223,6 +227,8 @@ push.ios.server.address http://localhost:8085/ios/push
|
|||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
# 监控配置
|
# 监控配置
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
|
##异常事件产生回调
|
||||||
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
#monitor.exception_event_address http://localhost:8888/im_exception_event/
|
#monitor.exception_event_address http://localhost:8888/im_exception_event/
|
||||||
|
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
@@ -292,7 +298,7 @@ sensitive.filter.type 0
|
|||||||
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
|
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
|
||||||
## 需要进行敏感词审核的消息类型,当有多个时以英文逗号分割
|
## 需要进行敏感词审核的消息类型,当有多个时以英文逗号分割
|
||||||
#sensitive.remote_sensitive_message_type 1,2,3
|
#sensitive.remote_sensitive_message_type 1,2,3
|
||||||
## 如果远程审核服务返回403,返回给发送端发送失败还是成功?实际上这个值影响发送响应是否等待审核结果,当为false时,消息发送给审核服务就立即返回
|
## 如果远程审核服务返回403,返回给发送端发送失败还是成功?实际上这个值影响发送响应是否等待审核结果,当为false时,消息发送给审核服务就立即返回成功给客户端。
|
||||||
## 成功给客户端。当为true时,消息发送给审核服务,等待审核结果,如果结果为继续发送就返回给客户端为成功,结果为禁止发送就返回失败给客户端。
|
## 当为true时,消息发送给审核服务,等待审核结果,如果结果为继续发送就返回给客户端为成功,结果为禁止发送就返回失败给客户端。
|
||||||
## 客户端操作的超时一般为10s左右,且考虑到复杂的网络情况,建议处理时间不要超过3s。建议这个值为false。
|
## 客户端操作的超时一般为10s左右,且考虑到复杂的网络情况,建议处理时间不要超过3s。建议这个值为false。
|
||||||
#sensitive.remote_fail_when_matched false
|
#sensitive.remote_fail_when_matched false
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>0.68</version>
|
<version>0.69</version>
|
||||||
<name>Wildfire Chat</name>
|
<name>Wildfire Chat</name>
|
||||||
<description>Wildfire Chat Server</description>
|
<description>Wildfire Chat Server</description>
|
||||||
<inceptionYear>2019</inceptionYear>
|
<inceptionYear>2019</inceptionYear>
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.68</version>
|
<version>0.69</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -11,9 +11,10 @@ public class ConferenceAdmin {
|
|||||||
return AdminHttpUtils.httpJsonPost(path, null, PojoConferenceInfoList.class);
|
return AdminHttpUtils.httpJsonPost(path, null, PojoConferenceInfoList.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IMResult<PojoConferenceParticipantList> listParticipants(String roomId) throws Exception {
|
public static IMResult<PojoConferenceParticipantList> listParticipants(String roomId, boolean advance) throws Exception {
|
||||||
String path = APIPath.Conference_List_Participant;
|
String path = APIPath.Conference_List_Participant;
|
||||||
return AdminHttpUtils.httpJsonPost(path, roomId, PojoConferenceParticipantList.class);
|
PojoConferenceRoomId data = new PojoConferenceRoomId(roomId, advance);
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, data, PojoConferenceParticipantList.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IMResult<Void> createRoom(String roomId, String description, String pin, int maxPublisher, boolean advance, int bitrate, boolean recording) throws Exception {
|
public static IMResult<Void> createRoom(String roomId, String description, String pin, int maxPublisher, boolean advance, int bitrate, boolean recording) throws Exception {
|
||||||
@@ -29,8 +30,9 @@ public class ConferenceAdmin {
|
|||||||
return AdminHttpUtils.httpJsonPost(path, create, Void.class);
|
return AdminHttpUtils.httpJsonPost(path, create, Void.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IMResult<Void> destroy(String roomId) throws Exception {
|
public static IMResult<Void> destroy(String roomId, boolean advance) throws Exception {
|
||||||
String path = APIPath.Conference_Destroy;
|
String path = APIPath.Conference_Destroy;
|
||||||
return AdminHttpUtils.httpJsonPost(path, roomId, Void.class);
|
PojoConferenceRoomId conferenceRoomId = new PojoConferenceRoomId(roomId, advance);
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, conferenceRoomId, Void.class);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ public class GeneralAdmin {
|
|||||||
out.result = result.result != null && "1".equals(result.result.getValue());
|
out.result = result.result != null && "1".equals(result.result.getValue());
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static IMResult<UserSettingPojo> getUserSetting(String userId, int scope, String key) throws Exception {
|
public static IMResult<UserSettingPojo> getUserSetting(String userId, int scope, String key) throws Exception {
|
||||||
String path = APIPath.User_Get_Setting;
|
String path = APIPath.User_Get_Setting;
|
||||||
UserSettingPojo pojo = new UserSettingPojo();
|
UserSettingPojo pojo = new UserSettingPojo();
|
||||||
@@ -62,4 +63,8 @@ public class GeneralAdmin {
|
|||||||
pojo.setValue(value);
|
pojo.setValue(value);
|
||||||
return AdminHttpUtils.httpJsonPost(path, pojo, Void.class);
|
return AdminHttpUtils.httpJsonPost(path, pojo, Void.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IMResult<HealthCheckResult> healthCheck() throws Exception {
|
||||||
|
return AdminHttpUtils.httpGet(APIPath.Health, HealthCheckResult.class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -707,6 +707,14 @@ public class Main {
|
|||||||
System.out.println("create channel failure");
|
System.out.println("create channel failure");
|
||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IMResult<HealthCheckResult> health = GeneralAdmin.healthCheck();
|
||||||
|
if(health != null && health.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println(health.result);
|
||||||
|
} else {
|
||||||
|
System.out.println("health check failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void testChatroom() throws Exception {
|
static void testChatroom() throws Exception {
|
||||||
@@ -1302,6 +1310,8 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Thread.sleep(100);
|
||||||
|
|
||||||
IMResult<InputOutputSensitiveWords> swResult = SensitiveAdmin.getSensitives();
|
IMResult<InputOutputSensitiveWords> swResult = SensitiveAdmin.getSensitives();
|
||||||
if (swResult != null && swResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && swResult.getResult().getWords().containsAll(words)) {
|
if (swResult != null && swResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && swResult.getResult().getWords().containsAll(words)) {
|
||||||
System.out.println("Sensitive word added");
|
System.out.println("Sensitive word added");
|
||||||
@@ -1318,6 +1328,7 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Thread.sleep(100);
|
||||||
swResult = SensitiveAdmin.getSensitives();
|
swResult = SensitiveAdmin.getSensitives();
|
||||||
if (swResult != null && swResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !swResult.getResult().getWords().containsAll(words)) {
|
if (swResult != null && swResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !swResult.getResult().getWords().containsAll(words)) {
|
||||||
System.out.println("Sensitive word removed");
|
System.out.println("Sensitive word removed");
|
||||||
@@ -1384,7 +1395,7 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (PojoConferenceInfo conferenceInfo:listResult.getResult().conferenceInfoList) {
|
for (PojoConferenceInfo conferenceInfo:listResult.getResult().conferenceInfoList) {
|
||||||
IMResult<Void> destroyResult = ConferenceAdmin.destroy(conferenceInfo.roomId);
|
IMResult<Void> destroyResult = ConferenceAdmin.destroy(conferenceInfo.roomId, conferenceInfo.advance);
|
||||||
if(destroyResult == null || destroyResult.getErrorCode() != ErrorCode.ERROR_CODE_SUCCESS) {
|
if(destroyResult == null || destroyResult.getErrorCode() != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("destroy room failure");
|
System.out.println("destroy room failure");
|
||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
@@ -1401,9 +1412,17 @@ public class Main {
|
|||||||
System.out.println("conference list " + listResult.getResult().conferenceInfoList);
|
System.out.println("conference list " + listResult.getResult().conferenceInfoList);
|
||||||
}
|
}
|
||||||
|
|
||||||
IMResult<Void> createResult = ConferenceAdmin.createRoom("helloroomid", "hello room description", "123456", 20, false, 0, false);
|
IMResult<Void> createResult = ConferenceAdmin.createRoom("helloroomid", "hello room description", "123456", 9, false, 0, false);
|
||||||
if(createResult == null || createResult.getErrorCode() != ErrorCode.ERROR_CODE_SUCCESS) {
|
if(createResult == null || createResult.getErrorCode() != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("create conference list failure");
|
System.out.println("create conference failure");
|
||||||
|
System.exit(-1);
|
||||||
|
} else {
|
||||||
|
System.out.println("create conference");
|
||||||
|
}
|
||||||
|
|
||||||
|
createResult = ConferenceAdmin.createRoom("helloroomid2", "hello room description advanced", "123456", 20, true, 0, false);
|
||||||
|
if(createResult == null || createResult.getErrorCode() != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("create conference failure");
|
||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
} else {
|
} else {
|
||||||
System.out.println("create conference");
|
System.out.println("create conference");
|
||||||
@@ -1418,12 +1437,12 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (PojoConferenceInfo conferenceInfo:listResult.getResult().conferenceInfoList) {
|
for (PojoConferenceInfo conferenceInfo:listResult.getResult().conferenceInfoList) {
|
||||||
IMResult<PojoConferenceParticipantList> listParticipantsResult = ConferenceAdmin.listParticipants(conferenceInfo.roomId);
|
IMResult<PojoConferenceParticipantList> listParticipantsResult = ConferenceAdmin.listParticipants(conferenceInfo.roomId, conferenceInfo.advance);
|
||||||
if(listParticipantsResult == null || listParticipantsResult.getErrorCode() != ErrorCode.ERROR_CODE_SUCCESS) {
|
if(listParticipantsResult == null || listParticipantsResult.getErrorCode() != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("destroy room failure");
|
System.out.println("list participants failure");
|
||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
} else {
|
} else {
|
||||||
System.out.println("destroy room success");
|
System.out.println("list participants success");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import org.apache.commons.codec.digest.DigestUtils;
|
|||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
import org.apache.http.HttpStatus;
|
import org.apache.http.HttpStatus;
|
||||||
import org.apache.http.client.HttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
|
import org.apache.http.client.methods.HttpGet;
|
||||||
import org.apache.http.client.methods.HttpPost;
|
import org.apache.http.client.methods.HttpPost;
|
||||||
import org.apache.http.entity.StringEntity;
|
import org.apache.http.entity.StringEntity;
|
||||||
import org.apache.http.impl.client.CloseableHttpClient;
|
import org.apache.http.impl.client.CloseableHttpClient;
|
||||||
@@ -34,7 +35,54 @@ public class AdminHttpUtils {
|
|||||||
httpClient = HttpClients.createDefault();
|
httpClient = HttpClients.createDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> IMResult<T> httpJsonPost(String path, Object object, Class<T> clazz) throws Exception{
|
public static <T> IMResult<T> httpGet(String path, Class<T> clazz) throws Exception {
|
||||||
|
if (isNullOrEmpty(adminUrl) || isNullOrEmpty(adminSecret)) {
|
||||||
|
LOG.error("野火IM Server SDK必须先初始化才能使用,是不是忘记初始化了!!!!");
|
||||||
|
throw new Exception("SDK没有初始化");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isNullOrEmpty(path)) {
|
||||||
|
throw new Exception("路径缺失");
|
||||||
|
}
|
||||||
|
HttpGet get = null;
|
||||||
|
try {
|
||||||
|
get = new HttpGet(adminUrl + path);
|
||||||
|
HttpResponse response = httpClient.execute(get);
|
||||||
|
|
||||||
|
int statusCode = response.getStatusLine().getStatusCode();
|
||||||
|
String content = null;
|
||||||
|
if (response.getEntity().getContentLength() > 0) {
|
||||||
|
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "utf-8"));
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
String line;
|
||||||
|
String NL = System.getProperty("line.separator");
|
||||||
|
while ((line = in.readLine()) != null) {
|
||||||
|
sb.append(line).append(NL);
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
|
||||||
|
content = sb.toString();
|
||||||
|
LOG.info("http request response content: {}", content);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(statusCode != HttpStatus.SC_OK){
|
||||||
|
LOG.info("Request error: " + statusCode + " error msg:" + content);
|
||||||
|
throw new Exception("Http request error with code:" + statusCode);
|
||||||
|
} else {
|
||||||
|
return fromJsonObject(content, clazz);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
throw e;
|
||||||
|
} finally {
|
||||||
|
if(get != null) {
|
||||||
|
get.releaseConnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> IMResult<T> httpJsonPost(String path, Object object, Class<T> clazz) throws Exception {
|
||||||
if (isNullOrEmpty(adminUrl) || isNullOrEmpty(adminSecret)) {
|
if (isNullOrEmpty(adminUrl) || isNullOrEmpty(adminSecret)) {
|
||||||
LOG.error("野火IM Server SDK必须先初始化才能使用,是不是忘记初始化了!!!!");
|
LOG.error("野火IM Server SDK必须先初始化才能使用,是不是忘记初始化了!!!!");
|
||||||
throw new Exception("SDK没有初始化");
|
throw new Exception("SDK没有初始化");
|
||||||
|
|||||||
Reference in New Issue
Block a user