TM-SGNL-iOS/SignalServiceKit/Messages/Interactions/TSInfoMessage+GroupUpdates+DisplayableGroupUpdateItem.swift
TeleMessage developers dde0620daf initial commit
2025-05-03 12:28:28 -07:00

1243 lines
67 KiB
Swift

//
// Copyright 2023 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//
import Foundation
/// Represents a specific update made to a group that can be presented to the
/// user as part of a ``TSInfoMessage``.
///
/// Legacy info messages produce these by "diffing" group models from
/// "before/after" the update, while new info messages produce these from
/// ``TSInfoMessage/PersistableGroupUpdateItem``s that are "precomputed" when the
/// info message is created.
public enum DisplayableGroupUpdateItem {
case genericUpdateByLocalUser
case genericUpdateByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case genericUpdateByUnknownUser
case createdByLocalUser
case createdByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case createdByUnknownUser
case nameChangedByLocalUser(newGroupName: String)
case nameChangedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress, newGroupName: String)
case nameChangedByUnknownUser(newGroupName: String)
case nameRemovedByLocalUser
case nameRemovedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case nameRemovedByUnknownUser
case avatarChangedByLocalUser
case avatarChangedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case avatarChangedByUnknownUser
case avatarRemovedByLocalUser
case avatarRemovedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case avatarRemovedByUnknownUser
case descriptionChangedByLocalUser(newDescription: String)
case descriptionChangedByOtherUser(newDescription: String, updaterName: String, updaterAddress: SignalServiceAddress)
case descriptionChangedByUnknownUser(newDescription: String)
case descriptionRemovedByLocalUser
case descriptionRemovedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case descriptionRemovedByUnknownUser
case membersAccessChangedByLocalUser(newAccess: GroupV2Access)
case membersAccessChangedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress, newAccess: GroupV2Access)
case membersAccessChangedByUnknownUser(newAccess: GroupV2Access)
case attributesAccessChangedByLocalUser(newAccess: GroupV2Access)
case attributesAccessChangedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress, newAccess: GroupV2Access)
case attributesAccessChangedByUnknownUser(newAccess: GroupV2Access)
case announcementOnlyEnabledByLocalUser
case announcementOnlyEnabledByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case announcementOnlyEnabledByUnknownUser
case announcementOnlyDisabledByLocalUser
case announcementOnlyDisabledByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case announcementOnlyDisabledByUnknownUser
case inviteFriendsToNewlyCreatedGroup
case wasMigrated
case localUserInvitedAfterMigration
case otherUsersInvitedAfterMigration(count: UInt)
case otherUsersDroppedAfterMigration(count: UInt)
case localUserWasGrantedAdministratorByLocalUser
case localUserWasGrantedAdministratorByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case localUserWasGrantedAdministratorByUnknownUser
case otherUserWasGrantedAdministratorByLocalUser(userName: String, userAddress: SignalServiceAddress)
case otherUserWasGrantedAdministratorByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress, userName: String, userAddress: SignalServiceAddress)
case otherUserWasGrantedAdministratorByUnknownUser(userName: String, userAddress: SignalServiceAddress)
case localUserWasRevokedAdministratorByLocalUser
case localUserWasRevokedAdministratorByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case localUserWasRevokedAdministratorByUnknownUser
case otherUserWasRevokedAdministratorByLocalUser(userName: String, userAddress: SignalServiceAddress)
case otherUserWasRevokedAdministratorByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress, userName: String, userAddress: SignalServiceAddress)
case otherUserWasRevokedAdministratorByUnknownUser(userName: String, userAddress: SignalServiceAddress)
case localUserLeft
case localUserRemoved(removerName: String, removerAddress: SignalServiceAddress)
case localUserRemovedByUnknownUser
case otherUserLeft(userName: String, userAddress: SignalServiceAddress)
case otherUserRemovedByLocalUser(userName: String, userAddress: SignalServiceAddress)
case otherUserRemoved(removerName: String, removerAddress: SignalServiceAddress, userName: String, userAddress: SignalServiceAddress)
case otherUserRemovedByUnknownUser(userName: String, userAddress: SignalServiceAddress)
case localUserWasInvitedByLocalUser
case localUserWasInvitedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case localUserWasInvitedByUnknownUser
case otherUserWasInvitedByLocalUser(userName: String, userAddress: SignalServiceAddress)
case unnamedUsersWereInvitedByLocalUser(count: UInt)
case unnamedUsersWereInvitedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress, count: UInt)
case unnamedUsersWereInvitedByUnknownUser(count: UInt)
case localUserAcceptedInviteFromInviter(inviterName: String, inviterAddress: SignalServiceAddress)
case localUserAcceptedInviteFromUnknownUser
case otherUserAcceptedInviteFromLocalUser(userName: String, userAddress: SignalServiceAddress)
case otherUserAcceptedInviteFromInviter(userName: String, userAddress: SignalServiceAddress, inviterName: String, inviterAddress: SignalServiceAddress)
case otherUserAcceptedInviteFromUnknownUser(userName: String, userAddress: SignalServiceAddress)
case localUserJoined
case otherUserJoined(userName: String, userAddress: SignalServiceAddress)
case localUserAddedByLocalUser
case localUserAddedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case localUserAddedByUnknownUser
case otherUserAddedByLocalUser(userName: String, userAddress: SignalServiceAddress)
case otherUserAddedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress, userName: String, userAddress: SignalServiceAddress)
case otherUserAddedByUnknownUser(userName: String, userAddress: SignalServiceAddress)
case localUserDeclinedInviteFromInviter(inviterName: String, inviterAddress: SignalServiceAddress)
case localUserDeclinedInviteFromUnknownUser
case localUserInviteRevoked(revokerName: String, revokerAddress: SignalServiceAddress)
case localUserInviteRevokedByUnknownUser
case otherUserInviteRevokedByLocalUser(userName: String, userAddress: SignalServiceAddress)
case otherUserDeclinedInviteFromLocalUser(userName: String, userAddress: SignalServiceAddress)
case otherUserDeclinedInviteFromInviter(inviterName: String, inviterAddress: SignalServiceAddress)
case otherUserDeclinedInviteFromUnknownUser
case unnamedUserInvitesWereRevokedByLocalUser(count: UInt)
case unnamedUserInvitesWereRevokedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress, count: UInt)
case unnamedUserInvitesWereRevokedByUnknownUser(count: UInt)
case localUserRequestedToJoin
case otherUserRequestedToJoin(userName: String, userAddress: SignalServiceAddress)
case localUserRequestApproved(approverName: String, approverAddress: SignalServiceAddress)
case localUserRequestApprovedByUnknownUser
case otherUserRequestApprovedByLocalUser(userName: String, userAddress: SignalServiceAddress)
case otherUserRequestApproved(userName: String, userAddress: SignalServiceAddress, approverName: String, approverAddress: SignalServiceAddress)
case otherUserRequestApprovedByUnknownUser(userName: String, userAddress: SignalServiceAddress)
case localUserRequestCanceledByLocalUser
case localUserRequestRejectedByUnknownUser
case otherUserRequestRejectedByLocalUser(requesterName: String, requesterAddress: SignalServiceAddress)
case otherUserRequestRejectedByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress, requesterName: String, requesterAddress: SignalServiceAddress)
case otherUserRequestCanceledByOtherUser(requesterName: String, requesterAddress: SignalServiceAddress)
case otherUserRequestRejectedByUnknownUser(requesterName: String, requesterAddress: SignalServiceAddress)
case disappearingMessagesEnabledByLocalUser(durationMs: UInt64)
case disappearingMessagesEnabledByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress, durationMs: UInt64)
case disappearingMessagesEnabledByUnknownUser(durationMs: UInt64)
case disappearingMessagesDisabledByLocalUser
case disappearingMessagesDisabledByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case disappearingMessagesDisabledByUnknownUser
case inviteLinkResetByLocalUser
case inviteLinkResetByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case inviteLinkResetByUnknownUser
case inviteLinkEnabledWithoutApprovalByLocalUser
case inviteLinkEnabledWithoutApprovalByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case inviteLinkEnabledWithoutApprovalByUnknownUser
case inviteLinkEnabledWithApprovalByLocalUser
case inviteLinkEnabledWithApprovalByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case inviteLinkEnabledWithApprovalByUnknownUser
case inviteLinkDisabledByLocalUser
case inviteLinkDisabledByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case inviteLinkDisabledByUnknownUser
case inviteLinkApprovalDisabledByLocalUser
case inviteLinkApprovalDisabledByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case inviteLinkApprovalDisabledByUnknownUser
case inviteLinkApprovalEnabledByLocalUser
case inviteLinkApprovalEnabledByOtherUser(updaterName: String, updaterAddress: SignalServiceAddress)
case inviteLinkApprovalEnabledByUnknownUser
case localUserJoinedViaInviteLink
case otherUserJoinedViaInviteLink(userName: String, userAddress: SignalServiceAddress)
case sequenceOfInviteLinkRequestAndCancels(userName: String, userAddress: SignalServiceAddress, count: UInt, isTail: Bool)
}
public extension TSInfoMessage.PersistableGroupUpdateItem {
/// Should this update appear as a group preview in the inbox?
var shouldAppearInInbox: Bool {
switch self {
case
.wasMigrated,
.localUserLeft,
.otherUserLeft:
return false
default:
return true
}
}
}
extension DisplayableGroupUpdateItem {
/// Localized text representing this update.
public var localizedText: NSAttributedString {
switch self {
case .genericUpdateByLocalUser:
return OWSLocalizedString(
"GROUP_UPDATED_BY_LOCAL_USER",
comment: "Info message indicating that the group was updated by the local user."
).attributed
case let .genericUpdateByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_UPDATED_BY_REMOTE_USER_FORMAT",
comment: "Info message indicating that the group was updated by another user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .genericUpdateByUnknownUser:
return OWSLocalizedString(
"GROUP_UPDATED",
comment: "Info message indicating that the group was updated by an unknown user."
).attributed
case .createdByLocalUser:
return OWSLocalizedString(
"GROUP_CREATED_BY_LOCAL_USER",
comment: "Message indicating that group was created by the local user."
).attributed
case let .createdByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_CREATED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that group was created by another user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .createdByUnknownUser:
return OWSLocalizedString(
"GROUP_CREATED_BY_UNKNOWN_USER",
comment: "Message indicating that group was created by an unknown user."
).attributed
case let .nameChangedByLocalUser(newGroupName):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_UPDATED_NAME_UPDATED_BY_LOCAL_USER_FORMAT",
comment: "Message indicating that the group's name was changed by the local user. Embeds {{new group name}}."
),
groupUpdateFormatArgs: [.raw(newGroupName)]
)
case let .nameChangedByOtherUser(updaterName, updaterAddress, newGroupName):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_UPDATED_NAME_UPDATED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group's name was changed by a remote user. Embeds {{ %1$@ user who changed the name, %2$@ new group name}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress), .raw(newGroupName)]
)
case let .nameChangedByUnknownUser(newGroupName):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_UPDATED_NAME_UPDATED_FORMAT",
comment: "Message indicating that the group's name was changed. Embeds {{new group name}}."
),
groupUpdateFormatArgs: [.raw(newGroupName)]
)
case .nameRemovedByLocalUser:
return OWSLocalizedString(
"GROUP_UPDATED_NAME_REMOVED_BY_LOCAL_USER",
comment: "Message indicating that the group's name was removed by the local user."
).attributed
case let .nameRemovedByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_UPDATED_NAME_REMOVED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group's name was removed by a remote user. Embeds {{user who removed the name}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .nameRemovedByUnknownUser:
return OWSLocalizedString(
"GROUP_UPDATED_NAME_REMOVED",
comment: "Message indicating that the group's name was removed."
).attributed
case .avatarChangedByLocalUser:
return OWSLocalizedString(
"GROUP_UPDATED_AVATAR_UPDATED_BY_LOCAL_USER",
comment: "Message indicating that the group's avatar was changed."
).attributed
case let .avatarChangedByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_UPDATED_AVATAR_UPDATED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group's avatar was changed by a remote user. Embeds {{user who changed the avatar}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .avatarChangedByUnknownUser:
return OWSLocalizedString(
"GROUP_UPDATED_AVATAR_UPDATED",
comment: "Message indicating that the group's avatar was changed."
).attributed
case .avatarRemovedByLocalUser:
return OWSLocalizedString(
"GROUP_UPDATED_AVATAR_REMOVED_BY_LOCAL_USER",
comment: "Message indicating that the group's avatar was removed."
).attributed
case let .avatarRemovedByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_UPDATED_AVATAR_REMOVED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group's avatar was removed by a remote user. Embeds {{user who removed the avatar}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .avatarRemovedByUnknownUser:
return OWSLocalizedString(
"GROUP_UPDATED_AVATAR_REMOVED",
comment: "Message indicating that the group's avatar was removed."
).attributed
case .descriptionChangedByLocalUser:
return OWSLocalizedString(
"GROUP_UPDATED_DESCRIPTION_UPDATED_BY_LOCAL_USER",
comment: "Message indicating that the group's description was changed by the local user.."
).attributed
case let .descriptionChangedByOtherUser(_, updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_UPDATED_DESCRIPTION_UPDATED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group's description was changed by a remote user. Embeds {{ user who changed the name }}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .descriptionChangedByUnknownUser:
return OWSLocalizedString(
"GROUP_UPDATED_DESCRIPTION_UPDATED",
comment: "Message indicating that the group's description was changed."
).attributed
case .descriptionRemovedByLocalUser:
return OWSLocalizedString(
"GROUP_UPDATED_DESCRIPTION_REMOVED_BY_LOCAL_USER",
comment: "Message indicating that the group's description was removed by the local user."
).attributed
case let .descriptionRemovedByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_UPDATED_DESCRIPTION_REMOVED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group's description was removed by a remote user. Embeds {{user who removed the name}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .descriptionRemovedByUnknownUser:
return OWSLocalizedString(
"GROUP_UPDATED_DESCRIPTION_REMOVED",
comment: "Message indicating that the group's description was removed."
).attributed
case let .membersAccessChangedByLocalUser(newAccess):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_ACCESS_MEMBERS_UPDATED_BY_LOCAL_USER_FORMAT",
comment: "Message indicating that the access to the group's members was changed by the local user. Embeds {{new access level}}."
),
groupUpdateFormatArgs: [.raw(newAccess.descriptionForCopy)]
)
case let .membersAccessChangedByOtherUser(updaterName, updaterAddress, newAccess):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_ACCESS_MEMBERS_UPDATED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the access to the group's members was changed by a remote user. Embeds {{ %1$@ user who changed the access, %2$@ new access level}}."
),
groupUpdateFormatArgs: [
.name(updaterName, updaterAddress),
.raw(newAccess.descriptionForCopy)
]
)
case let .membersAccessChangedByUnknownUser(newAccess):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_ACCESS_MEMBERS_UPDATED_FORMAT",
comment: "Message indicating that the access to the group's members was changed. Embeds {{new access level}}."
),
groupUpdateFormatArgs: [.raw(newAccess.descriptionForCopy)]
)
case let .attributesAccessChangedByLocalUser(newAccess):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_ACCESS_ATTRIBUTES_UPDATED_BY_LOCAL_USER_FORMAT",
comment: "Message indicating that the access to the group's attributes was changed by the local user. Embeds {{new access level}}."
),
groupUpdateFormatArgs: [.raw(newAccess.descriptionForCopy)]
)
case let .attributesAccessChangedByOtherUser(updaterName, updaterAddress, newAccess):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_ACCESS_ATTRIBUTES_UPDATED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the access to the group's attributes was changed by a remote user. Embeds {{ %1$@ user who changed the access, %2$@ new access level}}."
),
groupUpdateFormatArgs: [
.name(updaterName, updaterAddress),
.raw(newAccess.descriptionForCopy)
]
)
case let .attributesAccessChangedByUnknownUser(newAccess):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_ACCESS_ATTRIBUTES_UPDATED_FORMAT",
comment: "Message indicating that the access to the group's attributes was changed. Embeds {{new access level}}."
),
groupUpdateFormatArgs: [.raw(newAccess.descriptionForCopy)]
)
case .announcementOnlyEnabledByLocalUser:
return OWSLocalizedString(
"GROUP_IS_ANNOUNCEMENT_ONLY_ENABLED_BY_LOCAL_USER",
comment: "Message indicating that 'announcement-only' mode was enabled by the local user."
).attributed
case let .announcementOnlyEnabledByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_IS_ANNOUNCEMENT_ONLY_ENABLED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that 'announcement-only' mode was enabled by a remote user. Embeds {{ user who enabled 'announcement-only' mode }}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .announcementOnlyEnabledByUnknownUser:
return OWSLocalizedString(
"GROUP_IS_ANNOUNCEMENT_ONLY_ENABLED",
comment: "Message indicating that 'announcement-only' mode was enabled."
).attributed
case .announcementOnlyDisabledByLocalUser:
return OWSLocalizedString(
"GROUP_IS_ANNOUNCEMENT_ONLY_DISABLED_BY_LOCAL_USER",
comment: "Message indicating that 'announcement-only' mode was disabled by the local user."
).attributed
case let .announcementOnlyDisabledByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_IS_ANNOUNCEMENT_ONLY_DISABLED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that 'announcement-only' mode was disabled by a remote user. Embeds {{ user who disabled 'announcement-only' mode }}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .announcementOnlyDisabledByUnknownUser:
return OWSLocalizedString(
"GROUP_IS_ANNOUNCEMENT_ONLY_DISABLED",
comment: "Message indicating that 'announcement-only' mode was disabled."
).attributed
case .inviteFriendsToNewlyCreatedGroup:
return OWSLocalizedString(
"GROUP_LINK_PROMOTION_UPDATE",
comment: "Suggestion to invite more group members via the group invite link."
).attributed
case .wasMigrated:
return OWSLocalizedString(
"GROUP_WAS_MIGRATED",
comment: "Message indicating that the group was migrated."
).attributed
case .localUserInvitedAfterMigration:
return OWSLocalizedString(
"GROUP_WAS_MIGRATED_LOCAL_USER_INVITED",
comment: "Message indicating that the local user was invited after the group was migrated."
).attributed
case .otherUsersInvitedAfterMigration(let count):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_WAS_MIGRATED_USERS_INVITED_%d",
tableName: "PluralAware",
comment: "Message indicating that some members were invited after the group was migrated. Embeds {{ %1$@ the number of invited users }}."
),
groupUpdateFormatArgs: [
.raw(count)
]
)
case .otherUsersDroppedAfterMigration(let count):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_WAS_MIGRATED_USERS_DROPPED_%d",
tableName: "PluralAware",
comment: "Message indicating that some members were dropped after the group was migrated. Embeds {{ %1$@ the number of dropped users }}."
),
groupUpdateFormatArgs: [
.raw(count)
]
)
case .localUserWasGrantedAdministratorByLocalUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_GRANTED_ADMINISTRATOR",
comment: "Message indicating that the local user was granted administrator role."
).attributed
case let .localUserWasGrantedAdministratorByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_LOCAL_USER_GRANTED_ADMINISTRATOR_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the local user was granted administrator role by another user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .localUserWasGrantedAdministratorByUnknownUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_GRANTED_ADMINISTRATOR",
comment: "Message indicating that the local user was granted administrator role."
).attributed
case let .otherUserWasGrantedAdministratorByLocalUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_GRANTED_ADMINISTRATOR_BY_LOCAL_USER",
comment: "Message indicating that a remote user was granted administrator role by local user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .otherUserWasGrantedAdministratorByOtherUser(updaterName, updaterAddress, userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_GRANTED_ADMINISTRATOR_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that a remote user was granted administrator role by another user. Embeds {{ %1$@ user who granted, %2$@ user who was granted administrator role}}."
),
groupUpdateFormatArgs: [
.name(updaterName, updaterAddress),
.name(userName, userAddress)
]
)
case let .otherUserWasGrantedAdministratorByUnknownUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_GRANTED_ADMINISTRATOR",
comment: "Message indicating that a remote user was granted administrator role. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case .localUserWasRevokedAdministratorByLocalUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_REVOKED_ADMINISTRATOR",
comment: "Message indicating that the local user had their administrator role revoked."
).attributed
case let .localUserWasRevokedAdministratorByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_LOCAL_USER_REVOKED_ADMINISTRATOR_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the local user had their administrator role revoked by another user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .localUserWasRevokedAdministratorByUnknownUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_REVOKED_ADMINISTRATOR",
comment: "Message indicating that the local user had their administrator role revoked."
).attributed
case let .otherUserWasRevokedAdministratorByLocalUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REVOKED_ADMINISTRATOR_BY_LOCAL_USER",
comment: "Message indicating that a remote user had their administrator role revoked by local user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .otherUserWasRevokedAdministratorByOtherUser(updaterName, updaterAddress, userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REVOKED_ADMINISTRATOR_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that a remote user had their administrator role revoked by another user. Embeds {{ %1$@ user who revoked, %2$@ user who was granted administrator role}}."
),
groupUpdateFormatArgs: [
.name(updaterName, updaterAddress),
.name(userName, userAddress)
]
)
case let .otherUserWasRevokedAdministratorByUnknownUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REVOKED_ADMINISTRATOR",
comment: "Message indicating that a remote user had their administrator role revoked. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case .localUserLeft:
return OWSLocalizedString(
"GROUP_YOU_LEFT",
comment: "Message indicating that the local user left the group."
).attributed
case let .localUserRemoved(removerName, removerAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_LOCAL_USER_REMOVED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the local user was removed from the group by another user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(removerName, removerAddress)]
)
case .localUserRemovedByUnknownUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_REMOVED_BY_UNKNOWN_USER",
comment: "Message indicating that the local user was removed from the group by an unknown user."
).attributed
case let .otherUserLeft(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_LEFT_GROUP_FORMAT",
comment: "Message indicating that a remote user has left the group. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .otherUserRemovedByLocalUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REMOVED_BY_LOCAL_USER_FORMAT",
comment: "Message indicating that a remote user was removed from the group by the local user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .otherUserRemoved(removerName, removerAddress, userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REMOVED_FROM_GROUP_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the remote user was removed from the group. Embeds {{ %1$@ user who removed the user, %2$@ user who was removed}}."
),
groupUpdateFormatArgs: [
.name(removerName, removerAddress),
.name(userName, userAddress)
]
)
case let .otherUserRemovedByUnknownUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REMOVED_BY_UNKNOWN_USER_FORMAT",
comment: "Message indicating that a remote user was removed from the group by an unknown user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case .localUserWasInvitedByLocalUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_INVITED_TO_THE_GROUP",
comment: "Message indicating that the local user was invited to the group."
).attributed
case let .localUserWasInvitedByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_LOCAL_USER_INVITED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the local user was invited to the group by another user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .localUserWasInvitedByUnknownUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_INVITED_TO_THE_GROUP",
comment: "Message indicating that the local user was invited to the group."
).attributed
case let .otherUserWasInvitedByLocalUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_INVITED_BY_LOCAL_USER_FORMAT",
comment: "Message indicating that a remote user was invited to the group by the local user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .unnamedUsersWereInvitedByLocalUser(count):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_INVITED_%d",
tableName: "PluralAware",
comment: "Message indicating that a group of remote users were invited to the group. Embeds {{number of invited users}}."
),
groupUpdateFormatArgs: [.raw(count)]
)
case let .unnamedUsersWereInvitedByOtherUser(updaterName, updaterAddress, count):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_INVITED_BY_REMOTE_USER_%d",
tableName: "PluralAware",
comment: "Message indicating that a group of remote users were invited to the group by the local user. Embeds {{ %1$@ number of invited users, %2$@ user who invited the user }}."
),
groupUpdateFormatArgs: [.raw(count), .name(updaterName, updaterAddress)]
)
case let .unnamedUsersWereInvitedByUnknownUser(count):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_INVITED_%d",
tableName: "PluralAware",
comment: "Message indicating that a group of remote users were invited to the group. Embeds {{number of invited users}}."
),
groupUpdateFormatArgs: [.raw(count)]
)
case let .localUserAcceptedInviteFromInviter(inviterName, inviterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_LOCAL_USER_INVITE_ACCEPTED_FORMAT",
comment: "Message indicating that the local user accepted an invite to the group. Embeds {{user who invited the local user}}."
),
groupUpdateFormatArgs: [.name(inviterName, inviterAddress)]
)
case .localUserAcceptedInviteFromUnknownUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_INVITE_ACCEPTED",
comment: "Message indicating that the local user accepted an invite to the group."
).attributed
case let .otherUserAcceptedInviteFromLocalUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_ACCEPTED_INVITE_FROM_LOCAL_USER_FORMAT",
comment: "Message indicating that a remote user has accepted an invite from the local user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .otherUserAcceptedInviteFromInviter(userName, userAddress, inviterName, inviterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_ACCEPTED_INVITE_FROM_REMOTE_USER_FORMAT",
comment: "Message indicating that a remote user has accepted their invite. Embeds {{ %1$@ user who accepted their invite, %2$@ user who invited the user}}."
),
groupUpdateFormatArgs: [
.name(userName, userAddress),
.name(inviterName, inviterAddress)
]
)
case let .otherUserAcceptedInviteFromUnknownUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_ACCEPTED_INVITE_FORMAT",
comment: "Message indicating that a remote user has accepted their invite. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case .localUserJoined:
return OWSLocalizedString(
"GROUP_LOCAL_USER_JOINED_THE_GROUP",
comment: "Message indicating that the local user has joined the group."
).attributed
case let .otherUserJoined(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_JOINED_GROUP_FORMAT",
comment: "Message indicating that a remote user was added to the group. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case .localUserAddedByLocalUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_WAS_ADDED_TO_THE_GROUP",
comment: "Message indicating that the local user was added to the group."
).attributed
case let .localUserAddedByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_LOCAL_USER_ADDED_TO_GROUP_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the local user was added to the group by another user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .localUserAddedByUnknownUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_WAS_ADDED_TO_THE_GROUP",
comment: "Message indicating that the local user was added to the group."
).attributed
case let .otherUserAddedByLocalUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_ADDED_TO_GROUP_BY_LOCAL_USER_FORMAT",
comment: "Message indicating that a remote user was added to the group by the local user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .otherUserAddedByOtherUser(updaterName, updaterAddress, userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_ADDED_TO_GROUP_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that a remote user was added to the group by another user. Embeds {{ %1$@ user who added the user, %2$@ user who was added}}."
),
groupUpdateFormatArgs: [
.name(updaterName, updaterAddress),
.name(userName, userAddress)
]
)
case let .otherUserAddedByUnknownUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_ADDED_TO_GROUP_FORMAT",
comment: "Message indicating that a remote user was added to the group. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .localUserDeclinedInviteFromInviter(inviterName, inviterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_LOCAL_USER_INVITE_DECLINED_FORMAT",
comment: "Message indicating that the local user declined an invite to the group. Embeds {{user who invited the local user}}."
),
groupUpdateFormatArgs: [.name(inviterName, inviterAddress)]
)
case .localUserDeclinedInviteFromUnknownUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_INVITE_DECLINED_BY_LOCAL_USER",
comment: "Message indicating that the local user declined an invite to the group."
).attributed
case let .localUserInviteRevoked(revokerName, revokerAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_LOCAL_USER_INVITE_REVOKED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the local user's invite was revoked by another user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(revokerName, revokerAddress)]
)
case .localUserInviteRevokedByUnknownUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_INVITE_REVOKED_BY_UNKNOWN_USER",
comment: "Message indicating that the local user's invite was revoked by an unknown user."
).attributed
case let .otherUserInviteRevokedByLocalUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_INVITE_REVOKED_BY_LOCAL_USER_FORMAT",
comment: "Message indicating that a remote user's invite was revoked by the local user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .otherUserDeclinedInviteFromLocalUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_DECLINED_INVITE_FROM_LOCAL_USER_FORMAT",
comment: "Message indicating that a remote user has declined an invite to the group from the local user. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .otherUserDeclinedInviteFromInviter(inviterName, inviterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_DECLINED_INVITE_FORMAT",
comment: "Message indicating that a remote user has declined their invite. Embeds {{ user who invited them }}."
),
groupUpdateFormatArgs: [.name(inviterName, inviterAddress)]
)
case .otherUserDeclinedInviteFromUnknownUser:
return OWSLocalizedString(
"GROUP_REMOTE_USER_DECLINED_INVITE",
comment: "Message indicating that a remote user has declined their invite."
).attributed
case let .unnamedUserInvitesWereRevokedByLocalUser(count):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_INVITE_REVOKED_%d",
tableName: "PluralAware",
comment: "Message indicating that a group of remote users' invites were revoked. Embeds {{ number of users }}."
),
groupUpdateFormatArgs: [.raw(count)]
)
case let .unnamedUserInvitesWereRevokedByOtherUser(updaterName, updaterAddress, count):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_INVITE_REVOKED_BY_REMOTE_USER_%d",
tableName: "PluralAware",
comment: "Message indicating that a group of remote users' invites were revoked by a remote user. Embeds {{ %1$@ number of users, %2$@ user who revoked the invite }}."
),
groupUpdateFormatArgs: [
.raw(count),
.name(updaterName, updaterAddress)
]
)
case let .unnamedUserInvitesWereRevokedByUnknownUser(count):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_INVITE_REVOKED_%d",
tableName: "PluralAware",
comment: "Message indicating that a group of remote users' invites were revoked. Embeds {{ number of users }}."
),
groupUpdateFormatArgs: [.raw(count)]
)
case .localUserRequestedToJoin:
return OWSLocalizedString(
"GROUP_LOCAL_USER_REQUESTED_TO_JOIN_TO_THE_GROUP",
comment: "Message indicating that the local user requested to join the group."
).attributed
case let .otherUserRequestedToJoin(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REQUESTED_TO_JOIN_THE_GROUP_FORMAT",
comment: "Message indicating that a remote user requested to join the group. Embeds {{requesting user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .localUserRequestApproved(approverName, approverAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_LOCAL_USER_REQUEST_APPROVED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the local user's request to join the group was approved by another user. Embeds {{ %@ the name of the user who approved the request }}."
),
groupUpdateFormatArgs: [.name(approverName, approverAddress)]
)
case .localUserRequestApprovedByUnknownUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_REQUEST_APPROVED",
comment: "Message indicating that the local user's request to join the group was approved."
).attributed
case let .otherUserRequestApprovedByLocalUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REQUEST_APPROVED_BY_LOCAL_USER_FORMAT",
comment: "Message indicating that a remote user's request to join the group was approved by the local user. Embeds {{requesting user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .otherUserRequestApproved(userName, userAddress, approverName, approverAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REQUEST_APPROVED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that a remote user's request to join the group was approved by another user. Embeds {{ %1$@ requesting user name, %2$@ approving user name }}."
),
groupUpdateFormatArgs: [
.name(userName, userAddress),
.name(approverName, approverAddress)
]
)
case let .otherUserRequestApprovedByUnknownUser(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REQUEST_APPROVED_BY_UNKNOWN_USER_FORMAT",
comment: "Message indicating that a remote user's request to join the group was approved by an unknown user. Embeds {{ %1$@ requesting user name }}."
),
groupUpdateFormatArgs: [
.name(userName, userAddress)
]
)
case .localUserRequestCanceledByLocalUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_REQUEST_CANCELLED_BY_LOCAL_USER",
comment: "Message indicating that the local user cancelled their request to join the group."
).attributed
case .localUserRequestRejectedByUnknownUser:
return OWSLocalizedString(
"GROUP_LOCAL_USER_REQUEST_REJECTED",
comment: "Message indicating that the local user's request to join the group was rejected."
).attributed
case let .otherUserRequestRejectedByLocalUser(requesterName, requesterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REQUEST_REJECTED_BY_LOCAL_USER_FORMAT",
comment: "Message indicating that a remote user's request to join the group was rejected by the local user. Embeds {{requesting user name}}."
),
groupUpdateFormatArgs: [.name(requesterName, requesterAddress)]
)
case let .otherUserRequestRejectedByOtherUser(updaterName, updaterAddress, requesterName, requesterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REQUEST_REJECTED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that a remote user's request to join the group was rejected by another user. Embeds {{ %1$@ requesting user name, %2$@ rejecting user name }}."
),
groupUpdateFormatArgs: [
.name(requesterName, requesterAddress),
.name(updaterName, updaterAddress)
]
)
case let .otherUserRequestCanceledByOtherUser(requesterName, requesterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REQUEST_CANCELLED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that a remote user cancelled their request to join the group. Embeds {{ the name of the requesting user }}."
),
groupUpdateFormatArgs: [.name(requesterName, requesterAddress)]
)
case let .otherUserRequestRejectedByUnknownUser(requesterName, requesterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REQUEST_REJECTED_FORMAT",
comment: "Message indicating that a remote user's request to join the group was rejected. Embeds {{requesting user name}}."
),
groupUpdateFormatArgs: [.name(requesterName, requesterAddress)]
)
case let .disappearingMessagesEnabledByLocalUser(durationMs):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"YOU_UPDATED_DISAPPEARING_MESSAGES_CONFIGURATION",
comment: "Info Message when you update disappearing messages duration. Embeds a {{time amount}} before messages disappear. see the *_TIME_AMOUNT strings for context."
),
groupUpdateFormatArgs: [.durationMs(durationMs)]
)
case .disappearingMessagesDisabledByLocalUser:
return OWSLocalizedString(
"YOU_DISABLED_DISAPPEARING_MESSAGES_CONFIGURATION",
comment: "Info Message when you disabled disappearing messages."
).attributed
case let .disappearingMessagesEnabledByOtherUser(updaterName, updaterAddress, durationMs):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"OTHER_UPDATED_DISAPPEARING_MESSAGES_CONFIGURATION",
comment: "Info Message when another user enabled disappearing messages. Embeds {{name of other user}} and {{time amount}} before messages disappear. See the *_TIME_AMOUNT strings for context."
),
groupUpdateFormatArgs: [
.name(updaterName, updaterAddress),
.durationMs(durationMs)
]
)
case let .disappearingMessagesDisabledByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"OTHER_DISABLED_DISAPPEARING_MESSAGES_CONFIGURATION",
comment: "Info Message when another user disabled disappearing messages. Embeds {{name of other user}}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case let .disappearingMessagesEnabledByUnknownUser(durationMs):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"UNKNOWN_USER_UPDATED_DISAPPEARING_MESSAGES_CONFIGURATION",
comment: "Info Message when an unknown user enabled disappearing messages. Embeds {{time amount}} before messages disappear. see the *_TIME_AMOUNT strings for context."
),
groupUpdateFormatArgs: [.durationMs(durationMs)]
)
case .disappearingMessagesDisabledByUnknownUser:
return OWSLocalizedString(
"UNKNOWN_USER_DISABLED_DISAPPEARING_MESSAGES_CONFIGURATION",
comment: "Info Message when an unknown user disabled disappearing messages."
).attributed
case .inviteLinkResetByLocalUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_RESET_BY_LOCAL_USER",
comment: "Message indicating that the group invite link was reset by the local user."
).attributed
case let .inviteLinkResetByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_INVITE_LINK_RESET_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group invite link was reset by a remote user. Embeds {{ user who reset the group invite link }}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .inviteLinkResetByUnknownUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_RESET",
comment: "Message indicating that the group invite link was reset."
).attributed
case .inviteLinkEnabledWithoutApprovalByLocalUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_ENABLED_WITHOUT_APPROVAL_BY_LOCAL_USER",
comment: "Message indicating that the group invite link was enabled by the local user."
).attributed
case let .inviteLinkEnabledWithoutApprovalByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_INVITE_LINK_ENABLED_WITHOUT_APPROVAL_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group invite link was enabled by a remote user. Embeds {{ user who enabled the group invite link }}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .inviteLinkEnabledWithoutApprovalByUnknownUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_ENABLED_WITHOUT_APPROVAL",
comment: "Message indicating that the group invite link was enabled."
).attributed
case .inviteLinkEnabledWithApprovalByLocalUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_ENABLED_WITH_APPROVAL_BY_LOCAL_USER",
comment: "Message indicating that the group invite link was enabled by the local user."
).attributed
case let .inviteLinkEnabledWithApprovalByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_INVITE_LINK_ENABLED_WITH_APPROVAL_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group invite link was enabled by a remote user. Embeds {{ user who enabled the group invite link }}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .inviteLinkEnabledWithApprovalByUnknownUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_ENABLED_WITH_APPROVAL",
comment: "Message indicating that the group invite link was enabled."
).attributed
case .inviteLinkDisabledByLocalUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_DISABLED_BY_LOCAL_USER",
comment: "Message indicating that the group invite link was disabled by the local user."
).attributed
case let .inviteLinkDisabledByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_INVITE_LINK_DISABLED_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group invite link was disabled by a remote user. Embeds {{ user who disabled the group invite link }}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .inviteLinkDisabledByUnknownUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_DISABLED",
comment: "Message indicating that the group invite link was disabled."
).attributed
case .inviteLinkApprovalDisabledByLocalUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_SET_TO_NOT_REQUIRE_APPROVAL_BY_LOCAL_USER",
comment: "Message indicating that the group invite link was set to not require approval by the local user."
).attributed
case let .inviteLinkApprovalDisabledByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_INVITE_LINK_SET_TO_NOT_REQUIRE_APPROVAL_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group invite link was set to not require approval by a remote user. Embeds {{ user who set the group invite link to not require approval }}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .inviteLinkApprovalDisabledByUnknownUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_SET_TO_NOT_REQUIRE_APPROVAL",
comment: "Message indicating that the group invite link was set to not require approval."
).attributed
case .inviteLinkApprovalEnabledByLocalUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_SET_TO_REQUIRE_APPROVAL_BY_LOCAL_USER",
comment: "Message indicating that the group invite link was set to require approval by the local user."
).attributed
case let .inviteLinkApprovalEnabledByOtherUser(updaterName, updaterAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_INVITE_LINK_SET_TO_REQUIRE_APPROVAL_BY_REMOTE_USER_FORMAT",
comment: "Message indicating that the group invite link was set to require approval by a remote user. Embeds {{ user who set the group invite link to require approval }}."
),
groupUpdateFormatArgs: [.name(updaterName, updaterAddress)]
)
case .inviteLinkApprovalEnabledByUnknownUser:
return OWSLocalizedString(
"GROUP_INVITE_LINK_SET_TO_REQUIRE_APPROVAL",
comment: "Message indicating that the group invite link was set to require approval."
).attributed
case .localUserJoinedViaInviteLink:
return OWSLocalizedString(
"GROUP_LOCAL_USER_JOINED_THE_GROUP_VIA_GROUP_INVITE_LINK",
comment: "Message indicating that the local user has joined the group."
).attributed
case let .otherUserJoinedViaInviteLink(userName, userAddress):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_JOINED_THE_GROUP_VIA_GROUP_INVITE_LINK_FORMAT",
comment: "Message indicating that another user has joined the group. Embeds {{remote user name}}."
),
groupUpdateFormatArgs: [.name(userName, userAddress)]
)
case let .sequenceOfInviteLinkRequestAndCancels(userName, userAddress, count, _):
return NSAttributedString.make(
fromFormat: OWSLocalizedString(
"GROUP_REMOTE_USER_REQUESTED_TO_JOIN_THE_GROUP_AND_CANCELED_%d",
tableName: "PluralAware",
comment: "Message indicating that a remote user requested to join the group and then canceled, some number of times. Embeds {{ %1$@ the number of times, %2$@ the requesting user's name }}."
),
groupUpdateFormatArgs: [
.raw(count),
.name(userName, userAddress)
]
)
}
}
}
// MARK: - NSAttributedString
extension DisplayableGroupUpdateItem {
enum FormatArg {
case raw(_ value: CVarArg)
case durationMs(_ value: UInt64)
case name(_ string: String, _ address: SignalServiceAddress)
var asAttributedFormatArg: AttributedFormatArg {
switch self {
case let .raw(value):
return .raw(value)
case let .durationMs(value):
return .raw(String.formatDurationLossless(durationMs: value))
case let .name(value, address):
return .string(value, attributes: [.addressOfName: address])
}
}
}
}
public extension NSAttributedString.Key {
/// An attribute keying to the `SignalServiceAddress` of a user whose name
/// is being displayed in the associated range in the string.
static let addressOfName = NSAttributedString.Key(rawValue: "org.whispersystems.signal.addressOfName")
}
/// Note that this extension is used in tests as well as this file.
extension NSAttributedString {
static func make(
fromFormat format: String,
groupUpdateFormatArgs: [DisplayableGroupUpdateItem.FormatArg]
) -> NSAttributedString {
make(
fromFormat: format,
attributedFormatArgs: groupUpdateFormatArgs.map { $0.asAttributedFormatArg }
)
}
}
public extension NSAttributedString {
func enumerateAddressesOfNames(
in range: NSRange? = nil,
handler: (SignalServiceAddress?, NSRange, UnsafeMutablePointer<ObjCBool>) -> Void
) {
enumerateAttribute(
.addressOfName,
in: range ?? entireRange,
options: []
) { handler($0 as? SignalServiceAddress, $1, $2) }
}
}
// MARK: -
private extension GroupV2Access {
var descriptionForCopy: String {
switch self {
case .unknown:
owsFailDebug("Unknown access level!")
return OWSLocalizedString(
"GROUP_ACCESS_LEVEL_UNKNOWN",
comment: "Description of the 'unknown' access level."
)
case .any:
return OWSLocalizedString(
"GROUP_ACCESS_LEVEL_ANY",
comment: "Description of the 'all users' access level."
)
case .member:
return OWSLocalizedString(
"GROUP_ACCESS_LEVEL_MEMBER",
comment: "Description of the 'all members' access level."
)
case .administrator:
return OWSLocalizedString(
"GROUP_ACCESS_LEVEL_ADMINISTRATORS",
comment: "Description of the 'admins only' access level."
)
case .unsatisfiable:
return OWSLocalizedString(
"GROUP_ACCESS_LEVEL_UNSATISFIABLE",
comment: "Description of the 'unsatisfiable' access level."
)
}
}
}
private extension String {
var attributed: NSAttributedString {
NSAttributedString(string: self)
}
}