diff --git a/src/com/zchd/zim/ImAccountService.java b/src/com/zchd/zim/ImAccountService.java index 51977c5..0b7b5af 100644 --- a/src/com/zchd/zim/ImAccountService.java +++ b/src/com/zchd/zim/ImAccountService.java @@ -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 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(); diff --git a/src/com/zchd/zim/ImChatService.java b/src/com/zchd/zim/ImChatService.java index aa851ad..92ac412 100644 --- a/src/com/zchd/zim/ImChatService.java +++ b/src/com/zchd/zim/ImChatService.java @@ -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 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() { + }, 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 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; } diff --git a/src/com/zchd/zim/bean/MessageBean.java b/src/com/zchd/zim/bean/MessageBean.java new file mode 100644 index 0000000..9b1749c --- /dev/null +++ b/src/com/zchd/zim/bean/MessageBean.java @@ -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; + } +} diff --git a/src/com/zchd/zim/entity/FriendMessage.java b/src/com/zchd/zim/entity/FriendMessage.java index 3d8e113..bd40741 100644 --- a/src/com/zchd/zim/entity/FriendMessage.java +++ b/src/com/zchd/zim/entity/FriendMessage.java @@ -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 = "";