From 24749bb718985c382a404ce958666445d8422419 Mon Sep 17 00:00:00 2001 From: zhaocy Date: Thu, 16 Jun 2022 15:12:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9friend=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/friend/api_agree.go | 93 +++++++++++++++++++++++----------- modules/friend/api_apply.go | 76 ++++++++++++++++----------- modules/friend/api_refuse.go | 50 ++++++++++++++---- modules/friend/model_friend.go | 2 +- modules/model_comp.go | 54 ++++++++++++++------ modules/web/api_comp.go | 2 + services/worker/main.go | 3 +- 7 files changed, 191 insertions(+), 89 deletions(-) diff --git a/modules/friend/api_agree.go b/modules/friend/api_agree.go index ad6752942..21bffd1e9 100644 --- a/modules/friend/api_agree.go +++ b/modules/friend/api_agree.go @@ -6,7 +6,30 @@ import ( "go_dreamfactory/utils" ) -func (this *ApiComp) Agree_Check(session comm.IUserSession, req *pb.FriendAgreeReq) (result map[string]interface{}, code pb.ErrorCode) { +func (this *ApiComp) Agree_Check(session comm.IUserSession, req *pb.FriendAgreeReq) (chk map[string]interface{}, code pb.ErrorCode) { + chk = make(map[string]interface{}) + var err error + self := &pb.DB_FriendData{UserId: session.GetUserId()} + + //获取玩家自己好友数据 + err = this.module.model_friend.GetObj(session.GetUserId(), self) + if self == nil || err != nil { + code = pb.ErrorCode_FriendSelfNoData + return + } + + //同意的好友 + agreeIds := []string{} + for _, friendId := range req.FriendIds { + if _, ok := utils.Find(self.FriendIds, friendId); !ok { + //不在好友列表中就加入 + agreeIds = append(agreeIds, friendId) + } + } + + chk["agreeIds"] = agreeIds + chk["self"] = self + return } @@ -28,39 +51,49 @@ func (this *ApiComp) Agree(session comm.IUserSession, chk map[string]interface{} session.SendMsg(string(this.module.GetType()), Friend_SubType_Agree, code, rsp) }() - err = this.module.model_friend.GetObj(session.GetUserId(), self) - if self == nil || err != nil { - code = pb.ErrorCode_FriendSelfNoData + if v, ok := chk["self"]; !ok { + code = pb.ErrorCode_FriendTargetNoData return + } else { + self = v.(*pb.DB_FriendData) } - //将申请人加入到自己的好友列表中 - for _, userId := range req.FriendIds { - if _, ok := utils.Find(self.FriendIds, userId); !ok { - self.FriendIds = append(self.FriendIds, userId) + if agreeIds, ok := chk["agreeIds"]; ok { + //将目标加入到自己的好友列表中 + for _, userId := range agreeIds.([]string) { + if _, ok := utils.Find(self.FriendIds, userId); !ok { + if self.FriendIds == nil { + self.FriendIds = []string{} + } + self.FriendIds = append(self.FriendIds, userId) + } + + //双向添加:将自己加入到申请人的好友列表中 + target := &pb.DB_FriendData{} + err := this.module.model_friend.GetObj(userId, target) + if target == nil || err != nil { + code = pb.ErrorCode_FriendTargetNoData + + } + if _, ok := utils.Find(target.FriendIds, self.UserId); !ok { + if target.FriendIds == nil { + target.FriendIds = []string{} + } + target.FriendIds = append(target.FriendIds, self.UserId) + } + err = this.module.model_friend.SetObj(target.UserId, target, false, true) + if err != nil { + code = pb.ErrorCode_DBError + } + + //将目标从申请列表中删除 + self.ApplyIds = utils.DeleteString(self.ApplyIds, userId) + optNum++ } + + //更新 + return this.module.model_friend.SetObj(self.UserId, self, false, true) } - //将自己加入到申请人的好友列表中 - for _, userId := range req.FriendIds { - var target *pb.DB_FriendData - err2 := this.module.model_friend.GetObj(userId, target) - if target == nil || err2 != nil { - code = pb.ErrorCode_FriendTargetNoData - continue - } - if _, ok := utils.Find(target.FriendIds, self.UserId); !ok { - target.FriendIds = append(target.FriendIds, self.UserId) - } - this.module.model_friend.SetObj(target.UserId, target, false, true) - } - - //将申请人从申请列表中删除 - for _, userId := range req.FriendIds { - self.ApplyIds = utils.DeleteString(self.ApplyIds, userId) - optNum++ - } - - //更新 - return this.module.model_friend.SetObj(self.UserId, self, false, true) + return nil } diff --git a/modules/friend/api_apply.go b/modules/friend/api_apply.go index 7ca176782..87ff5678e 100644 --- a/modules/friend/api_apply.go +++ b/modules/friend/api_apply.go @@ -8,38 +8,19 @@ import ( ) func (this *ApiComp) Apply_Check(session comm.IUserSession, req *pb.FriendApplyReq) (chk map[string]interface{}, code pb.ErrorCode) { - return -} - -//好友申请 -func (this *ApiComp) Apply(session comm.IUserSession, chk map[string]interface{}, req *pb.FriendApplyReq) (err error) { - var ( - code pb.ErrorCode - self *pb.DB_FriendData - target *pb.DB_FriendData - rsp *pb.FriendApplyRsp - ) - - defer func() { - utils.TraceFunc(session.GetUserId(), string(this.module.GetType()), Friend_SubType_Apply, req, rsp) - }() - - defer func() { - if code == pb.ErrorCode_Success { - rsp = &pb.FriendApplyRsp{ - UserId: session.GetUserId(), - FriendId: req.FriendId, - } - } - session.SendMsg(string(this.module.GetType()), Friend_SubType_Apply, code, rsp) - }() + chk = make(map[string]interface{}) + var err error + self := &pb.DB_FriendData{UserId: session.GetUserId()} + target := &pb.DB_FriendData{UserId: req.FriendId} + //获取玩家自己好友数据 err = this.module.model_friend.GetObj(session.GetUserId(), self) if self == nil || err != nil { code = pb.ErrorCode_FriendSelfNoData return } + //获取好友数据 err = this.module.model_friend.GetObj(req.FriendId, target) if target == nil || err != nil { code = pb.ErrorCode_FriendTargetNoData @@ -92,12 +73,47 @@ func (this *ApiComp) Apply(session comm.IUserSession, chk map[string]interface{} return } + chk["self"] = self + chk["target"] = target + return +} + +//好友申请 +func (this *ApiComp) Apply(session comm.IUserSession, chk map[string]interface{}, req *pb.FriendApplyReq) (err error) { + var ( + code pb.ErrorCode + target *pb.DB_FriendData + rsp *pb.FriendApplyRsp + ) + + defer func() { + utils.TraceFunc(session.GetUserId(), string(this.module.GetType()), Friend_SubType_Apply, req, rsp) + }() + + defer func() { + if code == pb.ErrorCode_Success { + rsp = &pb.FriendApplyRsp{ + UserId: session.GetUserId(), + FriendId: req.FriendId, + } + } + session.SendMsg(string(this.module.GetType()), Friend_SubType_Apply, code, rsp) + }() + + if v, ok := chk["target"]; !ok { + code = pb.ErrorCode_FriendTargetNoData + return + } else { + target = v.(*pb.DB_FriendData) + } + //将自己加入到目标用户的申请列表中 - target.ApplyIds = append(target.ApplyIds, self.UserId) - err = this.module.model_friend.SetObj(req.FriendId, &pb.DB_FriendData{ - UserId: req.FriendId, - ApplyIds: target.ApplyIds, - }, false, true) + if target.ApplyIds == nil { + target.ApplyIds = []string{} + } + target.ApplyIds = append(target.ApplyIds, session.GetUserId()) + + err = this.module.model_friend.SetObj(req.FriendId, target, false, true) if err != nil { log.Errorf("firend Apply err:%v", err) diff --git a/modules/friend/api_refuse.go b/modules/friend/api_refuse.go index 45f1b9e8e..f139d68ba 100644 --- a/modules/friend/api_refuse.go +++ b/modules/friend/api_refuse.go @@ -7,6 +7,28 @@ import ( ) func (this *ApiComp) Refuse_Check(session comm.IUserSession, req *pb.FriendRefuseReq) (chk map[string]interface{}, code pb.ErrorCode) { + chk = make(map[string]interface{}) + var err error + self := &pb.DB_FriendData{UserId: session.GetUserId()} + + //获取玩家自己好友数据 + err = this.module.model_friend.GetObj(session.GetUserId(), self) + if self == nil || err != nil { + code = pb.ErrorCode_FriendSelfNoData + return + } + + //拒绝的Ids + refuseIds := []string{} + for _, friendId := range req.FriendIds { + if _, ok := utils.Find(self.ApplyIds, friendId); ok { + refuseIds = append(refuseIds, friendId) + } + } + + chk["self"] = self + chk["refuseIds"] = refuseIds + return } @@ -28,18 +50,24 @@ func (this *ApiComp) Refuse(session comm.IUserSession, chk map[string]interface{ session.SendMsg(string(this.module.GetType()), Friend_SubType_Refuse, code, rsp) }() - err = this.module.model_friend.GetObj(session.GetUserId(), self) - if self == nil || err != nil { - code = pb.ErrorCode_FriendSelfNoData + if v, ok := chk["self"]; !ok { + code = pb.ErrorCode_FriendTargetNoData return - } + } else { + self = v.(*pb.DB_FriendData) - //将申请人从申请列表中删除 - for _, userId := range req.FriendIds { - self.ApplyIds = utils.DeleteString(self.ApplyIds, userId) - optNum++ - } + if v, ok := chk["refuseIds"]; ok { + //将申请人从申请列表中删除 + for _, userId := range v.([]string) { + self.ApplyIds = utils.DeleteString(self.ApplyIds, userId) + optNum++ + } + //更新 + if optNum > 0 { + return this.module.model_friend.SetObj(self.UserId, self, false, true) + } - //更新 - return this.module.model_friend.SetObj(self.UserId, self, false, true) + } + } + return nil } diff --git a/modules/friend/model_friend.go b/modules/friend/model_friend.go index 2e19098e4..dfe997cfc 100644 --- a/modules/friend/model_friend.go +++ b/modules/friend/model_friend.go @@ -22,7 +22,7 @@ type ModelFriend struct { func (this *ModelFriend) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { err = this.Model_Comp.Init(service, module, comp, options) - this.Prefix = "friend" + this.TableName = "friend" return } diff --git a/modules/model_comp.go b/modules/model_comp.go index 7f62917df..a1ffa3537 100644 --- a/modules/model_comp.go +++ b/modules/model_comp.go @@ -14,6 +14,7 @@ import ( "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" "google.golang.org/protobuf/proto" ) @@ -23,9 +24,9 @@ DB组件也封装进来 */ type Model_Comp struct { cbase.ModuleCompBase - Redis redis.ISys - DB mgo.ISys - Prefix string //redis key前缀 + Redis redis.ISys + DB mgo.ISys + TableName string //redis key前缀 } const ( @@ -98,8 +99,9 @@ func (this *Model_Comp) UpdateModelLogs(table string, uID string, where bson.M, return err } +//设置缓存JSON格式数据 func (this *Model_Comp) SetObj(uid string, data proto.Message, isnew, islog bool) error { - err := this.Redis.Set(fmt.Sprintf("%s:%s", this.Prefix, uid), data, 0) + err := this.Redis.Set(fmt.Sprintf("%s:%s", this.TableName, uid), data, 0) if err != nil { log.Errorf("set err:%v", err) return err @@ -107,9 +109,9 @@ func (this *Model_Comp) SetObj(uid string, data proto.Message, isnew, islog bool if islog { if isnew { - return this.InsertModelLogs(this.Prefix, uid, data) + return this.InsertModelLogs(this.TableName, uid, data) } else { - return this.UpdateModelLogs(this.Prefix, uid, bson.M{"_id": uid}, data) + return this.UpdateModelLogs(this.TableName, uid, bson.M{"_id": uid}, data) } } return nil @@ -118,7 +120,7 @@ func (this *Model_Comp) SetObj(uid string, data proto.Message, isnew, islog bool //更新缓存字段 //isnew true insertlog , false updatelog func (this *Model_Comp) Set(uid string, v map[string]interface{}, isnew, islog bool) error { - err := this.Redis.HMSet(fmt.Sprintf("%s:%s", this.Prefix, uid), v) + err := this.Redis.HMSet(fmt.Sprintf("%s:%s", this.TableName, uid), v) if err != nil { log.Errorf("set err:%v", err) return err @@ -126,35 +128,57 @@ func (this *Model_Comp) Set(uid string, v map[string]interface{}, isnew, islog b if islog { if isnew { - return this.InsertModelLogs(this.Prefix, uid, v) + return this.InsertModelLogs(this.TableName, uid, v) } else { - return this.UpdateModelLogs(this.Prefix, uid, bson.M{"_id": uid}, v) + return this.UpdateModelLogs(this.TableName, uid, bson.M{"uid": uid}, v) } } return nil } -func (this *Model_Comp) GetObj(uid string, v interface{}) error { - return this.Redis.Get(fmt.Sprintf("%s:%s", this.Prefix, uid), v) +//获取缓存JSON数据 +func (this *Model_Comp) GetObj(uid string, v proto.Message) error { + err := this.Redis.Get(fmt.Sprintf("%s:%s", this.TableName, uid), v) + if err != nil { + if err == redis.RedisNil { + //query from mgo + err = this.DB.FindOne(core.SqlTable(this.TableName), bson.M{"_id": uid}).Decode(v) + if err != nil { + //no record + if err == mongo.ErrNoDocuments { + _, err = this.DB.InsertOne(core.SqlTable(this.TableName), v) + if err != nil { + log.Errorf("insert err: %v", err) + return err + } + //set cache + return this.SetObj(uid, v, true, false) + } + } + } else { + log.Errorf("get cache err: %v", err) + } + } + return err } //获取对象数据 func (this *Model_Comp) Get(uid string, v reflect.Type, fields ...string) ([]interface{}, error) { - return this.Redis.HMGet(fmt.Sprintf("%s:%s", this.Prefix, uid), v, fields...) + return this.Redis.HMGet(fmt.Sprintf("%s:%s", this.TableName, uid), v, fields...) } //获取字段数据 func (this *Model_Comp) GetField(uid string, field string, v interface{}) error { - return this.Redis.HGet(fmt.Sprintf("%s:%s", this.Prefix, uid), field, v) + return this.Redis.HGet(fmt.Sprintf("%s:%s", this.TableName, uid), field, v) } //删除一条数据 func (this *Model_Comp) Del(uid string) error { - err := this.Redis.HDel(fmt.Sprintf("%s:%s", this.Prefix, uid)) + err := this.Redis.HDel(fmt.Sprintf("%s:%s", this.TableName, uid)) if err != nil { log.Errorf("del err:%v", err) return err } - return this.DeleteModelLogs(this.Prefix, uid, bson.M{"_id": uid}) + return this.DeleteModelLogs(this.TableName, uid, bson.M{"_id": uid}) } diff --git a/modules/web/api_comp.go b/modules/web/api_comp.go index cb07f8233..c0dd8d6f0 100644 --- a/modules/web/api_comp.go +++ b/modules/web/api_comp.go @@ -39,11 +39,13 @@ func (this *Api_Comp) Register(c *engine.Context) { if err == nil { err := this.module.modelUser.User_Create(&pb.DB_UserData{ Binduid: req.Account, + Sid: req.Sid, }) if err != nil { log.Errorf("create user err: %v", err) rsp.Code = pb.ErrorCode_SqlExecutionError } + rsp.Account = req.Account rsp.Code = pb.ErrorCode_Success } else { rsp.Code = pb.ErrorCode_ReqParameterError diff --git a/services/worker/main.go b/services/worker/main.go index cca649e65..731eaa149 100644 --- a/services/worker/main.go +++ b/services/worker/main.go @@ -3,7 +3,6 @@ package main import ( "flag" "fmt" - "go_dreamfactory/modules/dbservice" "go_dreamfactory/modules/friend" "go_dreamfactory/modules/mail" "go_dreamfactory/modules/pack" @@ -41,7 +40,7 @@ func main() { pack.NewModule(), mail.NewModule(), friend.NewModule(), - dbservice.NewModule(), + // dbservice.NewModule(), ) }