Ensure author of message matches doer of group change action

This commit is contained in:
trevor-signal 2025-10-22 14:33:29 -04:00 committed by GitHub
parent 3a4447115f
commit ae41153c5a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
137 changed files with 311 additions and 1306 deletions

View File

@ -154,3 +154,15 @@ fun Any?.prettyPrint(indent: String = ""): String {
.replace(Regex("=\\s+"), "= ")
.replace(Regex("\\{\\s+}", RegexOption.MULTILINE), "{}")
}
/**
* Takes a total count and returns a list of chunk sizes, with max size chunkSize
*/
fun chunkSizes(total: Int, chunkSize: Int): IntArray {
val full = total / chunkSize
val remainder = total % chunkSize
return buildList {
repeat(full) { add(chunkSize) }
if (remainder != 0) add(remainder)
}.toIntArray()
}

View File

@ -8,15 +8,13 @@ import StandardFrames
import TestCase
import aci
import asList
import chunkSizes
import nullable
import okio.ByteString.Companion.toByteString
import oneOf
import org.thoughtcrime.securesms.backup.v2.proto.*
import pni
import toByteString
import kotlin.time.Duration.Companion.days
import kotlin.time.Duration.Companion.minutes
import kotlin.time.Duration.Companion.seconds
/**
* Reasonable permutations of [GroupChangeChatMultipleUpdate] objects.
@ -114,12 +112,6 @@ object ChatItemGroupChangeChatMultipleUpdateTestCase : TestCase("chat_item_group
inviteeCount = some(Generators.ints(1, 3))
)
},
// groupMemberJoinedUpdateGenerator,
Generators.permutation {
frames += GroupMemberJoinedUpdate(
newMemberAci = some(peopleNotInGroupGenerator())
)
},
// groupMemberAddedUpdateGenerator,
Generators.permutation {
val inviter = some(groupMembersExcludingSelfGenerator().nullable())
@ -134,7 +126,7 @@ object ChatItemGroupChangeChatMultipleUpdateTestCase : TestCase("chat_item_group
// groupSelfInvitationRevokedUpdateGenerator,
Generators.permutation {
frames += GroupSelfInvitationRevokedUpdate(
revokerAci = some(groupMembersExcludingSelfGenerator())
revokerAci = StandardFrames.SELF_ACI.toByteString()
)
},
// groupInvitationRevokedUpdateGenerator,
@ -167,7 +159,7 @@ object ChatItemGroupChangeChatMultipleUpdateTestCase : TestCase("chat_item_group
// groupJoinRequestCanceledUpdateGenerator,
Generators.permutation {
frames += GroupJoinRequestCanceledUpdate(
requestorAci = some(peopleNotInGroupGenerator())
requestorAci = StandardFrames.SELF_ACI.toByteString()
)
},
// groupInviteLinkResetUpdateGenerator,
@ -199,37 +191,32 @@ object ChatItemGroupChangeChatMultipleUpdateTestCase : TestCase("chat_item_group
// groupMemberJoinedByLinkUpdateGenerator,
Generators.permutation {
frames += GroupMemberJoinedByLinkUpdate(
newMemberAci = some(Generators.list(StandardFrames.recipientCarol.aci, StandardFrames.recipientDan.aci))
newMemberAci = StandardFrames.SELF_ACI.toByteString()
)
},
// groupV2MigrationUpdateGenerator,
Generators.single(GroupV2MigrationUpdate()),
// groupSequenceOfRequestsAndCancelsUpdateGenerator,
Generators.permutation {
frames += GroupSequenceOfRequestsAndCancelsUpdate(
requestorAci = StandardFrames.SELF_ACI.toByteString(),
count = some(Generators.ints(1, 5))
)
}
)
val listOfMigrationGenerators = oneOf(
// groupV2MigrationSelfInvitedUpdateGenerator,
Generators.single(GroupV2MigrationSelfInvitedUpdate()),
// groupV2MigrationInvitedMembersUpdateGenerator,
Generators.permutation {
frames += GroupV2MigrationInvitedMembersUpdate(
invitedMembersCount = some(Generators.ints(1, 5))
invitedMembersCount = 2
)
},
// groupV2MigrationDroppedMembersUpdateGenerator,
Generators.permutation {
frames += GroupV2MigrationDroppedMembersUpdate(
droppedMembersCount = some(Generators.ints(1, 5))
)
},
// groupSequenceOfRequestsAndCancelsUpdateGenerator,
Generators.permutation {
frames += GroupSequenceOfRequestsAndCancelsUpdate(
requestorAci = some(groupMembersExcludingSelfGenerator()),
count = some(Generators.ints(1, 5))
)
},
// groupExpirationTimerUpdateGenerator
Generators.permutation {
frames += GroupExpirationTimerUpdate(
updaterAci = updaterAci,
expiresInMs = some(Generators.longs(lower = 5.minutes.inWholeSeconds, upper = 28.days.inWholeSeconds)).seconds.inWholeMilliseconds
droppedMembersCount = 3
)
}
)
@ -245,24 +232,18 @@ object ChatItemGroupChangeChatMultipleUpdateTestCase : TestCase("chat_item_group
val groupAdminStatusUpdateGenerator = listOfGenerators[8]
val groupMemberRemovedUpdateGenerator = listOfGenerators[9]
val groupUnknownInviteeUpdateGenerator = listOfGenerators[10]
val groupMemberJoinedUpdateGenerator = listOfGenerators[11]
val groupMemberAddedUpdateGenerator = listOfGenerators[12]
val groupSelfInvitationRevokedUpdateGenerator = listOfGenerators[13]
val groupInvitationRevokedUpdateGenerator = listOfGenerators[14]
val groupJoinRequestUpdateGenerator = listOfGenerators[15]
val groupJoinRequestApprovalUpdateGenerator = listOfGenerators[16]
val groupJoinRequestCanceledUpdateGenerator = listOfGenerators[17]
val groupInviteLinkResetUpdateGenerator = listOfGenerators[18]
val groupInviteLinkEnabledUpdateGenerator = listOfGenerators[19]
val groupInviteLinkAdminApprovalUpdateGenerator = listOfGenerators[20]
val groupInviteLinkDisabledUpdateGenerator = listOfGenerators[21]
val groupMemberJoinedByLinkUpdateGenerator = listOfGenerators[22]
val groupV2MigrationUpdateGenerator = listOfGenerators[23]
val groupV2MigrationSelfInvitedUpdateGenerator = listOfGenerators[24]
val groupV2MigrationInvitedMembersUpdateGenerator = listOfGenerators[25]
val groupV2MigrationDroppedMembersUpdateGenerator = listOfGenerators[26]
val groupSequenceOfRequestsAndCancelsUpdateGenerator = listOfGenerators[27]
val groupExpirationTimerUpdateGenerator = listOfGenerators[28]
val groupMemberAddedUpdateGenerator = listOfGenerators[11]
val groupSelfInvitationRevokedUpdateGenerator = listOfGenerators[12]
val groupInvitationRevokedUpdateGenerator = listOfGenerators[13]
val groupJoinRequestUpdateGenerator = listOfGenerators[14]
val groupJoinRequestApprovalUpdateGenerator = listOfGenerators[15]
val groupJoinRequestCanceledUpdateGenerator = listOfGenerators[16]
val groupInviteLinkResetUpdateGenerator = listOfGenerators[17]
val groupInviteLinkEnabledUpdateGenerator = listOfGenerators[18]
val groupInviteLinkAdminApprovalUpdateGenerator = listOfGenerators[19]
val groupInviteLinkDisabledUpdateGenerator = listOfGenerators[20]
val groupMemberJoinedByLinkUpdateGenerator = listOfGenerators[21]
val groupSequenceOfRequestsAndCancelsUpdateGenerator = listOfGenerators[22]
val updates = Generators.permutation<GroupChangeChatUpdate.Update> {
frames += GroupChangeChatUpdate.Update(
@ -277,7 +258,6 @@ object ChatItemGroupChangeChatMultipleUpdateTestCase : TestCase("chat_item_group
groupAdminStatusUpdate = someOneOf(groupAdminStatusUpdateGenerator),
groupMemberRemovedUpdate = someOneOf(groupMemberRemovedUpdateGenerator),
groupUnknownInviteeUpdate = someOneOf(groupUnknownInviteeUpdateGenerator),
groupMemberJoinedUpdate = someOneOf(groupMemberJoinedUpdateGenerator),
groupMemberAddedUpdate = someOneOf(groupMemberAddedUpdateGenerator),
groupSelfInvitationRevokedUpdate = someOneOf(groupSelfInvitationRevokedUpdateGenerator),
groupInvitationRevokedUpdate = someOneOf(groupInvitationRevokedUpdateGenerator),
@ -289,14 +269,26 @@ object ChatItemGroupChangeChatMultipleUpdateTestCase : TestCase("chat_item_group
groupInviteLinkAdminApprovalUpdate = someOneOf(groupInviteLinkAdminApprovalUpdateGenerator),
groupInviteLinkDisabledUpdate = someOneOf(groupInviteLinkDisabledUpdateGenerator),
groupMemberJoinedByLinkUpdate = someOneOf(groupMemberJoinedByLinkUpdateGenerator),
groupV2MigrationUpdate = someOneOf(groupV2MigrationUpdateGenerator),
groupV2MigrationSelfInvitedUpdate = someOneOf(groupV2MigrationSelfInvitedUpdateGenerator),
groupV2MigrationInvitedMembersUpdate = someOneOf(groupV2MigrationInvitedMembersUpdateGenerator),
groupV2MigrationDroppedMembersUpdate = someOneOf(groupV2MigrationDroppedMembersUpdateGenerator),
groupSequenceOfRequestsAndCancelsUpdate = someOneOf(groupSequenceOfRequestsAndCancelsUpdateGenerator),
groupExpirationTimerUpdate = someOneOf(groupExpirationTimerUpdateGenerator)
groupSequenceOfRequestsAndCancelsUpdate = someOneOf(groupSequenceOfRequestsAndCancelsUpdateGenerator)
)
}
// Migration update messages should not be mixed with other types of update messages
val groupV2MigrationSelfInvitedUpdateGenerator = listOfMigrationGenerators[0]
val groupV2MigrationInvitedMembersUpdateGenerator = listOfMigrationGenerators[1]
val groupV2MigrationDroppedMembersUpdateGenerator = listOfMigrationGenerators[2]
val migrationUpdates = Generators.permutation<GroupChangeChatUpdate.Update> {
frames += GroupChangeChatUpdate.Update(
groupV2MigrationSelfInvitedUpdate = someOneOf(groupV2MigrationSelfInvitedUpdateGenerator),
groupV2MigrationInvitedMembersUpdate = someOneOf(groupV2MigrationInvitedMembersUpdateGenerator),
groupV2MigrationDroppedMembersUpdate = someOneOf(groupV2MigrationDroppedMembersUpdateGenerator)
)
}
val multipleUpdatesGenerator = updates.asList(*chunkSizes(updates.minSize, 3))
val multipleMigrationUpdatesGenerator = migrationUpdates.asList(*chunkSizes(migrationUpdates.minSize, 3))
frames += Frame(
chatItem = ChatItem(
chatId = StandardFrames.chatGroupAB.chat!!.id,
@ -305,7 +297,7 @@ object ChatItemGroupChangeChatMultipleUpdateTestCase : TestCase("chat_item_group
directionless = ChatItem.DirectionlessMessageDetails(),
updateMessage = ChatUpdateMessage(
groupChange = GroupChangeChatUpdate(
updates = updates.asList(*List(updates.minSize / 3) { 3 }.toIntArray()).let { some(it) }
updates = some(Generators.merge(multipleUpdatesGenerator, multipleMigrationUpdatesGenerator))
)
)
)

View File

@ -1,5 +1,3 @@
@file:Suppress("UNCHECKED_CAST")
package tests
import Generators
@ -7,7 +5,6 @@ import PermutationScope
import StandardFrames
import TestCase
import aci
import asList
import nullable
import okio.ByteString.Companion.toByteString
import oneOf
@ -32,235 +29,293 @@ object ChatItemGroupChangeChatUpdateTestCase : TestCase("chat_item_group_change_
frames += StandardFrames.recipientGroupAB
frames += StandardFrames.chatGroupAB
val groupMembersExcludingSelfGenerator = { Generators.list(StandardFrames.recipientAlice.aci, StandardFrames.recipientBob.aci) }
val peopleNotInGroupGenerator = { Generators.list(StandardFrames.recipientCarol.aci, StandardFrames.recipientDan.aci) }
val groupMembersExcludingSelfGenerator = { Generators.list(StandardFrames.recipientAlice, StandardFrames.recipientBob) }
val peopleNotInGroupGenerator = { Generators.list(StandardFrames.recipientCarol, StandardFrames.recipientDan) }
val updaters = mutableListOf<Frame>()
val listOfGenerators = oneOf(
// genericGroupUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GenericGroupUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator())
updaterAci = updater.aci
)
updaters.add(updater)
},
// groupCreationUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupCreationUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator())
updaterAci = updater.aci
)
updaters.add(updater)
},
// groupNameUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupNameUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
updaterAci = updater.aci,
newGroupName = some(Generators.titles().nullable())
)
updaters.add(updater)
},
// groupAvatarUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupAvatarUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
updaterAci = updater.aci,
wasRemoved = someBoolean()
)
updaters.add(updater)
},
// groupDescriptionUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupDescriptionUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
updaterAci = updater.aci,
newDescription = some(Generators.textBody().nullable())
)
updaters.add(updater)
},
// groupMembershipAccessLevelChangeUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupMembershipAccessLevelChangeUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
updaterAci = updater.aci,
accessLevel = someEnum(GroupV2AccessLevel::class.java, excluding = listOf(GroupV2AccessLevel.UNKNOWN, GroupV2AccessLevel.UNSATISFIABLE))
)
updaters.add(updater)
},
// groupAttributesAccessLevelChangeUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupAttributesAccessLevelChangeUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
updaterAci = updater.aci,
accessLevel = someEnum(GroupV2AccessLevel::class.java, listOf(GroupV2AccessLevel.UNKNOWN, GroupV2AccessLevel.UNSATISFIABLE))
)
updaters.add(updater)
},
// groupAnnouncementOnlyChangeUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupAnnouncementOnlyChangeUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
updaterAci = updater.aci,
isAnnouncementOnly = someBoolean()
)
updaters.add(updater)
},
// groupAdminStatusUpdateGenerator,
Generators.permutation {
frames += GroupAdminStatusUpdate(
updaterAci = StandardFrames.SELF_ACI.toByteString(),
memberAci = some(groupMembersExcludingSelfGenerator()),
memberAci = some(groupMembersExcludingSelfGenerator()).aci,
wasAdminStatusGranted = someBoolean()
)
updaters.add(StandardFrames.recipientSelf)
},
// groupMemberLeftUpdateGenerator,
Generators.permutation {
frames += GroupMemberLeftUpdate(
aci = some(groupMembersExcludingSelfGenerator())
aci = some(groupMembersExcludingSelfGenerator()).aci
)
updaters.add(StandardFrames.recipientSelf)
},
// groupMemberRemovedUpdateGenerator,
Generators.permutation {
frames += GroupMemberRemovedUpdate(
removerAci = StandardFrames.SELF_ACI.toByteString(),
removedAci = some(groupMembersExcludingSelfGenerator())
removedAci = some(groupMembersExcludingSelfGenerator()).aci
)
updaters.add(StandardFrames.recipientSelf)
},
// selfInvitedToGroupUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += SelfInvitedToGroupUpdate(
inviterAci = some(groupMembersExcludingSelfGenerator())
inviterAci = updater.aci
)
updaters.add(updater)
},
// selfInvitedOtherUserToGroupUpdateGenerator,
Generators.permutation {
frames += SelfInvitedOtherUserToGroupUpdate(
inviteeServiceId = some(groupMembersExcludingSelfGenerator())
inviteeServiceId = some(groupMembersExcludingSelfGenerator()).aci
)
updaters.add(StandardFrames.recipientSelf)
},
// groupUnknownInviteeUpdateGenerator,
Generators.permutation {
frames += GroupUnknownInviteeUpdate(
inviterAci = some(groupMembersExcludingSelfGenerator()),
inviterAci = some(groupMembersExcludingSelfGenerator()).aci,
inviteeCount = some(Generators.ints(1, 3))
)
updaters.add(StandardFrames.recipientSelf)
},
// groupInvitationAcceptedUpdateGenerator,
Generators.permutation {
frames += GroupInvitationAcceptedUpdate(
inviterAci = some(groupMembersExcludingSelfGenerator()),
newMemberAci = some(peopleNotInGroupGenerator())
inviterAci = some(groupMembersExcludingSelfGenerator()).aci,
newMemberAci = some(peopleNotInGroupGenerator()).aci
)
updaters.add(StandardFrames.recipientSelf)
},
// groupInvitationDeclinedUpdateGenerator,
Generators.permutation {
frames += GroupInvitationDeclinedUpdate(
inviterAci = some(groupMembersExcludingSelfGenerator()),
inviteeAci = some(peopleNotInGroupGenerator().nullable())
inviterAci = some(groupMembersExcludingSelfGenerator()).aci,
inviteeAci = some(peopleNotInGroupGenerator().nullable())?.aci
)
updaters.add(StandardFrames.recipientSelf)
},
// groupMemberJoinedUpdateGenerator,
Generators.permutation {
frames += GroupMemberJoinedUpdate(
newMemberAci = some(peopleNotInGroupGenerator())
newMemberAci = some(peopleNotInGroupGenerator()).aci
)
updaters.add(StandardFrames.recipientSelf)
},
// groupMemberAddedUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
val inviter = some(groupMembersExcludingSelfGenerator().nullable())
val hadOpenInvitation = someBoolean()
frames += GroupMemberAddedUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
newMemberAci = some(peopleNotInGroupGenerator()),
updaterAci = updater.aci,
newMemberAci = some(peopleNotInGroupGenerator()).aci,
hadOpenInvitation = if (inviter != null) true else hadOpenInvitation,
inviterAci = inviter
inviterAci = inviter?.aci
)
updaters.add(updater)
},
// groupSelfInvitationRevokedUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupSelfInvitationRevokedUpdate(
revokerAci = some(groupMembersExcludingSelfGenerator())
revokerAci = updater.aci
)
updaters.add(updater)
},
// groupInvitationRevokedUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupInvitationRevokedUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
updaterAci = updater.aci,
invitees = listOf(
GroupInvitationRevokedUpdate.Invitee(
inviterAci = some(groupMembersExcludingSelfGenerator()),
inviterAci = some(groupMembersExcludingSelfGenerator()).aci,
inviteeAci = some(Generators.list(StandardFrames.recipientCarol.aci, null)),
inviteePni = some(Generators.list(null, StandardFrames.recipientCarol.pni))
)
)
)
updaters.add(updater)
},
// groupJoinRequestUpdateGenerator,
Generators.permutation {
val updater = some(peopleNotInGroupGenerator())
frames += GroupJoinRequestUpdate(
requestorAci = some(peopleNotInGroupGenerator())
requestorAci = updater.aci
)
updaters.add(updater)
},
// groupJoinRequestApprovalUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupJoinRequestApprovalUpdate(
requestorAci = some(peopleNotInGroupGenerator()),
updaterAci = some(groupMembersExcludingSelfGenerator()),
requestorAci = some(peopleNotInGroupGenerator()).aci,
updaterAci = updater.aci,
wasApproved = someBoolean()
)
updaters.add(updater)
},
// groupJoinRequestCanceledUpdateGenerator,
Generators.permutation {
frames += GroupJoinRequestCanceledUpdate(
requestorAci = some(peopleNotInGroupGenerator())
requestorAci = some(peopleNotInGroupGenerator()).aci
)
updaters.add(StandardFrames.recipientSelf)
},
// groupInviteLinkResetUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupInviteLinkResetUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator())
updaterAci = updater.aci
)
updaters.add(updater)
},
// groupInviteLinkEnabledUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupInviteLinkEnabledUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
updaterAci = updater.aci,
linkRequiresAdminApproval = someBoolean()
)
updaters.add(updater)
},
// groupInviteLinkAdminApprovalUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupInviteLinkAdminApprovalUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
updaterAci = updater.aci,
linkRequiresAdminApproval = someBoolean()
)
updaters.add(updater)
},
// groupInviteLinkDisabledUpdateGenerator,
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupInviteLinkDisabledUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator())
updaterAci = updater.aci
)
updaters.add(updater)
},
// groupMemberJoinedByLinkUpdateGenerator,
Generators.permutation {
frames += GroupMemberJoinedByLinkUpdate(
newMemberAci = some(Generators.list(StandardFrames.recipientCarol.aci, StandardFrames.recipientDan.aci))
)
updaters.add(StandardFrames.recipientSelf)
},
// groupV2MigrationUpdateGenerator,
Generators.single(GroupV2MigrationUpdate()),
Generators.permutation {
frames += GroupV2MigrationUpdate()
updaters.add(StandardFrames.recipientSelf)
},
// groupV2MigrationSelfInvitedUpdateGenerator,
Generators.single(GroupV2MigrationSelfInvitedUpdate()),
Generators.permutation {
frames += GroupV2MigrationSelfInvitedUpdate()
updaters.add(StandardFrames.recipientSelf)
},
// groupV2MigrationInvitedMembersUpdateGenerator,
Generators.permutation {
frames += GroupV2MigrationInvitedMembersUpdate(
invitedMembersCount = some(Generators.ints(1, 5))
)
updaters.add(StandardFrames.recipientSelf)
},
// groupV2MigrationDroppedMembersUpdateGenerator,
Generators.permutation {
frames += GroupV2MigrationDroppedMembersUpdate(
droppedMembersCount = some(Generators.ints(1, 5))
)
updaters.add(StandardFrames.recipientSelf)
},
// groupSequenceOfRequestsAndCancelsUpdateGenerator,
Generators.permutation {
frames += GroupSequenceOfRequestsAndCancelsUpdate(
requestorAci = some(groupMembersExcludingSelfGenerator()),
requestorAci = some(groupMembersExcludingSelfGenerator()).aci,
count = some(Generators.ints(1, 5))
)
updaters.add(StandardFrames.recipientSelf)
},
// groupExpirationTimerUpdateGenerator
Generators.permutation {
val updater = some(groupMembersExcludingSelfGenerator())
frames += GroupExpirationTimerUpdate(
updaterAci = some(groupMembersExcludingSelfGenerator()),
updaterAci = updater.aci,
expiresInMs = some(Generators.longs(lower = 5.minutes.inWholeSeconds, upper = 28.days.inWholeSeconds)).seconds.inWholeMilliseconds
)
updaters.add(updater)
}
)
@ -336,15 +391,24 @@ object ChatItemGroupChangeChatUpdateTestCase : TestCase("chat_item_group_change_
groupExpirationTimerUpdate = someOneOf(groupExpirationTimerUpdateGenerator)
)
}
val update = some(updatesGenerator)
val updater = some(Generators.list(updaters))
val updatersSize = updaters.size
val updatesSize = updatesGenerator.minSize
println(updatersSize)
require(updatersSize == updatesSize) { "Every update frame must specify an updater. Frames: $updatesSize, updaters: $updatersSize." }
frames += Frame(
chatItem = ChatItem(
chatId = StandardFrames.chatGroupAB.chat!!.id,
authorId = StandardFrames.recipientSelf.recipient!!.id,
authorId = updater.recipient?.id ?: StandardFrames.recipientSelf.recipient!!.id,
dateSent = someNonZeroTimestamp(),
directionless = ChatItem.DirectionlessMessageDetails(),
updateMessage = ChatUpdateMessage(
groupChange = GroupChangeChatUpdate(
updates = updatesGenerator.asList(*List(updatesGenerator.minSize) { 1 }.toIntArray()).let { some(it) }
updates = listOf(update)
)
)
)

View File

@ -239,7 +239,7 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
dateSent = 1824414820669
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {

View File

@ -239,7 +239,7 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1776491210910
dateSent = 1853750641458
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {

View File

@ -239,7 +239,7 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
dateSent = 1824414820669
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {

View File

@ -239,7 +239,7 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1776491210910
dateSent = 1853750641458
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {

View File

@ -239,7 +239,7 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
dateSent = 1824414820669
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {

View File

@ -239,7 +239,7 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1776491210910
dateSent = 1853750641458
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {

View File

@ -239,7 +239,7 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
dateSent = 1824414820669
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {

View File

@ -239,7 +239,7 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1776491210910
dateSent = 1853750641458
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {

View File

@ -239,7 +239,7 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
dateSent = 1824414820669
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {

View File

@ -239,23 +239,29 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1776491210910
dateSent = 1853750641458
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupMemberJoinedUpdate = GroupMemberJoinedUpdate {
groupMemberAddedUpdate = GroupMemberAddedUpdate {
newMemberAci = <0000ca01000040008000000000000001>
}
},
Update {
groupMemberJoinedUpdate = GroupMemberJoinedUpdate {
newMemberAci = <000000da000040008000000000000001>
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupMemberAddedUpdate = GroupMemberAddedUpdate {
hadOpenInvitation = true
inviterAci = <000a11ce000040008000000000000001>
newMemberAci = <000000da000040008000000000000001>
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupMemberAddedUpdate = GroupMemberAddedUpdate {
hadOpenInvitation = true
inviterAci = <00000b0b000040008000000000000001>
newMemberAci = <0000ca01000040008000000000000001>
updaterAci = <00000000000040008000000000000001>
}

View File

@ -239,30 +239,36 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
dateSent = 1824414820669
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupMemberAddedUpdate = GroupMemberAddedUpdate {
hadOpenInvitation = true
inviterAci = <000a11ce000040008000000000000001>
newMemberAci = <000000da000040008000000000000001>
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupMemberAddedUpdate = GroupMemberAddedUpdate {
hadOpenInvitation = true
inviterAci = <00000b0b000040008000000000000001>
newMemberAci = <0000ca01000040008000000000000001>
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupSelfInvitationRevokedUpdate = GroupSelfInvitationRevokedUpdate {
revokerAci = <000a11ce000040008000000000000001>
revokerAci = <00000000000040008000000000000001>
}
},
Update {
groupInvitationRevokedUpdate = GroupInvitationRevokedUpdate {
invitees = [
Invitee {
inviteeAci = <0000ca01000040008000000000000001>
inviterAci = <000a11ce000040008000000000000001>
}
]
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupInvitationRevokedUpdate = GroupInvitationRevokedUpdate {
invitees = [
Invitee {
inviteePni = <0000ca01000040008000000000000002>
inviterAci = <00000b0b000040008000000000000001>
}
]
updaterAci = <00000000000040008000000000000001>
}
}
]

View File

@ -239,36 +239,26 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1776491210910
dateSent = 1853750641458
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupSelfInvitationRevokedUpdate = GroupSelfInvitationRevokedUpdate {
revokerAci = <00000b0b000040008000000000000001>
groupJoinRequestUpdate = GroupJoinRequestUpdate {
requestorAci = <0000ca01000040008000000000000001>
}
},
Update {
groupInvitationRevokedUpdate = GroupInvitationRevokedUpdate {
invitees = [
Invitee {
inviteeAci = <0000ca01000040008000000000000001>
inviterAci = <000a11ce000040008000000000000001>
}
]
updaterAci = <00000000000040008000000000000001>
groupJoinRequestUpdate = GroupJoinRequestUpdate {
requestorAci = <000000da000040008000000000000001>
}
},
Update {
groupInvitationRevokedUpdate = GroupInvitationRevokedUpdate {
invitees = [
Invitee {
inviteePni = <0000ca01000040008000000000000002>
inviterAci = <00000b0b000040008000000000000001>
}
]
groupJoinRequestApprovalUpdate = GroupJoinRequestApprovalUpdate {
requestorAci = <0000ca01000040008000000000000001>
updaterAci = <00000000000040008000000000000001>
wasApproved = true
}
}
]

View File

@ -239,26 +239,25 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
dateSent = 1824414820669
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupJoinRequestUpdate = GroupJoinRequestUpdate {
requestorAci = <0000ca01000040008000000000000001>
}
},
Update {
groupJoinRequestUpdate = GroupJoinRequestUpdate {
requestorAci = <000000da000040008000000000000001>
}
},
Update {
groupJoinRequestApprovalUpdate = GroupJoinRequestApprovalUpdate {
requestorAci = <0000ca01000040008000000000000001>
requestorAci = <000000da000040008000000000000001>
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupJoinRequestCanceledUpdate = GroupJoinRequestCanceledUpdate {
requestorAci = <00000000000040008000000000000001>
}
},
Update {
groupInviteLinkResetUpdate = GroupInviteLinkResetUpdate {
updaterAci = <00000000000040008000000000000001>
wasApproved = true
}
}
]

View File

@ -239,25 +239,26 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1776491210910
dateSent = 1853750641458
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupJoinRequestApprovalUpdate = GroupJoinRequestApprovalUpdate {
requestorAci = <000000da000040008000000000000001>
groupInviteLinkEnabledUpdate = GroupInviteLinkEnabledUpdate {
linkRequiresAdminApproval = true
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupJoinRequestCanceledUpdate = GroupJoinRequestCanceledUpdate {
requestorAci = <0000ca01000040008000000000000001>
groupInviteLinkEnabledUpdate = GroupInviteLinkEnabledUpdate {
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupJoinRequestCanceledUpdate = GroupJoinRequestCanceledUpdate {
requestorAci = <000000da000040008000000000000001>
groupInviteLinkAdminApprovalUpdate = GroupInviteLinkAdminApprovalUpdate {
linkRequiresAdminApproval = true
updaterAci = <00000000000040008000000000000001>
}
}
]

View File

@ -239,25 +239,24 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
dateSent = 1824414820669
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupInviteLinkResetUpdate = GroupInviteLinkResetUpdate {
groupInviteLinkAdminApprovalUpdate = GroupInviteLinkAdminApprovalUpdate {
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupInviteLinkEnabledUpdate = GroupInviteLinkEnabledUpdate {
linkRequiresAdminApproval = true
groupInviteLinkDisabledUpdate = GroupInviteLinkDisabledUpdate {
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupInviteLinkEnabledUpdate = GroupInviteLinkEnabledUpdate {
updaterAci = <00000000000040008000000000000001>
groupMemberJoinedByLinkUpdate = GroupMemberJoinedByLinkUpdate {
newMemberAci = <00000000000040008000000000000001>
}
}
]

View File

@ -239,25 +239,27 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1776491210910
dateSent = 1853750641458
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupInviteLinkAdminApprovalUpdate = GroupInviteLinkAdminApprovalUpdate {
linkRequiresAdminApproval = true
updaterAci = <00000000000040008000000000000001>
groupSequenceOfRequestsAndCancelsUpdate = GroupSequenceOfRequestsAndCancelsUpdate {
count = 4
requestorAci = <00000000000040008000000000000001>
}
},
Update {
groupInviteLinkAdminApprovalUpdate = GroupInviteLinkAdminApprovalUpdate {
updaterAci = <00000000000040008000000000000001>
groupSequenceOfRequestsAndCancelsUpdate = GroupSequenceOfRequestsAndCancelsUpdate {
count = 1
requestorAci = <00000000000040008000000000000001>
}
},
Update {
groupInviteLinkDisabledUpdate = GroupInviteLinkDisabledUpdate {
updaterAci = <00000000000040008000000000000001>
groupSequenceOfRequestsAndCancelsUpdate = GroupSequenceOfRequestsAndCancelsUpdate {
count = 4
requestorAci = <00000000000040008000000000000001>
}
}
]

View File

@ -239,23 +239,23 @@ Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
dateSent = 1824414820669
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupMemberJoinedByLinkUpdate = GroupMemberJoinedByLinkUpdate {
newMemberAci = <0000ca01000040008000000000000001>
groupV2MigrationSelfInvitedUpdate = GroupV2MigrationSelfInvitedUpdate {}
},
Update {
groupV2MigrationInvitedMembersUpdate = GroupV2MigrationInvitedMembersUpdate {
invitedMembersCount = 2
}
},
Update {
groupMemberJoinedByLinkUpdate = GroupMemberJoinedByLinkUpdate {
newMemberAci = <000000da000040008000000000000001>
groupV2MigrationDroppedMembersUpdate = GroupV2MigrationDroppedMembersUpdate {
droppedMembersCount = 3
}
},
Update {
groupV2MigrationUpdate = GroupV2MigrationUpdate {}
}
]
}

View File

@ -1,264 +0,0 @@
// This file was auto-generated! It's only meant to show you what's in the .binproto. Do not edit!
BackupInfo {
backupTimeMs = 1715636551000
currentAppVersion = "FooClient 2.0.0"
debugInfo = <>
firstAppVersion = "FooClient 1.0.0"
mediaRootBackupKey = <8fba3ce1946b78a4ca0d9229ddb050a12702072309d6574ae12451269e5fdbb2>
version = 1
}
Frame {
account = AccountData {
accountSettings = AccountSettings {
customChatColors = [
CustomChatColor {
id = 1
solid = -16777216
},
CustomChatColor {
id = 2
solid = -65536
},
CustomChatColor {
id = 3
solid = -16711936
}
]
displayBadgesOnProfile = true
hasCompletedUsernameOnboarding = true
hasSeenGroupStoryEducationSheet = true
hasSetMyStoriesPrivacy = true
hasViewedOnboardingStory = true
keepMutedChatsArchived = true
linkPreviews = true
notDiscoverableByPhoneNumber = true
phoneNumberSharingMode = PhoneNumberSharingMode.NOBODY
preferContactAvatars = true
preferredReactionEmoji = [
"a",
"b",
"c"
]
readReceipts = true
sealedSenderIndicators = true
storiesDisabled = true
storyViewReceiptsEnabled = true
typingIndicators = true
universalExpireTimerSeconds = 3600
}
avatarUrlPath = ""
donationSubscriberData = SubscriberData {
currencyCode = "USD"
manuallyCancelled = true
subscriberId = <ecbb68c734331a2ea333cda747c98c4553652261582b4fce5ae0dea84dce6519>
}
familyName = "Fett"
givenName = "Boba"
profileKey = <610291abedc34249489da39a31c9a5cd99cdd26ff58732e268e357ee0075d9d8>
svrPin = ""
username = "boba_fett.66"
usernameLink = UsernameLink {
color = Color.OLIVE
entropy = <65675c73d00eb01005e3bb7c4a47f296cb6554f78981238815e915d824fd2e93>
serverId = <61c101a200d5421789c20518d8497af0>
}
}
}
Frame {
recipient = Recipient {
id = 1
self = Self {
avatarColor = AvatarColor.A210
}
}
}
Frame {
recipient = Recipient {
id = 2
releaseNotes = ReleaseNotes {}
}
}
Frame {
recipient = Recipient {
distributionList = DistributionListItem {
distributionId = <00000000000000000000000000000000>
distributionList = DistributionList {
name = ""
privacyMode = PrivacyMode.ALL
}
}
id = 3
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <000a11ce000040008000000000000001>
avatarColor = AvatarColor.A110
e164 = 16105550101
identityKey = <05ea7585ab4f6de1913af6059f69b50ad26c55af2779e31bde58dec8ba165e164e>
identityState = IdentityState.DEFAULT
note = ""
pni = <000a11ce000040008000000000000002>
profileFamilyName = "Smith"
profileGivenName = "Alice"
profileKey = <d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 4
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <00000b0b000040008000000000000001>
avatarColor = AvatarColor.A120
e164 = 16105550102
identityKey = <052dde6c6dcfaf0ffdcbc5e2eac90e5a18c26969907c942eade3a0e345948be27e>
identityState = IdentityState.VERIFIED
note = ""
pni = <00000b0b000040008000000000000002>
profileFamilyName = "Jones"
profileGivenName = "Bob"
profileKey = <0410410410410410410410410410410410410410410410410410410410410410>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 5
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <0000ca01000040008000000000000001>
avatarColor = AvatarColor.A130
e164 = 16105550103
identityKey = <05463769b7ab7a38be2cbfa7e8cff7e37cbb32770d762370c55cfbe82346593f54>
identityState = IdentityState.UNVERIFIED
note = ""
pni = <0000ca01000040008000000000000002>
profileFamilyName = "Johnson"
profileGivenName = "Carol"
profileKey = <0820820820820820820820820820820820820820820820820820820820820820>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 6
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <000000da000040008000000000000001>
avatarColor = AvatarColor.A140
e164 = 16105550104
identityKey = <059e10072ee327212377ef4c442843b426ea4a1f16a029c23c9d028be4f513a97c>
identityState = IdentityState.DEFAULT
note = ""
pni = <000000da000040008000000000000002>
profileFamilyName = "Brown"
profileGivenName = "Dan"
profileKey = <0c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 7
}
}
Frame {
recipient = Recipient {
group = Group {
avatarColor = AvatarColor.A170
masterKey = <0000000000000000000000000000000000000000000000000000000000000000>
snapshot = GroupSnapshot {
accessControl = AccessControl {
addFromInviteLink = AccessRequired.UNSATISFIABLE
attributes = AccessRequired.MEMBER
members = AccessRequired.MEMBER
}
avatarUrl = "https://example.com/avatar.jpg"
inviteLinkPassword = <>
members = [
Member {
role = Role.ADMINISTRATOR
userId = <00000000000040008000000000000001>
},
Member {
role = Role.DEFAULT
userId = <000a11ce000040008000000000000001>
},
Member {
role = Role.DEFAULT
userId = <00000b0b000040008000000000000001>
}
]
title = GroupAttributeBlob {
title = "Me, Alice, Bob"
}
version = 1
}
storySendMode = StorySendMode.DEFAULT
whitelisted = true
}
id = 10
}
}
Frame {
chat = Chat {
expireTimerVersion = 1
id = 3
recipientId = 10
}
}
Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupV2MigrationSelfInvitedUpdate = GroupV2MigrationSelfInvitedUpdate {}
},
Update {
groupV2MigrationInvitedMembersUpdate = GroupV2MigrationInvitedMembersUpdate {
invitedMembersCount = 4
}
},
Update {
groupV2MigrationInvitedMembersUpdate = GroupV2MigrationInvitedMembersUpdate {
invitedMembersCount = 1
}
}
]
}
}
}
}

View File

@ -1,266 +0,0 @@
// This file was auto-generated! It's only meant to show you what's in the .binproto. Do not edit!
BackupInfo {
backupTimeMs = 1715636551000
currentAppVersion = "FooClient 2.0.0"
debugInfo = <>
firstAppVersion = "FooClient 1.0.0"
mediaRootBackupKey = <8fba3ce1946b78a4ca0d9229ddb050a12702072309d6574ae12451269e5fdbb2>
version = 1
}
Frame {
account = AccountData {
accountSettings = AccountSettings {
customChatColors = [
CustomChatColor {
id = 1
solid = -16777216
},
CustomChatColor {
id = 2
solid = -65536
},
CustomChatColor {
id = 3
solid = -16711936
}
]
displayBadgesOnProfile = true
hasCompletedUsernameOnboarding = true
hasSeenGroupStoryEducationSheet = true
hasSetMyStoriesPrivacy = true
hasViewedOnboardingStory = true
keepMutedChatsArchived = true
linkPreviews = true
notDiscoverableByPhoneNumber = true
phoneNumberSharingMode = PhoneNumberSharingMode.NOBODY
preferContactAvatars = true
preferredReactionEmoji = [
"a",
"b",
"c"
]
readReceipts = true
sealedSenderIndicators = true
storiesDisabled = true
storyViewReceiptsEnabled = true
typingIndicators = true
universalExpireTimerSeconds = 3600
}
avatarUrlPath = ""
donationSubscriberData = SubscriberData {
currencyCode = "USD"
manuallyCancelled = true
subscriberId = <ecbb68c734331a2ea333cda747c98c4553652261582b4fce5ae0dea84dce6519>
}
familyName = "Fett"
givenName = "Boba"
profileKey = <610291abedc34249489da39a31c9a5cd99cdd26ff58732e268e357ee0075d9d8>
svrPin = ""
username = "boba_fett.66"
usernameLink = UsernameLink {
color = Color.OLIVE
entropy = <65675c73d00eb01005e3bb7c4a47f296cb6554f78981238815e915d824fd2e93>
serverId = <61c101a200d5421789c20518d8497af0>
}
}
}
Frame {
recipient = Recipient {
id = 1
self = Self {
avatarColor = AvatarColor.A210
}
}
}
Frame {
recipient = Recipient {
id = 2
releaseNotes = ReleaseNotes {}
}
}
Frame {
recipient = Recipient {
distributionList = DistributionListItem {
distributionId = <00000000000000000000000000000000>
distributionList = DistributionList {
name = ""
privacyMode = PrivacyMode.ALL
}
}
id = 3
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <000a11ce000040008000000000000001>
avatarColor = AvatarColor.A110
e164 = 16105550101
identityKey = <05ea7585ab4f6de1913af6059f69b50ad26c55af2779e31bde58dec8ba165e164e>
identityState = IdentityState.DEFAULT
note = ""
pni = <000a11ce000040008000000000000002>
profileFamilyName = "Smith"
profileGivenName = "Alice"
profileKey = <d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 4
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <00000b0b000040008000000000000001>
avatarColor = AvatarColor.A120
e164 = 16105550102
identityKey = <052dde6c6dcfaf0ffdcbc5e2eac90e5a18c26969907c942eade3a0e345948be27e>
identityState = IdentityState.VERIFIED
note = ""
pni = <00000b0b000040008000000000000002>
profileFamilyName = "Jones"
profileGivenName = "Bob"
profileKey = <0410410410410410410410410410410410410410410410410410410410410410>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 5
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <0000ca01000040008000000000000001>
avatarColor = AvatarColor.A130
e164 = 16105550103
identityKey = <05463769b7ab7a38be2cbfa7e8cff7e37cbb32770d762370c55cfbe82346593f54>
identityState = IdentityState.UNVERIFIED
note = ""
pni = <0000ca01000040008000000000000002>
profileFamilyName = "Johnson"
profileGivenName = "Carol"
profileKey = <0820820820820820820820820820820820820820820820820820820820820820>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 6
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <000000da000040008000000000000001>
avatarColor = AvatarColor.A140
e164 = 16105550104
identityKey = <059e10072ee327212377ef4c442843b426ea4a1f16a029c23c9d028be4f513a97c>
identityState = IdentityState.DEFAULT
note = ""
pni = <000000da000040008000000000000002>
profileFamilyName = "Brown"
profileGivenName = "Dan"
profileKey = <0c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 7
}
}
Frame {
recipient = Recipient {
group = Group {
avatarColor = AvatarColor.A170
masterKey = <0000000000000000000000000000000000000000000000000000000000000000>
snapshot = GroupSnapshot {
accessControl = AccessControl {
addFromInviteLink = AccessRequired.UNSATISFIABLE
attributes = AccessRequired.MEMBER
members = AccessRequired.MEMBER
}
avatarUrl = "https://example.com/avatar.jpg"
inviteLinkPassword = <>
members = [
Member {
role = Role.ADMINISTRATOR
userId = <00000000000040008000000000000001>
},
Member {
role = Role.DEFAULT
userId = <000a11ce000040008000000000000001>
},
Member {
role = Role.DEFAULT
userId = <00000b0b000040008000000000000001>
}
]
title = GroupAttributeBlob {
title = "Me, Alice, Bob"
}
version = 1
}
storySendMode = StorySendMode.DEFAULT
whitelisted = true
}
id = 10
}
}
Frame {
chat = Chat {
expireTimerVersion = 1
id = 3
recipientId = 10
}
}
Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupV2MigrationInvitedMembersUpdate = GroupV2MigrationInvitedMembersUpdate {
invitedMembersCount = 4
}
},
Update {
groupV2MigrationDroppedMembersUpdate = GroupV2MigrationDroppedMembersUpdate {
droppedMembersCount = 1
}
},
Update {
groupV2MigrationDroppedMembersUpdate = GroupV2MigrationDroppedMembersUpdate {
droppedMembersCount = 2
}
}
]
}
}
}
}

View File

@ -1,268 +0,0 @@
// This file was auto-generated! It's only meant to show you what's in the .binproto. Do not edit!
BackupInfo {
backupTimeMs = 1715636551000
currentAppVersion = "FooClient 2.0.0"
debugInfo = <>
firstAppVersion = "FooClient 1.0.0"
mediaRootBackupKey = <8fba3ce1946b78a4ca0d9229ddb050a12702072309d6574ae12451269e5fdbb2>
version = 1
}
Frame {
account = AccountData {
accountSettings = AccountSettings {
customChatColors = [
CustomChatColor {
id = 1
solid = -16777216
},
CustomChatColor {
id = 2
solid = -65536
},
CustomChatColor {
id = 3
solid = -16711936
}
]
displayBadgesOnProfile = true
hasCompletedUsernameOnboarding = true
hasSeenGroupStoryEducationSheet = true
hasSetMyStoriesPrivacy = true
hasViewedOnboardingStory = true
keepMutedChatsArchived = true
linkPreviews = true
notDiscoverableByPhoneNumber = true
phoneNumberSharingMode = PhoneNumberSharingMode.NOBODY
preferContactAvatars = true
preferredReactionEmoji = [
"a",
"b",
"c"
]
readReceipts = true
sealedSenderIndicators = true
storiesDisabled = true
storyViewReceiptsEnabled = true
typingIndicators = true
universalExpireTimerSeconds = 3600
}
avatarUrlPath = ""
donationSubscriberData = SubscriberData {
currencyCode = "USD"
manuallyCancelled = true
subscriberId = <ecbb68c734331a2ea333cda747c98c4553652261582b4fce5ae0dea84dce6519>
}
familyName = "Fett"
givenName = "Boba"
profileKey = <610291abedc34249489da39a31c9a5cd99cdd26ff58732e268e357ee0075d9d8>
svrPin = ""
username = "boba_fett.66"
usernameLink = UsernameLink {
color = Color.OLIVE
entropy = <65675c73d00eb01005e3bb7c4a47f296cb6554f78981238815e915d824fd2e93>
serverId = <61c101a200d5421789c20518d8497af0>
}
}
}
Frame {
recipient = Recipient {
id = 1
self = Self {
avatarColor = AvatarColor.A210
}
}
}
Frame {
recipient = Recipient {
id = 2
releaseNotes = ReleaseNotes {}
}
}
Frame {
recipient = Recipient {
distributionList = DistributionListItem {
distributionId = <00000000000000000000000000000000>
distributionList = DistributionList {
name = ""
privacyMode = PrivacyMode.ALL
}
}
id = 3
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <000a11ce000040008000000000000001>
avatarColor = AvatarColor.A110
e164 = 16105550101
identityKey = <05ea7585ab4f6de1913af6059f69b50ad26c55af2779e31bde58dec8ba165e164e>
identityState = IdentityState.DEFAULT
note = ""
pni = <000a11ce000040008000000000000002>
profileFamilyName = "Smith"
profileGivenName = "Alice"
profileKey = <d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 4
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <00000b0b000040008000000000000001>
avatarColor = AvatarColor.A120
e164 = 16105550102
identityKey = <052dde6c6dcfaf0ffdcbc5e2eac90e5a18c26969907c942eade3a0e345948be27e>
identityState = IdentityState.VERIFIED
note = ""
pni = <00000b0b000040008000000000000002>
profileFamilyName = "Jones"
profileGivenName = "Bob"
profileKey = <0410410410410410410410410410410410410410410410410410410410410410>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 5
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <0000ca01000040008000000000000001>
avatarColor = AvatarColor.A130
e164 = 16105550103
identityKey = <05463769b7ab7a38be2cbfa7e8cff7e37cbb32770d762370c55cfbe82346593f54>
identityState = IdentityState.UNVERIFIED
note = ""
pni = <0000ca01000040008000000000000002>
profileFamilyName = "Johnson"
profileGivenName = "Carol"
profileKey = <0820820820820820820820820820820820820820820820820820820820820820>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 6
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <000000da000040008000000000000001>
avatarColor = AvatarColor.A140
e164 = 16105550104
identityKey = <059e10072ee327212377ef4c442843b426ea4a1f16a029c23c9d028be4f513a97c>
identityState = IdentityState.DEFAULT
note = ""
pni = <000000da000040008000000000000002>
profileFamilyName = "Brown"
profileGivenName = "Dan"
profileKey = <0c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 7
}
}
Frame {
recipient = Recipient {
group = Group {
avatarColor = AvatarColor.A170
masterKey = <0000000000000000000000000000000000000000000000000000000000000000>
snapshot = GroupSnapshot {
accessControl = AccessControl {
addFromInviteLink = AccessRequired.UNSATISFIABLE
attributes = AccessRequired.MEMBER
members = AccessRequired.MEMBER
}
avatarUrl = "https://example.com/avatar.jpg"
inviteLinkPassword = <>
members = [
Member {
role = Role.ADMINISTRATOR
userId = <00000000000040008000000000000001>
},
Member {
role = Role.DEFAULT
userId = <000a11ce000040008000000000000001>
},
Member {
role = Role.DEFAULT
userId = <00000b0b000040008000000000000001>
}
]
title = GroupAttributeBlob {
title = "Me, Alice, Bob"
}
version = 1
}
storySendMode = StorySendMode.DEFAULT
whitelisted = true
}
id = 10
}
}
Frame {
chat = Chat {
expireTimerVersion = 1
id = 3
recipientId = 10
}
}
Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupV2MigrationDroppedMembersUpdate = GroupV2MigrationDroppedMembersUpdate {
droppedMembersCount = 4
}
},
Update {
groupSequenceOfRequestsAndCancelsUpdate = GroupSequenceOfRequestsAndCancelsUpdate {
count = 1
requestorAci = <000a11ce000040008000000000000001>
}
},
Update {
groupSequenceOfRequestsAndCancelsUpdate = GroupSequenceOfRequestsAndCancelsUpdate {
count = 4
requestorAci = <00000b0b000040008000000000000001>
}
}
]
}
}
}
}

View File

@ -1,268 +0,0 @@
// This file was auto-generated! It's only meant to show you what's in the .binproto. Do not edit!
BackupInfo {
backupTimeMs = 1715636551000
currentAppVersion = "FooClient 2.0.0"
debugInfo = <>
firstAppVersion = "FooClient 1.0.0"
mediaRootBackupKey = <8fba3ce1946b78a4ca0d9229ddb050a12702072309d6574ae12451269e5fdbb2>
version = 1
}
Frame {
account = AccountData {
accountSettings = AccountSettings {
customChatColors = [
CustomChatColor {
id = 1
solid = -16777216
},
CustomChatColor {
id = 2
solid = -65536
},
CustomChatColor {
id = 3
solid = -16711936
}
]
displayBadgesOnProfile = true
hasCompletedUsernameOnboarding = true
hasSeenGroupStoryEducationSheet = true
hasSetMyStoriesPrivacy = true
hasViewedOnboardingStory = true
keepMutedChatsArchived = true
linkPreviews = true
notDiscoverableByPhoneNumber = true
phoneNumberSharingMode = PhoneNumberSharingMode.NOBODY
preferContactAvatars = true
preferredReactionEmoji = [
"a",
"b",
"c"
]
readReceipts = true
sealedSenderIndicators = true
storiesDisabled = true
storyViewReceiptsEnabled = true
typingIndicators = true
universalExpireTimerSeconds = 3600
}
avatarUrlPath = ""
donationSubscriberData = SubscriberData {
currencyCode = "USD"
manuallyCancelled = true
subscriberId = <ecbb68c734331a2ea333cda747c98c4553652261582b4fce5ae0dea84dce6519>
}
familyName = "Fett"
givenName = "Boba"
profileKey = <610291abedc34249489da39a31c9a5cd99cdd26ff58732e268e357ee0075d9d8>
svrPin = ""
username = "boba_fett.66"
usernameLink = UsernameLink {
color = Color.OLIVE
entropy = <65675c73d00eb01005e3bb7c4a47f296cb6554f78981238815e915d824fd2e93>
serverId = <61c101a200d5421789c20518d8497af0>
}
}
}
Frame {
recipient = Recipient {
id = 1
self = Self {
avatarColor = AvatarColor.A210
}
}
}
Frame {
recipient = Recipient {
id = 2
releaseNotes = ReleaseNotes {}
}
}
Frame {
recipient = Recipient {
distributionList = DistributionListItem {
distributionId = <00000000000000000000000000000000>
distributionList = DistributionList {
name = ""
privacyMode = PrivacyMode.ALL
}
}
id = 3
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <000a11ce000040008000000000000001>
avatarColor = AvatarColor.A110
e164 = 16105550101
identityKey = <05ea7585ab4f6de1913af6059f69b50ad26c55af2779e31bde58dec8ba165e164e>
identityState = IdentityState.DEFAULT
note = ""
pni = <000a11ce000040008000000000000002>
profileFamilyName = "Smith"
profileGivenName = "Alice"
profileKey = <d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d75d>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 4
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <00000b0b000040008000000000000001>
avatarColor = AvatarColor.A120
e164 = 16105550102
identityKey = <052dde6c6dcfaf0ffdcbc5e2eac90e5a18c26969907c942eade3a0e345948be27e>
identityState = IdentityState.VERIFIED
note = ""
pni = <00000b0b000040008000000000000002>
profileFamilyName = "Jones"
profileGivenName = "Bob"
profileKey = <0410410410410410410410410410410410410410410410410410410410410410>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 5
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <0000ca01000040008000000000000001>
avatarColor = AvatarColor.A130
e164 = 16105550103
identityKey = <05463769b7ab7a38be2cbfa7e8cff7e37cbb32770d762370c55cfbe82346593f54>
identityState = IdentityState.UNVERIFIED
note = ""
pni = <0000ca01000040008000000000000002>
profileFamilyName = "Johnson"
profileGivenName = "Carol"
profileKey = <0820820820820820820820820820820820820820820820820820820820820820>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 6
}
}
Frame {
recipient = Recipient {
contact = Contact {
aci = <000000da000040008000000000000001>
avatarColor = AvatarColor.A140
e164 = 16105550104
identityKey = <059e10072ee327212377ef4c442843b426ea4a1f16a029c23c9d028be4f513a97c>
identityState = IdentityState.DEFAULT
note = ""
pni = <000000da000040008000000000000002>
profileFamilyName = "Brown"
profileGivenName = "Dan"
profileKey = <0c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30c30>
registered = Registered {}
systemFamilyName = ""
systemGivenName = ""
systemNickname = ""
visibility = Visibility.VISIBLE
}
id = 7
}
}
Frame {
recipient = Recipient {
group = Group {
avatarColor = AvatarColor.A170
masterKey = <0000000000000000000000000000000000000000000000000000000000000000>
snapshot = GroupSnapshot {
accessControl = AccessControl {
addFromInviteLink = AccessRequired.UNSATISFIABLE
attributes = AccessRequired.MEMBER
members = AccessRequired.MEMBER
}
avatarUrl = "https://example.com/avatar.jpg"
inviteLinkPassword = <>
members = [
Member {
role = Role.ADMINISTRATOR
userId = <00000000000040008000000000000001>
},
Member {
role = Role.DEFAULT
userId = <000a11ce000040008000000000000001>
},
Member {
role = Role.DEFAULT
userId = <00000b0b000040008000000000000001>
}
]
title = GroupAttributeBlob {
title = "Me, Alice, Bob"
}
version = 1
}
storySendMode = StorySendMode.DEFAULT
whitelisted = true
}
id = 10
}
}
Frame {
chat = Chat {
expireTimerVersion = 1
id = 3
recipientId = 10
}
}
Frame {
chatItem = ChatItem {
authorId = 1
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}
updateMessage = ChatUpdateMessage {
groupChange = GroupChangeChatUpdate {
updates = [
Update {
groupSequenceOfRequestsAndCancelsUpdate = GroupSequenceOfRequestsAndCancelsUpdate {
count = 2
requestorAci = <000a11ce000040008000000000000001>
}
},
Update {
groupExpirationTimerUpdate = GroupExpirationTimerUpdate {
updaterAci = <00000000000040008000000000000001>
}
},
Update {
groupExpirationTimerUpdate = GroupExpirationTimerUpdate {
expiresInMs = 1595365000
updaterAci = <00000000000040008000000000000001>
}
}
]
}
}
}
}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 5
chatId = 3
dateSent = 1776491210910
directionless = DirectionlessMessageDetails {}

View File

@ -237,7 +237,7 @@ Frame {
Frame {
chatItem = ChatItem {
authorId = 1
authorId = 4
chatId = 3
dateSent = 1810531568155
directionless = DirectionlessMessageDetails {}

Some files were not shown because too many files have changed in this diff Show More