Classroom.m 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. //
  2. // Classroom.m
  3. // SealClass
  4. //
  5. // Created by LiFei on 2019/2/28.
  6. // Copyright © 2019 RongCloud. All rights reserved.
  7. //
  8. #import "Classroom.h"
  9. #import "RTCService.h"
  10. @interface Classroom ()
  11. @property (nonatomic, copy) NSString *currentMemberId;
  12. @property (nonatomic, assign) long long joinTime;
  13. @property (nonatomic, assign) NSInteger surplusTime;
  14. @end
  15. @implementation Classroom
  16. + (instancetype)classroomFromJson:(NSDictionary *)dic {
  17. Classroom *room = [[Classroom alloc] init];
  18. room.roomId = dic[@"roomId"];
  19. room.imToken = dic[@"imToken"];
  20. room.surplusTime = [dic[@"surplusTime"] integerValue];
  21. NSString *display = dic[@"display"];
  22. [room updateDisplayUri:display];
  23. NSArray *memberArray = dic[@"roomMemberList"];
  24. NSMutableArray *memberList = [[NSMutableArray alloc] init];
  25. for (NSDictionary *memberDic in memberArray) {
  26. NSMutableDictionary *memDic = [NSMutableDictionary dictionaryWithDictionary:memberDic];
  27. [memberDic setValue:[dic dictionaryValueForKey:@"midiJson"] forKey:@"playMidiJson"];
  28. RoomMember *member = [RoomMember memberFromJson:memDic];
  29. [memberList addObject:member];
  30. }
  31. room.memberList = memberList;
  32. NSDictionary *userDic = [dic dictionaryValueForKey:@"roomMember"];
  33. RoomMember *currentMember = [RoomMember memberFromJson:userDic];
  34. room.currentMemberId = currentMember.userId;
  35. room.joinTime = currentMember.joinTime;
  36. room.autoCloseFlag = YES;
  37. room.autoCloseNetworkRoomTime = [dic[@"autoCloseNetworkRoomTime"] integerValue];
  38. room.soundVolume = [dic[@"soundVolume"] integerValue];
  39. return room;
  40. }
  41. - (BOOL)addMemeber:(RoomMember *)member {
  42. BOOL canAdd = [self indexInDataSource:member] < 0 ? YES:NO;
  43. if(canAdd) {
  44. NSMutableArray *tmp = [self.memberList mutableCopy];
  45. [tmp addObject:member];
  46. self.memberList = [tmp copy];
  47. }
  48. return YES;
  49. }
  50. - (BOOL)removeMemeber:(RoomMember *)member {
  51. int index = [self indexInDataSource:member];
  52. BOOL canRemove = index >= 0 ? YES:NO ;
  53. if(canRemove) {
  54. NSMutableArray *tmp = [self.memberList mutableCopy];
  55. [tmp removeObjectAtIndex:index];
  56. self.memberList = [tmp copy];
  57. }
  58. return canRemove;
  59. }
  60. - (void)updateMemeber:(NSString *)userId forRole:(Role )role {
  61. RoomMember *memeber = [self getMember:userId];
  62. memeber.role = role;
  63. [self updateMemeber:memeber];
  64. }
  65. - (void)updateMember:(NSString *)userId forCamera:(BOOL)enable {
  66. RoomMember *member = [self getMember:userId];
  67. member.cameraEnable = enable;
  68. [self updateMemeber:member];
  69. }
  70. - (void)updateMember:(NSString *)userId forMicrophone:(BOOL)enable {
  71. RoomMember *member = [self getMember:userId];
  72. member.microphoneEnable = enable;
  73. [self updateMemeber:member];
  74. }
  75. - (void)updateMember:(NSString *)userId forMusicMode:(BOOL)enable {
  76. RoomMember *member = [self getMember:userId];
  77. member.musicModeOn = enable;
  78. [self updateMemeber:member];
  79. }
  80. - (void)updateMember:(NSString *)userId forHandsUp:(BOOL)enable {
  81. if ([userId isEqualToString:self.currentDisplayURI]) {
  82. return;
  83. }
  84. RoomMember *member = [self getMember:userId];
  85. member.handUpOn = enable;
  86. [self updateMemeber:member];
  87. }
  88. - (void)updateMember:(NSString *)userId forExamSong:(BOOL)enable {
  89. RoomMember *member = [self getMember:userId];
  90. // member.examSongEnable = enable;
  91. [self updateMemeber:member];
  92. }
  93. - (void)updateMember:(NSString *)userId forMusicScore:(BOOL)enable songId:(int)songId {
  94. RoomMember *member = [self getMember:userId];
  95. member.musicScoreAccompanimentId = songId;
  96. member.playStatus = enable;
  97. member.accompanimentPlayStatus = NO;
  98. // 获取成员当前曲目
  99. for (ClassSongMessage *songMessage in member.songMessage) {
  100. if (songMessage.musicScoreAccompanimentId == songId) {
  101. member.url = songMessage.url;
  102. member.mp3Url = songMessage.mp3Url;
  103. break;
  104. }
  105. }
  106. [self updateMemeber:member];
  107. }
  108. - (void)updateMember:(NSString *)userId forAccompany:(BOOL)enable songId:(int)songId {
  109. RoomMember *member = [self getMember:userId];
  110. member.accompanimentPlayStatus = enable;
  111. member.playStatus = NO;
  112. member.musicScoreAccompanimentId = songId;
  113. // 获取成员当前曲目
  114. for (ClassSongMessage *songMessage in member.songMessage) {
  115. if (songMessage.musicScoreAccompanimentId == songId) {
  116. member.url = songMessage.url;
  117. member.mp3Url = songMessage.mp3Url;
  118. break;
  119. }
  120. }
  121. [self updateMemeber:member];
  122. }
  123. - (void)updateMemberAccompamy:(NSString *)userId songMessage:(ClassSongMessage *)songMessage {
  124. RoomMember *member = [self getMember:userId];
  125. BOOL hasRecordSong = NO;
  126. for (ClassSongMessage *recordSongMessage in member.songMessage) {
  127. if (songMessage.musicScoreAccompanimentId == recordSongMessage.musicScoreAccompanimentId) {
  128. hasRecordSong = YES;
  129. break;
  130. }
  131. }
  132. if (hasRecordSong == NO) {
  133. [member.songMessage addObject:songMessage];
  134. }
  135. [self updateMemeber:member];
  136. }
  137. - (void)updateMemeber:(RoomMember *)member {
  138. int index = [self indexInDataSource:member];
  139. if(index >= 0) {
  140. NSMutableArray *tmp = [self.memberList mutableCopy];
  141. [tmp replaceObjectAtIndex:index withObject:member];
  142. self.memberList = [tmp copy];
  143. }
  144. }
  145. - (RoomMember *)getMember:(NSString *)userId {
  146. for(RoomMember *mem in self.memberList) {
  147. if([mem.userId isEqualToString:userId]) {
  148. return mem;
  149. }
  150. }
  151. return nil;
  152. }
  153. - (void)updateDisplayUri:(NSString *)display {
  154. if(display.length == 0){
  155. self.currentDisplayType = DisplayNone;
  156. self.currentDisplayURI = @"";
  157. return;
  158. }
  159. NSRange typeRange = [display rangeOfString:@"display://type="];
  160. NSRange userIdRange = [display rangeOfString:@"?userId="];
  161. NSRange uriRange = [display rangeOfString:@"?uri="];
  162. DisplayType type = (DisplayType)[[display substringWithRange:NSMakeRange(NSMaxRange(typeRange), 1)] intValue];
  163. NSString *userId = nil;
  164. NSInteger location = uriRange.location;
  165. if(display.length < location) {
  166. location = display.length;
  167. }
  168. if(userIdRange.location != NSNotFound) {
  169. userId = [display substringWithRange:NSMakeRange(NSMaxRange(userIdRange), location-NSMaxRange(userIdRange))];
  170. }
  171. NSString *uri = nil;
  172. if(uriRange.location != NSNotFound) {
  173. uri =[display substringWithRange:NSMakeRange(NSMaxRange(uriRange), display.length-NSMaxRange(uriRange))];
  174. }
  175. self.currentDisplayType = type;
  176. if(type == DisplayTeacher || type == DisplaySharedScreen || type == DisplayTypeStudent) {
  177. self.currentDisplayURI = userId;
  178. }
  179. else if (type == DisplayWhiteboard) {
  180. self.currentDisplayURI = uri;
  181. }
  182. }
  183. - (int)indexInDataSource:(RoomMember *)member {
  184. int index = -1;
  185. for(int i=0;i<self.memberList.count;i++) {
  186. RoomMember *mem = self.memberList[i];
  187. if([mem.userId isEqualToString:member.userId]) {
  188. index = i;
  189. break;
  190. }
  191. }
  192. return index;
  193. }
  194. - (RoomMember *)teacher {
  195. for(RoomMember *mem in self.memberList) {
  196. if(mem.role == RoleTeacher) {
  197. return mem;
  198. }
  199. }
  200. return nil;
  201. }
  202. - (RoomMember *)assistant {
  203. for(RoomMember *mem in self.memberList) {
  204. if(mem.role == RoleTeacher) {
  205. return mem;
  206. }
  207. }
  208. return nil;
  209. }
  210. - (RoomMember *)currentMember {
  211. return [self getMember:self.currentMemberId];
  212. }
  213. - (int)getMemberCountWithoutAudience {
  214. int count = 0;
  215. for (RoomMember *mem in self.memberList) {
  216. if (mem.role != RoleAudience) {
  217. count ++;
  218. }
  219. }
  220. return count;
  221. }
  222. - (NSString *)description
  223. {
  224. return [NSString stringWithFormat:@"Classroom:%@ displayType:%@ displayUri:%@ memeberList:%@", self.roomId,@(self.currentDisplayType),self.currentDisplayURI,self.memberList];
  225. }
  226. @end