refactor: extract community_changes
This commit is contained in:
parent
9674bc463f
commit
caca511aed
|
@ -479,44 +479,6 @@ type CommunitySettings struct {
|
||||||
Clock uint64 `json:"clock"`
|
Clock uint64 `json:"clock"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type CommunityChatChanges struct {
|
|
||||||
ChatModified *protobuf.CommunityChat
|
|
||||||
MembersAdded map[string]*protobuf.CommunityMember
|
|
||||||
MembersRemoved map[string]*protobuf.CommunityMember
|
|
||||||
CategoryModified string
|
|
||||||
PositionModified int
|
|
||||||
FirstMessageTimestampModified uint32
|
|
||||||
}
|
|
||||||
|
|
||||||
type CommunityChanges struct {
|
|
||||||
Community *Community `json:"community"`
|
|
||||||
MembersAdded map[string]*protobuf.CommunityMember `json:"membersAdded"`
|
|
||||||
MembersRemoved map[string]*protobuf.CommunityMember `json:"membersRemoved"`
|
|
||||||
|
|
||||||
TokenPermissionsAdded map[string]*protobuf.CommunityTokenPermission `json:"tokenPermissionsAdded"`
|
|
||||||
TokenPermissionsModified map[string]*protobuf.CommunityTokenPermission `json:"tokenPermissionsModified"`
|
|
||||||
TokenPermissionsRemoved []string `json:"tokenPermissionsRemoved"`
|
|
||||||
|
|
||||||
ChatsRemoved map[string]*protobuf.CommunityChat `json:"chatsRemoved"`
|
|
||||||
ChatsAdded map[string]*protobuf.CommunityChat `json:"chatsAdded"`
|
|
||||||
ChatsModified map[string]*CommunityChatChanges `json:"chatsModified"`
|
|
||||||
|
|
||||||
CategoriesRemoved []string `json:"categoriesRemoved"`
|
|
||||||
CategoriesAdded map[string]*protobuf.CommunityCategory `json:"categoriesAdded"`
|
|
||||||
CategoriesModified map[string]*protobuf.CommunityCategory `json:"categoriesModified"`
|
|
||||||
|
|
||||||
MemberWalletsRemoved []string `json:"memberWalletsRemoved"`
|
|
||||||
MemberWalletsAdded map[string][]*protobuf.RevealedAccount `json:"memberWalletsAdded"`
|
|
||||||
|
|
||||||
// ShouldMemberJoin indicates whether the user should join this community
|
|
||||||
// automatically
|
|
||||||
ShouldMemberJoin bool `json:"memberAdded"`
|
|
||||||
|
|
||||||
// ShouldMemberJoin indicates whether the user should leave this community
|
|
||||||
// automatically
|
|
||||||
ShouldMemberLeave bool `json:"memberRemoved"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// `CommunityAdminEventChanges contain additional changes that don't live on
|
// `CommunityAdminEventChanges contain additional changes that don't live on
|
||||||
// a `Community` but still have to be propagated to other admin and control nodes
|
// a `Community` but still have to be propagated to other admin and control nodes
|
||||||
type CommunityAdminEventChanges struct {
|
type CommunityAdminEventChanges struct {
|
||||||
|
@ -527,24 +489,8 @@ type CommunityAdminEventChanges struct {
|
||||||
AcceptedRequestsToJoin map[string]*protobuf.CommunityRequestToJoin `json:"acceptedRequestsToJoin"`
|
AcceptedRequestsToJoin map[string]*protobuf.CommunityRequestToJoin `json:"acceptedRequestsToJoin"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CommunityChanges) HasNewMember(identity string) bool {
|
|
||||||
if len(c.MembersAdded) == 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
_, ok := c.MembersAdded[identity]
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CommunityChanges) HasMemberLeft(identity string) bool {
|
|
||||||
if len(c.MembersRemoved) == 0 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
_, ok := c.MembersRemoved[identity]
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *Community) emptyCommunityChanges() *CommunityChanges {
|
func (o *Community) emptyCommunityChanges() *CommunityChanges {
|
||||||
changes := emptyCommunityChanges()
|
changes := EmptyCommunityChanges()
|
||||||
changes.Community = o
|
changes.Community = o
|
||||||
return changes
|
return changes
|
||||||
}
|
}
|
||||||
|
@ -1013,171 +959,8 @@ func (o *Community) UpdateCommunityDescription(description *protobuf.CommunityDe
|
||||||
|
|
||||||
// We only calculate changes if we joined/spectated the community or we requested access, otherwise not interested
|
// We only calculate changes if we joined/spectated the community or we requested access, otherwise not interested
|
||||||
if o.config.Joined || o.config.Spectated || o.config.RequestedToJoinAt > 0 {
|
if o.config.Joined || o.config.Spectated || o.config.RequestedToJoinAt > 0 {
|
||||||
// Check for new members at the org level
|
response = EvaluateCommunityChanges(o.config.CommunityDescription, description)
|
||||||
for pk, member := range description.Members {
|
response.Community = o
|
||||||
if _, ok := o.config.CommunityDescription.Members[pk]; !ok {
|
|
||||||
if response.MembersAdded == nil {
|
|
||||||
response.MembersAdded = make(map[string]*protobuf.CommunityMember)
|
|
||||||
}
|
|
||||||
response.MembersAdded[pk] = member
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for removed members at the org level
|
|
||||||
for pk, member := range o.config.CommunityDescription.Members {
|
|
||||||
if _, ok := description.Members[pk]; !ok {
|
|
||||||
if response.MembersRemoved == nil {
|
|
||||||
response.MembersRemoved = make(map[string]*protobuf.CommunityMember)
|
|
||||||
}
|
|
||||||
response.MembersRemoved[pk] = member
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check for removed chats
|
|
||||||
for chatID, chat := range o.config.CommunityDescription.Chats {
|
|
||||||
if description.Chats == nil {
|
|
||||||
description.Chats = make(map[string]*protobuf.CommunityChat)
|
|
||||||
}
|
|
||||||
if _, ok := description.Chats[chatID]; !ok {
|
|
||||||
if response.ChatsRemoved == nil {
|
|
||||||
response.ChatsRemoved = make(map[string]*protobuf.CommunityChat)
|
|
||||||
}
|
|
||||||
|
|
||||||
response.ChatsRemoved[chatID] = chat
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for chatID, chat := range description.Chats {
|
|
||||||
if o.config.CommunityDescription.Chats == nil {
|
|
||||||
o.config.CommunityDescription.Chats = make(map[string]*protobuf.CommunityChat)
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, ok := o.config.CommunityDescription.Chats[chatID]; !ok {
|
|
||||||
if response.ChatsAdded == nil {
|
|
||||||
response.ChatsAdded = make(map[string]*protobuf.CommunityChat)
|
|
||||||
}
|
|
||||||
|
|
||||||
response.ChatsAdded[chatID] = chat
|
|
||||||
} else {
|
|
||||||
// Check for members added
|
|
||||||
for pk, member := range description.Chats[chatID].Members {
|
|
||||||
if _, ok := o.config.CommunityDescription.Chats[chatID].Members[pk]; !ok {
|
|
||||||
if response.ChatsModified[chatID] == nil {
|
|
||||||
response.ChatsModified[chatID] = &CommunityChatChanges{
|
|
||||||
MembersAdded: make(map[string]*protobuf.CommunityMember),
|
|
||||||
MembersRemoved: make(map[string]*protobuf.CommunityMember),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
response.ChatsModified[chatID].MembersAdded[pk] = member
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check for members removed
|
|
||||||
for pk, member := range o.config.CommunityDescription.Chats[chatID].Members {
|
|
||||||
if _, ok := description.Chats[chatID].Members[pk]; !ok {
|
|
||||||
if response.ChatsModified[chatID] == nil {
|
|
||||||
response.ChatsModified[chatID] = &CommunityChatChanges{
|
|
||||||
MembersAdded: make(map[string]*protobuf.CommunityMember),
|
|
||||||
MembersRemoved: make(map[string]*protobuf.CommunityMember),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
response.ChatsModified[chatID].MembersRemoved[pk] = member
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check if first message timestamp was modified
|
|
||||||
if o.config.CommunityDescription.Chats[chatID].Identity.FirstMessageTimestamp !=
|
|
||||||
description.Chats[chatID].Identity.FirstMessageTimestamp {
|
|
||||||
if response.ChatsModified[chatID] == nil {
|
|
||||||
response.ChatsModified[chatID] = &CommunityChatChanges{
|
|
||||||
MembersAdded: make(map[string]*protobuf.CommunityMember),
|
|
||||||
MembersRemoved: make(map[string]*protobuf.CommunityMember),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
response.ChatsModified[chatID].FirstMessageTimestampModified = description.Chats[chatID].Identity.FirstMessageTimestamp
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for categories that were removed
|
|
||||||
for categoryID := range o.config.CommunityDescription.Categories {
|
|
||||||
if description.Categories == nil {
|
|
||||||
description.Categories = make(map[string]*protobuf.CommunityCategory)
|
|
||||||
}
|
|
||||||
|
|
||||||
if description.Chats == nil {
|
|
||||||
description.Chats = make(map[string]*protobuf.CommunityChat)
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, ok := description.Categories[categoryID]; !ok {
|
|
||||||
response.CategoriesRemoved = append(response.CategoriesRemoved, categoryID)
|
|
||||||
}
|
|
||||||
|
|
||||||
if o.config.CommunityDescription.Chats == nil {
|
|
||||||
o.config.CommunityDescription.Chats = make(map[string]*protobuf.CommunityChat)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for categories that were added
|
|
||||||
for categoryID, category := range description.Categories {
|
|
||||||
if o.config.CommunityDescription.Categories == nil {
|
|
||||||
o.config.CommunityDescription.Categories = make(map[string]*protobuf.CommunityCategory)
|
|
||||||
}
|
|
||||||
if _, ok := o.config.CommunityDescription.Categories[categoryID]; !ok {
|
|
||||||
if response.CategoriesAdded == nil {
|
|
||||||
response.CategoriesAdded = make(map[string]*protobuf.CommunityCategory)
|
|
||||||
}
|
|
||||||
|
|
||||||
response.CategoriesAdded[categoryID] = category
|
|
||||||
} else {
|
|
||||||
if o.config.CommunityDescription.Categories[categoryID].Name != category.Name || o.config.CommunityDescription.Categories[categoryID].Position != category.Position {
|
|
||||||
response.CategoriesModified[categoryID] = category
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for chat categories that were modified
|
|
||||||
for chatID, chat := range description.Chats {
|
|
||||||
if o.config.CommunityDescription.Chats == nil {
|
|
||||||
o.config.CommunityDescription.Chats = make(map[string]*protobuf.CommunityChat)
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, ok := o.config.CommunityDescription.Chats[chatID]; !ok {
|
|
||||||
continue // It's a new chat
|
|
||||||
}
|
|
||||||
|
|
||||||
if o.config.CommunityDescription.Chats[chatID].CategoryId != chat.CategoryId {
|
|
||||||
if response.ChatsModified[chatID] == nil {
|
|
||||||
response.ChatsModified[chatID] = &CommunityChatChanges{
|
|
||||||
MembersAdded: make(map[string]*protobuf.CommunityMember),
|
|
||||||
MembersRemoved: make(map[string]*protobuf.CommunityMember),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
response.ChatsModified[chatID].CategoryModified = chat.CategoryId
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for removed token permissions
|
|
||||||
for id := range o.config.CommunityDescription.TokenPermissions {
|
|
||||||
if _, ok := description.TokenPermissions[id]; !ok {
|
|
||||||
if response.TokenPermissionsRemoved == nil {
|
|
||||||
response.TokenPermissionsRemoved = make([]string, 0)
|
|
||||||
}
|
|
||||||
response.TokenPermissionsRemoved = append(response.TokenPermissionsRemoved, id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for id, permission := range description.TokenPermissions {
|
|
||||||
if _, ok := o.config.CommunityDescription.TokenPermissions[id]; !ok {
|
|
||||||
if response.TokenPermissionsAdded == nil {
|
|
||||||
response.TokenPermissionsAdded = make(map[string]*protobuf.CommunityTokenPermission)
|
|
||||||
}
|
|
||||||
response.TokenPermissionsAdded[id] = permission
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
o.config.CommunityDescription = description
|
o.config.CommunityDescription = description
|
||||||
|
@ -2007,24 +1790,6 @@ func (o *Community) SetActiveMembersCount(activeMembersCount uint64) (updated bo
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func emptyCommunityChanges() *CommunityChanges {
|
|
||||||
return &CommunityChanges{
|
|
||||||
MembersAdded: make(map[string]*protobuf.CommunityMember),
|
|
||||||
MembersRemoved: make(map[string]*protobuf.CommunityMember),
|
|
||||||
|
|
||||||
ChatsRemoved: make(map[string]*protobuf.CommunityChat),
|
|
||||||
ChatsAdded: make(map[string]*protobuf.CommunityChat),
|
|
||||||
ChatsModified: make(map[string]*CommunityChatChanges),
|
|
||||||
|
|
||||||
CategoriesRemoved: []string{},
|
|
||||||
CategoriesAdded: make(map[string]*protobuf.CommunityCategory),
|
|
||||||
CategoriesModified: make(map[string]*protobuf.CommunityCategory),
|
|
||||||
|
|
||||||
MemberWalletsRemoved: []string{},
|
|
||||||
MemberWalletsAdded: make(map[string][]*protobuf.RevealedAccount),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type sortSlice []sorterHelperIdx
|
type sortSlice []sorterHelperIdx
|
||||||
type sorterHelperIdx struct {
|
type sorterHelperIdx struct {
|
||||||
pos int32
|
pos int32
|
||||||
|
|
|
@ -0,0 +1,248 @@
|
||||||
|
package communities
|
||||||
|
|
||||||
|
import "github.com/status-im/status-go/protocol/protobuf"
|
||||||
|
|
||||||
|
type CommunityChatChanges struct {
|
||||||
|
ChatModified *protobuf.CommunityChat
|
||||||
|
MembersAdded map[string]*protobuf.CommunityMember
|
||||||
|
MembersRemoved map[string]*protobuf.CommunityMember
|
||||||
|
CategoryModified string
|
||||||
|
PositionModified int
|
||||||
|
FirstMessageTimestampModified uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
type CommunityChanges struct {
|
||||||
|
Community *Community `json:"community"`
|
||||||
|
MembersAdded map[string]*protobuf.CommunityMember `json:"membersAdded"`
|
||||||
|
MembersRemoved map[string]*protobuf.CommunityMember `json:"membersRemoved"`
|
||||||
|
|
||||||
|
TokenPermissionsAdded map[string]*protobuf.CommunityTokenPermission `json:"tokenPermissionsAdded"`
|
||||||
|
TokenPermissionsModified map[string]*protobuf.CommunityTokenPermission `json:"tokenPermissionsModified"`
|
||||||
|
TokenPermissionsRemoved []string `json:"tokenPermissionsRemoved"`
|
||||||
|
|
||||||
|
ChatsRemoved map[string]*protobuf.CommunityChat `json:"chatsRemoved"`
|
||||||
|
ChatsAdded map[string]*protobuf.CommunityChat `json:"chatsAdded"`
|
||||||
|
ChatsModified map[string]*CommunityChatChanges `json:"chatsModified"`
|
||||||
|
|
||||||
|
CategoriesRemoved []string `json:"categoriesRemoved"`
|
||||||
|
CategoriesAdded map[string]*protobuf.CommunityCategory `json:"categoriesAdded"`
|
||||||
|
CategoriesModified map[string]*protobuf.CommunityCategory `json:"categoriesModified"`
|
||||||
|
|
||||||
|
MemberWalletsRemoved []string `json:"memberWalletsRemoved"`
|
||||||
|
MemberWalletsAdded map[string][]*protobuf.RevealedAccount `json:"memberWalletsAdded"`
|
||||||
|
|
||||||
|
// ShouldMemberJoin indicates whether the user should join this community
|
||||||
|
// automatically
|
||||||
|
ShouldMemberJoin bool `json:"memberAdded"`
|
||||||
|
|
||||||
|
// ShouldMemberJoin indicates whether the user should leave this community
|
||||||
|
// automatically
|
||||||
|
ShouldMemberLeave bool `json:"memberRemoved"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func EmptyCommunityChanges() *CommunityChanges {
|
||||||
|
return &CommunityChanges{
|
||||||
|
MembersAdded: make(map[string]*protobuf.CommunityMember),
|
||||||
|
MembersRemoved: make(map[string]*protobuf.CommunityMember),
|
||||||
|
|
||||||
|
ChatsRemoved: make(map[string]*protobuf.CommunityChat),
|
||||||
|
ChatsAdded: make(map[string]*protobuf.CommunityChat),
|
||||||
|
ChatsModified: make(map[string]*CommunityChatChanges),
|
||||||
|
|
||||||
|
CategoriesRemoved: []string{},
|
||||||
|
CategoriesAdded: make(map[string]*protobuf.CommunityCategory),
|
||||||
|
CategoriesModified: make(map[string]*protobuf.CommunityCategory),
|
||||||
|
|
||||||
|
MemberWalletsRemoved: []string{},
|
||||||
|
MemberWalletsAdded: make(map[string][]*protobuf.RevealedAccount),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CommunityChanges) HasNewMember(identity string) bool {
|
||||||
|
if len(c.MembersAdded) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
_, ok := c.MembersAdded[identity]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *CommunityChanges) HasMemberLeft(identity string) bool {
|
||||||
|
if len(c.MembersRemoved) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
_, ok := c.MembersRemoved[identity]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func EvaluateCommunityChanges(origin, modified *protobuf.CommunityDescription) *CommunityChanges {
|
||||||
|
changes := EmptyCommunityChanges()
|
||||||
|
|
||||||
|
// Check for new members at the org level
|
||||||
|
for pk, member := range modified.Members {
|
||||||
|
if _, ok := origin.Members[pk]; !ok {
|
||||||
|
if changes.MembersAdded == nil {
|
||||||
|
changes.MembersAdded = make(map[string]*protobuf.CommunityMember)
|
||||||
|
}
|
||||||
|
changes.MembersAdded[pk] = member
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for removed members at the org level
|
||||||
|
for pk, member := range origin.Members {
|
||||||
|
if _, ok := modified.Members[pk]; !ok {
|
||||||
|
if changes.MembersRemoved == nil {
|
||||||
|
changes.MembersRemoved = make(map[string]*protobuf.CommunityMember)
|
||||||
|
}
|
||||||
|
changes.MembersRemoved[pk] = member
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for removed chats
|
||||||
|
for chatID, chat := range origin.Chats {
|
||||||
|
if modified.Chats == nil {
|
||||||
|
modified.Chats = make(map[string]*protobuf.CommunityChat)
|
||||||
|
}
|
||||||
|
if _, ok := modified.Chats[chatID]; !ok {
|
||||||
|
if changes.ChatsRemoved == nil {
|
||||||
|
changes.ChatsRemoved = make(map[string]*protobuf.CommunityChat)
|
||||||
|
}
|
||||||
|
|
||||||
|
changes.ChatsRemoved[chatID] = chat
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for chatID, chat := range modified.Chats {
|
||||||
|
if origin.Chats == nil {
|
||||||
|
origin.Chats = make(map[string]*protobuf.CommunityChat)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := origin.Chats[chatID]; !ok {
|
||||||
|
if changes.ChatsAdded == nil {
|
||||||
|
changes.ChatsAdded = make(map[string]*protobuf.CommunityChat)
|
||||||
|
}
|
||||||
|
|
||||||
|
changes.ChatsAdded[chatID] = chat
|
||||||
|
} else {
|
||||||
|
// Check for members added
|
||||||
|
for pk, member := range modified.Chats[chatID].Members {
|
||||||
|
if _, ok := origin.Chats[chatID].Members[pk]; !ok {
|
||||||
|
if changes.ChatsModified[chatID] == nil {
|
||||||
|
changes.ChatsModified[chatID] = &CommunityChatChanges{
|
||||||
|
MembersAdded: make(map[string]*protobuf.CommunityMember),
|
||||||
|
MembersRemoved: make(map[string]*protobuf.CommunityMember),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
changes.ChatsModified[chatID].MembersAdded[pk] = member
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check for members removed
|
||||||
|
for pk, member := range origin.Chats[chatID].Members {
|
||||||
|
if _, ok := modified.Chats[chatID].Members[pk]; !ok {
|
||||||
|
if changes.ChatsModified[chatID] == nil {
|
||||||
|
changes.ChatsModified[chatID] = &CommunityChatChanges{
|
||||||
|
MembersAdded: make(map[string]*protobuf.CommunityMember),
|
||||||
|
MembersRemoved: make(map[string]*protobuf.CommunityMember),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
changes.ChatsModified[chatID].MembersRemoved[pk] = member
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if first message timestamp was modified
|
||||||
|
if origin.Chats[chatID].Identity.FirstMessageTimestamp !=
|
||||||
|
modified.Chats[chatID].Identity.FirstMessageTimestamp {
|
||||||
|
if changes.ChatsModified[chatID] == nil {
|
||||||
|
changes.ChatsModified[chatID] = &CommunityChatChanges{
|
||||||
|
MembersAdded: make(map[string]*protobuf.CommunityMember),
|
||||||
|
MembersRemoved: make(map[string]*protobuf.CommunityMember),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
changes.ChatsModified[chatID].FirstMessageTimestampModified = modified.Chats[chatID].Identity.FirstMessageTimestamp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for categories that were removed
|
||||||
|
for categoryID := range origin.Categories {
|
||||||
|
if modified.Categories == nil {
|
||||||
|
modified.Categories = make(map[string]*protobuf.CommunityCategory)
|
||||||
|
}
|
||||||
|
|
||||||
|
if modified.Chats == nil {
|
||||||
|
modified.Chats = make(map[string]*protobuf.CommunityChat)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := modified.Categories[categoryID]; !ok {
|
||||||
|
changes.CategoriesRemoved = append(changes.CategoriesRemoved, categoryID)
|
||||||
|
}
|
||||||
|
|
||||||
|
if origin.Chats == nil {
|
||||||
|
origin.Chats = make(map[string]*protobuf.CommunityChat)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for categories that were added
|
||||||
|
for categoryID, category := range modified.Categories {
|
||||||
|
if origin.Categories == nil {
|
||||||
|
origin.Categories = make(map[string]*protobuf.CommunityCategory)
|
||||||
|
}
|
||||||
|
if _, ok := origin.Categories[categoryID]; !ok {
|
||||||
|
if changes.CategoriesAdded == nil {
|
||||||
|
changes.CategoriesAdded = make(map[string]*protobuf.CommunityCategory)
|
||||||
|
}
|
||||||
|
|
||||||
|
changes.CategoriesAdded[categoryID] = category
|
||||||
|
} else {
|
||||||
|
if origin.Categories[categoryID].Name != category.Name || origin.Categories[categoryID].Position != category.Position {
|
||||||
|
changes.CategoriesModified[categoryID] = category
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for chat categories that were modified
|
||||||
|
for chatID, chat := range modified.Chats {
|
||||||
|
if origin.Chats == nil {
|
||||||
|
origin.Chats = make(map[string]*protobuf.CommunityChat)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := origin.Chats[chatID]; !ok {
|
||||||
|
continue // It's a new chat
|
||||||
|
}
|
||||||
|
|
||||||
|
if origin.Chats[chatID].CategoryId != chat.CategoryId {
|
||||||
|
if changes.ChatsModified[chatID] == nil {
|
||||||
|
changes.ChatsModified[chatID] = &CommunityChatChanges{
|
||||||
|
MembersAdded: make(map[string]*protobuf.CommunityMember),
|
||||||
|
MembersRemoved: make(map[string]*protobuf.CommunityMember),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
changes.ChatsModified[chatID].CategoryModified = chat.CategoryId
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for removed token permissions
|
||||||
|
for id := range origin.TokenPermissions {
|
||||||
|
if _, ok := modified.TokenPermissions[id]; !ok {
|
||||||
|
if changes.TokenPermissionsRemoved == nil {
|
||||||
|
changes.TokenPermissionsRemoved = make([]string, 0)
|
||||||
|
}
|
||||||
|
changes.TokenPermissionsRemoved = append(changes.TokenPermissionsRemoved, id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for added token permissions
|
||||||
|
for id, permission := range modified.TokenPermissions {
|
||||||
|
if _, ok := origin.TokenPermissions[id]; !ok {
|
||||||
|
if changes.TokenPermissionsAdded == nil {
|
||||||
|
changes.TokenPermissionsAdded = make(map[string]*protobuf.CommunityTokenPermission)
|
||||||
|
}
|
||||||
|
changes.TokenPermissionsAdded[id] = permission
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return changes
|
||||||
|
}
|
Loading…
Reference in New Issue