新增:应用系统推送IM消息 im:send-message
This commit is contained in:
parent
4e4a4c2f82
commit
621c205b6c
@ -13,7 +13,10 @@ import org.redkale.convert.json.JsonConvert;
|
|||||||
import org.redkale.net.http.RestMapping;
|
import org.redkale.net.http.RestMapping;
|
||||||
import org.redkale.net.http.RestService;
|
import org.redkale.net.http.RestService;
|
||||||
import org.redkale.service.RetResult;
|
import org.redkale.service.RetResult;
|
||||||
import org.redkale.source.*;
|
import org.redkale.source.ColumnValue;
|
||||||
|
import org.redkale.source.FilterBean;
|
||||||
|
import org.redkale.source.FilterNode;
|
||||||
|
import org.redkale.source.Flipper;
|
||||||
import org.redkale.util.AnyValue;
|
import org.redkale.util.AnyValue;
|
||||||
import org.redkale.util.Comment;
|
import org.redkale.util.Comment;
|
||||||
import org.redkale.util.TypeToken;
|
import org.redkale.util.TypeToken;
|
||||||
@ -34,8 +37,8 @@ public class ImAccountService extends BaseService {
|
|||||||
protected MyRedisCacheSource<String> strCache;
|
protected MyRedisCacheSource<String> strCache;
|
||||||
@Resource
|
@Resource
|
||||||
protected ImMessageMonitor messageMonitor;
|
protected ImMessageMonitor messageMonitor;
|
||||||
@Resource
|
/*@Resource
|
||||||
protected ImAccountService accountService;
|
protected ImAccountService accountService;*/
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(AnyValue config) {
|
public void init(AnyValue config) {
|
||||||
@ -93,7 +96,7 @@ public class ImAccountService extends BaseService {
|
|||||||
SubscribeBean bean = r.getValue();
|
SubscribeBean bean = r.getValue();
|
||||||
String imtoken = bean.getImtoken();
|
String imtoken = bean.getImtoken();
|
||||||
|
|
||||||
ImUser user = accountService.currentImUser(imtoken);
|
ImUser user = currentImUser(imtoken);
|
||||||
int userid = user.getUserid();
|
int userid = user.getUserid();
|
||||||
zimSource.updateColumn(ImUser.class, userid, ColumnValue.create("status", ImUser.STATUS_FREEZE_ACTIVE));
|
zimSource.updateColumn(ImUser.class, userid, ColumnValue.create("status", ImUser.STATUS_FREEZE_ACTIVE));
|
||||||
intCache.setBit("im:banned-talk", userid, true);
|
intCache.setBit("im:banned-talk", userid, true);
|
||||||
@ -106,7 +109,7 @@ public class ImAccountService extends BaseService {
|
|||||||
SubscribeBean bean = r.getValue();
|
SubscribeBean bean = r.getValue();
|
||||||
String imtoken = bean.getImtoken();
|
String imtoken = bean.getImtoken();
|
||||||
|
|
||||||
ImUser user = accountService.currentImUser(imtoken);
|
ImUser user = currentImUser(imtoken);
|
||||||
int userid = user.getUserid();
|
int userid = user.getUserid();
|
||||||
zimSource.updateColumn(ImUser.class, userid, ColumnValue.create("status", 10));
|
zimSource.updateColumn(ImUser.class, userid, ColumnValue.create("status", 10));
|
||||||
intCache.setBit("im:banned-talk", userid, false);
|
intCache.setBit("im:banned-talk", userid, false);
|
||||||
@ -127,6 +130,10 @@ public class ImAccountService extends BaseService {
|
|||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ImUser getImUser(ImBean bean) {
|
||||||
|
return zimSource.find(ImUser.class, FilterNode.create("guserid", bean.getGuserid()).and("appid", bean.getAppid()));
|
||||||
|
}
|
||||||
|
|
||||||
/*@Comment("获取当前用户ID")
|
/*@Comment("获取当前用户ID")
|
||||||
public int currentImUserId(String token) {
|
public int currentImUserId(String token) {
|
||||||
return currentImUser(token).getUserid();
|
return currentImUser(token).getUserid();
|
||||||
@ -190,7 +197,7 @@ public class ImAccountService extends BaseService {
|
|||||||
*/
|
*/
|
||||||
@RestMapping(name = "subscribe", auth = false, comment = "给用户订阅频道信息")
|
@RestMapping(name = "subscribe", auth = false, comment = "给用户订阅频道信息")
|
||||||
public RetResult subscribe(SubscribeBean bean) {
|
public RetResult subscribe(SubscribeBean bean) {
|
||||||
ImUser user = accountService.currentImUser(bean.getImtoken());
|
ImUser user = currentImUser(bean.getImtoken());
|
||||||
int userid = user.getUserid();
|
int userid = user.getUserid();
|
||||||
Lock lock = zhub.lock("im:channel-create:" + userid, 500);
|
Lock lock = zhub.lock("im:channel-create:" + userid, 500);
|
||||||
try {
|
try {
|
||||||
@ -220,7 +227,7 @@ public class ImAccountService extends BaseService {
|
|||||||
*/
|
*/
|
||||||
@RestMapping(name = "unsubscribe", auth = false, comment = "取消频道订阅")
|
@RestMapping(name = "unsubscribe", auth = false, comment = "取消频道订阅")
|
||||||
public RetResult unsubscribe(SubscribeBean bean) {
|
public RetResult unsubscribe(SubscribeBean bean) {
|
||||||
ImUser user = accountService.currentImUser(bean.getImtoken());
|
ImUser user = currentImUser(bean.getImtoken());
|
||||||
int userid = user.getUserid();
|
int userid = user.getUserid();
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,6 +3,9 @@ package com.zchd.zim;
|
|||||||
import com.zchd.base.BaseService;
|
import com.zchd.base.BaseService;
|
||||||
import com.zchd.base.util.Kv;
|
import com.zchd.base.util.Kv;
|
||||||
import com.zchd.base.util.QueueTask;
|
import com.zchd.base.util.QueueTask;
|
||||||
|
import com.zchd.base.util.Utils;
|
||||||
|
import com.zchd.zim.bean.ImBean;
|
||||||
|
import com.zchd.zim.bean.MessageBean;
|
||||||
import com.zchd.zim.entity.ChannelMessage;
|
import com.zchd.zim.entity.ChannelMessage;
|
||||||
import com.zchd.zim.entity.ChannelUser;
|
import com.zchd.zim.entity.ChannelUser;
|
||||||
import com.zchd.zim.entity.FriendMessage;
|
import com.zchd.zim.entity.FriendMessage;
|
||||||
@ -11,12 +14,14 @@ import net.tccn.timer.Timers;
|
|||||||
import net.tccn.zhub.ZHubClient;
|
import net.tccn.zhub.ZHubClient;
|
||||||
import org.redkale.net.http.RestService;
|
import org.redkale.net.http.RestService;
|
||||||
import org.redkale.net.http.WebSocketNode;
|
import org.redkale.net.http.WebSocketNode;
|
||||||
|
import org.redkale.service.RetResult;
|
||||||
import org.redkale.source.ColumnValue;
|
import org.redkale.source.ColumnValue;
|
||||||
import org.redkale.source.DataSource;
|
import org.redkale.source.DataSource;
|
||||||
import org.redkale.source.FilterNode;
|
import org.redkale.source.FilterNode;
|
||||||
import org.redkale.source.Flipper;
|
import org.redkale.source.Flipper;
|
||||||
import org.redkale.util.AnyValue;
|
import org.redkale.util.AnyValue;
|
||||||
import org.redkale.util.Comment;
|
import org.redkale.util.Comment;
|
||||||
|
import org.redkale.util.TypeToken;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.persistence.Transient;
|
import javax.persistence.Transient;
|
||||||
@ -39,11 +44,52 @@ public class ImChatService extends BaseService {
|
|||||||
@Transient //消息存储
|
@Transient //消息存储
|
||||||
protected QueueTask<Runnable> dbQueue = new QueueTask<>(1);
|
protected QueueTask<Runnable> dbQueue = new QueueTask<>(1);
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ImAccountService accountService;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(AnyValue config) {
|
public void init(AnyValue config) {
|
||||||
msgQueue.init(logger, Runnable::run);
|
msgQueue.init(logger, Runnable::run);
|
||||||
dbQueue.init(logger, Runnable::run);
|
dbQueue.init(logger, Runnable::run);
|
||||||
|
|
||||||
|
zhub.rpcSubscribe("im:send-message", new TypeToken<MessageBean>() {
|
||||||
|
}, r -> {
|
||||||
|
MessageBean bean = r.getValue();
|
||||||
|
|
||||||
|
/*// 当指定点对点消息类型的时候,消息类型必须明确
|
||||||
|
if (!Utils.isEmpty(bean.getGuserid()) && Utils.isEmpty(bean.getMessagetype())) {
|
||||||
|
return r.retError("发送消息类型未明确");
|
||||||
|
}*/
|
||||||
|
if (Utils.isEmpty(bean.getGuserid()) && bean.getReceivechannel() == null) {
|
||||||
|
return r.retError("发送目标未明确");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送点对点消息
|
||||||
|
if (!Utils.isEmpty(bean.getGuserid())) {
|
||||||
|
ImBean imBean = bean.buildImBean();
|
||||||
|
ImUser imUser = accountService.getImUser(imBean);
|
||||||
|
// 接收人未注册 IM 信息,为其注册信息
|
||||||
|
if (imUser == null) {
|
||||||
|
RetResult<Kv> result = accountService.register(imBean);
|
||||||
|
if (!result.isSuccess()) {
|
||||||
|
return r.retError(result.getRetinfo());
|
||||||
|
}
|
||||||
|
imUser = accountService.getImUser(imBean);
|
||||||
|
}
|
||||||
|
|
||||||
|
FriendMessage message = bean.buildFriendMessage(0, imUser.getUserid());
|
||||||
|
sendFriendMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 发送群组消息
|
||||||
|
if (bean.getReceivechannel() != null) {
|
||||||
|
ChannelMessage message = bean.buildChannelMessage(0); // 发送者:0系统发送
|
||||||
|
sendChannelMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.render();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Comment("发送私聊消息")
|
@Comment("发送私聊消息")
|
||||||
@ -166,7 +212,7 @@ public class ImChatService extends BaseService {
|
|||||||
public Kv buildFriendMessageDeail(FriendMessage message) {
|
public Kv buildFriendMessageDeail(FriendMessage message) {
|
||||||
Kv detail = Kv.toKv(message, "content", "messageid", "sendtime");
|
Kv detail = Kv.toKv(message, "content", "messageid", "sendtime");
|
||||||
detail.set("sendguserid", getGuserid(message.getSenduserid()));
|
detail.set("sendguserid", getGuserid(message.getSenduserid()));
|
||||||
Kv data = Kv.of("detail", detail).set("type", "friend-text");
|
Kv data = Kv.of("detail", detail).set("type", message.getMessagetype());
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
65
src/com/zchd/zim/bean/MessageBean.java
Normal file
65
src/com/zchd/zim/bean/MessageBean.java
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
package com.zchd.zim.bean;
|
||||||
|
|
||||||
|
import com.zchd.base.util.Utils;
|
||||||
|
import com.zchd.zim.entity.AppInfo;
|
||||||
|
import com.zchd.zim.entity.ChannelMessage;
|
||||||
|
import com.zchd.zim.entity.FriendMessage;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.redkale.util.Comment;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
|
||||||
|
@Setter
|
||||||
|
@Getter
|
||||||
|
public class MessageBean {
|
||||||
|
|
||||||
|
@Column(comment = "[消息内容]")
|
||||||
|
private String content = "";
|
||||||
|
|
||||||
|
@Column(comment = "[平台信息]{appid, appsecret}")
|
||||||
|
private AppInfo appinfo;
|
||||||
|
|
||||||
|
@Column(comment = "[消息类型]用于点对点模式下的消息类别标注")
|
||||||
|
private String messagetype = "";
|
||||||
|
|
||||||
|
@Column(comment = "[接收人]")
|
||||||
|
private String guserid;
|
||||||
|
|
||||||
|
@Comment("[接收群组]{channeltype, channelvalue}")
|
||||||
|
private SubscribeBean receivechannel;
|
||||||
|
|
||||||
|
public FriendMessage buildFriendMessage(int senduserid, int userid) {
|
||||||
|
FriendMessage message = new FriendMessage();
|
||||||
|
message.setContent(content);
|
||||||
|
message.setMessagetype(messagetype);
|
||||||
|
message.setSenduserid(senduserid);
|
||||||
|
message.setReceiveuserid(userid);
|
||||||
|
message.setCreatetime(System.currentTimeMillis());
|
||||||
|
message.setStatus((short) 20);
|
||||||
|
message.setMessageid(Utils.fmt36(senduserid) + "-" + Utils.fmt36(message.getCreatetime()));
|
||||||
|
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ChannelMessage buildChannelMessage(int senduserid) {
|
||||||
|
ChannelMessage message = new ChannelMessage();
|
||||||
|
message.setContent(content);
|
||||||
|
message.setAppid(appinfo.getAppid());
|
||||||
|
message.setSenduserid(senduserid);
|
||||||
|
message.setChanneltype(receivechannel.getChanneltype());
|
||||||
|
message.setChannelvalue(receivechannel.getChannelvalue());
|
||||||
|
message.setCreatetime(System.currentTimeMillis());
|
||||||
|
message.setStatus((short) 20);
|
||||||
|
message.setMessageid(Utils.fmt36(message.getSenduserid()) + "-" + Utils.fmt36(message.getCreatetime()));
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImBean buildImBean() {
|
||||||
|
ImBean bean = new ImBean();
|
||||||
|
bean.setAppid(appinfo.getAppid());
|
||||||
|
bean.setAppsecret(appinfo.getAppsecret());
|
||||||
|
bean.setGuserid(guserid);
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
}
|
@ -17,6 +17,9 @@ public class FriendMessage {
|
|||||||
@Column(comment = "[私聊ID]发送人-时间戳")
|
@Column(comment = "[私聊ID]发送人-时间戳")
|
||||||
private String messageid = "";
|
private String messageid = "";
|
||||||
|
|
||||||
|
@Column(comment = "[消息类型]")
|
||||||
|
private String messagetype = "friend-text";
|
||||||
|
|
||||||
@Column(comment = "[私聊内容]")
|
@Column(comment = "[私聊内容]")
|
||||||
private String content = "";
|
private String content = "";
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user