Classroom.m 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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 = [dic[@"autoCloseFlag"] boolValue];
  37. room.autoCloseFlag = YES;
  38. room.autoCloseNetworkRoomTime = [dic[@"autoCloseNetworkRoomTime"] integerValue];
  39. room.soundVolume = [dic[@"soundVolume"] integerValue];
  40. return room;
  41. }
  42. - (BOOL)addMemeber:(RoomMember *)member {
  43. BOOL canAdd = [self indexInDataSource:member] < 0 ? YES:NO;
  44. if(canAdd) {
  45. NSMutableArray *tmp = [self.memberList mutableCopy];
  46. [tmp addObject:member];
  47. self.memberList = [tmp copy];
  48. }
  49. return YES;
  50. }
  51. - (BOOL)removeMemeber:(RoomMember *)member {
  52. int index = [self indexInDataSource:member];
  53. BOOL canRemove = index >= 0 ? YES:NO ;
  54. if(canRemove) {
  55. NSMutableArray *tmp = [self.memberList mutableCopy];
  56. [tmp removeObjectAtIndex:index];
  57. self.memberList = [tmp copy];
  58. }
  59. return canRemove;
  60. }
  61. - (void)updateMemeber:(NSString *)userId forRole:(Role )role {
  62. RoomMember *memeber = [self getMember:userId];
  63. memeber.role = role;
  64. [self updateMemeber:memeber];
  65. }
  66. - (void)updateMember:(NSString *)userId forCamera:(BOOL)enable {
  67. RoomMember *member = [self getMember:userId];
  68. member.cameraEnable = enable;
  69. [self updateMemeber:member];
  70. }
  71. - (void)updateMember:(NSString *)userId forMicrophone:(BOOL)enable {
  72. RoomMember *member = [self getMember:userId];
  73. member.microphoneEnable = enable;
  74. [self updateMemeber:member];
  75. }
  76. - (void)updateMember:(NSString *)userId forMusicMode:(BOOL)enable {
  77. RoomMember *member = [self getMember:userId];
  78. member.musicModeOn = enable;
  79. [self updateMemeber:member];
  80. }
  81. - (void)updateMember:(NSString *)userId forHandsUp:(BOOL)enable {
  82. if ([userId isEqualToString:self.currentDisplayURI]) {
  83. return;
  84. }
  85. RoomMember *member = [self getMember:userId];
  86. member.handUpOn = enable;
  87. [self updateMemeber:member];
  88. }
  89. - (void)updateMember:(NSString *)userId forExamSong:(BOOL)enable {
  90. RoomMember *member = [self getMember:userId];
  91. // member.examSongEnable = enable;
  92. [self updateMemeber:member];
  93. }
  94. - (void)updateMember:(NSString *)userId forMusicScore:(BOOL)enable songId:(int)songId {
  95. RoomMember *member = [self getMember:userId];
  96. member.musicScoreAccompanimentId = songId;
  97. member.playStatus = enable;
  98. member.accompanimentPlayStatus = NO;
  99. // 获取成员当前曲目
  100. for (ClassSongMessage *songMessage in member.songMessage) {
  101. if (songMessage.musicScoreAccompanimentId == songId) {
  102. member.url = songMessage.url;
  103. member.mp3Url = songMessage.mp3Url;
  104. break;
  105. }
  106. }
  107. [self updateMemeber:member];
  108. }
  109. - (void)updateMember:(NSString *)userId forAccompany:(BOOL)enable songId:(int)songId {
  110. RoomMember *member = [self getMember:userId];
  111. member.accompanimentPlayStatus = enable;
  112. member.playStatus = NO;
  113. member.musicScoreAccompanimentId = songId;
  114. // 获取成员当前曲目
  115. for (ClassSongMessage *songMessage in member.songMessage) {
  116. if (songMessage.musicScoreAccompanimentId == songId) {
  117. member.url = songMessage.url;
  118. member.mp3Url = songMessage.mp3Url;
  119. break;
  120. }
  121. }
  122. [self updateMemeber:member];
  123. }
  124. - (void)updateMemberAccompamy:(NSString *)userId songMessage:(ClassSongMessage *)songMessage {
  125. RoomMember *member = [self getMember:userId];
  126. BOOL hasRecordSong = NO;
  127. for (ClassSongMessage *recordSongMessage in member.songMessage) {
  128. if (songMessage.musicScoreAccompanimentId == recordSongMessage.musicScoreAccompanimentId) {
  129. hasRecordSong = YES;
  130. break;
  131. }
  132. }
  133. if (hasRecordSong == NO) {
  134. [member.songMessage addObject:songMessage];
  135. }
  136. [self updateMemeber:member];
  137. }
  138. - (void)updateMemeber:(RoomMember *)member {
  139. int index = [self indexInDataSource:member];
  140. if(index >= 0) {
  141. NSMutableArray *tmp = [self.memberList mutableCopy];
  142. [tmp replaceObjectAtIndex:index withObject:member];
  143. self.memberList = [tmp copy];
  144. }
  145. }
  146. - (RoomMember *)getMember:(NSString *)userId {
  147. for(RoomMember *mem in self.memberList) {
  148. if([mem.userId isEqualToString:userId]) {
  149. return mem;
  150. }
  151. }
  152. return nil;
  153. }
  154. - (void)updateDisplayUri:(NSString *)display {
  155. if(display.length == 0){
  156. self.currentDisplayType = DisplayNone;
  157. self.currentDisplayURI = @"";
  158. return;
  159. }
  160. NSRange typeRange = [display rangeOfString:@"display://type="];
  161. NSRange userIdRange = [display rangeOfString:@"?userId="];
  162. NSRange uriRange = [display rangeOfString:@"?uri="];
  163. DisplayType type = (DisplayType)[[display substringWithRange:NSMakeRange(NSMaxRange(typeRange), 1)] intValue];
  164. NSString *userId = nil;
  165. NSInteger location = uriRange.location;
  166. if(display.length < location) {
  167. location = display.length;
  168. }
  169. if(userIdRange.location != NSNotFound) {
  170. userId = [display substringWithRange:NSMakeRange(NSMaxRange(userIdRange), location-NSMaxRange(userIdRange))];
  171. }
  172. NSString *uri = nil;
  173. if(uriRange.location != NSNotFound) {
  174. uri =[display substringWithRange:NSMakeRange(NSMaxRange(uriRange), display.length-NSMaxRange(uriRange))];
  175. }
  176. self.currentDisplayType = type;
  177. if(type == DisplayTeacher || type == DisplaySharedScreen || type == DisplayTypeStudent) {
  178. self.currentDisplayURI = userId;
  179. }
  180. else if (type == DisplayWhiteboard) {
  181. self.currentDisplayURI = uri;
  182. }
  183. }
  184. - (int)indexInDataSource:(RoomMember *)member {
  185. int index = -1;
  186. for(int i=0;i<self.memberList.count;i++) {
  187. RoomMember *mem = self.memberList[i];
  188. if([mem.userId isEqualToString:member.userId]) {
  189. index = i;
  190. break;
  191. }
  192. }
  193. return index;
  194. }
  195. - (RoomMember *)teacher {
  196. for(RoomMember *mem in self.memberList) {
  197. if(mem.role == RoleTeacher) {
  198. return mem;
  199. }
  200. }
  201. return nil;
  202. }
  203. - (RoomMember *)assistant {
  204. for(RoomMember *mem in self.memberList) {
  205. if(mem.role == RoleTeacher) {
  206. return mem;
  207. }
  208. }
  209. return nil;
  210. }
  211. - (RoomMember *)currentMember {
  212. return [self getMember:self.currentMemberId];
  213. }
  214. - (int)getMemberCountWithoutAudience {
  215. int count = 0;
  216. for (RoomMember *mem in self.memberList) {
  217. if (mem.role != RoleAudience) {
  218. count ++;
  219. }
  220. }
  221. return count;
  222. }
  223. - (NSString *)description
  224. {
  225. return [NSString stringWithFormat:@"Classroom:%@ displayType:%@ displayUri:%@ memeberList:%@", self.roomId,@(self.currentDisplayType),self.currentDisplayURI,self.memberList];
  226. }
  227. @end