From 3888da346c60a70534455410f9453874efa0a559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=AF=28004796=29?= Date: Fri, 29 Dec 2023 15:07:08 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E8=AF=9D=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/cai/{agora => trd}/Agora.java | 15 ++-- .../com/ruoyi/cai/trd}/AgoraProperties.java | 2 +- .../java/com/ruoyi/cai/trd/ImDataRes.java | 18 +++++ .../main/java/com/ruoyi/cai/trd/ImMsgGen.java | 24 ++++++ .../main/java/com/ruoyi/cai/trd/Yunxin.java | 77 +++++++++++++++++++ .../com/ruoyi/cai/trd/YunxinProperties.java | 15 ++++ .../com/ruoyi/cai/util/RestTemplateUtil.java | 2 +- .../com/ruoyi/cai/ws/processon/OpenLogic.java | 2 +- .../handler/message/CancelMessageHandler.java | 11 ++- .../handler/message/RefuseMessageHandler.java | 15 ++-- 10 files changed, 164 insertions(+), 17 deletions(-) rename ruoyi-cai/src/main/java/com/ruoyi/cai/{agora => trd}/Agora.java (85%) rename {ruoyi-websocket/src/main/java/com/ruoyi/websocket/config => ruoyi-cai/src/main/java/com/ruoyi/cai/trd}/AgoraProperties.java (89%) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/trd/ImDataRes.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/trd/ImMsgGen.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/trd/Yunxin.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/trd/YunxinProperties.java diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/agora/Agora.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/Agora.java similarity index 85% rename from ruoyi-cai/src/main/java/com/ruoyi/cai/agora/Agora.java rename to ruoyi-cai/src/main/java/com/ruoyi/cai/trd/Agora.java index 504acc7a..2c36d9fa 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/agora/Agora.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/Agora.java @@ -1,9 +1,8 @@ -package com.ruoyi.cai.agora; +package com.ruoyi.cai.trd; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.cai.util.RestTemplateUtil; -import com.ruoyi.websocket.config.AgoraProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -45,15 +44,15 @@ public class Agora { public void closeChannel(String roomId){ String url = "http://api.sd-rtn.com/dev/v1/kicking-rule"; - Map param = new HashMap<>(); - param.put("appid",agoraProperties.getAppId()); - param.put("cname",roomId); - param.put("time",0); - param.put("privileges",Collections.emptyList()); + Map bodyData = new HashMap<>(); + bodyData.put("appid",agoraProperties.getAppId()); + bodyData.put("cname",roomId); + bodyData.put("time",0); + bodyData.put("privileges",Collections.emptyList()); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", getAuthorizationHeader()); - HttpEntity httpEntity = new HttpEntity<>(param, headers); + HttpEntity httpEntity = new HttpEntity<>(bodyData, headers); RestTemplateUtil.restTemplate.postForObject(url, httpEntity, JSONObject.class); } diff --git a/ruoyi-websocket/src/main/java/com/ruoyi/websocket/config/AgoraProperties.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/AgoraProperties.java similarity index 89% rename from ruoyi-websocket/src/main/java/com/ruoyi/websocket/config/AgoraProperties.java rename to ruoyi-cai/src/main/java/com/ruoyi/cai/trd/AgoraProperties.java index 6139027a..a9e210ab 100644 --- a/ruoyi-websocket/src/main/java/com/ruoyi/websocket/config/AgoraProperties.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/AgoraProperties.java @@ -1,4 +1,4 @@ -package com.ruoyi.websocket.config; +package com.ruoyi.cai.trd; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/ImDataRes.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/ImDataRes.java new file mode 100644 index 00000000..34c6c608 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/ImDataRes.java @@ -0,0 +1,18 @@ +package com.ruoyi.cai.trd; + +import lombok.Data; + +@Data +public class ImDataRes { + private Integer type; + private ImData data; + + @Data + public static class ImData { + private Integer callType; + private Integer status; + private String fromUid; + private String toUid; + private Integer callTime; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/ImMsgGen.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/ImMsgGen.java new file mode 100644 index 00000000..5f27603d --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/ImMsgGen.java @@ -0,0 +1,24 @@ +package com.ruoyi.cai.trd; + +public class ImMsgGen { + + /** + * 通话通知 + * @param status + * @param from + * @param to + * @param callTime + */ + public static ImDataRes callNotice(int status,String from,String to,int callTime){ + ImDataRes imDataRes = new ImDataRes(); + imDataRes.setType(15); + ImDataRes.ImData imData = new ImDataRes.ImData(); + imData.setCallType(1); + imData.setStatus(status); + imData.setFromUid(from); + imData.setToUid(to); + imData.setCallTime(callTime); + imDataRes.setData(imData); + return imDataRes; + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/Yunxin.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/Yunxin.java new file mode 100644 index 00000000..4e333b16 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/Yunxin.java @@ -0,0 +1,77 @@ +package com.ruoyi.cai.trd; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.lang.UUID; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.cai.util.RestTemplateUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class Yunxin { + + @Autowired + private YunxinProperties yunxinProperties; + + private final static String SEND_URL = "https://api.netease.im/nimserver/msg/sendMsg.action"; + private final static String SEND_ATTR_URL = "https://api.netease.im/nimserver/msg/sendAttachMsg.action"; + + public void sendTo(String toUid,Object data,String fromUid){ + Map option = new HashMap<>(); + option.put("push",true); // 该消息是否需要APNS推送或安卓系统通知栏推送 + option.put("roam",false); // 该消息是否需要漫游(需要app开通漫游消息功能) + option.put("history",false); // 该消息是否存云端历史 + option.put("sendersync",false); // 该消息是否需要发送方多端同步 + option.put("route",false); // 该消息是否需要抄送第三方 (需要app开通消息抄送功能) + + Map bodyData = new HashMap<>(); + bodyData.put("from", StringUtils.isBlank(fromUid) ? yunxinProperties.getDefaultFromUid() :fromUid); + bodyData.put("ope", 0); + bodyData.put("to", toUid); + bodyData.put("type", 100); + bodyData.put("body", JSON.toJSONString(data)); + bodyData.put("option", JSON.toJSONString(option)); + String nonce = UUID.fastUUID().toString(); + String curTime = DateUtil.currentSeconds() + ""; + HttpHeaders headers = new HttpHeaders(); + headers.add("AppKey",yunxinProperties.getAppKey()); + headers.add("Nonce", nonce); + headers.add("CurTime", curTime); + headers.add("CheckSum", yunxinProperties.getAppSecret()+nonce+curTime); + HttpEntity httpEntity = new HttpEntity<>(bodyData, headers); + RestTemplateUtil.restTemplate.postForObject(SEND_URL,httpEntity, JSONObject.class); + } + + public void sendAttachMsg(String toUid,Object data,String fromUid){ + Map option = new HashMap<>(); + option.put("push",true); // 该消息是否需要APNS推送或安卓系统通知栏推送 + option.put("roam",false); // 该消息是否需要漫游(需要app开通漫游消息功能) + option.put("history",false); // 该消息是否存云端历史 + option.put("sendersync",false); // 该消息是否需要发送方多端同步 + option.put("route",false); // 该消息是否需要抄送第三方 (需要app开通消息抄送功能) + + Map bodyData = new HashMap<>(); + bodyData.put("from", StringUtils.isBlank(fromUid) ? yunxinProperties.getDefaultFromUid() :fromUid); + bodyData.put("ope", 0); + bodyData.put("to", toUid); + bodyData.put("type", 100); + bodyData.put("body", JSON.toJSONString(data)); + bodyData.put("option", JSON.toJSONString(option)); + String nonce = UUID.fastUUID().toString(); + String curTime = DateUtil.currentSeconds() + ""; + HttpHeaders headers = new HttpHeaders(); + headers.add("AppKey",yunxinProperties.getAppKey()); + headers.add("Nonce", nonce); + headers.add("CurTime", curTime); + headers.add("CheckSum", yunxinProperties.getAppSecret()+nonce+curTime); + HttpEntity httpEntity = new HttpEntity<>(bodyData, headers); + RestTemplateUtil.restTemplate.postForObject(SEND_ATTR_URL,httpEntity, JSONObject.class); + } +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/YunxinProperties.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/YunxinProperties.java new file mode 100644 index 00000000..adc600eb --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trd/YunxinProperties.java @@ -0,0 +1,15 @@ +package com.ruoyi.cai.trd; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "yunxin") +public class YunxinProperties { + private String appKey; + private String appSecret; + + private String defaultFromUid; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/util/RestTemplateUtil.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/util/RestTemplateUtil.java index 4661650f..920aabe2 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/util/RestTemplateUtil.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/util/RestTemplateUtil.java @@ -11,7 +11,7 @@ import java.util.List; public class RestTemplateUtil { - public static RestTemplate restTemplate = null; + public static RestTemplate restTemplate; static { SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/processon/OpenLogic.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/processon/OpenLogic.java index fdd940ed..e0022a76 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/processon/OpenLogic.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/processon/OpenLogic.java @@ -1,7 +1,7 @@ package com.ruoyi.cai.ws.processon; import cn.hutool.core.date.DateUtil; -import com.ruoyi.cai.agora.Agora; +import com.ruoyi.cai.trd.Agora; import com.ruoyi.cai.executor.ExecutorConstant; import com.ruoyi.cai.service.CaiAnchorService; import com.ruoyi.cai.service.CaiUserService; diff --git a/ruoyi-websocket/src/main/java/com/ruoyi/websocket/handler/message/CancelMessageHandler.java b/ruoyi-websocket/src/main/java/com/ruoyi/websocket/handler/message/CancelMessageHandler.java index 80d5dd5c..5285bea8 100644 --- a/ruoyi-websocket/src/main/java/com/ruoyi/websocket/handler/message/CancelMessageHandler.java +++ b/ruoyi-websocket/src/main/java/com/ruoyi/websocket/handler/message/CancelMessageHandler.java @@ -4,6 +4,9 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.cai.domain.CaiUserCall; import com.ruoyi.cai.service.CaiUserCallService; +import com.ruoyi.cai.trd.ImDataRes; +import com.ruoyi.cai.trd.ImMsgGen; +import com.ruoyi.cai.trd.Yunxin; import com.ruoyi.cai.ws.bean.FdCtxData; import com.ruoyi.cai.ws.bean.Room; import com.ruoyi.cai.ws.constant.HangUpEnums; @@ -24,6 +27,8 @@ public class CancelMessageHandler extends AbstractMessageHandle implements IMess private CaiUserCallService userCallService; @Autowired private RoomService roomService; + @Autowired + private Yunxin yunxin; @Override public void processOn(Room room, FdCtxData fdCtxData, JSONObject map) { if(!fdCtxData.isCaller()){ @@ -37,7 +42,11 @@ public class CancelMessageHandler extends AbstractMessageHandle implements IMess sendToCurrent(fdCtxData,WsRMsgGen.hangup("通话已取消",roomId, HangUpEnums.CANCEL.getCode())); sendToReceiver(roomId,WsRMsgGen.hangup("对方已取消",roomId, HangUpEnums.CANCEL.getCode())); roomService.closeAllFd(roomId); - // IM TODO + // IM + String receiverId = room.getReceiverUserData().getId() +""; + String callerId = room.getCallUserData().getId()+""; + ImDataRes imDataRes = ImMsgGen.callNotice(1, callerId, receiverId, 0); + yunxin.sendTo(receiverId,imDataRes,callerId); // 更新房间状态 userCallService.update(Wrappers.lambdaUpdate(CaiUserCall.class) .eq(CaiUserCall::getId,roomId) diff --git a/ruoyi-websocket/src/main/java/com/ruoyi/websocket/handler/message/RefuseMessageHandler.java b/ruoyi-websocket/src/main/java/com/ruoyi/websocket/handler/message/RefuseMessageHandler.java index 7a5fb60f..7f874746 100644 --- a/ruoyi-websocket/src/main/java/com/ruoyi/websocket/handler/message/RefuseMessageHandler.java +++ b/ruoyi-websocket/src/main/java/com/ruoyi/websocket/handler/message/RefuseMessageHandler.java @@ -4,9 +4,11 @@ import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.cai.domain.CaiUserCall; import com.ruoyi.cai.service.CaiUserCallService; +import com.ruoyi.cai.trd.ImDataRes; +import com.ruoyi.cai.trd.ImMsgGen; +import com.ruoyi.cai.trd.Yunxin; import com.ruoyi.cai.ws.bean.FdCtxData; import com.ruoyi.cai.ws.bean.Room; -import com.ruoyi.cai.ws.cache.RoomCtxCache; import com.ruoyi.cai.ws.cache.RoomDataCache; import com.ruoyi.cai.ws.constant.HangUpEnums; import com.ruoyi.cai.ws.constant.RoomStatusEnums; @@ -14,7 +16,6 @@ import com.ruoyi.cai.ws.service.RoomService; import com.ruoyi.websocket.dto.WsRMsgGen; import com.ruoyi.websocket.handler.AbstractMessageHandle; import com.ruoyi.websocket.handler.IMessageHandler; -import com.ruoyi.websocket.util.RoomWebSocketUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -26,11 +27,11 @@ public class RefuseMessageHandler extends AbstractMessageHandle implements IMess @Autowired private RoomDataCache roomDataCache; @Autowired - private RoomCtxCache roomCtxCache; - @Autowired private RoomService roomService; @Autowired private CaiUserCallService userCallService; + @Autowired + private Yunxin yunxin; @Override public void processOn(Room room, FdCtxData fdCtxData, JSONObject map) { if(!fdCtxData.isReceiver() || !RoomStatusEnums.STATUS_RECEIVER_CONNECT.getCode().equals(room.getStatus())){ @@ -44,7 +45,11 @@ public class RefuseMessageHandler extends AbstractMessageHandle implements IMess sendToTar(fdCtxData,WsRMsgGen.hangup("对方已拒绝",room.getRoomId(), HangUpEnums.REFUSE.getCode())); roomService.closeAllFd(room.getRoomId()); - //发送IM通知 TODO + //发送IM通知 + String receiverId = room.getReceiverUserData().getId()+""; + String callerId = room.getCallUserData().getId()+""; + ImDataRes imDataRes = ImMsgGen.callNotice(1, callerId, receiverId, 0); + yunxin.sendTo(receiverId,imDataRes,callerId); // 更新房间状态 userCallService.update(Wrappers.lambdaUpdate(CaiUserCall.class)