通话逻辑
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -12,4 +12,6 @@ public class RoomData {
|
||||
private Integer status;
|
||||
private BigDecimal videoDivide;
|
||||
private Long hangUpTime;
|
||||
|
||||
private Long beginTime;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user