package maincity import ( "context" "go_dreamfactory/comm" "go_dreamfactory/lego/core" "go_dreamfactory/lego/sys/event" "go_dreamfactory/lego/sys/log" "go_dreamfactory/modules" "go_dreamfactory/pb" "time" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" ) type MainCity struct { modules.ModuleBase service comm.IService api *apiComp model *modelComp friend comm.IFriend sociaty comm.ISociaty } func NewModule() core.IModule { return &MainCity{} } func (this *MainCity) GetType() core.M_Modules { return comm.ModuleKFTask } func (this *MainCity) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) { if err = this.ModuleBase.Init(service, module, options); err != nil { return } this.service = service.(comm.IService) return } func (this *MainCity) Start() (err error) { if err = this.ModuleBase.Start(); err != nil { return } var module core.IModule if module, err = this.service.GetModule(comm.ModuleFriend); err != nil { return } this.friend = module.(comm.IFriend) if module, err = this.service.GetModule(comm.ModuleSociaty); err != nil { return } this.sociaty = module.(comm.ISociaty) event.Register(comm.EventUserLogin, this.EventUserLogin) event.Register(comm.EventUserOffline, this.EventUserOffline) return } func (this *MainCity) OnInstallComp() { this.ModuleBase.OnInstallComp() this.api = this.RegisterComp(new(apiComp)).(*apiComp) this.model = this.RegisterComp(new(modelComp)).(*modelComp) } // 用户登录 func (this *MainCity) EventUserLogin(session comm.IUserSession) { var ( uids []string sociaty *pb.DBSociaty users []*pb.DBUser busers []*pb.BaseUserInfo err error ) uids = this.friend.GetFriendList(session.GetUserId()) if sociaty = this.sociaty.GetSociaty(session.GetUserId()); sociaty != nil { for _, v := range sociaty.Members { if v.Uid != session.GetUserId() { uids = append(uids, v.Uid) } } } if users, err = this.ModuleUser.GetCrossUsers(uids); err != nil { this.Errorln(err) return } busers = make([]*pb.BaseUserInfo, len(users)) for i, v := range users { busers[i] = comm.GetUserBaseInfo(v) } this.model.setplayerPos(session.GetUserId(), busers) } // 用户登录 func (this *MainCity) EventUserOffline(session comm.IUserSession) { this.model.removelayerPos(session.GetUserId()) } // 向多个用户发送消息 func (this *MainCity) SendMsgToSession(mainType, subType string, msg proto.Message, users map[string][]*pb.BaseUserInfo) (err error) { data, _ := anypb.New(msg) for k, users := range users { uids := []string{} for _, v := range users { uids = append(uids, v.Uid) } ctx, _ := context.WithTimeout(context.Background(), time.Second*5) if _, err = this.service.AcrossClusterRpcGo(ctx, k, comm.Service_Gateway, string(comm.Rpc_GatewaySendBatchMsgByUid), &pb.BatchUsersMessageReq{ Uids: uids, MainType: mainType, SubType: subType, Data: data, }, nil); err != nil { log.Errorf("SendMsgToUsers:%s->%s.%s err:%v", k, mainType, subType, err) } } return }