RoomServiceImpl.java 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139
  1. package com.ym.service.Impl;
  2. import com.ym.common.ApiException;
  3. import com.ym.common.DisplayEnum;
  4. import com.ym.common.ErrorEnum;
  5. import com.ym.config.IMProperties;
  6. import com.ym.config.RoomProperties;
  7. import com.ym.dao.RoomDao;
  8. import com.ym.dao.RoomMemberDao;
  9. import com.ym.dao.UserDao;
  10. import com.ym.dao.WhiteboardDao;
  11. import com.ym.im.IMHelper;
  12. import com.ym.im.message.*;
  13. import com.ym.job.ScheduleManager;
  14. import com.ym.mec.auth.api.client.SysUserFeignService;
  15. import com.ym.mec.auth.api.entity.SysUser;
  16. import com.ym.mec.common.security.SecurityUtils;
  17. import com.ym.pojo.*;
  18. import com.ym.service.RoomService;
  19. import com.ym.utils.CheckUtils;
  20. import com.ym.utils.CodeUtil;
  21. import com.ym.utils.DateTimeUtils;
  22. import com.ym.utils.IdentifierUtils;
  23. import com.ym.whiteboard.WhiteBoardHelper;
  24. import lombok.extern.slf4j.Slf4j;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.stereotype.Service;
  27. import org.springframework.transaction.annotation.Transactional;
  28. import java.util.ArrayList;
  29. import java.util.Date;
  30. import java.util.List;
  31. /**
  32. * Created by weiqinxiao on 2019/2/28.
  33. */
  34. @Slf4j
  35. @Service
  36. public class RoomServiceImpl implements RoomService {
  37. @Autowired
  38. private IMHelper imHelper;
  39. @Autowired
  40. private RoomProperties roomProperties;
  41. @Autowired
  42. private RoomDao roomDao;
  43. @Autowired
  44. private RoomMemberDao roomMemberDao;
  45. @Autowired
  46. private WhiteBoardHelper whiteBoardHelper;
  47. @Autowired
  48. private WhiteboardDao whiteboardDao;
  49. @Autowired
  50. private ScheduleManager scheduleManager;
  51. @Autowired
  52. private UserDao userDao;
  53. @Autowired
  54. private IMProperties imProperties;
  55. @Autowired
  56. private SysUserFeignService sysUserFeignService;
  57. /*private AuthUser getUser(){
  58. String token = SecurityUtils.getToken();
  59. String principal = SecurityUtils.getPrincipal().toString();
  60. String json = redisTemplate.opsForValue().get(principal);
  61. return JSON.parseObject(json,AuthUser.class);
  62. }*/
  63. @Transactional
  64. @Override
  65. public RoomResult joinRoom(String userName, String roomId, boolean isAudience, boolean isDisableCamera) throws ApiException, Exception {
  66. String token = SecurityUtils.getAuthenticationValue();
  67. CheckUtils.checkArgument(userName != null, "userName must't be null");
  68. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  69. log.info("joinRoom: roomId={}, userName={}, isAudience={}, isDisableCamera={}", roomId, userName, isAudience, isDisableCamera);
  70. roomId = "DAYA" + roomId;
  71. // String userId = getUser().getUserId().toString();
  72. String userId = sysUserFeignService.queryUserInfo().getId().toString();
  73. String display = "";
  74. Date curTime = DateTimeUtils.currentUTC();
  75. List<Room> roomList = roomDao.findByRid(roomId);
  76. if (roomList.isEmpty()) {
  77. saveRoom(roomId, roomId, curTime, display);
  78. IMApiResultInfo resultInfo = imHelper.createGroup(new String[]{userId}, roomId, roomId);
  79. if (!resultInfo.isSuccess()) {
  80. log.error("joinRoom IM error: roomId={}, {}", roomId, resultInfo.getErrorMessage());
  81. throw new ApiException(ErrorEnum.ERR_CREATE_ROOM_ERROR, resultInfo.getErrorMessage());
  82. } else {
  83. scheduleManager.addExpiredTask(this, roomId);
  84. }
  85. } else {
  86. display = roomList.get(0).getDisplay();
  87. }
  88. RoleEnum roleEnum;
  89. RoomResult roomResult = new RoomResult();
  90. RoomResult.MemberResult userResult = new RoomResult.MemberResult();
  91. List<RoomMember> memberList = roomMemberDao.findByRidAndUid(roomId, userId);
  92. if (memberList.isEmpty()) {
  93. int count = roomMemberDao.countByRidAndExcludeRole(roomId, RoleEnum.RoleAudience.getValue());
  94. if (!isAudience && count == roomProperties.getMaxCount()) {
  95. log.info("join error: roomId = {}, userName = {}, isAudience = {}", roomId, userName, isAudience);
  96. throw new ApiException(ErrorEnum.ERR_OVER_MAX_COUNT);
  97. }
  98. if (!isAudience) {
  99. List<RoomMember> assistantList = roomMemberDao.findByRidAndRole(roomId, RoleEnum.RoleAssistant.getValue());
  100. if (!assistantList.isEmpty()) {
  101. if (count == 1) {
  102. roleEnum = RoleEnum.RoleTeacher;
  103. } else {
  104. roleEnum = RoleEnum.RoleStudent;
  105. }
  106. } else {
  107. roleEnum = RoleEnum.RoleAssistant;
  108. }
  109. } else {
  110. roleEnum = RoleEnum.RoleAudience;
  111. }
  112. saveRoomMember(userId, userName, roomId, roleEnum.getValue(), !isDisableCamera, curTime);
  113. IMApiResultInfo resultInfo = imHelper.joinGroup(new String[]{userId}, roomId, roomId);
  114. if (!resultInfo.isSuccess()) {
  115. throw new ApiException(ErrorEnum.ERR_CREATE_ROOM_ERROR, resultInfo.getErrorMessage());
  116. }
  117. userResult.setMicrophone(true);
  118. userResult.setCamera(!isDisableCamera);
  119. userResult.setJoinTime(curTime);
  120. log.info("user join the room: roomId={} , userId={}, roleEnum={}, memCount: {}", roomId, userId, roleEnum, count);
  121. } else {
  122. roleEnum = RoleEnum.getEnumByValue(memberList.get(0).getRole());
  123. roomMemberDao.updateCameraByRidAndUid(roomId, userId, !isDisableCamera);
  124. userResult.setCamera(!isDisableCamera);
  125. userResult.setJoinTime(memberList.get(0).getJoinDt());
  126. log.info("user exist in the room: roomId={} , userId={}, use the last role={}", roomId, userId, roleEnum);
  127. }
  128. MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Join, userId, roleEnum.getValue());
  129. msg.setTimestamp(curTime);
  130. msg.setUserName(userName);
  131. msg.setCamera(!isDisableCamera);
  132. imHelper.publishMessage(userId, roomId, msg);
  133. if (roleEnum == RoleEnum.RoleTeacher) {
  134. display = "display://type=1?userId=" + userId + "?uri=";
  135. updateDisplay(roomId, userId, display, 0);
  136. log.info("joinRoom, display changed: roomId={}, {}, userId={}", roomId, display, userId);
  137. } else if (roleEnum == RoleEnum.RoleAssistant && display.isEmpty()) {
  138. display = "display://type=0?userId=" + userId + "?uri=";
  139. updateDisplay(roomId, userId, display, 0);
  140. log.info("joinRoom, display changed: roomId={}, {}, userId={}", roomId, display, userId);
  141. }
  142. List<UserInfo> userInfoList = userDao.findByUid(userId);
  143. if (userInfoList.isEmpty()) {
  144. UserInfo userInfo = new UserInfo();
  145. userInfo.setUid(userId);
  146. userInfo.setName(userName);
  147. userInfo.setCreateDt(curTime);
  148. userInfo.setUpdateDt(curTime);
  149. userDao.save(userInfo);
  150. } else {
  151. UserInfo user = userInfoList.get(0);
  152. user.setUpdateDt(curTime);
  153. userDao.save(user);
  154. }
  155. userResult.setUserName(userName);
  156. userResult.setUserId(userId);
  157. userResult.setRole(roleEnum.getValue());
  158. roomResult.setUserInfo(userResult);
  159. roomResult.setDisplay(display);
  160. // JwtToken jwtToken = tokenHelper.createJwtToken(jwtUser);
  161. IMTokenInfo tokenInfo = imHelper.getToken(userId, userId, "");
  162. // if (tokenInfo.isSuccess()) {
  163. // roomResult.setImToken(tokenInfo.getAuthenticationValue());
  164. // } else {
  165. // throw new ApiException(ErrorEnum.ERR_IM_TOKEN_ERROR, tokenInfo.getErrorMessage());
  166. // }
  167. // roomResult.setAuthorization(jwtToken.getToken());
  168. roomResult.setRoomId(roomId);
  169. List<RoomMember> roomMemberList = roomMemberDao.findByRid(roomId);
  170. roomResult.setMembers(roomMemberList);
  171. List<Whiteboard> whiteboardList = whiteboardDao.findByRid(roomId);
  172. roomResult.setWhiteboards(whiteboardList);
  173. log.info("join success: roomId = {}, userId = {}, userName={}, role = {}", roomId, userId, userName, roleEnum);
  174. return roomResult;
  175. }
  176. private void saveRoom(String roomId, String roomName, Date createTime, String display) {
  177. Room room = new Room();
  178. room.setRid(roomId);
  179. room.setName(roomName);
  180. room.setCreateDt(createTime);
  181. room.setDisplay(display);
  182. room.setWhiteboardNameIndex(0);
  183. roomDao.save(room);
  184. }
  185. private void saveRoomMember(String userId, String userName, String roomId, int role, boolean cameraOn, Date joinTime) {
  186. RoomMember roomMember = new RoomMember();
  187. roomMember.setUid(userId);
  188. roomMember.setName(userName);
  189. roomMember.setRid(roomId);
  190. roomMember.setRole(role);
  191. roomMember.setCamera(cameraOn);
  192. roomMember.setJoinDt(joinTime);
  193. roomMemberDao.save(roomMember);
  194. }
  195. @Transactional
  196. @Override
  197. public Boolean leaveRoom(String roomId) throws Exception {
  198. String token = SecurityUtils.getAuthenticationValue();
  199. SysUser user = sysUserFeignService.queryUserInfo();
  200. String userId = user.getId().toString();
  201. CheckUtils.checkArgument(user != null, "user must't be null");
  202. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  203. List<Room> roomList = roomDao.findByRid(roomId);
  204. if (roomList.size() == 0) {
  205. log.error("room : {} not exist ", roomId);
  206. throw new ApiException(ErrorEnum.ERR_ROOM_NOT_EXIST);
  207. }
  208. List<RoomMember> roomMemberList = roomMemberDao.findByRidAndUid(roomId, userId);
  209. if (roomMemberList.size() == 0) {
  210. log.error("{} not exist in room: {}", userId, roomId);
  211. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  212. }
  213. int userRole = roomMemberList.get(0).getRole();
  214. log.info("leaveRoom: roomId={}, role={}", roomId, RoleEnum.getEnumByValue(userRole));
  215. if (userRole == RoleEnum.RoleTeacher.getValue() || userRole == RoleEnum.RoleAssistant.getValue()) {
  216. if (isUserDisplay(roomList.get(0), userId)) {
  217. updateDisplay(roomId, userId, "", 0);
  218. log.info("clear display cause speaker leave: roomId={}", roomId);
  219. } else {
  220. log.info("don't update current display: room={}, role={}", roomList.get(0), RoleEnum.getEnumByValue(userRole));
  221. }
  222. } else {
  223. log.info("don't update current display: room={}, userRole={}", roomList.get(0), RoleEnum.getEnumByValue(userRole));
  224. }
  225. if (roomMemberDao.countByRid(roomId) == 1) {
  226. IMApiResultInfo apiResultInfo = null;
  227. try {
  228. apiResultInfo = imHelper.dismiss(userId, roomId);
  229. if (apiResultInfo.getCode() == 200) {
  230. roomMemberDao.deleteUserByRidAndUid(roomId, userId);
  231. roomDao.deleteByRid(roomId);
  232. deleteWhiteboardByUser(roomId, userId);
  233. log.info("dismiss the room: {}", roomId);
  234. } else {
  235. log.error("{} exit {} room error: {}", userId, roomId, apiResultInfo.getErrorMessage());
  236. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, apiResultInfo.getErrorMessage());
  237. }
  238. } catch (Exception e) {
  239. log.error("{} exit {} room error: {}", userId, roomId, e.getMessage());
  240. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, e.getMessage());
  241. }
  242. } else {
  243. IMApiResultInfo apiResultInfo = null;
  244. try {
  245. apiResultInfo = imHelper.quit(new String[]{userId}, roomId);
  246. if (apiResultInfo.isSuccess()) {
  247. roomMemberDao.deleteUserByRidAndUid(roomId, userId);
  248. MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Leave, userId, userRole);
  249. msg.setUserName(user.getUsername());
  250. imHelper.publishMessage(userId, roomId, msg);
  251. imHelper.quit(new String[]{userId}, roomId);
  252. log.info("quit group: roomId={}", roomId);
  253. } else {
  254. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, apiResultInfo.getErrorMessage());
  255. }
  256. } catch (Exception e) {
  257. log.error("leave room error: roomId={}, {}", roomId, e.getMessage());
  258. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR);
  259. }
  260. }
  261. userDao.deleteByUid(userId);
  262. return true;
  263. }
  264. private void deleteWhiteboardByUser(String roomId, String userId) throws Exception {
  265. List<Whiteboard> whiteboardList = whiteboardDao.findByRidAndCreator(roomId, userId);
  266. if (!whiteboardList.isEmpty()) {
  267. whiteboardDao.deleteByRidAndCreator(roomId, userId);
  268. for (Whiteboard wb : whiteboardList) {
  269. whiteBoardHelper.destroy(wb.getWbRoom());
  270. }
  271. }
  272. }
  273. @Transactional
  274. @Override
  275. public void destroyRoom(String roomId) {
  276. roomDao.deleteByRid(roomId);
  277. whiteboardDao.deleteByRid(roomId);
  278. List<RoomMember> list = roomMemberDao.findByRid(roomId);
  279. if (!list.isEmpty()) {
  280. try {
  281. imHelper.dismiss(list.get(0).getUid(), roomId);
  282. } catch (Exception e) {
  283. log.error("destroyRoom: {}", e.getMessage());
  284. e.printStackTrace();
  285. }
  286. }
  287. roomMemberDao.deleteByRid(roomId);
  288. log.info("destroyRoom: {}", roomId);
  289. }
  290. @Transactional
  291. @Override
  292. public Boolean downgrade(String roomId, List<ReqChangeUserRoleData.ChangedUser> users) throws ApiException, Exception {
  293. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  294. CheckUtils.checkArgument(users.size() > 0, "the changed user list must't be null");
  295. String token = SecurityUtils.getAuthenticationValue();
  296. SysUser authUser = sysUserFeignService.queryUserInfo();
  297. String userId = authUser.getId().toString();
  298. List<Room> roomList = roomDao.findByRid(roomId);
  299. if (roomList.isEmpty()) {
  300. throw new ApiException(ErrorEnum.ERR_ROOM_NOT_EXIST);
  301. }
  302. boolean result = false;
  303. List<RoleChangedMessage.ChangedUser> changedUsers = new ArrayList<>();
  304. for (ReqChangeUserRoleData.ChangedUser user : users) {
  305. String changedUserId = user.getUserId();
  306. RoleEnum changedRole = RoleEnum.getEnumByValue(user.getRole());
  307. if (changedUserId.equals(userId)) {
  308. log.error("can not change self role: {}, {}, {}", roomId, userId, changedRole);
  309. throw new ApiException(ErrorEnum.ERR_CHANGE_SELF_ROLE);
  310. } else {
  311. List<RoomMember> oldUsers = roomMemberDao.findByRidAndUid(roomId, changedUserId);
  312. if (oldUsers.size() > 0) {
  313. if (changedRole.equals(RoleEnum.RoleAudience)) {
  314. int r = roomMemberDao.updateRoleByRidAndUid(roomId, changedUserId, changedRole.getValue());
  315. RoleChangedMessage.ChangedUser u = new RoleChangedMessage.ChangedUser(changedUserId, changedRole.getValue());
  316. List<UserInfo> userInfoList = userDao.findByUid(changedUserId);
  317. if (!userInfoList.isEmpty()) {
  318. u.setUserName(userInfoList.get(0).getName());
  319. }
  320. changedUsers.add(u);
  321. log.info("change the role: {}, {}, {}, result: {}", roomId, userId, changedRole, r);
  322. result = true;
  323. }
  324. if (oldUsers.get(0).getRole() == RoleEnum.RoleTeacher.getValue() && isUserDisplay(roomList.get(0), oldUsers.get(0).getUid())) {
  325. updateDisplay(roomId, userId, "", 1);
  326. } else {
  327. log.info("don't update display: room={}, userRole={}", roomList.get(0), RoleEnum.getEnumByValue(oldUsers.get(0).getRole()));
  328. }
  329. } else {
  330. log.info("role changed fail, not exist: {} - {} - {}", roomId, userId, changedRole);
  331. }
  332. }
  333. }
  334. if (result) {
  335. RoleChangedMessage msg = new RoleChangedMessage(userId);
  336. msg.setUsers(changedUsers);
  337. imHelper.publishMessage(userId, roomId, msg, 1);
  338. }
  339. return result;
  340. }
  341. @Override
  342. public Boolean kickMember(String roomId) throws ApiException, Exception {
  343. String token = SecurityUtils.getAuthenticationValue();
  344. SysUser authUser = sysUserFeignService.queryUserInfo();
  345. String userId = authUser.getId().toString();
  346. CheckUtils.checkArgument(userId != null, "userId must't be null");
  347. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  348. List<RoomMember> kickedUsers = roomMemberDao.findByRidAndUid(roomId, userId);
  349. int result = roomMemberDao.deleteUserByRidAndUid(roomId, userId);
  350. log.info("kickMember: roomId={}, userId={}, result = {}", roomId, userId, result);
  351. if (result == 0) {
  352. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  353. } else {
  354. MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Kick, userId, kickedUsers.get(0).getRole());
  355. List<UserInfo> userInfoList = userDao.findByUid(userId);
  356. if (!userInfoList.isEmpty()) {
  357. msg.setUserName(userInfoList.get(0).getName());
  358. }
  359. IMApiResultInfo apiResultInfo = imHelper.publishMessage(userId, roomId, msg, 1);
  360. if (!apiResultInfo.isSuccess()) {
  361. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR);
  362. }
  363. Thread.sleep(50);
  364. log.info("published msg: msg={}", msg);
  365. List<Room> roomList = roomDao.findByRid(roomId);
  366. if (kickedUsers.get(0).getRole() == RoleEnum.RoleTeacher.getValue() && isUserDisplay(roomList.get(0), userId)) {
  367. updateDisplay(roomId, userId, "", 1);
  368. } else {
  369. log.info("don't update display: room={}, userRole={}", roomId, RoleEnum.getEnumByValue(kickedUsers.get(0).getRole()));
  370. }
  371. }
  372. userDao.deleteByUid(userId);
  373. IMApiResultInfo apiResultInfo = imHelper.quit(new String[]{userId}, roomId);
  374. if (!apiResultInfo.isSuccess()) {
  375. throw new ApiException(ErrorEnum.ERR_EXIT_ROOM_ERROR, apiResultInfo.getErrorMessage());
  376. }
  377. return true;
  378. }
  379. @Override
  380. public Boolean display(String roomId, int type, String uri) throws ApiException, Exception {
  381. String token = SecurityUtils.getAuthenticationValue();
  382. SysUser authUser = sysUserFeignService.queryUserInfo();
  383. String userId = authUser.getId().toString();
  384. log.info("display in room: {}, type = {}, uri = {}", roomId, type, uri);
  385. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  386. CheckUtils.checkArgument(type >= 0 && type < DisplayEnum.values().length, "type not exist");
  387. DisplayEnum displayEnum = DisplayEnum.values()[type];
  388. if (displayEnum.equals(DisplayEnum.None)) {
  389. roomDao.updateDisplayByRid(roomId, "");
  390. DisplayMessage displayMessage = new DisplayMessage("");
  391. IMApiResultInfo apiResultInfo = imHelper.publishMessage(userId, roomId, displayMessage);
  392. if (apiResultInfo.isSuccess()) {
  393. return true;
  394. } else {
  395. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, apiResultInfo.getErrorMessage());
  396. }
  397. }
  398. String display = "display://type=" + type;
  399. if (displayEnum.equals(DisplayEnum.Teacher)) {
  400. List<RoomMember> teachers = roomMemberDao.findByRidAndRole(roomId, RoleEnum.RoleTeacher.getValue());
  401. if (teachers.isEmpty()) {
  402. throw new ApiException(ErrorEnum.ERR_TEACHER_NOT_EXIST_IN_ROOM);
  403. } else {
  404. display += "?userId=" + teachers.get(0).getUid() + "?uri=";
  405. roomDao.updateDisplayByRid(roomId, display);
  406. DisplayMessage displayMessage = new DisplayMessage(display);
  407. imHelper.publishMessage(userId, roomId, displayMessage);
  408. log.info("change display to teacher: roomId={}, display={}", roomId, display);
  409. }
  410. } else if (displayEnum.equals(DisplayEnum.Assistant)) {
  411. List<RoomMember> assistants = roomMemberDao.findByRidAndRole(roomId, RoleEnum.RoleAssistant.getValue());
  412. if (assistants.isEmpty()) {
  413. throw new ApiException(ErrorEnum.ERR_ASSISTANT_NOT_EXIST_IN_ROOM);
  414. } else {
  415. display += "?userId=" + assistants.get(0).getUid() + "?uri=";
  416. roomDao.updateDisplayByRid(roomId, display);
  417. DisplayMessage displayMessage = new DisplayMessage(display);
  418. imHelper.publishMessage(userId, roomId, displayMessage);
  419. log.info("change display to assistant: roomId={}, display={}", roomId, display);
  420. }
  421. } else if (displayEnum.equals(DisplayEnum.Screen)) {
  422. display += "?userId=" + userId + "?uri=";
  423. roomDao.updateDisplayByRid(roomId, display);
  424. DisplayMessage displayMessage = new DisplayMessage(display);
  425. imHelper.publishMessage(userId, roomId, displayMessage);
  426. log.info("change display to screen: roomId={}, display={}", roomId, display);
  427. } else {
  428. display += "?userId=" + "?uri=" + uri;
  429. CheckUtils.checkArgument(uri != null, "uri must't be null");
  430. CheckUtils.checkArgument(whiteboardDao.findByRidAndWbid(roomId, uri).size() > 0, "whiteboard not exist");
  431. roomDao.updateDisplayByRid(roomId, display);
  432. DisplayMessage displayMessage = new DisplayMessage(display);
  433. imHelper.publishMessage(userId, roomId, displayMessage);
  434. }
  435. log.info("result display in room: {}, type = {}, uri = {}", roomId, type, uri);
  436. return true;
  437. }
  438. @Override
  439. public String createWhiteBoard(String roomId) throws ApiException, Exception {
  440. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  441. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  442. String token = SecurityUtils.getAuthenticationValue();
  443. SysUser authUser = sysUserFeignService.queryUserInfo();
  444. String userId = authUser.getId().toString();
  445. CheckUtils.checkArgument(roomMemberDao.existsByRidAndUid(roomId, userId), "room member not exist");
  446. log.info("createWhiteBoard: roomId = {}", roomId);
  447. String wbRoom = IdentifierUtils.uuid();
  448. WhiteBoardApiResultInfo resultInfo = whiteBoardHelper.create(wbRoom);
  449. if (resultInfo.isSuccess()) {
  450. String wbId = resultInfo.getData();
  451. Date date = DateTimeUtils.currentUTC();
  452. List<Room> roomList = roomDao.findByRid(roomId);
  453. int whiteboardNameIndex = roomList.get(0).getWhiteboardNameIndex() + 1;
  454. String name = "白板" + whiteboardNameIndex;
  455. roomDao.updateWhiteboardNameIndexByRid(roomId, whiteboardNameIndex);
  456. Whiteboard wb = new Whiteboard();
  457. wb.setRid(roomId);
  458. wb.setWbRoom(wbRoom);
  459. wb.setWbid(wbId);
  460. wb.setName(name);
  461. wb.setCreator(userId);
  462. wb.setCreateDt(date);
  463. wb.setCurPg(0);
  464. whiteboardDao.save(wb);
  465. WhiteboardMessage wbmsg = new WhiteboardMessage(WhiteboardMessage.Create);
  466. wbmsg.setWhiteboardId(wbId);
  467. wbmsg.setWhiteboardName(name);
  468. imHelper.publishMessage(userId, roomId, wbmsg);
  469. String display = "display://type=2?userId=" + userId + "?uri=" + wbId;
  470. roomDao.updateDisplayByRid(roomId, display);
  471. DisplayMessage displayMessage = new DisplayMessage(display);
  472. imHelper.publishMessage(userId, roomId, displayMessage, 1);
  473. return wbId;
  474. } else {
  475. throw new ApiException(ErrorEnum.ERR_CREATE_WHITE_BOARD, resultInfo.getMsg());
  476. }
  477. }
  478. @Override
  479. public Boolean deleteWhiteboard(String roomId, String whiteBoardId) throws ApiException, Exception {
  480. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  481. CheckUtils.checkArgument(whiteBoardId != null, "whiteBoardId must't be null");
  482. String token = SecurityUtils.getAuthenticationValue();
  483. SysUser authUser = sysUserFeignService.queryUserInfo();
  484. String userId = authUser.getId().toString();
  485. List<Whiteboard> whiteboardList = whiteboardDao.findByRidAndWbid(roomId, whiteBoardId);
  486. CheckUtils.checkArgument(whiteboardList.size() > 0, "whiteboard not exist");
  487. List<Room> roomList = roomDao.findByRid(roomId);
  488. CheckUtils.checkArgument(!roomList.isEmpty(), "room not exist");
  489. log.info("deleteWhiteboard: room={}, whiteBoardId={}", roomList.get(0), whiteBoardId);
  490. String display = roomList.get(0).getDisplay();
  491. if (display.contains("uri=" + whiteBoardId)) {
  492. int result = roomDao.updateDisplayByRid(roomId, "");
  493. log.info("clear room display, room: {}, result: {}", roomId, result);
  494. DisplayMessage displayMessage = new DisplayMessage("");
  495. imHelper.publishMessage(userId, roomId, displayMessage, 1);
  496. } else {
  497. log.info("no display to clean: room={}", roomList.get(0));
  498. }
  499. String wbRoom = whiteboardList.get(0).getWbRoom();
  500. WhiteBoardApiResultInfo resultInfo = whiteBoardHelper.destroy(wbRoom);
  501. if (resultInfo.isSuccess()) {
  502. int result = whiteboardDao.deleteByWbid(whiteBoardId);
  503. log.info("delete whiteboard: roomId = {}, whiteBoardId = {}, result = {}", roomId, whiteBoardId, result);
  504. WhiteboardMessage wbmsg = new WhiteboardMessage(WhiteboardMessage.Delete);
  505. wbmsg.setWhiteboardId(whiteBoardId);
  506. imHelper.publishMessage(userId, roomId, wbmsg, 1);
  507. return true;
  508. } else {
  509. throw new ApiException(ErrorEnum.ERR_DELETE_WHITE_BOARD, resultInfo.getMsg());
  510. }
  511. }
  512. @Override
  513. public List<RoomResult.WhiteboardResult> getWhiteboard(String roomId) throws ApiException, Exception {
  514. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  515. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  516. List<Whiteboard> whiteboards = whiteboardDao.findByRid(roomId);
  517. List<RoomResult.WhiteboardResult> result = new ArrayList<>();
  518. for (Whiteboard wb : whiteboards) {
  519. RoomResult.WhiteboardResult r = new RoomResult.WhiteboardResult();
  520. r.setName(wb.getName());
  521. r.setCurPg(wb.getCurPg());
  522. r.setWhiteboardId(wb.getWbid());
  523. result.add(r);
  524. }
  525. return result;
  526. }
  527. @Override
  528. public Boolean turnWhiteBoardPage(String roomId, String whiteBoardId, int page) throws ApiException, Exception {
  529. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  530. CheckUtils.checkArgument(whiteBoardId != null, "whiteBoardId must't be null");
  531. String token = SecurityUtils.getAuthenticationValue();
  532. SysUser authUser = sysUserFeignService.queryUserInfo();
  533. String userId = authUser.getId().toString();
  534. List<Room> roomList = roomDao.findByRid(roomId);
  535. CheckUtils.checkArgument(!roomList.isEmpty(), "room not exist");
  536. int result = whiteboardDao.updatePageByRidAndWbid(roomId, whiteBoardId, page);
  537. log.info("turn page to: {}, room: {}, wb : {}; r: {}", page, roomId, whiteBoardId, result);
  538. TurnPageMessage turnPageMessage = new TurnPageMessage(whiteBoardId, userId, page);
  539. imHelper.publishMessage(userId, roomId, turnPageMessage);
  540. return true;
  541. }
  542. @Override
  543. public Boolean controlDevice(String roomId, String userId, DeviceTypeEnum typeEnum, boolean enable) throws ApiException, Exception {
  544. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  545. CheckUtils.checkArgument(userId != null, "userId must't be null");
  546. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  547. CheckUtils.checkArgument(roomMemberDao.existsByRidAndUid(roomId, userId), "room member not exist");
  548. String token = SecurityUtils.getAuthenticationValue();
  549. SysUser authUser = sysUserFeignService.queryUserInfo();
  550. log.info("controlDevice: userId={}, typeEnum={}, onOff={}", userId, typeEnum, enable);
  551. if (enable) {
  552. String ticket = IdentifierUtils.uuid();
  553. ControlDeviceTaskInfo taskInfo = new ControlDeviceTaskInfo();
  554. taskInfo.setRoomId(roomId);
  555. taskInfo.setTypeEnum(typeEnum);
  556. taskInfo.setOnOff(true);
  557. taskInfo.setApplyUserId(userId);
  558. taskInfo.setTargetUserId(userId);
  559. taskInfo.setTicket(ticket);
  560. scheduleManager.addTask(taskInfo);
  561. ControlDeviceNotifyMessage msg = new ControlDeviceNotifyMessage(ActionEnum.Invite.ordinal());
  562. msg.setTicket(ticket);
  563. msg.setType(taskInfo.getTypeEnum().ordinal());
  564. msg.setOpUserId(userId);
  565. msg.setOpUserName(authUser.getUsername());
  566. imHelper.publishMessage(userId, userId, roomId, msg);
  567. } else {
  568. if (typeEnum.equals(DeviceTypeEnum.Camera)) {
  569. roomMemberDao.updateCameraByRidAndUid(roomId, userId, false);
  570. } else {
  571. roomMemberDao.updateMicByRidAndUid(roomId, userId, false);
  572. }
  573. DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(typeEnum.ordinal(), false);
  574. deviceResourceMessage.setUserId(userId);
  575. List<UserInfo> userInfoList = userDao.findByUid(userId);
  576. if (!userInfoList.isEmpty()) {
  577. deviceResourceMessage.setUserName(userInfoList.get(0).getName());
  578. }
  579. imHelper.publishMessage(userId, roomId, deviceResourceMessage, 1);
  580. }
  581. return true;
  582. }
  583. @Override
  584. public Boolean approveControlDevice(String roomId, String ticket) throws ApiException, Exception {
  585. CheckUtils.checkArgument(ticket != null, "ticket must't be null");
  586. String token = SecurityUtils.getAuthenticationValue();
  587. SysUser authUser = sysUserFeignService.queryUserInfo();
  588. String userId = authUser.getId().toString();
  589. log.info("approveControlDevice: ticket={}", ticket);
  590. ControlDeviceTaskInfo taskInfo = (ControlDeviceTaskInfo) scheduleManager.executeTask(ticket);
  591. if (taskInfo.getTypeEnum().equals(DeviceTypeEnum.Camera)) {
  592. roomMemberDao.updateCameraByRidAndUid(roomId, userId, taskInfo.isOnOff());
  593. } else {
  594. roomMemberDao.updateMicByRidAndUid(roomId, userId, taskInfo.isOnOff());
  595. }
  596. ControlDeviceNotifyMessage msg = new ControlDeviceNotifyMessage(ActionEnum.Approve.ordinal());
  597. msg.setType(taskInfo.getTypeEnum().ordinal());
  598. msg.setOpUserId(userId);
  599. msg.setOpUserName(authUser.getUsername());
  600. imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  601. DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(taskInfo.getTypeEnum().ordinal(), taskInfo.isOnOff());
  602. deviceResourceMessage.setUserId(userId);
  603. imHelper.publishMessage(userId, roomId, deviceResourceMessage, 1);
  604. return true;
  605. }
  606. @Override
  607. public Boolean rejectControlDevice(String roomId, String ticket) throws ApiException, Exception {
  608. CheckUtils.checkArgument(ticket != null, "ticket must't be null");
  609. String token = SecurityUtils.getAuthenticationValue();
  610. SysUser authUser = sysUserFeignService.queryUserInfo();
  611. String userId = authUser.getId().toString();
  612. log.info("rejectControlDevice: ticket={}", ticket);
  613. ControlDeviceTaskInfo taskInfo = (ControlDeviceTaskInfo) scheduleManager.executeTask(ticket);
  614. ControlDeviceNotifyMessage msg = new ControlDeviceNotifyMessage(ActionEnum.Reject.ordinal());
  615. msg.setType(taskInfo.getTypeEnum().ordinal());
  616. msg.setOpUserId(userId);
  617. msg.setOpUserName(authUser.getUsername());
  618. imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  619. return true;
  620. }
  621. @Override
  622. public Boolean syncDeviceState(String roomId, DeviceTypeEnum type, boolean enable) throws ApiException, Exception {
  623. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  624. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  625. String token = SecurityUtils.getAuthenticationValue();
  626. SysUser authUser = sysUserFeignService.queryUserInfo();
  627. String userId = authUser.getId().toString();
  628. int result;
  629. DeviceStateChangedMessage deviceResourceMessage;
  630. if (type.equals(DeviceTypeEnum.Camera)) {
  631. result = roomMemberDao.updateCameraByRidAndUid(roomId, userId, enable);
  632. deviceResourceMessage = new DeviceStateChangedMessage(type.ordinal(), enable);
  633. } else {
  634. result = roomMemberDao.updateMicByRidAndUid(roomId, userId, enable);
  635. deviceResourceMessage = new DeviceStateChangedMessage(type.ordinal(), enable);
  636. }
  637. deviceResourceMessage.setUserId(userId);
  638. imHelper.publishMessage(userId, roomId, deviceResourceMessage, 1);
  639. log.info("syncDeviceState : {}, {}, result = {}", roomId, enable, result);
  640. return true;
  641. }
  642. @Override
  643. public List<RoomResult.MemberResult> getMembers(String roomId) throws ApiException, Exception {
  644. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  645. List<RoomMember> roomMemberList = roomMemberDao.findByRid(roomId);
  646. RoomResult roomResult = new RoomResult();
  647. roomResult.setMembers(roomMemberList);
  648. return roomResult.getMembers();
  649. }
  650. @Override
  651. public Boolean applySpeech(String roomId) throws ApiException, Exception {
  652. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  653. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  654. String token = SecurityUtils.getAuthenticationValue();
  655. SysUser authUser = sysUserFeignService.queryUserInfo();
  656. String userId = authUser.getId().toString();
  657. List<RoomMember> assistants = roomMemberDao.findByRidAndRole(roomId, RoleEnum.RoleAssistant.getValue());
  658. if (assistants.isEmpty()) {
  659. throw new ApiException(ErrorEnum.ERR_ASSISTANT_NOT_EXIST_IN_ROOM);
  660. }
  661. String ticket = IdentifierUtils.uuid();
  662. ScheduledTaskInfo scheduledTaskInfo = new ScheduledTaskInfo();
  663. scheduledTaskInfo.setTicket(ticket);
  664. scheduledTaskInfo.setRoomId(roomId);
  665. scheduledTaskInfo.setApplyUserId(userId);
  666. scheduledTaskInfo.setTargetUserId(assistants.get(0).getUid());
  667. scheduleManager.addTask(scheduledTaskInfo);
  668. log.info("applySpeech: task = {}", scheduledTaskInfo);
  669. ApplyForSpeechMessage msg = new ApplyForSpeechMessage();
  670. msg.setTicket(ticket);
  671. msg.setReqUserId(userId);
  672. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, assistants.get(0).getUid(), roomId, msg);
  673. log.info("apply for speech: {}, task = {}", roomId, scheduledTaskInfo);
  674. if (resultInfo.isSuccess()) {
  675. return true;
  676. } else {
  677. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  678. }
  679. }
  680. @Override
  681. public Boolean approveSpeech(String roomId, String ticket) throws ApiException, Exception {
  682. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  683. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  684. String token = SecurityUtils.getAuthenticationValue();
  685. SysUser authUser = sysUserFeignService.queryUserInfo();
  686. String userId = authUser.getId().toString();
  687. int count = roomMemberDao.countByRidAndExcludeRole(roomId, RoleEnum.RoleAudience.getValue());
  688. if (count == roomProperties.getMaxCount()) {
  689. log.error("approveSpeech error: roomId = {}, ticket={}", roomId, ticket);
  690. throw new ApiException(ErrorEnum.ERR_OVER_MAX_COUNT);
  691. }
  692. ScheduledTaskInfo taskInfo = scheduleManager.executeTask(ticket);
  693. log.info("approveSpeech: task = {}", taskInfo);
  694. roomMemberDao.updateRoleByRidAndUid(roomId, taskInfo.getApplyUserId(), RoleEnum.RoleStudent.getValue());
  695. SpeechResultMessage msg = new SpeechResultMessage(SpeechResultMessage.Action_Approve);
  696. List<UserInfo> userInfoList = userDao.findByUid(taskInfo.getApplyUserId());
  697. msg.setOpUserId(userId);
  698. msg.setOpUserName(authUser.getUsername());
  699. msg.setReqUserId(taskInfo.getApplyUserId());
  700. if (!userInfoList.isEmpty()) {
  701. msg.setReqUserName(userInfoList.get(0).getName());
  702. }
  703. msg.setRole(RoleEnum.RoleStudent.getValue());
  704. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  705. if (!resultInfo.isSuccess()) {
  706. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  707. }
  708. RoleChangedMessage rcMsg = new RoleChangedMessage(userId);
  709. List<RoleChangedMessage.ChangedUser> changedUserList = new ArrayList<>();
  710. RoleChangedMessage.ChangedUser user = new RoleChangedMessage.ChangedUser(taskInfo.getApplyUserId(), RoleEnum.RoleStudent.getValue());
  711. if (!userInfoList.isEmpty()) {
  712. user.setUserName(userInfoList.get(0).getName());
  713. }
  714. changedUserList.add(user);
  715. rcMsg.setUsers(changedUserList);
  716. imHelper.publishMessage(userId, roomId, rcMsg, 1);
  717. return true;
  718. }
  719. @Override
  720. public Boolean rejectSpeech(String roomId, String ticket) throws ApiException, Exception {
  721. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  722. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  723. String token = SecurityUtils.getAuthenticationValue();
  724. SysUser authUser = sysUserFeignService.queryUserInfo();
  725. String userId = authUser.getId().toString();
  726. ScheduledTaskInfo taskInfo = scheduleManager.executeTask(ticket);
  727. log.info("rejectSpeech: task = {}", taskInfo);
  728. SpeechResultMessage msg = new SpeechResultMessage(SpeechResultMessage.Action_Reject);
  729. msg.setOpUserId(userId);
  730. msg.setOpUserName(authUser.getUsername());
  731. msg.setRole(RoleEnum.RoleStudent.getValue());
  732. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  733. if (resultInfo.isSuccess()) {
  734. return true;
  735. } else {
  736. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  737. }
  738. }
  739. private void checkOverMax(String roomId, RoomMember targetUser, int targetRole) {
  740. if (RoleEnum.getEnumByValue(targetUser.getRole()).equals(RoleEnum.RoleAudience)) {
  741. int count = roomMemberDao.countByRidAndExcludeRole(roomId, RoleEnum.RoleAudience.getValue());
  742. if (count == roomProperties.getMaxCount()) {
  743. log.error("assign error: roomId = {}, userId = {}, role = {}", roomId, targetUser.getRid(), targetUser.getRole());
  744. throw new ApiException(ErrorEnum.ERR_OVER_MAX_COUNT);
  745. }
  746. } else if (targetRole > targetUser.getRole()) {
  747. throw new ApiException(ErrorEnum.ERR_DOWNGRADE_ROLE);
  748. }
  749. }
  750. @Override
  751. public Boolean transfer(String roomId, String userId) throws ApiException, Exception {
  752. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  753. CheckUtils.checkArgument(userId != null, "userId must't be null");
  754. CheckUtils.checkArgument(!userId.equals(userId), "can't set self role");
  755. log.info("transfer: roomId = {}, userId = {}", roomId, userId);
  756. List<RoomMember> roomMemberList = roomMemberDao.findByRidAndUid(roomId, userId);
  757. if (roomMemberList.size() == 0) {
  758. log.error("assistant transfer error: {} toUser = {}, opUser={}", roomId, userId, userId);
  759. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  760. }
  761. List<Room> roomList = roomDao.findByRid(roomId);
  762. if (roomList.size() == 0) {
  763. log.error("assistant transfer error: {} toUser = {}, opUser={}", roomId, userId, userId);
  764. throw new ApiException(ErrorEnum.ERR_ROOM_NOT_EXIST);
  765. }
  766. if (isUserDisplay(roomList.get(0), userId) || isUserDisplay(roomList.get(0), userId)) {
  767. updateDisplay(roomId, userId, "", 1);
  768. } else {
  769. log.info("don't update display: room={}", roomList.get(0));
  770. }
  771. roomMemberDao.updateRoleByRidAndUid(roomId, userId, RoleEnum.RoleStudent.getValue());
  772. roomMemberDao.updateRoleByRidAndUid(roomId, userId, RoleEnum.RoleAssistant.getValue());
  773. AssistantTransferMessage msg = new AssistantTransferMessage();
  774. msg.setOpUserId(userId);
  775. msg.setToUserId(userId);
  776. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, roomId, msg, 1);
  777. if (resultInfo.isSuccess()) {
  778. return true;
  779. } else {
  780. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  781. }
  782. }
  783. @Override
  784. public Boolean inviteUpgradeRole(String roomId, String targetUserId, int targetRole) throws ApiException, Exception {
  785. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  786. CheckUtils.checkArgument(targetUserId != null, "userId must't be null");
  787. CheckUtils.checkArgument(roomMemberDao.existsByRidAndUid(roomId, targetUserId), "room member not exist");
  788. String token = SecurityUtils.getAuthenticationValue();
  789. SysUser authUser = sysUserFeignService.queryUserInfo();
  790. String userId = authUser.getId().toString();
  791. log.info("inviteUpgradeRole roomId = {}, targetUserId = {}, targetRole = {}", roomId, targetUserId, targetRole);
  792. List<RoomMember> targetUser = roomMemberDao.findByRidAndUid(roomId, targetUserId);
  793. if (targetUser.isEmpty()) {
  794. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  795. }
  796. checkOverMax(roomId, targetUser.get(0), targetRole);
  797. String ticket = IdentifierUtils.uuid();
  798. UpgradeRoleTaskInfo taskInfo = new UpgradeRoleTaskInfo();
  799. taskInfo.setTicket(ticket);
  800. taskInfo.setRoomId(roomId);
  801. taskInfo.setApplyUserId(userId);
  802. taskInfo.setTargetUserId(targetUserId);
  803. taskInfo.setRole(RoleEnum.getEnumByValue(targetRole));
  804. scheduleManager.addTask(taskInfo);
  805. UpgradeRoleMessage msg = new UpgradeRoleMessage(ActionEnum.Invite.ordinal());
  806. msg.setTicket(ticket);
  807. msg.setOpUserId(userId);
  808. msg.setOpUserName(authUser.getUsername());
  809. msg.setRole(targetRole);
  810. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, targetUserId, roomId, msg);
  811. if (resultInfo.isSuccess()) {
  812. return true;
  813. } else {
  814. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  815. }
  816. }
  817. @Override
  818. public Boolean approveUpgradeRole(String roomId, String ticket) throws ApiException, Exception {
  819. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  820. CheckUtils.checkArgument(ticket != null, "ticket must't be null");
  821. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  822. String token = SecurityUtils.getAuthenticationValue();
  823. SysUser authUser = sysUserFeignService.queryUserInfo();
  824. String userId = authUser.getId().toString();
  825. UpgradeRoleTaskInfo taskInfo = (UpgradeRoleTaskInfo) scheduleManager.executeTask(ticket);
  826. log.info("approveUpgradeRole roomId = {}, task={}", roomId, taskInfo);
  827. List<RoomMember> targetUser = roomMemberDao.findByRidAndUid(roomId, userId);
  828. if (targetUser.isEmpty()) {
  829. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  830. }
  831. if (!taskInfo.getTargetUserId().equals(userId)) {
  832. throw new ApiException(ErrorEnum.ERR_APPLY_TICKET_INVALID);
  833. }
  834. checkOverMax(roomId, targetUser.get(0), taskInfo.getRole().getValue());
  835. roomMemberDao.updateRoleByRidAndUid(roomId, userId, taskInfo.getRole().getValue());
  836. UpgradeRoleMessage msg = new UpgradeRoleMessage(ActionEnum.Approve.ordinal());
  837. msg.setOpUserName(authUser.getUsername());
  838. msg.setOpUserId(userId);
  839. msg.setRole(taskInfo.getRole().getValue());
  840. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  841. if (!resultInfo.isSuccess()) {
  842. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  843. }
  844. RoleChangedMessage rcMsg = new RoleChangedMessage(userId);
  845. List<RoleChangedMessage.ChangedUser> changedUserList = new ArrayList<>();
  846. RoleChangedMessage.ChangedUser user = new RoleChangedMessage.ChangedUser(userId, taskInfo.getRole().getValue());
  847. user.setUserName(authUser.getUsername());
  848. changedUserList.add(user);
  849. rcMsg.setUsers(changedUserList);
  850. imHelper.publishMessage(userId, roomId, rcMsg, 1);
  851. return true;
  852. }
  853. @Override
  854. public Boolean rejectUpgradeRole(String roomId, String ticket) throws ApiException, Exception {
  855. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  856. CheckUtils.checkArgument(ticket != null, "ticket must't be null");
  857. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  858. String token = SecurityUtils.getAuthenticationValue();
  859. SysUser authUser = sysUserFeignService.queryUserInfo();
  860. String userId = authUser.getId().toString();
  861. UpgradeRoleTaskInfo taskInfo = (UpgradeRoleTaskInfo) scheduleManager.executeTask(ticket);
  862. UpgradeRoleMessage msg = new UpgradeRoleMessage(ActionEnum.Reject.ordinal());
  863. msg.setOpUserName(authUser.getUsername());
  864. msg.setOpUserId(userId);
  865. msg.setRole(taskInfo.getRole().getValue());
  866. IMApiResultInfo resultInfo = imHelper.publishMessage(userId, taskInfo.getApplyUserId(), roomId, msg);
  867. if (resultInfo.isSuccess()) {
  868. return true;
  869. } else {
  870. throw new ApiException(ErrorEnum.ERR_MESSAGE_ERROR, resultInfo.getErrorMessage());
  871. }
  872. }
  873. @Override
  874. public Boolean changeRole(String roomId, String targetUserId, int targetRole) throws ApiException, Exception {
  875. CheckUtils.checkArgument(roomId != null, "roomId must't be null");
  876. CheckUtils.checkArgument(targetUserId != null, "userId must't be null");
  877. CheckUtils.checkArgument(roomDao.existsByRid(roomId), "room not exist");
  878. CheckUtils.checkArgument(RoleEnum.getEnumByValue(targetRole).equals(RoleEnum.RoleTeacher), "only set to teacher");
  879. CheckUtils.checkArgument(roomMemberDao.existsByRidAndUid(roomId, targetUserId), "room member not exist");
  880. String token = SecurityUtils.getAuthenticationValue();
  881. SysUser authUser = sysUserFeignService.queryUserInfo();
  882. String userId = authUser.getId().toString();
  883. List<RoomMember> targetUser = roomMemberDao.findByRidAndUid(roomId, targetUserId);
  884. if (targetUser.isEmpty()) {
  885. throw new ApiException(ErrorEnum.ERR_USER_NOT_EXIST_IN_ROOM);
  886. } else {
  887. if (!RoleEnum.getEnumByValue(targetUser.get(0).getRole()).equals(RoleEnum.RoleStudent)) {
  888. log.error("change role error: targetUserId={}, targetRole = {}", targetUser, RoleEnum.getEnumByValue(targetRole));
  889. throw new ApiException(ErrorEnum.ERR_CHANGE_ROLE);
  890. }
  891. }
  892. log.info("changeRole: roomId={}, targetUserId={}", roomId, targetUserId);
  893. List<RoleChangedMessage.ChangedUser> changedUserList = new ArrayList<>();
  894. RoleChangedMessage msg = new RoleChangedMessage(userId);
  895. List<RoomMember> teachers = roomMemberDao.findByRidAndRole(roomId, RoleEnum.RoleTeacher.getValue());
  896. if (!teachers.isEmpty()) {
  897. roomMemberDao.updateRoleByRidAndUid(roomId, teachers.get(0).getUid(), RoleEnum.RoleStudent.getValue());
  898. RoleChangedMessage.ChangedUser user = new RoleChangedMessage.ChangedUser(teachers.get(0).getUid(), RoleEnum.RoleStudent.getValue());
  899. List<UserInfo> userInfoList = userDao.findByUid(teachers.get(0).getUid());
  900. if (!userInfoList.isEmpty()) {
  901. user.setUserName(userInfoList.get(0).getName());
  902. }
  903. changedUserList.add(user);
  904. } else {
  905. log.info("change directly cause no teacher exist in room, roomId={}", roomId);
  906. }
  907. roomMemberDao.updateRoleByRidAndUid(roomId, targetUserId, targetRole);
  908. RoleChangedMessage.ChangedUser user = new RoleChangedMessage.ChangedUser(targetUserId, targetRole);
  909. List<UserInfo> userInfoList = userDao.findByUid(targetUserId);
  910. if (!userInfoList.isEmpty()) {
  911. user.setUserName(userInfoList.get(0).getName());
  912. }
  913. changedUserList.add(user);
  914. msg.setUsers(changedUserList);
  915. imHelper.publishMessage(userId, roomId, msg, 1);
  916. String display = "display://type=1?userId=" + targetUserId + "?uri=";
  917. DisplayMessage displayMessage = new DisplayMessage(display);
  918. roomDao.updateDisplayByRid(roomId, display);
  919. imHelper.publishMessage(userId, roomId, displayMessage, 1);
  920. log.info("changeRole, display changed: roomId={}, {}, targetUserId={}", roomId, display, targetUserId);
  921. return true;
  922. }
  923. @Override
  924. public Boolean memberOnlineStatus(List<ReqMemberOnlineStatus> statusList, String nonce, String timestamp, String signature) throws ApiException, Exception {
  925. String sign = imProperties.getSecret() + nonce + timestamp;
  926. String signSHA1 = CodeUtil.hexSHA1(sign);
  927. if (!signSHA1.equals(signature)) {
  928. log.info("memberOnlineStatus signature error");
  929. return true;
  930. }
  931. for (ReqMemberOnlineStatus status : statusList) {
  932. int s = Integer.parseInt(status.getStatus());
  933. String userId = status.getUserId();
  934. log.info("memberOnlineStatus, userId={}, status={}", userId, status);
  935. //1:offline 离线; 0: online 在线
  936. if (s == 1) {
  937. List<RoomMember> members = roomMemberDao.findByUid(userId);
  938. if (!members.isEmpty()) {
  939. scheduleManager.userIMOffline(userId);
  940. }
  941. } else if (s == 0) {
  942. scheduleManager.userIMOnline(userId);
  943. }
  944. }
  945. return true;
  946. }
  947. @Override
  948. public void userIMOfflineKick(String userId) {
  949. List<RoomMember> members = roomMemberDao.findByUid(userId);
  950. for (RoomMember member : members) {
  951. int userRole = member.getRole();
  952. log.info("userIMOfflineKick: roomId={}, {}, role={}", member.getRid(), userId, RoleEnum.getEnumByValue(userRole));
  953. try {
  954. if (userRole == RoleEnum.RoleTeacher.getValue() || userRole == RoleEnum.RoleAssistant.getValue()) {
  955. List<Room> rooms = roomDao.findByRid(member.getRid());
  956. if (rooms.isEmpty()) {
  957. break;
  958. }
  959. if (isUserDisplay(rooms.get(0), member.getUid())) {
  960. updateDisplay(member.getRid(), member.getUid(), "", 0);
  961. log.info("memberOnlineStatus offline: roomId={}, {}", member.getRid(), member.getUid());
  962. }
  963. }
  964. if (roomMemberDao.countByRid(member.getRid()) == 1) {
  965. IMApiResultInfo apiResultInfo = null;
  966. apiResultInfo = imHelper.dismiss(member.getUid(), member.getRid());
  967. if (apiResultInfo.getCode() == 200) {
  968. roomMemberDao.deleteUserByRidAndUid(member.getRid(), member.getUid());
  969. roomDao.deleteByRid(member.getRid());
  970. deleteWhiteboardByUser(member.getRid(), member.getUid());
  971. log.info("dismiss the room: {}", member.getRid());
  972. } else {
  973. log.error("{} exit {} room error: {}", member.getUid(), member.getRid(), apiResultInfo.getErrorMessage());
  974. }
  975. } else {
  976. IMApiResultInfo apiResultInfo = null;
  977. apiResultInfo = imHelper.quit(new String[]{member.getUid()}, member.getRid());
  978. if (apiResultInfo.isSuccess()) {
  979. roomMemberDao.deleteUserByRidAndUid(member.getRid(), member.getUid());
  980. MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Leave, member.getUid(), userRole);
  981. msg.setUserName(member.getName());
  982. imHelper.publishMessage(member.getUid(), member.getRid(), msg);
  983. imHelper.quit(new String[]{member.getUid()}, member.getRid());
  984. log.info("quit group: roomId={}, {}", member.getRid(), member.getUid());
  985. } else {
  986. log.error("{} exit {} room error: {}", member.getUid(), member.getRid(), apiResultInfo.getErrorMessage());
  987. }
  988. }
  989. userDao.deleteByUid(member.getUid());
  990. } catch (Exception e) {
  991. log.error("userIMOfflineKick error: userId={}", userId);
  992. }
  993. }
  994. }
  995. private void updateDisplay(String roomId, String senderId, String display, Integer isIncludeSender) throws ApiException, Exception {
  996. roomDao.updateDisplayByRid(roomId, display);
  997. DisplayMessage displayMessage = new DisplayMessage(display);
  998. imHelper.publishMessage(senderId, roomId, displayMessage, isIncludeSender);
  999. }
  1000. private boolean isTeacherDisplay(Room room, String userId) {
  1001. return !room.getDisplay().isEmpty() && room.getDisplay().contains("userId=" + userId);
  1002. }
  1003. private boolean isTeacherDisplayWhiteboard(Room room, String userId) {
  1004. return !room.getDisplay().isEmpty() && room.getDisplay().contains("userId=" + userId) && room.getDisplay().contains("type=2");
  1005. }
  1006. private boolean isAssistantDisplay(Room room, String userId) {
  1007. return !room.getDisplay().isEmpty() && room.getDisplay().contains("userId=" + userId);
  1008. }
  1009. private boolean isUserDisplay(Room room, String userId) {
  1010. boolean result = false;
  1011. if (!room.getDisplay().isEmpty() && room.getDisplay().contains("userId=" + userId)) {
  1012. if (room.getDisplay().contains("type=0") || room.getDisplay().contains("type=1") || room.getDisplay().contains("type=3")) {
  1013. result = true;
  1014. }
  1015. }
  1016. return result;
  1017. }
  1018. }