NCRoomParticipants.m 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /**
  2. * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
  3. * SPDX-License-Identifier: GPL-3.0-or-later
  4. */
  5. #import "NCRoomParticipant.h"
  6. #import "CallConstants.h"
  7. #import "NCDatabaseManager.h"
  8. NSString * const NCAttendeeTypeUser = @"users";
  9. NSString * const NCAttendeeTypeGroup = @"groups";
  10. NSString * const NCAttendeeTypeCircle = @"circles";
  11. NSString * const NCAttendeeTypeGuest = @"guests";
  12. NSString * const NCAttendeeTypeEmail = @"emails";
  13. NSString * const NCAttendeeTypeFederated = @"federated_users";
  14. NSString * const NCAttendeeBridgeBotId = @"bridge-bot";
  15. @implementation NCRoomParticipant
  16. + (instancetype)participantWithDictionary:(NSDictionary *)participantDict
  17. {
  18. if (!participantDict) {
  19. return nil;
  20. }
  21. NCRoomParticipant *participant = [[NCRoomParticipant alloc] init];
  22. participant.attendeeId = [[participantDict objectForKey:@"attendeeId"] integerValue];
  23. participant.actorType = [participantDict objectForKey:@"actorType"];
  24. participant.actorId = [participantDict objectForKey:@"actorId"];
  25. participant.displayName = [participantDict objectForKey:@"displayName"];
  26. participant.inCall = [[participantDict objectForKey:@"inCall"] integerValue];
  27. participant.lastPing = [[participantDict objectForKey:@"lastPing"] integerValue];
  28. participant.participantType = (NCParticipantType)[[participantDict objectForKey:@"participantType"] integerValue];
  29. participant.sessionId = [participantDict objectForKey:@"sessionId"];
  30. participant.sessionIds = [participantDict objectForKey:@"sessionIds"];
  31. participant.userId = [participantDict objectForKey:@"userId"];
  32. id displayName = [participantDict objectForKey:@"displayName"];
  33. if ([displayName isKindOfClass:[NSString class]]) {
  34. participant.displayName = displayName;
  35. } else {
  36. participant.displayName = [displayName stringValue];
  37. }
  38. // Optional attribute
  39. id status = [participantDict objectForKey:@"status"];
  40. if ([status isKindOfClass:[NSString class]]) {
  41. participant.status = status;
  42. }
  43. // Optional attribute
  44. id statusIcon = [participantDict objectForKey:@"statusIcon"];
  45. if ([statusIcon isKindOfClass:[NSString class]]) {
  46. participant.statusIcon = statusIcon;
  47. }
  48. // Optional attribute
  49. id statusMessage = [participantDict objectForKey:@"statusMessage"];
  50. if ([statusMessage isKindOfClass:[NSString class]]) {
  51. participant.statusMessage = statusMessage;
  52. }
  53. return participant;
  54. }
  55. - (BOOL)canModerate
  56. {
  57. return _participantType == kNCParticipantTypeOwner || _participantType == kNCParticipantTypeModerator || _participantType == kNCParticipantTypeGuestModerator;
  58. }
  59. - (BOOL)canBePromoted
  60. {
  61. // In Talk 5 guest moderators were introduced
  62. if ([[NCDatabaseManager sharedInstance] serverHasTalkCapability:kCapabilityInviteGroupsAndMails]) {
  63. BOOL allowedActorType = [_actorType isEqualToString:NCAttendeeTypeUser] || [_actorType isEqualToString:NCAttendeeTypeGuest] || [_actorType isEqualToString:NCAttendeeTypeEmail];
  64. return !self.canModerate && allowedActorType;
  65. }
  66. return _participantType == kNCParticipantTypeUser;
  67. }
  68. - (BOOL)canBeDemoted
  69. {
  70. return _participantType == kNCParticipantTypeModerator || _participantType == kNCParticipantTypeGuestModerator;
  71. }
  72. - (BOOL)isBridgeBotUser
  73. {
  74. return [_actorType isEqualToString:NCAttendeeTypeUser] && [_actorId isEqualToString:NCAttendeeBridgeBotId];
  75. }
  76. - (BOOL)isGuest
  77. {
  78. return _participantType == kNCParticipantTypeGuest || _participantType == kNCParticipantTypeGuestModerator;
  79. }
  80. - (BOOL)isGroup
  81. {
  82. return [_actorType isEqualToString:NCAttendeeTypeGroup];
  83. }
  84. - (BOOL)isCircle
  85. {
  86. return [_actorType isEqualToString:NCAttendeeTypeCircle];
  87. }
  88. - (BOOL)isFederated
  89. {
  90. return [_actorType isEqualToString:NCAttendeeTypeFederated];
  91. }
  92. - (BOOL)isOffline
  93. {
  94. return ([_sessionId isEqualToString:@"0"] || [_sessionId isEqualToString:@""] || !_sessionId) && _sessionIds.count == 0;
  95. }
  96. - (NSString *)participantId
  97. {
  98. // Conversation API v3
  99. if (_actorId) {
  100. return _actorId;
  101. }
  102. return (self.isGuest) ? _sessionId : _userId;
  103. }
  104. - (NSString *)detailedName
  105. {
  106. NSString *detailedNameString = _displayName;
  107. if ([_displayName isEqualToString:@""]) {
  108. if (self.isGuest) {
  109. detailedNameString = NSLocalizedString(@"Guest", nil);
  110. } else {
  111. detailedNameString = NSLocalizedString(@"[Unknown username]", nil);
  112. }
  113. }
  114. // Moderator label
  115. if (self.canModerate) {
  116. NSString *moderatorString = NSLocalizedString(@"moderator", nil);
  117. detailedNameString = [NSString stringWithFormat:@"%@ (%@)", detailedNameString, moderatorString];
  118. }
  119. // Bridge bot label
  120. if (self.isBridgeBotUser) {
  121. NSString *botString = NSLocalizedString(@"bot", nil);
  122. detailedNameString = [NSString stringWithFormat:@"%@ (%@)", detailedNameString, botString];
  123. }
  124. // Guest label
  125. if (self.isGuest) {
  126. NSString *guestString = NSLocalizedString(@"guest", nil);
  127. detailedNameString = [NSString stringWithFormat:@"%@ (%@)", detailedNameString, guestString];
  128. }
  129. return detailedNameString;
  130. }
  131. - (NSString *)callIconImageName
  132. {
  133. if (self.inCall == CallFlagDisconnected) {
  134. return nil;
  135. }
  136. if ((self.inCall & CallFlagWithVideo) != 0) {
  137. return @"video";
  138. }
  139. if ((self.inCall & CallFlagWithPhone) != 0) {
  140. return @"phone";
  141. }
  142. return @"mic";
  143. }
  144. @end