Files
open-im-server/internal/rpc/msg/server.go
T

118 lines
4.5 KiB
Go
Raw Normal View History

2021-12-23 17:34:32 +08:00
package msg
2021-05-26 19:40:38 +08:00
import (
2023-03-21 11:27:20 +08:00
"context"
2023-04-28 11:01:48 +08:00
2023-06-05 18:01:59 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/controller"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/localcache"
2023-03-23 19:02:20 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/tx"
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/unrelation"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/prome"
"github.com/OpenIMSDK/Open-IM-Server/pkg/discoveryregistry"
2023-06-05 18:01:59 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/conversation"
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/proto/msg"
2023-04-23 19:50:42 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/rpcclient"
2022-09-14 17:45:38 +08:00
"google.golang.org/grpc"
)
2023-03-21 19:05:02 +08:00
type MessageInterceptorChain []MessageInterceptorFunc
2023-02-10 22:10:37 +08:00
type msgServer struct {
2023-05-17 17:09:26 +08:00
RegisterCenter discoveryregistry.SvcDiscoveryRegistry
MsgDatabase controller.CommonMsgDatabase
ExtendMsgDatabase controller.ExtendMsgDatabase
Group *rpcclient.GroupClient
User *rpcclient.UserClient
Conversation *rpcclient.ConversationClient
friend *rpcclient.FriendClient
black *rpcclient.BlackClient
GroupLocalCache *localcache.GroupLocalCache
ConversationLocalCache *localcache.ConversationLocalCache
MessageLocker MessageLocker
Handlers MessageInterceptorChain
2023-05-29 19:11:32 +08:00
notificationSender *rpcclient.NotificationSender
2022-05-23 10:14:10 +08:00
}
2023-03-21 19:05:02 +08:00
func (m *msgServer) addInterceptorHandler(interceptorFunc ...MessageInterceptorFunc) {
m.Handlers = append(m.Handlers, interceptorFunc...)
}
2023-05-17 17:09:26 +08:00
2023-03-21 19:05:02 +08:00
func (m *msgServer) execInterceptorHandler(ctx context.Context, req *msg.SendMsgReq) error {
for _, handler := range m.Handlers {
msgData, err := handler(ctx, req)
if err != nil {
return err
}
req.MsgData = msgData
}
return nil
}
2023-05-17 17:09:26 +08:00
2023-03-02 12:00:31 +08:00
func Start(client discoveryregistry.SvcDiscoveryRegistry, server *grpc.Server) error {
2023-03-03 17:42:26 +08:00
rdb, err := cache.NewRedis()
2023-02-14 20:01:44 +08:00
if err != nil {
return err
2021-05-26 19:40:38 +08:00
}
2023-03-03 17:42:26 +08:00
mongo, err := unrelation.NewMongo()
if err != nil {
2023-02-14 20:01:44 +08:00
return err
}
2023-05-26 11:11:34 +08:00
if err := mongo.CreateMsgIndex(); err != nil {
return err
}
2023-05-04 12:11:29 +08:00
cacheModel := cache.NewMsgCacheModel(rdb)
2023-03-03 17:42:26 +08:00
msgDocModel := unrelation.NewMsgMongoDriver(mongo.GetDatabase())
extendMsgModel := unrelation.NewExtendMsgSetMongoDriver(mongo.GetDatabase())
2023-03-23 19:02:20 +08:00
extendMsgCacheModel := cache.NewExtendMsgSetCacheRedis(rdb, extendMsgModel, cache.GetDefaultOpt())
extendMsgDatabase := controller.NewExtendMsgDatabase(extendMsgModel, extendMsgCacheModel, tx.NewMongo(mongo.GetClient()))
2023-05-08 12:39:45 +08:00
msgDatabase := controller.NewCommonMsgDatabase(msgDocModel, cacheModel)
2023-02-14 20:01:44 +08:00
s := &msgServer{
2023-05-17 17:09:26 +08:00
Conversation: rpcclient.NewConversationClient(client),
User: rpcclient.NewUserClient(client),
Group: rpcclient.NewGroupClient(client),
MsgDatabase: msgDatabase,
ExtendMsgDatabase: extendMsgDatabase,
RegisterCenter: client,
GroupLocalCache: localcache.NewGroupLocalCache(client),
ConversationLocalCache: localcache.NewConversationLocalCache(client),
black: rpcclient.NewBlackClient(client),
friend: rpcclient.NewFriendClient(client),
MessageLocker: NewLockerMessage(cacheModel),
2023-02-14 20:01:44 +08:00
}
2023-05-29 19:11:32 +08:00
s.notificationSender = rpcclient.NewNotificationSender(rpcclient.WithLocalSendMsg(s.SendMsg))
2023-06-09 18:40:44 +08:00
s.addInterceptorHandler(MessageHasReadEnabled)
2023-02-14 20:01:44 +08:00
s.initPrometheus()
msg.RegisterMsgServer(server, s)
return nil
2021-05-26 19:40:38 +08:00
}
2023-02-14 20:01:44 +08:00
func (m *msgServer) initPrometheus() {
2023-03-01 15:32:26 +08:00
prome.NewMsgPullFromRedisSuccessCounter()
prome.NewMsgPullFromRedisFailedCounter()
prome.NewMsgPullFromMongoSuccessCounter()
prome.NewMsgPullFromMongoFailedCounter()
prome.NewSingleChatMsgRecvSuccessCounter()
prome.NewGroupChatMsgRecvSuccessCounter()
prome.NewWorkSuperGroupChatMsgRecvSuccessCounter()
prome.NewSingleChatMsgProcessSuccessCounter()
prome.NewSingleChatMsgProcessFailedCounter()
prome.NewGroupChatMsgProcessSuccessCounter()
prome.NewGroupChatMsgProcessFailedCounter()
prome.NewWorkSuperGroupChatMsgProcessSuccessCounter()
prome.NewWorkSuperGroupChatMsgProcessFailedCounter()
2022-09-14 17:45:38 +08:00
}
2023-06-05 18:01:59 +08:00
func (m *msgServer) conversationAndGetRecvID(conversation *conversation.Conversation, userID string) (recvID string) {
if conversation.ConversationType == constant.SingleChatType || conversation.ConversationType == constant.NotificationChatType {
if userID == conversation.OwnerUserID {
recvID = conversation.UserID
} else {
recvID = conversation.OwnerUserID
}
} else if conversation.ConversationType == constant.SuperGroupChatType {
recvID = conversation.GroupID
}
return
}