NCRoom.m 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /**
  2. * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
  3. * SPDX-License-Identifier: GPL-3.0-or-later
  4. */
  5. #import "NCRoom.h"
  6. #import "NCDatabaseManager.h"
  7. #import "NextcloudTalk-Swift.h"
  8. NSString * const NCRoomObjectTypeFile = @"file";
  9. NSString * const NCRoomObjectTypeSharePassword = @"share:password";
  10. NSString * const NCRoomObjectTypeRoom = @"room";
  11. @implementation NCRoom
  12. + (instancetype)roomWithDictionary:(NSDictionary *)roomDict
  13. {
  14. if (!roomDict) {
  15. return nil;
  16. }
  17. NCRoom *room = [[self alloc] init];
  18. room.token = [roomDict objectForKey:@"token"];
  19. room.type = (NCRoomType)[[roomDict objectForKey:@"type"] integerValue];
  20. room.roomDescription = [roomDict objectForKey:@"description"];
  21. room.hasPassword = [[roomDict objectForKey:@"hasPassword"] boolValue];
  22. room.participantType = (NCParticipantType)[[roomDict objectForKey:@"participantType"] integerValue];
  23. room.attendeeId = [[roomDict objectForKey:@"attendeeId"] integerValue];
  24. room.attendeePin = [roomDict objectForKey:@"attendeePin"];
  25. room.unreadMessages = [[roomDict objectForKey:@"unreadMessages"] integerValue];
  26. room.unreadMention = [[roomDict objectForKey:@"unreadMention"] boolValue];
  27. room.unreadMentionDirect = [[roomDict objectForKey:@"unreadMentionDirect"] boolValue];
  28. room.lastActivity = [[roomDict objectForKey:@"lastActivity"] integerValue];
  29. room.isFavorite = [[roomDict objectForKey:@"isFavorite"] boolValue];
  30. room.notificationLevel = (NCRoomNotificationLevel)[[roomDict objectForKey:@"notificationLevel"] integerValue];
  31. room.notificationCalls = [[roomDict objectForKey:@"notificationCalls"] boolValue];
  32. room.objectType = [roomDict objectForKey:@"objectType"];
  33. room.objectId = [roomDict objectForKey:@"objectId"];
  34. room.readOnlyState = (NCRoomReadOnlyState)[[roomDict objectForKey:@"readOnly"] integerValue];
  35. room.listable = (NCRoomListableScope)[[roomDict objectForKey:@"listable"] integerValue];
  36. room.messageExpiration = [[roomDict objectForKey:@"messageExpiration"] integerValue];
  37. room.lobbyState = (NCRoomLobbyState)[[roomDict objectForKey:@"lobbyState"] integerValue];
  38. room.lobbyTimer = [[roomDict objectForKey:@"lobbyTimer"] integerValue];
  39. room.sipState = (NCRoomSIPState)[[roomDict objectForKey:@"sipEnabled"] integerValue];
  40. room.canEnableSIP = [[roomDict objectForKey:@"canEnableSIP"] boolValue];
  41. room.lastReadMessage = [[roomDict objectForKey:@"lastReadMessage"] integerValue];
  42. room.lastCommonReadMessage = [[roomDict objectForKey:@"lastCommonReadMessage"] integerValue];
  43. room.canStartCall = [[roomDict objectForKey:@"canStartCall"] boolValue];
  44. room.hasCall = [[roomDict objectForKey:@"hasCall"] boolValue];
  45. room.canLeaveConversation = [[roomDict objectForKey:@"canLeaveConversation"] boolValue];
  46. room.canDeleteConversation = [[roomDict objectForKey:@"canDeleteConversation"] boolValue];
  47. room.permissions = [[roomDict objectForKey:@"permissions"] integerValue];
  48. room.attendeePermissions = [[roomDict objectForKey:@"attendeePermissions"] integerValue];
  49. room.defaultPermissions = [[roomDict objectForKey:@"defaultPermissions"] integerValue];
  50. room.callRecording = [[roomDict objectForKey:@"callRecording"] integerValue];
  51. room.callStartTime = [[roomDict objectForKey:@"callStartTime"] integerValue];
  52. room.avatarVersion = [roomDict objectForKey:@"avatarVersion"];
  53. room.isCustomAvatar = [roomDict objectForKey:@"isCustomAvatar"];
  54. room.recordingConsent = [[roomDict objectForKey:@"recordingConsent"] integerValue];
  55. room.remoteServer = [roomDict objectForKey:@"remoteServer"];
  56. room.remoteToken = [roomDict objectForKey:@"remoteToken"];
  57. room.mentionPermissions = [[roomDict objectForKey:@"mentionPermissions"] integerValue];
  58. // Local-only field -> update only if there's actually a value
  59. if ([roomDict objectForKey:@"pendingMessage"] != nil) {
  60. room.pendingMessage = [roomDict objectForKey:@"pendingMessage"];
  61. }
  62. id name = [roomDict objectForKey:@"name"];
  63. if ([name isKindOfClass:[NSString class]]) {
  64. room.name = name;
  65. } else {
  66. room.name = [name stringValue];
  67. }
  68. id displayName = [roomDict objectForKey:@"displayName"];
  69. if ([displayName isKindOfClass:[NSString class]]) {
  70. room.displayName = displayName;
  71. } else {
  72. room.displayName = [displayName stringValue];
  73. }
  74. id participants = [roomDict objectForKey:@"participants"];
  75. if ([participants isKindOfClass:[NSDictionary class]]) {
  76. room.participants = (RLMArray<RLMString> *)[participants allKeys];
  77. }
  78. // Optional attribute
  79. id status = [roomDict objectForKey:@"status"];
  80. if ([status isKindOfClass:[NSString class]]) {
  81. room.status = status;
  82. }
  83. // Optional attribute
  84. id statusIcon = [roomDict objectForKey:@"statusIcon"];
  85. if ([statusIcon isKindOfClass:[NSString class]]) {
  86. room.statusIcon = statusIcon;
  87. }
  88. // Optional attribute
  89. id statusMessage = [roomDict objectForKey:@"statusMessage"];
  90. if ([statusMessage isKindOfClass:[NSString class]]) {
  91. room.statusMessage = statusMessage;
  92. }
  93. // Participants flags is null in Talk versions that don't support conversation v4 API
  94. id participantFlags = [roomDict objectForKey:@"participantFlags"];
  95. if ([participantFlags isKindOfClass:[NSNumber class]]) {
  96. room.participantFlags = [participantFlags integerValue];
  97. }
  98. // Last message proxied (only for Federated rooms)
  99. if ([room isFederated]) {
  100. id lastMessageProxied = [roomDict objectForKey:@"lastMessage"];
  101. if ([lastMessageProxied isKindOfClass:[NSDictionary class]]) {
  102. NSError *error;
  103. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:lastMessageProxied
  104. options:0
  105. error:&error];
  106. if (jsonData) {
  107. room.lastMessageProxiedJSONString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  108. } else {
  109. NSLog(@"Error generating reactions JSON string: %@", error);
  110. }
  111. }
  112. }
  113. return room;
  114. }
  115. + (instancetype)roomWithDictionary:(NSDictionary *)roomDict andAccountId:(NSString *)accountId
  116. {
  117. NCRoom *room = [self roomWithDictionary:roomDict];
  118. if (room) {
  119. room.accountId = accountId;
  120. room.internalId = [NSString stringWithFormat:@"%@@%@", room.accountId, room.token];
  121. }
  122. return room;
  123. }
  124. + (void)updateRoom:(NCRoom *)managedRoom withRoom:(NCRoom *)room
  125. {
  126. managedRoom.name = room.name;
  127. managedRoom.displayName = room.displayName;
  128. managedRoom.type = room.type;
  129. managedRoom.roomDescription = room.roomDescription;
  130. managedRoom.hasPassword = room.hasPassword;
  131. managedRoom.participantType = room.participantType;
  132. managedRoom.attendeeId = room.attendeeId;
  133. managedRoom.attendeePin = room.attendeePin;
  134. managedRoom.unreadMessages = room.unreadMessages;
  135. managedRoom.unreadMention = room.unreadMention;
  136. managedRoom.unreadMentionDirect = room.unreadMentionDirect;
  137. managedRoom.participants = room.participants;
  138. managedRoom.lastActivity = room.lastActivity;
  139. managedRoom.lastMessageId = room.lastMessageId;
  140. managedRoom.lastMessageProxiedJSONString = room.lastMessageProxiedJSONString;
  141. managedRoom.isFavorite = room.isFavorite;
  142. managedRoom.notificationLevel = room.notificationLevel;
  143. managedRoom.notificationCalls = room.notificationCalls;
  144. managedRoom.objectType = room.objectType;
  145. managedRoom.objectId = room.objectId;
  146. managedRoom.readOnlyState = room.readOnlyState;
  147. managedRoom.listable = room.listable;
  148. managedRoom.messageExpiration = room.messageExpiration;
  149. managedRoom.lobbyState = room.lobbyState;
  150. managedRoom.lobbyTimer = room.lobbyTimer;
  151. managedRoom.sipState = room.sipState;
  152. managedRoom.canEnableSIP = room.canEnableSIP;
  153. managedRoom.lastReadMessage = room.lastReadMessage;
  154. managedRoom.lastCommonReadMessage = room.lastCommonReadMessage;
  155. managedRoom.canStartCall = room.canStartCall;
  156. managedRoom.hasCall = room.hasCall;
  157. managedRoom.lastUpdate = room.lastUpdate;
  158. managedRoom.canLeaveConversation = room.canLeaveConversation;
  159. managedRoom.canDeleteConversation = room.canDeleteConversation;
  160. managedRoom.status = room.status;
  161. managedRoom.statusIcon = room.statusIcon;
  162. managedRoom.statusMessage = room.statusMessage;
  163. managedRoom.participantFlags = room.participantFlags;
  164. managedRoom.permissions = room.permissions;
  165. managedRoom.attendeePermissions = room.attendeePermissions;
  166. managedRoom.defaultPermissions = room.defaultPermissions;
  167. managedRoom.callRecording = room.callRecording;
  168. managedRoom.callStartTime = room.callStartTime;
  169. managedRoom.avatarVersion = room.avatarVersion;
  170. managedRoom.isCustomAvatar = room.isCustomAvatar;
  171. managedRoom.recordingConsent = room.recordingConsent;
  172. managedRoom.remoteToken = room.remoteToken;
  173. managedRoom.remoteServer = room.remoteServer;
  174. managedRoom.mentionPermissions = room.mentionPermissions;
  175. }
  176. + (NSString *)primaryKey {
  177. return @"internalId";
  178. }
  179. @end