通话逻辑

This commit is contained in:
张良(004796)
2023-12-29 15:07:08 +08:00
parent 244fadd1e6
commit 3888da346c
10 changed files with 164 additions and 17 deletions

View File

@@ -1,9 +1,8 @@
package com.ruoyi.cai.agora; package com.ruoyi.cai.trd;
import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.cai.util.RestTemplateUtil; import com.ruoyi.cai.util.RestTemplateUtil;
import com.ruoyi.websocket.config.AgoraProperties;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity; import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
@@ -45,15 +44,15 @@ public class Agora {
public void closeChannel(String roomId){ public void closeChannel(String roomId){
String url = "http://api.sd-rtn.com/dev/v1/kicking-rule"; String url = "http://api.sd-rtn.com/dev/v1/kicking-rule";
Map<String,Object> param = new HashMap<>(); Map<String,Object> bodyData = new HashMap<>();
param.put("appid",agoraProperties.getAppId()); bodyData.put("appid",agoraProperties.getAppId());
param.put("cname",roomId); bodyData.put("cname",roomId);
param.put("time",0); bodyData.put("time",0);
param.put("privileges",Collections.emptyList()); bodyData.put("privileges",Collections.emptyList());
HttpHeaders headers = new HttpHeaders(); HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON); headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", getAuthorizationHeader()); headers.set("Authorization", getAuthorizationHeader());
HttpEntity httpEntity = new HttpEntity<>(param, headers); HttpEntity httpEntity = new HttpEntity<>(bodyData, headers);
RestTemplateUtil.restTemplate.postForObject(url, httpEntity, JSONObject.class); RestTemplateUtil.restTemplate.postForObject(url, httpEntity, JSONObject.class);
} }

View File

@@ -1,4 +1,4 @@
package com.ruoyi.websocket.config; package com.ruoyi.cai.trd;
import lombok.Data; import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;

View File

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

View File

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

View File

@@ -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<String,Object> 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<String,Object> 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<String,Object> 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<String,Object> 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);
}
}

View File

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

View File

@@ -11,7 +11,7 @@ import java.util.List;
public class RestTemplateUtil { public class RestTemplateUtil {
public static RestTemplate restTemplate = null; public static RestTemplate restTemplate;
static { static {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();

View File

@@ -1,7 +1,7 @@
package com.ruoyi.cai.ws.processon; package com.ruoyi.cai.ws.processon;
import cn.hutool.core.date.DateUtil; 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.executor.ExecutorConstant;
import com.ruoyi.cai.service.CaiAnchorService; import com.ruoyi.cai.service.CaiAnchorService;
import com.ruoyi.cai.service.CaiUserService; import com.ruoyi.cai.service.CaiUserService;

View File

@@ -4,6 +4,9 @@ import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.cai.domain.CaiUserCall; import com.ruoyi.cai.domain.CaiUserCall;
import com.ruoyi.cai.service.CaiUserCallService; 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.FdCtxData;
import com.ruoyi.cai.ws.bean.Room; import com.ruoyi.cai.ws.bean.Room;
import com.ruoyi.cai.ws.constant.HangUpEnums; import com.ruoyi.cai.ws.constant.HangUpEnums;
@@ -24,6 +27,8 @@ public class CancelMessageHandler extends AbstractMessageHandle implements IMess
private CaiUserCallService userCallService; private CaiUserCallService userCallService;
@Autowired @Autowired
private RoomService roomService; private RoomService roomService;
@Autowired
private Yunxin yunxin;
@Override @Override
public void processOn(Room room, FdCtxData fdCtxData, JSONObject map) { public void processOn(Room room, FdCtxData fdCtxData, JSONObject map) {
if(!fdCtxData.isCaller()){ if(!fdCtxData.isCaller()){
@@ -37,7 +42,11 @@ public class CancelMessageHandler extends AbstractMessageHandle implements IMess
sendToCurrent(fdCtxData,WsRMsgGen.hangup("通话已取消",roomId, HangUpEnums.CANCEL.getCode())); sendToCurrent(fdCtxData,WsRMsgGen.hangup("通话已取消",roomId, HangUpEnums.CANCEL.getCode()));
sendToReceiver(roomId,WsRMsgGen.hangup("对方已取消",roomId, HangUpEnums.CANCEL.getCode())); sendToReceiver(roomId,WsRMsgGen.hangup("对方已取消",roomId, HangUpEnums.CANCEL.getCode()));
roomService.closeAllFd(roomId); 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) userCallService.update(Wrappers.lambdaUpdate(CaiUserCall.class)
.eq(CaiUserCall::getId,roomId) .eq(CaiUserCall::getId,roomId)

View File

@@ -4,9 +4,11 @@ import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.cai.domain.CaiUserCall; import com.ruoyi.cai.domain.CaiUserCall;
import com.ruoyi.cai.service.CaiUserCallService; 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.FdCtxData;
import com.ruoyi.cai.ws.bean.Room; 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.cache.RoomDataCache;
import com.ruoyi.cai.ws.constant.HangUpEnums; import com.ruoyi.cai.ws.constant.HangUpEnums;
import com.ruoyi.cai.ws.constant.RoomStatusEnums; 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.dto.WsRMsgGen;
import com.ruoyi.websocket.handler.AbstractMessageHandle; import com.ruoyi.websocket.handler.AbstractMessageHandle;
import com.ruoyi.websocket.handler.IMessageHandler; import com.ruoyi.websocket.handler.IMessageHandler;
import com.ruoyi.websocket.util.RoomWebSocketUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -26,11 +27,11 @@ public class RefuseMessageHandler extends AbstractMessageHandle implements IMess
@Autowired @Autowired
private RoomDataCache roomDataCache; private RoomDataCache roomDataCache;
@Autowired @Autowired
private RoomCtxCache roomCtxCache;
@Autowired
private RoomService roomService; private RoomService roomService;
@Autowired @Autowired
private CaiUserCallService userCallService; private CaiUserCallService userCallService;
@Autowired
private Yunxin yunxin;
@Override @Override
public void processOn(Room room, FdCtxData fdCtxData, JSONObject map) { public void processOn(Room room, FdCtxData fdCtxData, JSONObject map) {
if(!fdCtxData.isReceiver() || !RoomStatusEnums.STATUS_RECEIVER_CONNECT.getCode().equals(room.getStatus())){ 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())); sendToTar(fdCtxData,WsRMsgGen.hangup("对方已拒绝",room.getRoomId(), HangUpEnums.REFUSE.getCode()));
roomService.closeAllFd(room.getRoomId()); 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) userCallService.update(Wrappers.lambdaUpdate(CaiUserCall.class)