diff --git a/src/HttpServer/logic/constdef.go b/src/HttpServer/logic/constdef.go new file mode 100644 index 0000000..326799e --- /dev/null +++ b/src/HttpServer/logic/constdef.go @@ -0,0 +1,8 @@ +package logic + + +const ( + FRIEND_MAX_NUM = 50 //好友人数上限 + FRIEND_APPLY_LIMIT = 50 //好友申请当日上限 + FRIEND_APPROVE_LIMIT = 50 //好友批准当日上限 +) \ No newline at end of file diff --git a/src/HttpServer/logic/datadef.go b/src/HttpServer/logic/datadef.go index 3119903..db05a27 100644 --- a/src/HttpServer/logic/datadef.go +++ b/src/HttpServer/logic/datadef.go @@ -393,12 +393,78 @@ type SearchTeamReq struct{ Page int `json:"page"` } +type SearchTeamResp struct { + Status string `json:"status"` + Result GetTeamListResult `json:"result"` +} +type FriendInfo struct { + Uuid int `json:"uuid"` + Status int `json:"status"` +} +type FriendList struct { + Friends []FriendInfo `json:"friends"` +} -type SearchTeamResp struct { +type ApplyInfo struct { + Uuid int `json:"uuid"` + Apply_time int `json:"apply_time"` +} +type ApplyList struct { + Apply_info []ApplyInfo `json:"apply_info"` +} + +type ApproveList struct { + Approve_info []ApplyInfo `json:"approve_info"` +} + +type SetFriendReq struct{ + Token string `json:"token"` + User_id int `json:"user_id"` +} + + +type SetFriendResp struct { Status string `json:"status"` - Result GetTeamListResult `json:"result"` + Result CommonResult `json:"result"` +} + +type GetFriendListReq struct{ + Token string `json:"token"` +} + +type GetFriendListDesc struct { + Friend_list []FriendInfo `json:"friend_list"` +} + +type GetFriendListResult struct { + Code int `json:"code"` + Data GetFriendListDesc `json:"data"` +} + +type GetFriendListResp struct { + Status string `json:"status"` + Result GetFriendListResult `json:"result"` +} + + +type GetAuditListReq struct{ + Token string `json:"token"` +} + +type GetAuditListDesc struct { + Approve_list []ApplyInfo `json:"approve_list"` +} + +type GetAuditListResult struct { + Code int `json:"code"` + Data GetAuditListDesc `json:"data"` +} + +type GetAuditListResp struct { + Status string `json:"status"` + Result GetAuditListResult `json:"result"` } diff --git a/src/HttpServer/logic/errordef.go b/src/HttpServer/logic/errordef.go index 73ad58b..2a1b204 100644 --- a/src/HttpServer/logic/errordef.go +++ b/src/HttpServer/logic/errordef.go @@ -20,4 +20,13 @@ const ( ERROR_TEAMNOTINTEAM = 15 //不在在队伍中无法再推出 ERROR_GETUSERINFOBYIDFAILED = 16 //通过uid查询玩家数据失败 ERROR_GETTEAMLISTFAILED = 17 //查询队伍列表失败 + ERROR_GETFRIENDLISTAILED = 18 //获取好友列表失败 + ERROR_INLISTAILED = 19 //已经在好友列表无法再添加 + ERROR_FRIENDISMAX = 20 //好友人数已经达到上限无法继续添加 + ERROR_FRIENDGETAPPLISTFAILED = 21 //获取申请好友列表失败 + ERROR_FRIENDAPPLYLIMIT = 22 //当日申请已达上限 + ERROR_FRIENDALREDAYINAPPLYLIST = 23 //已经在申请列表 + RROR_FRIENDGETAPPROVELISTFAILED = 24 //获取申请好友列表失败 + RROR_FRIENDINAPPROVELISTFAILED = 25 //已经在等待批准列表 + ERROR_FRIENDAPPROVELIMIT = 26 //当日批准已达上限 ) \ No newline at end of file diff --git a/src/HttpServer/logic/function.go b/src/HttpServer/logic/function.go index 8e42373..1b0176d 100644 --- a/src/HttpServer/logic/function.go +++ b/src/HttpServer/logic/function.go @@ -381,4 +381,155 @@ func GetTeamListByNameCond(shopnum int,page int, name string) (TeamSlice,error,i return rtslice[begin:end],nil,sumlen +} + +func (alist *ApproveList) InApproveList(uuid int) bool { + for _,val := range alist.Approve_info { + if val.Uuid == uuid { + return true + } + } + return false +} + +//待批准列表 +func GetUserApproveList(uuid int) (*ApproveList,error) { + rt := new(ApproveList) + //存储为hset key为 固定key+uuid ,field为被添加者的uuid,fieldW为FriendInfo + userkey := redis.FRIEND_APPROVELIST_KEY + ":" + strconv.Itoa(uuid) + vv,err := redishandler.GetRedisClient().HGetAllValues(userkey) + if err != nil { + logger.Error("GetUserApproveList err") + return nil,err + } + + nowtime:= int(time.Now().Unix()) + for _,val := range vv { + one := new(ApplyInfo) + bytestr := val.([]byte) + err = json.Unmarshal(bytestr, one) + if err!= nil { + //需要剔除超过时间的 + if nowtime <= one.Apply_time + 3*86400 { + rt.Approve_info = append(rt.Approve_info,*one) + }else { + //已经超时,需要删除 + redishandler.GetRedisClient().HDel(userkey,strconv.Itoa(one.Uuid)) + } + + } + + } + return rt,nil +} + +func SaveUserApproveList(uuid int,adduuid int) error { + userkey := redis.FRIEND_APPROVELIST_KEY + ":" + strconv.Itoa(uuid) + var finfo ApplyInfo + finfo.Uuid = adduuid + finfo.Apply_time = int(time.Now().Unix()) + str,err := json.Marshal(&finfo) + if err != nil { + logger.Error("SaveUserApproveList failed,err=%v",err) + } + err = redishandler.GetRedisClient().HSet(userkey,strconv.Itoa(adduuid),string(str)) + return err +} + +func (alist *ApplyList) InApplyList(uuid int) bool { + for _,val := range alist.Apply_info { + if val.Uuid == uuid { + return true + } + } + return false +} + +func GetUserApplyList(uuid int) (*ApplyList,error) { + rt := new(ApplyList) + //存储为hset key为 固定key+uuid ,field为被添加者的uuid,fieldW为FriendInfo + userkey := redis.FRIEND_APPLYLIST_KEY + ":" + strconv.Itoa(uuid) + vv,err := redishandler.GetRedisClient().HGetAllValues(userkey) + if err != nil { + logger.Error("GetUserApplyList err") + return nil,err + } + + nowtime:= int(time.Now().Unix()) + for _,val := range vv { + one := new(ApplyInfo) + bytestr := val.([]byte) + err = json.Unmarshal(bytestr, one) + if err!= nil { + //需要剔除超过时间的 + if nowtime <= one.Apply_time + 86400 { + rt.Apply_info = append(rt.Apply_info,*one) + }else { + //已经超时,需要删除 + redishandler.GetRedisClient().HDel(userkey,strconv.Itoa(one.Uuid)) + } + + } + + } + return rt,nil +} + +func SaveUserApplyList(uuid int,adduuid int) error { + userkey := redis.FRIEND_APPLYLIST_KEY + ":" + strconv.Itoa(uuid) + var finfo ApplyInfo + finfo.Uuid = adduuid + finfo.Apply_time = int(time.Now().Unix()) + str,err := json.Marshal(&finfo) + if err != nil { + logger.Error("SaveUserApplyList failed,err=%v",err) + } + err = redishandler.GetRedisClient().HSet(userkey,strconv.Itoa(adduuid),string(str)) + return err +} + +func GetUserFriendList(uuid int) (*FriendList,error) { + //todo + rt := new(FriendList) + //存储为hset key为 固定key+uuid ,field为被添加者的uuid,fieldW为FriendInfo + userkey := redis.FRIEND_LIST_KEY + ":" + strconv.Itoa(uuid) + vv,err := redishandler.GetRedisClient().HGetAllValues(userkey) + if err != nil { + logger.Error("GetUserFriendList err") + return nil,err + } + + for _,val := range vv { + one := new(FriendInfo) + bytestr := val.([]byte) + err = json.Unmarshal(bytestr, one) + if err!= nil { + rt.Friends = append(rt.Friends,*one) + } + + } + return rt,nil +} + +func SaveUserFriendList(uuid int,adduuid int) error { + userkey := redis.FRIEND_LIST_KEY + ":" + strconv.Itoa(uuid) + var finfo FriendInfo + finfo.Uuid = adduuid + finfo.Status = 0 + str,err := json.Marshal(&finfo) + if err != nil { + logger.Error("SaveUserFriendList failed,err=%v",err) + } + err = redishandler.GetRedisClient().HSet(userkey,strconv.Itoa(adduuid),string(str)) + return err +} + +//判断是否已经是好友 +func (flist *FriendList) IsInFreiendList(uuid int) bool { + for _,val := range flist.Friends { + if val.Uuid == uuid && val.Status == 0 { + return true + } + } + return false } \ No newline at end of file diff --git a/src/HttpServer/logic/httpserver.go b/src/HttpServer/logic/httpserver.go index b03a8ec..d94b658 100644 --- a/src/HttpServer/logic/httpserver.go +++ b/src/HttpServer/logic/httpserver.go @@ -46,12 +46,49 @@ func startServerHttpServe() { http.HandleFunc("/catcafe/team/getDataByUserId", GetDataByUserId) //获取队伍成员的详细数据 http.HandleFunc("/catcafe/team/getTeamList", GetTeamList) //查询队伍列表 http.HandleFunc("/catcafe/team/searchTeam", SearchTeam) //根据名称搜索队伍 + http.HandleFunc("/catcafe/friend/setFriendRequest", SetFriendRequest) //申请添加好友 + http.HandleFunc("/catcafe/friend/getList", GetFriendList) //获取好友列表 + http.HandleFunc("/catcafe/friend/getAuditList", GetAuditList) //获取待审核好友列表 err := http.ListenAndServe(conf.GetServerHttpAddrConf(), nil) CheckErr(err) } +func GetAuditList(w http.ResponseWriter, r *http.Request) { + + result, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + + s := string(result) + logger.Info("GetAuditList , body:%v,uuid=%v", s) + + HandleGetAuditList(w,s) +} + + +func GetFriendList(w http.ResponseWriter, r *http.Request) { + + result, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + + s := string(result) + logger.Info("GetFriendList , body:%v,uuid=%v", s) + + HandleGetFriendList(w,s) +} + +func SetFriendRequest(w http.ResponseWriter, r *http.Request) { + + result, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + + s := string(result) + logger.Info("SetFriendRequest , body:%v,uuid=%v", s) + + HandleSetFriendRequest(w,s) +} + func SearchTeam(w http.ResponseWriter, r *http.Request) { result, _ := ioutil.ReadAll(r.Body) diff --git a/src/HttpServer/logic/logic.go b/src/HttpServer/logic/logic.go index f120af8..c327651 100644 --- a/src/HttpServer/logic/logic.go +++ b/src/HttpServer/logic/logic.go @@ -1141,4 +1141,190 @@ func HandleSearchTeam(w http.ResponseWriter, data string) { //回包 respstr, _ := json.Marshal(&resp) fmt.Fprint(w, string(respstr)) -} \ No newline at end of file +} + + +func HandleSetFriendRequest(w http.ResponseWriter, data string) { + SetHeader(w) + var resp SetFriendResp + resp.Status = "true" + resp.Result.Code = ERROR_OK + var rdata SetFriendReq + err := json.Unmarshal([]byte(data), &rdata) + for { + if err != nil { + logger.Error("HandleSetFriendRequest json unmarshal failed=%v", err) + resp.Result.Code = ERROR_JSONUNMASHFAILED + break + } + + uuid,err := GetTouristUid(rdata.Token) + if err != nil || uuid==0{ + logger.Error("HandleSetFriendRequest GetTouristUid failed=%v", err) + resp.Result.Code = ERROR_GETUSERIDFAILED + break + } + + //先判断是否是好友关系 + list,err := GetUserFriendList(rdata.User_id) + if err != nil { + logger.Error("HandleSetFriendRequest GetFriendList failed=%v", err) + resp.Result.Code = ERROR_GETFRIENDLISTAILED + break + } + inlist := list.IsInFreiendList(uuid) + if inlist { + logger.Error("HandleSetFriendRequest InFriendList failed=%v", err) + resp.Result.Code = ERROR_INLISTAILED + break + } + + //判断自己的好友人数是否已经达到上限 + ownlist,err := GetUserFriendList(uuid) + if err != nil { + logger.Error("HandleSetFriendRequest GetFriendList failed=%v", err) + resp.Result.Code = ERROR_GETFRIENDLISTAILED + break + } + //判断好友人数上限 + if len(list.Friends) >= FRIEND_MAX_NUM || len(ownlist.Friends) >= FRIEND_MAX_NUM { + logger.Error("HandleSetFriendRequest FRIENDMAX failed=%v", err) + resp.Result.Code = ERROR_FRIENDISMAX + break + } + + //判断申请列表是否已经有对该玩家的申请 24小时,此处需要判断24小时内的申请次数上限,需要先提出超过24小时的申请 + applylist,err := GetUserApplyList(uuid) + if err != nil { + logger.Error("HandleSetFriendRequest GetApplyListFailed failed=%v", err) + resp.Result.Code = ERROR_FRIENDGETAPPLISTFAILED + break + } + + if applylist.InApplyList(rdata.User_id) { + logger.Error("HandleSetFriendRequest ALREDAYINAPPLYLIST failed=%v", err) + resp.Result.Code = ERROR_FRIENDALREDAYINAPPLYLIST + break + } + + if len(applylist.Apply_info) >=FRIEND_APPLY_LIMIT { + logger.Error("HandleSetFriendRequest Apply limit failed=%v", err) + resp.Result.Code = ERROR_FRIENDAPPLYLIMIT + break + } + + //加入对方列表,如果已经在对方待批准列表则返回错误 + approvelist,err := GetUserApproveList(rdata.User_id) + if err != nil { + logger.Error("HandleSetFriendRequest GetApproveListFailed failed=%v", err) + resp.Result.Code = RROR_FRIENDGETAPPROVELISTFAILED + break + } + + if approvelist.InApproveList(uuid) { + logger.Error("HandleSetFriendRequest inApprovelist failed=%v", err) + resp.Result.Code = RROR_FRIENDINAPPROVELISTFAILED + break + } + + if len(approvelist.Approve_info) >=FRIEND_APPROVE_LIMIT { + logger.Error("HandleSetFriendRequest Apply limit failed=%v", err) + resp.Result.Code = ERROR_FRIENDAPPROVELIMIT + break + } + + //添加到对方的待批准记录 + SaveUserApplyList(uuid,rdata.User_id) + + //添加到自己的申请记录 + SaveUserApproveList(rdata.User_id,uuid) + + //清空好友推荐缓存 + //TODO + + resp.Result.Code = ERROR_OK + break + } + + //回包 + respstr, _ := json.Marshal(&resp) + fmt.Fprint(w, string(respstr)) +} + +func HandleGetFriendList(w http.ResponseWriter, data string) { + SetHeader(w) + var resp GetFriendListResp + resp.Status = "true" + resp.Result.Code = ERROR_OK + var rdata GetFriendListReq + err := json.Unmarshal([]byte(data), &rdata) + for { + if err != nil { + logger.Error("HandleGetFriendList json unmarshal failed=%v", err) + resp.Result.Code = ERROR_JSONUNMASHFAILED + break + } + + uuid,err := GetTouristUid(rdata.Token) + if err != nil || uuid==0{ + logger.Error("HandleGetFriendList GetTouristUid failed=%v", err) + resp.Result.Code = ERROR_GETUSERIDFAILED + break + } + + friendlist,err := GetUserFriendList(uuid) + if err != nil { + logger.Error("HandleSetFriendRequest GetFriendList failed=%v", err) + resp.Result.Code = ERROR_GETFRIENDLISTAILED + break + } + resp.Result.Data.Friend_list = append(resp.Result.Data.Friend_list,friendlist.Friends...) + + resp.Result.Code = ERROR_OK + break + } + + //回包 + respstr, _ := json.Marshal(&resp) + fmt.Fprint(w, string(respstr)) +} + + +func HandleGetAuditList(w http.ResponseWriter, data string) { + SetHeader(w) + var resp GetAuditListResp + resp.Status = "true" + resp.Result.Code = ERROR_OK + var rdata GetAuditListReq + err := json.Unmarshal([]byte(data), &rdata) + for { + if err != nil { + logger.Error("HandleGetAuditList json unmarshal failed=%v", err) + resp.Result.Code = ERROR_JSONUNMASHFAILED + break + } + + uuid,err := GetTouristUid(rdata.Token) + if err != nil || uuid==0{ + logger.Error("HandleGetAuditList GetTouristUid failed=%v", err) + resp.Result.Code = ERROR_GETUSERIDFAILED + break + } + + approvelist,err := GetUserApproveList(uuid) + if err != nil { + logger.Error("HandleGetAuditList Getapprovelistfailedt failed=%v", err) + resp.Result.Code = RROR_FRIENDGETAPPROVELISTFAILED + break + } + resp.Result.Data.Approve_list = append(resp.Result.Data.Approve_list,approvelist.Approve_info...) + + resp.Result.Code = ERROR_OK + break + } + + //回包 + respstr, _ := json.Marshal(&resp) + fmt.Fprint(w, string(respstr)) +} + diff --git a/src/common/redis/def.go b/src/common/redis/def.go index e9e2db5..8f695f7 100644 --- a/src/common/redis/def.go +++ b/src/common/redis/def.go @@ -11,4 +11,7 @@ const ( TEAM_INFO = "CATCAFE_TEAM_INFO" //存储了玩家队伍信息 TEAM_MAX_UUID = "CATCAFE_TEAM_MAX_UUID" //记录当前最大的teamid,新增自增即可 TEAM_TEAMID_TOUUID = "CATCAFE_TEAM_TEAMID_TOUUID" //记录teamid与uuid的关系 + FRIEND_LIST_KEY = "CATCAFE_FRIEND_LIST_KEY" //玩家的好友列表的key,需要在末尾加死":uuid" + FRIEND_APPLYLIST_KEY = "CATCAFE_FRIEND_APPLYLIST_KEY" //玩家申请好友列表,需要在末尾加死":uuid" + FRIEND_APPROVELIST_KEY = "CATCAFE_FRIEND_APPROVELIST_KEY" //待批准好友列表,需要在末尾加死":uuid" ) -- libgit2 0.21.0