七牛云多人视频会议

加入、退出会议前端能处理

业务类

操作管理

package com.taiji.soa.mobile.api;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.qiniu.rtc.QRTC;
import com.qiniu.rtc.QRTCClient;
import com.qiniu.rtc.model.QRTCResult;
import com.qiniu.rtc.model.RoomParam;
import com.qiniu.rtc.model.RoomResult;
import com.taiji.common.controller.Result;
import com.taiji.common.util.CommonUtil;
import com.taiji.general.entity.user.SysUser;
import com.taiji.general.message.ObjectRestResponse;
import com.taiji.general.utils.httpClient.HttpClientUtil;
import com.taiji.general.vo.UserInfoVo;
import com.taiji.soa.mobile.client.UserFeignClient;
import com.taiji.soa.mobile.constant.MobileCommonConstant;
import com.taiji.soa.mobile.dto.QnimDto;
import com.taiji.soa.mobile.dto.QnimJoinerDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author chenxuxing
 * @ClassName: QiniuControllerApi
 * @Description:
 * @date 2019/1/18 0018 11:33
 */
@Slf4j
@RestController
@RequestMapping("/api/qnapi")
public class QiniuControllerApi {

    @Autowired
    private UserFeignClient userFeignClient;

    /**
     * @des:获取七牛云房间token
     * @auther: chenxuxing
     * @date: 2023年3月10日
     */
    @PostMapping(value = "/qrtc/getRoomToken")
    @ResponseBody
    public ObjectRestResponse getRoomToken(){
        ObjectRestResponse objectRestResponse = new ObjectRestResponse();
        QRTCClient client = QRTC.init(MobileCommonConstant.qrtcAccessKey,MobileCommonConstant.qrtcSecretKey,MobileCommonConstant.qrtcAppId);;
        try {
            String roomName="room_"+ System.currentTimeMillis();
            RoomParam roomParam = new RoomParam();
            roomParam.setRoomName(roomName);
            roomParam.setOpenRoom(true);
            roomParam.setAutoCloseTtlS(30);
            roomParam.setNoEntreTtlS(3600);
            roomParam.setMaxUsers(2);
            QRTCResult<RoomResult> roomResult = client.createRoom(roomParam);
            String tokenA = client.getRoomToken(roomName, "qrtcA", System.currentTimeMillis() / 1000+3600, "user");
            String tokenB = client.getRoomToken(roomName, "qrtcB", System.currentTimeMillis() / 1000+3600, "user");
            Map map=new HashMap();
            map.put("roomTokenA",tokenA);
            map.put("roomTokenB",tokenB);
            objectRestResponse.setRel(true);
            objectRestResponse.setMessage("success");
            objectRestResponse.setData(map);
            return objectRestResponse;
        }catch (Exception e){
            log.error("获取roomtoken失败", e);
            throw new RuntimeException();
        }
    }

    /**
     * @des:创建七牛云视频房间
     * @auther: chenxuxing
     * @date: 2023年4月13日
     */
    @PostMapping(value = "/qrtc/createRoom")
    @ResponseBody
    public ObjectRestResponse createRoom(@RequestBody QnimJoinerDto qnimJoinerDto){
        ObjectRestResponse objectRestResponse = new ObjectRestResponse();
        QRTCClient client = QRTC.init(MobileCommonConstant.qrtcAccessKey,MobileCommonConstant.qrtcSecretKey,MobileCommonConstant.qrtcAppId);;
        try {
            String roomName="room_"+ System.currentTimeMillis();
            RoomParam roomParam = new RoomParam();
            roomParam.setRoomName(roomName);
            roomParam.setOpenRoom(true);
            roomParam.setAutoCloseTtlS(30);
            roomParam.setNoEntreTtlS(3600);
            roomParam.setMaxUsers(20);
            QRTCResult<RoomResult> roomResult = client.createRoom(roomParam);
            String joinerToken = client.getRoomToken(roomName, qnimJoinerDto.getUserName(), System.currentTimeMillis() / 1000+36000, "user");
            Map map=new HashMap();
            map.put("roomToken",joinerToken);
            map.put("roomName",roomName);
            objectRestResponse.setRel(true);
            objectRestResponse.setMessage("success");
            objectRestResponse.setData(map);
            return objectRestResponse;
        }catch (Exception e){
            log.error("创建七牛云视频房间失败", e);
            throw new RuntimeException();
        }
    }

    /**
     * @des:添加参会人员
     * @auther: chenxuxing
     * @date: 2023年4月13日
     */
    @PostMapping(value = "/qrtc/addJoiner")
    @ResponseBody
    public ObjectRestResponse addJoiner(@RequestBody QnimDto qnimDto){
        ObjectRestResponse objectRestResponse = new ObjectRestResponse();
        QRTCClient client = QRTC.init(MobileCommonConstant.qrtcAccessKey,MobileCommonConstant.qrtcSecretKey,MobileCommonConstant.qrtcAppId);;
        try {
            List<QnimJoinerDto> joiners=qnimDto.getJoiners();
            Boolean flag=false;
            QRTCResult<RoomResult> roomResult=client.listUser(qnimDto.getRoomName());
            List<RoomResult.UserInfo> users=new ArrayList<>();
            if(roomResult!=null){
                if(roomResult.getResult()!=null){
                    if(roomResult.getResult().getUsers()!=null&&roomResult.getResult().getUsers().size()>0){
                        users=roomResult.getResult().getUsers();
                    }
                }
            }
            for (QnimJoinerDto joinerDto:joiners) {
                for (RoomResult.UserInfo userInfo:users) {
                    if(userInfo.getUserId().equals(joinerDto.getUserName())){
                        flag=true;
                        break;
                    }
                }
                //房间存在此人,不发消息,遍历下一人
                if(flag){
                    continue;
                }
                String joinerToken = client.getRoomToken(qnimDto.getRoomName(), joinerDto.getUserName(), System.currentTimeMillis() / 1000+36000, "user");
                QnimDto sendParam=new QnimDto();
                sendParam.setFromUserName(qnimDto.getFromUserName());
                sendParam.setToUserId(new Long[]{Long.valueOf(joinerDto.getQnUserId())});
                sendParam.setRoomToken(joinerToken);
                sendParam.setRoomName(qnimDto.getRoomName());
                sendParam.setType(2);
                qnimSendMsg(sendParam);
            }

            objectRestResponse.setRel(true);
            objectRestResponse.setMessage("success");
            return objectRestResponse;
        }catch (Exception e){
            log.error("添加参会人员失败", e);
            throw new RuntimeException();
        }
    }

    /**
     * @des:七牛云即时通讯
     * @auther: chenxuxing
     * @date: 2023年3月10日
     */
    @PostMapping(value = "/qrtc/sendMsg")
    @ResponseBody
    public ObjectRestResponse qnimSendMsg(@RequestBody QnimDto qnimDto){
        try{
            ObjectRestResponse objectRestResponse = new ObjectRestResponse();
            String url=MobileCommonConstant.qnimApiEndpoint+"/token/login";
            Map<String, Object> paramMap = new HashMap<String, Object>();
            paramMap.put("login_name", qnimDto.getFromUserName());
            paramMap.put("password", "taiji_laibin");
            Map<String, String> headerMap = new HashMap<String, String>();
            headerMap.put("access-token", MobileCommonConstant.qnimAk);
            headerMap.put("app_id", MobileCommonConstant.qnimAppId);
            String resultStr = HttpClientUtil.doPostJson(url, JSON.toJSONString(paramMap),headerMap);
            if (resultStr != null && !resultStr.equals("")) {
                JSONObject jsonObject = JSONObject.parseObject(resultStr);
                if (jsonObject.getInteger("code") == 200) {
                    Long userId=jsonObject.getJSONObject("data").getLong("user_id");
                    Map map = new HashMap<>();
                    map.put("transaction_id", System.currentTimeMillis());
                    map.put("type", 1);
                    map.put("from_user_id", userId);
                    map.put("targets", qnimDto.getToUserId());
                    map.put("content_type", 0);
                    Map contentMap = new HashMap<>();
                    contentMap.put("roomToken", qnimDto.getRoomToken());
                    contentMap.put("fromName", qnimDto.getFromUserName());
                    contentMap.put("roomName", qnimDto.getRoomName());
                    contentMap.put("type", null!=qnimDto.getType()?qnimDto.getType():1);
                    String content=JSON.toJSONString(contentMap);
                    map.put("content", JSON.toJSONString(contentMap));
                    map.put("ext", JSON.toJSONString(contentMap));
                    url=MobileCommonConstant.qnimApiEndpoint+"/message/send";
                    log.info("发送人"+userId);
                    log.info("接收人"+JSON.toJSONString(qnimDto.getToUserId()));
                    resultStr = HttpClientUtil.doPostJson(url, JSON.toJSONString(map),headerMap);
                    JSONObject jsonSend = JSONObject.parseObject(resultStr);
                    if (jsonSend.getInteger("code") == 200) {
                        objectRestResponse.setRel(true);
                        objectRestResponse.setMessage("success");
                        return objectRestResponse;
                    }
                }else {
                    url=MobileCommonConstant.qnimApiEndpoint+"/user/register/v2";
                    Map<String, Object> registerMap = new HashMap<String, Object>();
                    registerMap.put("username", qnimDto.getFromUserName());
                    registerMap.put("password", "taiji_laibin");
                    resultStr = HttpClientUtil.doPostJson(url, JSON.toJSONString(registerMap),headerMap);
                    JSONObject jsonRegiter = JSONObject.parseObject(resultStr);
                    if (jsonRegiter.getInteger("code") == 200) {
                        qnimSendMsg(qnimDto);
                    }
                }
            }
            objectRestResponse.setRel(false);
            objectRestResponse.setMessage("七牛云即时通讯消息发送失败");
            return objectRestResponse;
        }catch (Exception e){
            log.error("七牛云即时通讯消息发送失败", e);
            throw new RuntimeException();
        }
    }

    /**
     * @des:七牛云即时通讯注册用户
     * @auther: chenxuxing
     * @date: 2023年3月10日
     */
    @PostMapping(value = "/qrtc/registerQnUser")
    @ResponseBody
    public ObjectRestResponse registerQnUser(@RequestBody SysUser user){
        try{
            ObjectRestResponse objectRestResponse = new ObjectRestResponse();
            String url=MobileCommonConstant.qnimApiEndpoint+"/user/register/v2";
            Map<String, String> headerMap = new HashMap<String, String>();
            headerMap.put("access-token", MobileCommonConstant.qnimAk);
            headerMap.put("app_id", MobileCommonConstant.qnimAppId);
            Map<String, Object> registerMap = new HashMap<String, Object>();
            registerMap.put("username", user.getUserName());
            registerMap.put("password", "taiji_laibin");
            String resultStr = HttpClientUtil.doPostJson(url, JSON.toJSONString(registerMap),headerMap);
            JSONObject jsonRegiter = JSONObject.parseObject(resultStr);
            if (jsonRegiter.getInteger("code") == 200) {
                Long userId=jsonRegiter.getJSONObject("data").getLong("user_id");
                SysUser updateSysUser = new SysUser();
                updateSysUser.setId(user.getId());
                updateSysUser.setQnUserId(userId);
                userFeignClient.registerQnUser(updateSysUser);
                objectRestResponse.setRel(true);
                Map resMap= new HashMap<String,Object>();
                resMap.put("qnUserId",userId);
                objectRestResponse.setData(resMap);
                objectRestResponse.setMessage("七牛云即时通讯注册用户成功");
                return objectRestResponse;
            }else {
                Result<UserInfoVo> resultUserInfoVo=userFeignClient.getUserByUserId(user.getId());
                if (CommonUtil.isResultSuccess(resultUserInfoVo)) {
                    UserInfoVo userInfoVo = resultUserInfoVo.getData();
                    if(userInfoVo.getQnUserId()==null){
                        url=MobileCommonConstant.qnimApiEndpoint+"/token/login";
                        Map<String, Object> paramMap = new HashMap<String, Object>();
                        paramMap.put("login_name", user.getUserName());
                        paramMap.put("password", "taiji_laibin");
                        resultStr = HttpClientUtil.doPostJson(url, JSON.toJSONString(paramMap),headerMap);
                        if (resultStr != null && !resultStr.equals("")) {
                            JSONObject jsonObject = JSONObject.parseObject(resultStr);
                            if (jsonObject.getInteger("code") == 200) {
                                Long userId = jsonObject.getJSONObject("data").getLong("user_id");
                                SysUser updateSysUser = new SysUser();
                                updateSysUser.setId(user.getId());
                                updateSysUser.setQnUserId(userId);
                                userFeignClient.registerQnUser(updateSysUser);
                                objectRestResponse.setRel(true);
                                Map resMap= new HashMap<String,Object>();
                                resMap.put("qnUserId",userId);
                                objectRestResponse.setData(resMap);
                                objectRestResponse.setMessage("七牛云即时通讯注册用户成功");
                                return objectRestResponse;
                            }
                        }
                    }
                }
            }
            objectRestResponse.setRel(false);
            objectRestResponse.setMessage("七牛云即时通讯注册用户失败");
            return objectRestResponse;
        }catch (Exception e){
            log.error("七牛云即时通讯注册用户失败", e);
            throw new RuntimeException();
        }
    }

}

房间管理

package com.taiji.soa.mobile.biz;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.qiniu.common.QiniuException;
import com.qiniu.rtc.QRTCClient;
import com.qiniu.rtc.model.QRTCResult;
import com.qiniu.rtc.model.RoomParam;
import com.qiniu.rtc.model.RoomResult;
import com.taiji.common.controller.Result;
import com.taiji.common.exception.CommonCodes;
import com.taiji.soa.mobile.entity.RoomAccess;
import io.netty.util.internal.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Description: 获取RTC接口
 * @author: 颜景琦
 * @date: 2023年04月09日 17:03
 */
@Slf4j
@Service
public class WebRTCService {

    @Resource
    private QRTCClient qrtcClient;

    public String getRoomToken(RoomAccess roomAccess) throws Exception {
        String roomName = roomAccess.getRoomName();
        String permission = roomAccess.getPermission();
        String userId = roomAccess.getUserId();
        long expireAt = roomAccess.getExpireAt();
        log.info("入参信息为:" + roomAccess);
        return qrtcClient.getRoomToken(roomName, permission, expireAt, userId);
    }

    public Result<?> createRoom(RoomParam roomParam) throws QiniuException {

        // TODO 校验房间名称是否重复,重复则提示

        Result<?> activeRoom = activeRoom(StringUtil.EMPTY_STRING, 0, 1);
        RoomResult result = (RoomResult) activeRoom.getData();
        List<String> rooms = result.getRooms();
        if (!ObjectUtils.isEmpty(rooms)) {
            boolean anyMatch = rooms.stream().anyMatch(res -> res.equals(roomParam.getRoomName()));
            if (anyMatch) {
                return Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode(), "创建失败,该房间名称已存在");
            }
        }

        // 创建房间
        // roomParam.setRoomName("test_room_create");
        roomParam.setOpenRoom(true);
        roomParam.setAutoCloseTtlS(30);
        roomParam.setNoEntreTtlS(3600);
        // TODO 允许进入的在线用户量待商榷
        roomParam.setMaxUsers(20);
        QRTCResult<RoomResult> roomResult = qrtcClient.createRoom(roomParam);
        return roomResult.getCode() != 200 ? Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode(), "创建房间失败") : Result.ok(roomResult.getResult());
    }

    public Result<?> enterRoom(String roomName) throws QiniuException {
        // TODO 单用户进入多个在线会议是否允许

        QRTCResult<RoomResult> roomResult = qrtcClient.listUser(roomName);
        return roomResult.getCode() != 200 ?
                Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode(), "获取房间用户失败") : Result.ok(roomResult.getResult());
    }

    public Result<?> activeRoom(String roomNamePrefix, int offset, int limit) throws QiniuException {
        QRTCResult<RoomResult> roomResult = qrtcClient.listActiveRoom(roomNamePrefix, offset, limit);
        return roomResult.getCode() != 200 ? Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode()
                , "获取活跃用失败") : Result.ok(roomResult.getResult());
    }

    public Result<?> kickRoom(String roomName, String userId) throws QiniuException {
        QRTCResult<RoomResult> roomResult = qrtcClient.kickUser(roomName, userId);
        return roomResult.getCode() != 200 ? Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode()
                , "踢出用户失败") : Result.ok(roomResult.getResult());
    }


    public Result<?> removeRoom(String roomName) throws QiniuException {
        QRTCResult<RoomResult> roomResult = qrtcClient.deleteRoom(roomName);
        return roomResult.getCode() != 200 ? Result.fail(CommonCodes.CODE_SERVICE_UNAVAILABLE.getCode(),
                "删除房间失败") : Result.ok(roomResult.getResult());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值