UserController.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package com.ym.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.microsvc.toolkit.middleware.live.LivePluginContext;
  5. import com.microsvc.toolkit.middleware.live.LivePluginService;
  6. import com.microsvc.toolkit.middleware.live.impl.TencentCloudLivePlugin;
  7. import com.ym.common.BaseResponse;
  8. import com.ym.mec.biz.dal.dto.TencentData;
  9. import com.ym.mec.biz.dal.dto.TencentImCallbackResult;
  10. import com.ym.mec.biz.dal.enums.ETencentImCallbackCommand;
  11. import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
  12. import com.ym.mec.common.entity.ImUserState;
  13. import com.ym.service.LiveRoomService;
  14. import com.ym.service.UserService;
  15. import io.rong.models.user.UserModel;
  16. import io.swagger.annotations.ApiOperation;
  17. import org.apache.commons.lang3.StringUtils;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.web.bind.annotation.PostMapping;
  22. import org.springframework.web.bind.annotation.RequestBody;
  23. import org.springframework.web.bind.annotation.RequestMapping;
  24. import org.springframework.web.bind.annotation.RequestMethod;
  25. import org.springframework.web.bind.annotation.RestController;
  26. import javax.servlet.http.HttpServletRequest;
  27. import java.util.ArrayList;
  28. import java.util.Arrays;
  29. import java.util.List;
  30. import static com.ym.mec.common.controller.BaseController.succeed;
  31. @RestController
  32. @RequestMapping("/user")
  33. public class UserController {
  34. private static final Logger log = LoggerFactory.getLogger(UserController.class);
  35. @Autowired
  36. private UserService userService;
  37. @Autowired
  38. private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
  39. @Autowired
  40. private LiveRoomService liveRoomService;
  41. @Autowired
  42. private LivePluginContext livePluginContext;
  43. @RequestMapping(value = "/register", method = RequestMethod.POST)
  44. public Object register(@RequestBody UserModel userModel) throws Exception {
  45. return userService.register(userModel);
  46. }
  47. @RequestMapping(value = "/update", method = RequestMethod.POST)
  48. public Object update(@RequestBody UserModel userModel) throws Exception {
  49. return userService.update(userModel);
  50. }
  51. /**
  52. * 监听融云用户状态变更
  53. *
  54. * @param userState List<ImUserState>
  55. */
  56. @PostMapping(value = "/statusImUser")
  57. public BaseResponse statusImUser(@RequestBody List<ImUserState> userState) {
  58. log.info("statusImUser >>>>> : {}", JSONObject.toJSONString(userState));
  59. imLiveBroadcastRoomService.opsRoom(userState);
  60. return new BaseResponse<>();
  61. }
  62. /**
  63. * 监听融云用户状态变更
  64. *
  65. * @param userState List<ImUserState>
  66. */
  67. @PostMapping(value = "/update/statusImUser")
  68. public Object updateStatusImUser(@RequestBody List<ImUserState> userState) {
  69. log.info("statusImUser >>>>> : {}", JSONObject.toJSONString(userState));
  70. imLiveBroadcastRoomService.opsRoom(userState);
  71. return succeed();
  72. }
  73. @ApiOperation("腾讯im 回调接口")
  74. @PostMapping(value = "/tencentImCallback")
  75. public TencentImCallbackResult tencentImCallback(@RequestBody String body, HttpServletRequest request) {
  76. log.info("tencentImCallback body:{}", body);
  77. LivePluginService pluginService = livePluginContext.getPluginService(TencentCloudLivePlugin.PLUGIN_NAME);
  78. String appKey = pluginService.getLiveRoomConfig().getAppKey();
  79. log.info("tencentImCallback request param:{}", JSON.toJSONString(request.getParameterMap()));
  80. List<String> sdkList = Arrays.asList(request.getParameterValues("SdkAppid"));
  81. if (sdkList == null || sdkList.size() == 0) {
  82. log.error("tencentImCallback sdkAppid is null");
  83. return new TencentImCallbackResult();
  84. }
  85. if (!sdkList.contains(appKey)) {
  86. log.error("tencentImCallback sdkAppid is not match");
  87. return new TencentImCallbackResult();
  88. }
  89. String clientIP = request.getParameter("ClientIP");
  90. String optPlatform = request.getParameter("OptPlatform");
  91. if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKONMEMBERSTATECHANGE.getCommand())) {
  92. TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange = TencentData.CallbackOnMemberStateChange.toObject(
  93. body);
  94. log.debug("callbackOnMemberStateChange: {}", callbackOnMemberStateChange);
  95. callbackOnMemberStateChange.setClientIP(clientIP);
  96. callbackOnMemberStateChange.setOptPlatform(optPlatform);
  97. if (callbackOnMemberStateChange.getGroupId().startsWith("LIVE")) {
  98. imLiveBroadcastRoomService.callbackOnMemberStateChange(callbackOnMemberStateChange);
  99. }
  100. } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERMEMBEREXIT.getCommand())) {
  101. TencentData.CallbackAfterMemberExit callbackAfterMemberExit = TencentData.CallbackAfterMemberExit.toObject(
  102. body);
  103. log.debug("callbackAfterMemberExit: {}", callbackAfterMemberExit);
  104. callbackAfterMemberExit.setClientIP(clientIP);
  105. callbackAfterMemberExit.setOptPlatform(optPlatform);
  106. if (callbackAfterMemberExit.getGroupId().startsWith("LIVE")) {
  107. imLiveBroadcastRoomService.callbackAfterMemberExit(callbackAfterMemberExit);
  108. }
  109. } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERNEWMEMBERJOIN.getCommand())) {
  110. TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin = TencentData.CallbackAfterNewMemberJoin.toObject(
  111. body);
  112. log.debug("CallbackAfterNewMemberJoin: {}", callbackAfterNewMemberJoin);
  113. callbackAfterNewMemberJoin.setClientIP(clientIP);
  114. callbackAfterNewMemberJoin.setOptPlatform(optPlatform);
  115. if (callbackAfterNewMemberJoin.getGroupId().startsWith("LIVE")) {
  116. imLiveBroadcastRoomService.callbackAfterNewMemberJoin(callbackAfterNewMemberJoin);
  117. }
  118. }
  119. return new TencentImCallbackResult();
  120. }
  121. @ApiOperation("腾讯云直播-推流 回调接口")
  122. @PostMapping(value = "/tencentStreamEventCallback")
  123. public TencentData.StreamEventCallbackResult tencentStreamEventCallback(@RequestBody String body) {
  124. log.info("tencentStreamEventCallback body:{}", body);
  125. TencentData.CallbackStreamStateEvent event = TencentData.CallbackStreamStateEvent.from(body);
  126. List<ImUserState> userState = new ArrayList<>();
  127. ImUserState imUserState = new ImUserState();
  128. userState.add(imUserState);
  129. imUserState.setUserid(getSpeakerId(event.getStreamId()).toString());
  130. // 断流事件通知
  131. if (event.getEventType() == 0) {
  132. // 更新推流时长
  133. if (StringUtils.isNotBlank(event.getPushDuration()) && event.getPushDuration().matches("\\d+")) {
  134. // 更新直播推流时长
  135. imLiveBroadcastRoomService.updateLiveRoomPushStreamTime(event);
  136. }
  137. imUserState.setStatus("3");
  138. // 自动关闭录制
  139. imLiveBroadcastRoomService.closeLive(getRoomUid(event.getStreamId()), getSpeakerId(event.getStreamId()),event.getSequence());
  140. // 同步点赞数
  141. imLiveBroadcastRoomService.syncLikeCount(getRoomUid(event.getStreamId()));
  142. }
  143. // 推流事件通知
  144. if (event.getEventType() == 1) {
  145. // 自动开启录制
  146. imLiveBroadcastRoomService.startLive(getRoomUid(event.getStreamId()), getSpeakerId(event.getStreamId()), null,event.getSequence());
  147. imUserState.setStatus("0");
  148. }
  149. // imLiveBroadcastRoomService.opsRoom(userState);
  150. return TencentData.StreamEventCallbackResult.builder().code(0).build();
  151. }
  152. private Integer getSpeakerId(String streamId) {
  153. return Integer.parseInt(streamId.split("_")[1]);
  154. }
  155. private String getRoomUid(String streamId) {
  156. return streamId.split("_")[0];
  157. }
  158. @ApiOperation("腾讯云直播-录制 回调接口")
  159. @PostMapping(value = "/tencentStreamRecordCallback")
  160. public TencentData.StreamEventCallbackResult tencentStreamRecordCallback(@RequestBody String body) {
  161. log.info("tencentStreamRecordCallback body:{}", body);
  162. TencentData.CallbackSteamRecordEvent event = TencentData.CallbackSteamRecordEvent.from(body);
  163. log.info("taskId={}, url={}", event.getTaskId(), event.getVideoUrl());
  164. // 生成直播录制信息
  165. liveRoomService.createLiveRoomVideoRecord(event);
  166. return TencentData.StreamEventCallbackResult.builder().code(0).build();
  167. }
  168. @ApiOperation("腾讯云直播-推流异常 回调接口")
  169. @PostMapping(value = "/tencentStreamExceptionCallback")
  170. public TencentData.StreamEventCallbackResult tencentStreamExceptionCallback(@RequestBody String body) {
  171. log.info("tencentStreamExceptionCallback body:{}", body);
  172. return TencentData.StreamEventCallbackResult.builder().code(0).build();
  173. }
  174. }