89 lines
2.5 KiB
Go
89 lines
2.5 KiB
Go
package modules
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"go_dreamfactory/comm"
|
|
"go_dreamfactory/pb"
|
|
|
|
"go_dreamfactory/lego/base"
|
|
"go_dreamfactory/lego/core"
|
|
"go_dreamfactory/lego/core/cbase"
|
|
"go_dreamfactory/lego/sys/log"
|
|
|
|
"github.com/golang/protobuf/proto"
|
|
"github.com/golang/protobuf/ptypes"
|
|
)
|
|
|
|
/*
|
|
基础业务模块实现 封装一些通用的接口提供给业务模块使用
|
|
*/
|
|
type ModuleBase struct {
|
|
cbase.ModuleBase
|
|
service base.IRPCXService
|
|
Api_Comp IAPI_Comp
|
|
Cache_Comp ICache_Comp
|
|
Db_Comp IDB_Comp
|
|
}
|
|
|
|
func (this *ModuleBase) API() IAPI_Comp {
|
|
return this.Api_Comp
|
|
}
|
|
func (this *ModuleBase) Cache() ICache_Comp {
|
|
return this.Cache_Comp
|
|
}
|
|
func (this *ModuleBase) DB() IDB_Comp {
|
|
return this.Db_Comp
|
|
}
|
|
|
|
//模块初始化接口
|
|
func (this *ModuleBase) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) {
|
|
err = this.ModuleBase.Init(service, module, options)
|
|
this.service = service.(base.IRPCXService)
|
|
return
|
|
}
|
|
|
|
//向指定用户发送消息
|
|
func (this *ModuleBase) SendMsgToUser(mainType, subType string, msg proto.Message, user *pb.Cache_UserData) (err error) {
|
|
reply := &pb.RPCMessageReply{}
|
|
data, _ := ptypes.MarshalAny(msg)
|
|
if _, err = this.service.RpcGo(context.Background(), fmt.Sprintf("%s/%s", comm.Service_Gateway, user.GatewayServiceId), string(comm.Rpc_GatewayAgentSendMsg), &pb.AgentSendMessageReq{
|
|
UserSessionId: user.SessionId,
|
|
MainType: mainType,
|
|
SubType: subType,
|
|
Data: data,
|
|
}, reply); err != nil {
|
|
log.Errorf("SendMsgToUser%d:%s [%s.%s] err:%v", user.UserData.Uid, user.SessionId, mainType, subType, err)
|
|
}
|
|
return
|
|
}
|
|
|
|
//向多个用户发送消息
|
|
func (this *ModuleBase) SendMsgToUsers(mainType, subType string, msg proto.Message, user ...*pb.Cache_UserData) (err error) {
|
|
var (
|
|
gateways map[string][]string = make(map[string][]string)
|
|
gateway []string
|
|
ok bool
|
|
)
|
|
for _, v := range user {
|
|
if gateway, ok = gateways[v.GatewayServiceId]; !ok {
|
|
gateway = make([]string, 0)
|
|
gateways[v.GatewayServiceId] = gateway
|
|
}
|
|
gateway = append(gateway, v.SessionId)
|
|
}
|
|
reply := &pb.RPCMessageReply{}
|
|
data, _ := ptypes.MarshalAny(msg)
|
|
for k, v := range gateways {
|
|
if _, err = this.service.RpcGo(context.Background(), fmt.Sprintf("%s/%s", comm.Service_Gateway, k), string(comm.Rpc_GatewayAgentSendMsg), &pb.BatchMessageReq{
|
|
UserSessionIds: v,
|
|
MainType: mainType,
|
|
SubType: subType,
|
|
Data: data,
|
|
}, reply); err != nil {
|
|
log.Errorf("SendMsgToUsers:%s->%s.%s err:%v", k, mainType, subType, err)
|
|
}
|
|
}
|
|
return
|
|
}
|