Skip to content

Commit

Permalink
fix: accept or refuse group application remove lock. (#634)
Browse files Browse the repository at this point in the history
* feat: add function of GetUsersInGroup checks if the provided userIDs are in the specified group.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* feat: add function of GetUsersInGroup checks if the provided userIDs are in the specified group.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* feat: add function of GetUsersInGroup checks if the provided userIDs are in the specified group.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* feat: add function of GetUsersInGroup checks if the provided userIDs are in the specified group.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* feat: add incremental synchronization for common conversation attributes.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* fix: commit.

* fix: commit.

* fix: commit.

* fix: commit.

* feat: add incremental synchronization for common conversation attributes.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* fix: sync user error.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* fix: remove wasm file.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* fix: change limit int type avoid overflow and group member sorted.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* fix: sdk logout due to client kick online, incr sync data trigger full id.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* fix: conversation list will disappear when conversation version table has been deleted in server.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* fix: conversation will deadlock when sync data logging.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* chore: sdk update log version to v0.0.49-alpha.60.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* fix: accept or refuse group application remove lock.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

* fix: accept or refuse group application remove lock.

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>

---------

Signed-off-by: Gordon <46924906+FGadvancer@users.noreply.github.com>
  • Loading branch information
FGadvancer committed Aug 2, 2024
1 parent e2a7e9c commit e83c038
Showing 1 changed file with 175 additions and 170 deletions.
345 changes: 175 additions & 170 deletions internal/group/notification.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,48 +41,7 @@ func (g *Group) DoNotification(ctx context.Context, msg *sdkws.MsgData) {
}

func (g *Group) doNotification(ctx context.Context, msg *sdkws.MsgData) error {
g.groupSyncMutex.Lock()
defer g.groupSyncMutex.Unlock()
switch msg.ContentType {
case constant.GroupCreatedNotification: // 1501
var detail sdkws.GroupCreatedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}

if err := g.IncrSyncJoinGroup(ctx); err != nil {
return err
}
return g.IncrSyncGroupAndMember(ctx, detail.Group.GroupID)

case constant.GroupInfoSetNotification: // 1502
var detail sdkws.GroupInfoSetTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
nil, nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.JoinGroupApplicationNotification: // 1503
var detail sdkws.JoinGroupApplicationTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
if detail.Applicant.UserID == g.loginUserID {
return g.SyncSelfGroupApplications(ctx, detail.Group.GroupID)
} else {
return g.SyncAdminGroupApplications(ctx, detail.Group.GroupID)
}
case constant.MemberQuitNotification: // 1504
var detail sdkws.MemberQuitTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
if detail.QuitUser.UserID == g.loginUserID {
return g.IncrSyncJoinGroup(ctx)
} else {
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, []*sdkws.GroupMemberFullInfo{detail.QuitUser}, nil,
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
}
case constant.GroupApplicationAcceptedNotification: // 1505
var detail sdkws.GroupApplicationAcceptedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
Expand All @@ -96,6 +55,7 @@ func (g *Group) doNotification(ctx context.Context, msg *sdkws.MsgData) error {
default:
return errs.New(fmt.Sprintf("GroupApplicationAcceptedNotification ReceiverAs unknown %d", detail.ReceiverAs)).Wrap()
}

case constant.GroupApplicationRejectedNotification: // 1506
var detail sdkws.GroupApplicationRejectedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
Expand All @@ -109,145 +69,190 @@ func (g *Group) doNotification(ctx context.Context, msg *sdkws.MsgData) error {
default:
return errs.New(fmt.Sprintf("GroupApplicationRejectedNotification ReceiverAs unknown %d", detail.ReceiverAs)).Wrap()
}
case constant.GroupOwnerTransferredNotification: // 1507
var detail sdkws.GroupOwnerTransferredTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
if detail.Group == nil {
return errs.New(fmt.Sprintf("group is nil, groupID: %s", detail.Group.GroupID)).Wrap()
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.NewGroupOwner, detail.OldGroupOwnerInfo}, nil,
detail.Group, groupSortIDChanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.MemberKickedNotification: // 1508
var detail sdkws.MemberKickedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
var self bool
for _, info := range detail.KickedUserList {
if info.UserID == g.loginUserID {
self = true
break

default:
g.groupSyncMutex.Lock()
defer g.groupSyncMutex.Unlock()
switch msg.ContentType {
case constant.GroupCreatedNotification: // 1501
var detail sdkws.GroupCreatedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
}
if self {
return g.IncrSyncJoinGroup(ctx)
} else {
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, detail.KickedUserList, nil,
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
}
case constant.MemberInvitedNotification: // 1509
var detail sdkws.MemberInvitedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
userIDMap := datautil.SliceSetAny(detail.InvitedUserList, func(e *sdkws.GroupMemberFullInfo) string {
return e.UserID
})
//Also invited as a member
if _, ok := userIDMap[g.loginUserID]; ok {

if err := g.IncrSyncJoinGroup(ctx); err != nil {
return err
}
return g.IncrSyncGroupAndMember(ctx, detail.Group.GroupID)
} else {

case constant.GroupInfoSetNotification: // 1502
var detail sdkws.GroupInfoSetTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
nil, nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.JoinGroupApplicationNotification: // 1503
var detail sdkws.JoinGroupApplicationTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
if detail.Applicant.UserID == g.loginUserID {
return g.SyncSelfGroupApplications(ctx, detail.Group.GroupID)
} else {
return g.SyncAdminGroupApplications(ctx, detail.Group.GroupID)
}
case constant.MemberQuitNotification: // 1504
var detail sdkws.MemberQuitTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
if detail.QuitUser.UserID == g.loginUserID {
return g.IncrSyncJoinGroup(ctx)
} else {
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, []*sdkws.GroupMemberFullInfo{detail.QuitUser}, nil,
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
}
case constant.GroupOwnerTransferredNotification: // 1507
var detail sdkws.GroupOwnerTransferredTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
if detail.Group == nil {
return errs.New(fmt.Sprintf("group is nil, groupID: %s", detail.Group.GroupID)).Wrap()
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.NewGroupOwner, detail.OldGroupOwnerInfo}, nil,
detail.Group, groupSortIDChanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.MemberKickedNotification: // 1508
var detail sdkws.MemberKickedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
var self bool
for _, info := range detail.KickedUserList {
if info.UserID == g.loginUserID {
self = true
break
}
}
if self {
return g.IncrSyncJoinGroup(ctx)
} else {
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, detail.KickedUserList, nil,
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
}
case constant.MemberInvitedNotification: // 1509
var detail sdkws.MemberInvitedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
userIDMap := datautil.SliceSetAny(detail.InvitedUserList, func(e *sdkws.GroupMemberFullInfo) string {
return e.UserID
})
//Also invited as a member
if _, ok := userIDMap[g.loginUserID]; ok {
if err := g.IncrSyncJoinGroup(ctx); err != nil {
return err
}
return g.IncrSyncGroupAndMember(ctx, detail.Group.GroupID)
} else {
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil, nil,
detail.InvitedUserList, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
}
case constant.MemberEnterNotification: // 1510
var detail sdkws.MemberEnterTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
if detail.EntrantUser.UserID == g.loginUserID {
if err := g.IncrSyncJoinGroup(ctx); err != nil {
return err
}
return g.IncrSyncGroupAndMember(ctx, detail.Group.GroupID)
} else {
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil, nil,
[]*sdkws.GroupMemberFullInfo{detail.EntrantUser}, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
}
case constant.GroupDismissedNotification: // 1511
var detail sdkws.GroupDismissedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
g.listener().OnGroupDismissed(utils.StructToJsonString(detail.Group))

return g.IncrSyncJoinGroup(ctx)
case constant.GroupMemberMutedNotification: // 1512
var detail sdkws.GroupMemberMutedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.MutedUser}, nil, nil,
groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupMemberCancelMutedNotification: // 1513
var detail sdkws.GroupMemberCancelMutedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.MutedUser}, nil, nil,
groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupMutedNotification: // 1514
var detail sdkws.GroupMutedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil, nil,
detail.InvitedUserList, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
}
case constant.MemberEnterNotification: // 1510
var detail sdkws.MemberEnterTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
if detail.EntrantUser.UserID == g.loginUserID {
if err := g.IncrSyncJoinGroup(ctx); err != nil {
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupCancelMutedNotification: // 1515
var detail sdkws.GroupCancelMutedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.IncrSyncGroupAndMember(ctx, detail.Group.GroupID)
} else {
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil, nil,
[]*sdkws.GroupMemberFullInfo{detail.EntrantUser}, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
}
case constant.GroupDismissedNotification: // 1511
var detail sdkws.GroupDismissedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
g.listener().OnGroupDismissed(utils.StructToJsonString(detail.Group))

return g.IncrSyncJoinGroup(ctx)
case constant.GroupMemberMutedNotification: // 1512
var detail sdkws.GroupMemberMutedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.MutedUser}, nil, nil,
groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupMemberCancelMutedNotification: // 1513
var detail sdkws.GroupMemberCancelMutedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.MutedUser}, nil, nil,
groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupMutedNotification: // 1514
var detail sdkws.GroupMutedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil, nil,
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupCancelMutedNotification: // 1515
var detail sdkws.GroupCancelMutedTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil, nil,
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupMemberInfoSetNotification: // 1516
var detail sdkws.GroupMemberInfoSetTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupMemberInfoSetNotification: // 1516
var detail sdkws.GroupMemberInfoSetTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}

return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.ChangedUser}, nil, nil,
detail.GroupSortVersion, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupMemberSetToAdminNotification: // 1517
var detail sdkws.GroupMemberInfoSetTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.ChangedUser}, nil, nil,
detail.GroupSortVersion, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupMemberSetToOrdinaryUserNotification: // 1518
var detail sdkws.GroupMemberInfoSetTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.ChangedUser}, nil, nil,
detail.GroupSortVersion, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupInfoSetAnnouncementNotification: // 1519
var detail sdkws.GroupInfoSetAnnouncementTips //
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil, nil,
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupInfoSetNameNotification: // 1520
var detail sdkws.GroupInfoSetNameTips //
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.ChangedUser}, nil, nil,
detail.GroupSortVersion, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupMemberSetToAdminNotification: // 1517
var detail sdkws.GroupMemberInfoSetTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.ChangedUser}, nil, nil,
detail.GroupSortVersion, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupMemberSetToOrdinaryUserNotification: // 1518
var detail sdkws.GroupMemberInfoSetTips
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil,
[]*sdkws.GroupMemberFullInfo{detail.ChangedUser}, nil, nil,
detail.GroupSortVersion, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupInfoSetAnnouncementNotification: // 1519
var detail sdkws.GroupInfoSetAnnouncementTips //
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil, nil,
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
case constant.GroupInfoSetNameNotification: // 1520
var detail sdkws.GroupInfoSetNameTips //
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil, nil,
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
default:
return errs.New("unknown tips type", "contentType", msg.ContentType).Wrap()
}
return g.onlineSyncGroupAndMember(ctx, detail.Group.GroupID, nil, nil,
nil, detail.Group, groupSortIDUnchanged, detail.GroupMemberVersion, detail.GroupMemberVersionID)
default:
return errs.New("unknown tips type", "contentType", msg.ContentType).Wrap()
}
}

0 comments on commit e83c038

Please sign in to comment.