Skip to content

Commit

Permalink
refactor: using closures, can allow the listener to be overridden mul…
Browse files Browse the repository at this point in the history
…tiple times. (openimsdk#429)

* refactor: using closures, can allow the listener to be overridden multiple times.

Signed-off-by: Gordon <[email protected]>

* refactor: using closures, can allow the listener to be overridden multiple times.

Signed-off-by: Gordon <[email protected]>

---------

Signed-off-by: Gordon <[email protected]>
  • Loading branch information
FGadvancer committed Dec 13, 2023
1 parent bb6fb09 commit a2e5562
Show file tree
Hide file tree
Showing 16 changed files with 85 additions and 90 deletions.
4 changes: 2 additions & 2 deletions internal/business/business.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import (
)

type Business struct {
listener open_im_sdk_callback.OnCustomBusinessListener
listener func() open_im_sdk_callback.OnCustomBusinessListener
db db_interface.DataBase
}

Expand All @@ -45,5 +45,5 @@ func (b *Business) DoNotification(ctx context.Context, msg *sdkws.MsgData) {
return

}
b.listener.OnRecvCustomBusinessMessage(n.Detail)
b.listener().OnRecvCustomBusinessMessage(n.Detail)
}
2 changes: 1 addition & 1 deletion internal/business/open_im_sdk_business.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,5 @@ import (
)

func (w *Business) SetListener(listener func() open_im_sdk_callback.OnCustomBusinessListener) {
w.listener = listener()
w.listener = listener
}
28 changes: 12 additions & 16 deletions internal/conversation_msg/conversation_msg.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,10 @@ type Conversation struct {
*interaction.LongConnMgr
conversationSyncer *syncer.Syncer[*model_struct.LocalConversation, string]
db db_interface.DataBase
ConversationListener open_im_sdk_callback.OnConversationListener
msgListener open_im_sdk_callback.OnAdvancedMsgListener
msgKvListener open_im_sdk_callback.OnMessageKvInfoListener
batchMsgListener open_im_sdk_callback.OnBatchMsgListener
ConversationListener func() open_im_sdk_callback.OnConversationListener
msgListener func() open_im_sdk_callback.OnAdvancedMsgListener
msgKvListener func() open_im_sdk_callback.OnMessageKvInfoListener
batchMsgListener func() open_im_sdk_callback.OnBatchMsgListener
recvCH chan common.Cmd2Value
loginUserID string
platformID int32
Expand All @@ -70,25 +70,21 @@ type Conversation struct {
full *full.Full
maxSeqRecorder MaxSeqRecorder
IsExternalExtensions bool
listenerForService open_im_sdk_callback.OnListenerForService

startTime time.Time
}

func (c *Conversation) MsgListener() open_im_sdk_callback.OnAdvancedMsgListener {
return c.msgListener
}

func (c *Conversation) SetMsgListener(msgListener func() open_im_sdk_callback.OnAdvancedMsgListener) {
c.msgListener = msgListener()
c.msgListener = msgListener
}

func (c *Conversation) SetMsgKvListener(msgKvListener open_im_sdk_callback.OnMessageKvInfoListener) {
func (c *Conversation) SetMsgKvListener(msgKvListener func() open_im_sdk_callback.OnMessageKvInfoListener) {
c.msgKvListener = msgKvListener
}

func (c *Conversation) SetBatchMsgListener(batchMsgListener func() open_im_sdk_callback.OnBatchMsgListener) {
c.batchMsgListener = batchMsgListener()
c.batchMsgListener = batchMsgListener
}

func NewConversation(ctx context.Context, longConnMgr *interaction.LongConnMgr, db db_interface.DataBase,
Expand Down Expand Up @@ -656,23 +652,23 @@ func (c *Conversation) newMessage(ctx context.Context, newMessagesList sdk_struc
for _, w := range newMessagesList {
conversationID := utils.GetConversationIDByMsg(w)
if v, ok := cc[conversationID]; ok && v.RecvMsgOpt == constant.ReceiveMessage {
c.msgListener.OnRecvOfflineNewMessage(utils.StructToJsonString(w))
c.msgListener().OnRecvOfflineNewMessage(utils.StructToJsonString(w))
}
if v, ok := nc[conversationID]; ok && v.RecvMsgOpt == constant.ReceiveMessage {
c.msgListener.OnRecvOfflineNewMessage(utils.StructToJsonString(w))
c.msgListener().OnRecvOfflineNewMessage(utils.StructToJsonString(w))
}
}
} else {
for _, w := range newMessagesList {
c.msgListener.OnRecvNewMessage(utils.StructToJsonString(w))
c.msgListener().OnRecvNewMessage(utils.StructToJsonString(w))
}
}

}
func (c *Conversation) batchNewMessages(ctx context.Context, newMessagesList sdk_struct.NewMsgList) {
sort.Sort(newMessagesList)
if len(newMessagesList) > 0 {
c.batchMsgListener.OnRecvNewMessages(utils.StructToJsonString(newMessagesList))
c.batchMsgListener().OnRecvNewMessages(utils.StructToJsonString(newMessagesList))
//if c.IsBackground {
// c.batchMsgListener.OnRecvOfflineNewMessages(utils.StructToJsonString(newMessagesList))
//}
Expand Down Expand Up @@ -737,7 +733,7 @@ func (c *Conversation) doMsgReadState(ctx context.Context, msgReadList []*sdk_st
if len(messageReceiptResp) > 0 {

// log.Info("internal", "OnRecvC2CReadReceipt: ", utils.StructToJsonString(messageReceiptResp))
c.msgListener.OnRecvC2CReadReceipt(utils.StructToJsonString(messageReceiptResp))
c.msgListener().OnRecvC2CReadReceipt(utils.StructToJsonString(messageReceiptResp))
}
}

Expand Down
24 changes: 12 additions & 12 deletions internal/conversation_msg/conversation_notification.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ func (c *Conversation) doUpdateConversation(c2v common.Cmd2Value) {
oc.LatestMsgSendTime = lc.LatestMsgSendTime
oc.LatestMsg = lc.LatestMsg
list = append(list, oc)
c.ConversationListener.OnConversationChanged(utils.StructToJsonString(list))
c.ConversationListener().OnConversationChanged(utils.StructToJsonString(list))
}
}
} else {
Expand All @@ -95,7 +95,7 @@ func (c *Conversation) doUpdateConversation(c2v common.Cmd2Value) {
// log.Error("internal", "insert new conversation err:", err4.Error())
} else {
list = append(list, &lc)
c.ConversationListener.OnNewConversation(utils.StructToJsonString(list))
c.ConversationListener().OnNewConversation(utils.StructToJsonString(list))
}
}

Expand All @@ -105,7 +105,7 @@ func (c *Conversation) doUpdateConversation(c2v common.Cmd2Value) {
} else {
totalUnreadCount, err := c.db.GetTotalUnreadMsgCountDB(ctx)
if err == nil {
c.ConversationListener.OnTotalUnreadMessageCountChanged(totalUnreadCount)
c.ConversationListener().OnTotalUnreadMessageCountChanged(totalUnreadCount)
} else {
log.ZError(ctx, "getTotalUnreadMsgCountDB err", err)
}
Expand Down Expand Up @@ -134,7 +134,7 @@ func (c *Conversation) doUpdateConversation(c2v common.Cmd2Value) {
if err != nil {
// log.Error("internal", "TotalUnreadMessageChanged database err:", err.Error())
} else {
c.ConversationListener.OnTotalUnreadMessageCountChanged(totalUnreadCount)
c.ConversationListener().OnTotalUnreadMessageCountChanged(totalUnreadCount)
}
case constant.UpdateConFaceUrlAndNickName:
var lc model_struct.LocalConversation
Expand Down Expand Up @@ -198,7 +198,7 @@ func (c *Conversation) doUpdateConversation(c2v common.Cmd2Value) {
newCList = append(newCList, v)
}
}
c.ConversationListener.OnConversationChanged(utils.StructToJsonStringDefault(newCList))
c.ConversationListener().OnConversationChanged(utils.StructToJsonStringDefault(newCList))
}
case constant.NewCon:
cidList := node.Args.([]string)
Expand All @@ -208,17 +208,17 @@ func (c *Conversation) doUpdateConversation(c2v common.Cmd2Value) {
} else {
if cLists != nil {
// log.Info("internal", "getMultipleConversationModel success :", cLists)
c.ConversationListener.OnNewConversation(utils.StructToJsonString(cLists))
c.ConversationListener().OnNewConversation(utils.StructToJsonString(cLists))
}
}
case constant.ConChangeDirect:
cidList := node.Args.(string)
c.ConversationListener.OnConversationChanged(cidList)
c.ConversationListener().OnConversationChanged(cidList)

case constant.NewConDirect:
cidList := node.Args.(string)
// log.Debug("internal", "NewConversation", cidList)
c.ConversationListener.OnNewConversation(cidList)
c.ConversationListener().OnNewConversation(cidList)

case constant.ConversationLatestMsgHasRead:
hasReadMsgList := node.Args.(map[string][]string)
Expand Down Expand Up @@ -252,7 +252,7 @@ func (c *Conversation) doUpdateConversation(c2v common.Cmd2Value) {
}
if result != nil {
// log.Info("internal", "getMultipleConversationModel success :", result)
c.ConversationListener.OnNewConversation(utils.StructToJsonString(result))
c.ConversationListener().OnNewConversation(utils.StructToJsonString(result))
}
case constant.SyncConversation:

Expand Down Expand Up @@ -594,7 +594,7 @@ func (c *Conversation) doNotificationNew(c2v common.Cmd2Value) {
switch syncFlag {
case constant.MsgSyncBegin:
c.startTime = time.Now()
c.ConversationListener.OnSyncServerStart()
c.ConversationListener().OnSyncServerStart()
if err := c.SyncAllConversationHashReadSeqs(ctx); err != nil {
log.ZError(ctx, "SyncConversationHashReadSeqs err", err)
}
Expand All @@ -610,10 +610,10 @@ func (c *Conversation) doNotificationNew(c2v common.Cmd2Value) {
}(syncFunc)
}
case constant.MsgSyncFailed:
c.ConversationListener.OnSyncServerFailed()
c.ConversationListener().OnSyncServerFailed()
case constant.MsgSyncEnd:
log.ZDebug(ctx, "MsgSyncEnd", "time", time.Since(c.startTime).Milliseconds())
defer c.ConversationListener.OnSyncServerFinish()
defer c.ConversationListener().OnSyncServerFinish()
go c.SyncAllConversations(ctx)
}

Expand Down
2 changes: 1 addition & 1 deletion internal/conversation_msg/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ func (c *Conversation) deleteMessageFromLocal(ctx context.Context, conversationI
}
c.doUpdateConversation(common.Cmd2Value{Value: common.UpdateConNode{Action: constant.ConChange, Args: []string{conversationID}}})
}
c.msgListener.OnMsgDeleted(utils.StructToJsonString(s))
c.msgListener().OnMsgDeleted(utils.StructToJsonString(s))
return nil
}

Expand Down
2 changes: 1 addition & 1 deletion internal/conversation_msg/read_drawing.go
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ func (c *Conversation) doReadDrawing(ctx context.Context, msg *sdkws.MsgData) {
}
var messageReceiptResp = []*sdk_struct.MessageReceipt{{UserID: tips.MarkAsReadUserID, MsgIDList: successMsgIDs,
SessionType: conversation.ConversationType, ReadTime: msg.SendTime}}
c.msgListener.OnRecvC2CReadReceipt(utils.StructToJsonString(messageReceiptResp))
c.msgListener().OnRecvC2CReadReceipt(utils.StructToJsonString(messageReceiptResp))
}
//else if conversation.ConversationType == constant.SuperGroupChatType {
// var successMsgIDs []string
Expand Down
2 changes: 1 addition & 1 deletion internal/conversation_msg/revoke.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ func (c *Conversation) revokeMessage(ctx context.Context, tips *sdkws.RevokeMsgT
}
}
}
c.msgListener.OnNewRecvMessageRevoked(utils.StructToJsonString(m))
c.msgListener().OnNewRecvMessageRevoked(utils.StructToJsonString(m))
msgList, err := c.db.SearchAllMessageByContentType(ctx, conversation.ConversationID, constant.Quote)
if err != nil {
log.ZError(ctx, "SearchAllMessageByContentType failed", err, "tips", &tips)
Expand Down
2 changes: 1 addition & 1 deletion internal/conversation_msg/sdk.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ func (c *Conversation) GetTotalUnreadMsgCount(ctx context.Context) (totalUnreadC
}

func (c *Conversation) SetConversationListener(listener func() open_im_sdk_callback.OnConversationListener) {
c.ConversationListener = listener()
c.ConversationListener = listener
}

func (c *Conversation) msgStructToLocalChatLog(src *sdk_struct.MsgStruct) *model_struct.LocalChatLog {
Expand Down
2 changes: 1 addition & 1 deletion internal/friend/friend.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ func (f *Friend) Db() db_interface.DataBase {
}

func (f *Friend) SetListener(listener func() open_im_sdk_callback.OnFriendshipListener) {
f.friendListener = open_im_sdk_callback.NewOnFriendshipListenerSdk(listener())
f.friendListener = open_im_sdk_callback.NewOnFriendshipListenerSdk(listener)
}

func (f *Friend) SetListenerForService(listener open_im_sdk_callback.OnListenerForService) {
Expand Down
34 changes: 17 additions & 17 deletions internal/group/group.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func NewGroup(loginUserID string, db db_interface.DataBase,

// //utils.GetCurrentTimestampByMill()
type Group struct {
listener open_im_sdk_callback.OnGroupListener
listener func() open_im_sdk_callback.OnGroupListener
loginUserID string
db db_interface.DataBase
groupSyncer *syncer.Syncer[*model_struct.LocalGroup, string]
Expand Down Expand Up @@ -76,18 +76,18 @@ func (g *Group) initSyncer() {
}, nil, func(ctx context.Context, state int, server, local *model_struct.LocalGroup) error {
switch state {
case syncer.Insert:
g.listener.OnJoinedGroupAdded(utils.StructToJsonString(server))
g.listener().OnJoinedGroupAdded(utils.StructToJsonString(server))
case syncer.Delete:
g.listener.OnJoinedGroupDeleted(utils.StructToJsonString(local))
g.listener().OnJoinedGroupDeleted(utils.StructToJsonString(local))
case syncer.Update:
log.ZInfo(ctx, "groupSyncer trigger update", "groupID", server.GroupID, "data", server, "isDismissed", server.Status == constant.GroupStatusDismissed)
if server.Status == constant.GroupStatusDismissed {
if err := g.db.DeleteGroupAllMembers(ctx, server.GroupID); err != nil {
log.ZError(ctx, "delete group all members failed", err)
}
g.listener.OnGroupDismissed(utils.StructToJsonString(server))
g.listener().OnGroupDismissed(utils.StructToJsonString(server))
} else {
g.listener.OnGroupInfoChanged(utils.StructToJsonString(server))
g.listener().OnGroupInfoChanged(utils.StructToJsonString(server))
if server.GroupName != local.GroupName || local.FaceURL != server.FaceURL {
_ = common.TriggerCmdUpdateConversation(ctx, common.UpdateConNode{Action: constant.UpdateConFaceUrlAndNickName, Args: common.SourceIDAndSessionType{SourceID: server.GroupID,
SessionType: constant.SuperGroupChatType, FaceURL: server.FaceURL, Nickname: server.GroupName}}, g.conversationCh)
Expand All @@ -109,11 +109,11 @@ func (g *Group) initSyncer() {
}, nil, func(ctx context.Context, state int, server, local *model_struct.LocalGroupMember) error {
switch state {
case syncer.Insert:
g.listener.OnGroupMemberAdded(utils.StructToJsonString(server))
g.listener().OnGroupMemberAdded(utils.StructToJsonString(server))
case syncer.Delete:
g.listener.OnGroupMemberDeleted(utils.StructToJsonString(local))
g.listener().OnGroupMemberDeleted(utils.StructToJsonString(local))
case syncer.Update:
g.listener.OnGroupMemberInfoChanged(utils.StructToJsonString(server))
g.listener().OnGroupMemberInfoChanged(utils.StructToJsonString(server))
if server.Nickname != local.Nickname || server.FaceURL != local.FaceURL {
_ = common.TriggerCmdUpdateMessage(ctx, common.UpdateMessageNode{Action: constant.UpdateMsgFaceUrlAndNickName, Args: common.UpdateMessageInfo{UserID: server.UserID, FaceURL: server.FaceURL,
Nickname: server.Nickname, GroupID: server.GroupID}}, g.conversationCh)
Expand All @@ -133,15 +133,15 @@ func (g *Group) initSyncer() {
}, nil, func(ctx context.Context, state int, server, local *model_struct.LocalGroupRequest) error {
switch state {
case syncer.Insert:
g.listener.OnGroupApplicationAdded(utils.StructToJsonString(server))
g.listener().OnGroupApplicationAdded(utils.StructToJsonString(server))
case syncer.Update:
switch server.HandleResult {
case constant.FriendResponseAgree:
g.listener.OnGroupApplicationAccepted(utils.StructToJsonString(server))
g.listener().OnGroupApplicationAccepted(utils.StructToJsonString(server))
case constant.FriendResponseRefuse:
g.listener.OnGroupApplicationRejected(utils.StructToJsonString(server))
g.listener().OnGroupApplicationRejected(utils.StructToJsonString(server))
default:
g.listener.OnGroupApplicationAdded(utils.StructToJsonString(server))
g.listener().OnGroupApplicationAdded(utils.StructToJsonString(server))
}
}
return nil
Expand All @@ -158,15 +158,15 @@ func (g *Group) initSyncer() {
}, nil, func(ctx context.Context, state int, server, local *model_struct.LocalAdminGroupRequest) error {
switch state {
case syncer.Insert:
g.listener.OnGroupApplicationAdded(utils.StructToJsonString(server))
g.listener().OnGroupApplicationAdded(utils.StructToJsonString(server))
case syncer.Update:
switch server.HandleResult {
case constant.FriendResponseAgree:
g.listener.OnGroupApplicationAccepted(utils.StructToJsonString(server))
g.listener().OnGroupApplicationAccepted(utils.StructToJsonString(server))
case constant.FriendResponseRefuse:
g.listener.OnGroupApplicationRejected(utils.StructToJsonString(server))
g.listener().OnGroupApplicationRejected(utils.StructToJsonString(server))
default:
g.listener.OnGroupApplicationAdded(utils.StructToJsonString(server))
g.listener().OnGroupApplicationAdded(utils.StructToJsonString(server))
}
}
return nil
Expand All @@ -175,7 +175,7 @@ func (g *Group) initSyncer() {
}

func (g *Group) SetGroupListener(listener func() open_im_sdk_callback.OnGroupListener) {
g.listener = listener()
g.listener = listener
}

func (g *Group) SetListenerForService(listener open_im_sdk_callback.OnListenerForService) {
Expand Down
10 changes: 5 additions & 5 deletions internal/group/notification.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ func (g *Group) doNotification(ctx context.Context, msg *sdkws.MsgData) error {
if err != nil {
return err
}
g.listener.OnGroupMemberDeleted(string(data))
g.listener().OnGroupMemberDeleted(string(data))
}
group, err := g.db.GetGroupInfoByGroupID(ctx, detail.Group.GroupID)
if err != nil {
Expand All @@ -136,7 +136,7 @@ func (g *Group) doNotification(ctx context.Context, msg *sdkws.MsgData) error {
if err := g.db.DeleteGroup(ctx, detail.Group.GroupID); err != nil {
return err
}
g.listener.OnGroupInfoChanged(string(data))
g.listener().OnGroupInfoChanged(string(data))
return nil
} else {
var userIDs []string
Expand All @@ -163,7 +163,7 @@ func (g *Group) doNotification(ctx context.Context, msg *sdkws.MsgData) error {
if err != nil {
return err
}
g.listener.OnGroupMemberDeleted(string(data))
g.listener().OnGroupMemberDeleted(string(data))
}
group, err := g.db.GetGroupInfoByGroupID(ctx, detail.Group.GroupID)
if err != nil {
Expand All @@ -177,7 +177,7 @@ func (g *Group) doNotification(ctx context.Context, msg *sdkws.MsgData) error {
if err := g.db.DeleteGroup(ctx, detail.Group.GroupID); err != nil {
return err
}
g.listener.OnGroupInfoChanged(string(data))
g.listener().OnGroupInfoChanged(string(data))
return nil
} else {
return g.SyncGroupMembers(ctx, detail.Group.GroupID, detail.QuitUser.UserID)
Expand Down Expand Up @@ -218,7 +218,7 @@ func (g *Group) doNotification(ctx context.Context, msg *sdkws.MsgData) error {
if err := utils.UnmarshalNotificationElem(msg.Content, &detail); err != nil {
return err
}
g.listener.OnGroupDismissed(utils.StructToJsonString(detail.Group))
g.listener().OnGroupDismissed(utils.StructToJsonString(detail.Group))
if err := g.db.DeleteGroupAllMembers(ctx, detail.Group.GroupID); err != nil {
return err
}
Expand Down
Loading

0 comments on commit a2e5562

Please sign in to comment.