通话逻辑

This commit is contained in:
张良(004796)
2023-12-28 22:23:32 +08:00
parent 49922904ec
commit 934a613f11
15 changed files with 245 additions and 122 deletions

View File

@@ -29,7 +29,7 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.19</version>
<version>2.0.32</version>
</dependency>
<dependency>
<groupId>com.ruoyi</groupId>

View File

@@ -12,4 +12,6 @@ public class RoomData {
private Integer status;
private BigDecimal videoDivide;
private Long hangUpTime;
private Long beginTime;
}

View File

@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON;
import com.ruoyi.cai.ws.bean.FdCtxData;
import com.ruoyi.cai.ws.constant.RedisConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

View File

@@ -1,10 +1,12 @@
package com.ruoyi.cai.ws.cache;
import com.ruoyi.cai.ws.constant.RedisConstant;
import com.ruoyi.websocket.holder.WebSocketSessionHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Component
@@ -21,4 +23,21 @@ public class RoomCtxCache {
redisTemplate.opsForHash().putIfAbsent(key,sessionKey,userType);
redisTemplate.expire(key,7, TimeUnit.DAYS);
}
public String getSessionKeyByRoomIdAndUserType(String roomId,Integer userType){
String key = getKey(roomId);
Map<Object, Object> entries = redisTemplate.opsForHash().entries(key);
for (Map.Entry<Object, Object> entry : entries.entrySet()) {
String sessionKey = String.valueOf(entry.getKey());
Integer userTypeK = Integer.valueOf(entry.getValue().toString());
if(WebSocketSessionHolder.existSession(sessionKey) && userTypeK.equals(userType)){
return sessionKey;
}
}
return null;
}
public String getSessionKeyReceiverByRoomId(String roomId){
return getSessionKeyByRoomIdAndUserType(roomId,UserDataCache.TYPE_RECEIVER);
}
}

View File

@@ -11,7 +11,10 @@ import com.ruoyi.cai.ws.constant.RoomStatusEnums;
import com.ruoyi.cai.ws.service.CheckConnectionDTO;
import com.ruoyi.cai.ws.service.RoomService;
import com.ruoyi.cai.ws.util.WsExceptionUtil;
import com.ruoyi.websocket.dto.WsRMsgGen;
import com.ruoyi.websocket.handle.IOpenLogic;
import com.ruoyi.websocket.util.RoomWebSocketUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;
@@ -42,8 +45,10 @@ public class OpenLogic implements IOpenLogic {
public void processOn(WebSocketSession session) {
Map<String, Object> map = session.getAttributes();
String token = map.get("token").toString();
String roomId = map.get("roomId").toString();
Long userId = Long.valueOf(map.get("userId").toString());
// 校验token
process(token,"",0L);
process(token,roomId,userId);
}
public void process(String sessionKey,String roomId,Long userId){
@@ -99,7 +104,6 @@ public class OpenLogic implements IOpenLogic {
}
// 已经接通
if(room.isOnline()){
// TODO
// 如果视频也掉线了,则重连的时候发送消息提示
// sgo(function() use ($rs){
// $users = Agora::getChannelUsers($rs->room->id);
@@ -111,12 +115,20 @@ public class OpenLogic implements IOpenLogic {
// ->sendToCurrent(WsMsgGen::sysNotice('重连成功,房间已通话 '.gmdate('H:i:s', $rs->callTime())))
// ->sendToReceiver(WsMsgGen::sysNotice('对方已重连成功'));
// });
Long callTime = roomService.getCallTime(room);
RoomWebSocketUtil.sendSendMessage(sessionKey,WsRMsgGen.startVideo(room.getRoomId(), callTime));
RoomWebSocketUtil.sendSendMessage(sessionKey,WsRMsgGen.sysNotice("重连成功,房间已通话(转换成时分秒) "));
String sessionKeyReceiver = roomCtxCache.getSessionKeyReceiverByRoomId(room.getRoomId());
if(StringUtils.isNotEmpty(sessionKeyReceiver)){
RoomWebSocketUtil.sendSendMessage(sessionKey,WsRMsgGen.sysNotice("对方已重连成功"));
}
}
if(RoomStatusEnums.STATUS_CREATE.getCode().equals(status) ||
RoomStatusEnums.STATUS_CALLER_CONNECT.getCode().equals(status) ||
RoomStatusEnums.STATUS_RECEIVER_CONNECT.getCode().equals(status)){
// 给当前会话发送消息 - 连线成功
RoomWebSocketUtil.sendSendMessage(sessionKey, WsRMsgGen.response(room.getRoomId()));
}
if(isFirst){
// 给对方发送呼叫页面
@@ -138,9 +150,8 @@ public class OpenLogic implements IOpenLogic {
userService.updateVideoStatus(userId,1);
anchorService.updateVideoStatus(userId,1);
}
// 连线成功
// $rs->sendToCurrent(WsMsgGen::response($this->roomId))
// ->sendToCurrent(WsMsgGen::updateTip());
RoomWebSocketUtil.sendSendMessage(sessionKey, WsRMsgGen.response(room.getRoomId()));
RoomWebSocketUtil.sendSendMessage(sessionKey, WsRMsgGen.updateTip());
}

View File

@@ -1,5 +1,6 @@
package com.ruoyi.cai.ws.service;
import cn.hutool.core.date.DateUtil;
import com.ruoyi.cai.ws.bean.Room;
import com.ruoyi.cai.ws.bean.RoomData;
import com.ruoyi.cai.ws.bean.UserData;
@@ -86,4 +87,17 @@ public class RoomService {
}
return null;
}
public Long getCallTime(Room room) {
RoomData roomData = room.getRoomData();
Long beginTime = roomData.getBeginTime();
if(beginTime == null){
return 0L;
}
if(roomData.getHangUpTime() != null){
return roomData.getHangUpTime() - roomData.getBeginTime();
}
return DateUtil.currentSeconds() - beginTime;
}
}