新增:应用系统推送IM消息 im:send-message

This commit is contained in:
绝尘 2024-07-23 19:36:34 +08:00
parent 4e4a4c2f82
commit 621c205b6c
4 changed files with 129 additions and 8 deletions

View File

@ -13,7 +13,10 @@ import org.redkale.convert.json.JsonConvert;
import org.redkale.net.http.RestMapping;
import org.redkale.net.http.RestService;
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.Comment;
import org.redkale.util.TypeToken;
@ -34,8 +37,8 @@ public class ImAccountService extends BaseService {
protected MyRedisCacheSource<String> strCache;
@Resource
protected ImMessageMonitor messageMonitor;
@Resource
protected ImAccountService accountService;
/*@Resource
protected ImAccountService accountService;*/
@Override
public void init(AnyValue config) {
@ -93,7 +96,7 @@ public class ImAccountService extends BaseService {
SubscribeBean bean = r.getValue();
String imtoken = bean.getImtoken();
ImUser user = accountService.currentImUser(imtoken);
ImUser user = currentImUser(imtoken);
int userid = user.getUserid();
zimSource.updateColumn(ImUser.class, userid, ColumnValue.create("status", ImUser.STATUS_FREEZE_ACTIVE));
intCache.setBit("im:banned-talk", userid, true);
@ -106,7 +109,7 @@ public class ImAccountService extends BaseService {
SubscribeBean bean = r.getValue();
String imtoken = bean.getImtoken();
ImUser user = accountService.currentImUser(imtoken);
ImUser user = currentImUser(imtoken);
int userid = user.getUserid();
zimSource.updateColumn(ImUser.class, userid, ColumnValue.create("status", 10));
intCache.setBit("im:banned-talk", userid, false);
@ -127,6 +130,10 @@ public class ImAccountService extends BaseService {
return user;
}
public ImUser getImUser(ImBean bean) {
return zimSource.find(ImUser.class, FilterNode.create("guserid", bean.getGuserid()).and("appid", bean.getAppid()));
}
/*@Comment("获取当前用户ID")
public int currentImUserId(String token) {
return currentImUser(token).getUserid();
@ -190,7 +197,7 @@ public class ImAccountService extends BaseService {
*/
@RestMapping(name = "subscribe", auth = false, comment = "给用户订阅频道信息")
public RetResult subscribe(SubscribeBean bean) {
ImUser user = accountService.currentImUser(bean.getImtoken());
ImUser user = currentImUser(bean.getImtoken());
int userid = user.getUserid();
Lock lock = zhub.lock("im:channel-create:" + userid, 500);
try {
@ -220,7 +227,7 @@ public class ImAccountService extends BaseService {
*/
@RestMapping(name = "unsubscribe", auth = false, comment = "取消频道订阅")
public RetResult unsubscribe(SubscribeBean bean) {
ImUser user = accountService.currentImUser(bean.getImtoken());
ImUser user = currentImUser(bean.getImtoken());
int userid = user.getUserid();

View File

@ -3,6 +3,9 @@ package com.zchd.zim;
import com.zchd.base.BaseService;
import com.zchd.base.util.Kv;
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.ChannelUser;
import com.zchd.zim.entity.FriendMessage;
@ -11,12 +14,14 @@ import net.tccn.timer.Timers;
import net.tccn.zhub.ZHubClient;
import org.redkale.net.http.RestService;
import org.redkale.net.http.WebSocketNode;
import org.redkale.service.RetResult;
import org.redkale.source.ColumnValue;
import org.redkale.source.DataSource;
import org.redkale.source.FilterNode;
import org.redkale.source.Flipper;
import org.redkale.util.AnyValue;
import org.redkale.util.Comment;
import org.redkale.util.TypeToken;
import javax.annotation.Resource;
import javax.persistence.Transient;
@ -39,11 +44,52 @@ public class ImChatService extends BaseService {
@Transient //消息存储
protected QueueTask<Runnable> dbQueue = new QueueTask<>(1);
@Resource
private ImAccountService accountService;
@Override
public void init(AnyValue config) {
msgQueue.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("发送私聊消息")
@ -166,7 +212,7 @@ public class ImChatService extends BaseService {
public Kv buildFriendMessageDeail(FriendMessage message) {
Kv detail = Kv.toKv(message, "content", "messageid", "sendtime");
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;
}

View 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;
}
}

View File

@ -17,6 +17,9 @@ public class FriendMessage {
@Column(comment = "[私聊ID]发送人-时间戳")
private String messageid = "";
@Column(comment = "[消息类型]")
private String messagetype = "friend-text";
@Column(comment = "[私聊内容]")
private String content = "";