RoomServiceImpl.java 55 KB

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