From 3afa305d97e668bda2497c40f9471821171bc591 Mon Sep 17 00:00:00 2001 From: 陆恒 Date: Sat, 9 May 2020 14:28:03 +0800 Subject: [PATCH] 提交邀请功能的接口 --- src/HttpServer/logic/datadef.go | 11 +++++++++++ src/HttpServer/logic/errordef.go | 1 + src/HttpServer/logic/httpserver.go | 15 +++++++++++++++ src/HttpServer/logic/logic.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- src/common/redis/def.go | 3 ++- src/mysql/dbmysql.go | 80 ++++++++++++++++++++++++++++++++++++++++++++++---------------------------------- 6 files changed, 128 insertions(+), 38 deletions(-) diff --git a/src/HttpServer/logic/datadef.go b/src/HttpServer/logic/datadef.go index b30cd26..b6843af 100644 --- a/src/HttpServer/logic/datadef.go +++ b/src/HttpServer/logic/datadef.go @@ -115,6 +115,17 @@ type FetchInviteResp struct { Message string `json:"message"` } +type EnterInviteReq struct{ + Selfuuid int `json:"selfuuid"` + Inviteuuid int `json:"inviteuuid"` +} + + +type EnterInviteResp struct { + Code int `json:"code"` + Message string `json:"message"` +} + type RegeisterReq struct{ Account string `json:"account"` diff --git a/src/HttpServer/logic/errordef.go b/src/HttpServer/logic/errordef.go index e5cf885..0380ecd 100644 --- a/src/HttpServer/logic/errordef.go +++ b/src/HttpServer/logic/errordef.go @@ -40,4 +40,5 @@ const ( ERROR_ACCOUNTPWDWRONG= 35 //账号登录密码不对 ERROR_TEAMISMAX= 36 //队伍人数已满 ERROR_INVITEREAWARD_FETCHED= 37 //邀请奖励已经领取 + ERROR_ALREADY_INVITED= 38 //该玩家已经被邀请了 ) \ No newline at end of file diff --git a/src/HttpServer/logic/httpserver.go b/src/HttpServer/logic/httpserver.go index 522cf71..05af615 100644 --- a/src/HttpServer/logic/httpserver.go +++ b/src/HttpServer/logic/httpserver.go @@ -81,6 +81,7 @@ func startServerHttpServe() { //................................................................................................................... http.HandleFunc("/catcafe/user/queryInvite", QueryInvite) //查询玩家对应邀请关系 http.HandleFunc("/catcafe/user/fetchInviteReward",FetchInviteReward) //领取邀请奖励 + http.HandleFunc("/catcafe/user/enterInvite",EnterInvite) //别的玩家(新玩家)通过邀请连接进来 err := http.ListenAndServe(conf.GetServerHttpAddrConf(), nil) @@ -226,6 +227,20 @@ func ClearData(w http.ResponseWriter, r *http.Request) { //HandleRegeister(w,s) } + +func EnterInvite(w http.ResponseWriter, r *http.Request) { + + result, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + + s := string(result) + logger.Info("EnterInvite , body:%v,uuid=%v", s) + + HandleEnterInvite(w,s) + +} + + func FetchInviteReward(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 41c3779..cf4e719 100644 --- a/src/HttpServer/logic/logic.go +++ b/src/HttpServer/logic/logic.go @@ -273,6 +273,56 @@ func HandleQueryInvite(w http.ResponseWriter, data string) { fmt.Fprint(w, string(respstr)) } + +func HandleEnterInvite(w http.ResponseWriter, data string) { + + SetHeader(w) + var resp EnterInviteResp + resp.Code = 0 + var rdata EnterInviteReq + err := json.Unmarshal([]byte(data), &rdata) + for { + if err != nil { + logger.Error("HandleEnterInvite json unmarshal failed=%v", err) + resp.Code = ERROR_JSONUNMASHFAILED + resp.Message = "json unmarshal failed" + break + } + + //首先要判断一下这个玩家是否已经被邀请过了 + exist,err := redishandler.GetRedisClient().HExists(redis.USER_BEINVITE_UUIDRELATION,strconv.Itoa(rdata.Selfuuid)) + if err != nil { + logger.Error("HandleEnterInvite redis failed=%v", err) + resp.Code = ERROR_JSONUNMASHFAILED + resp.Message = fmt.Sprintf("%s",err) + break + } + + if exist { + logger.Error("HandleEnterInvite already invited") + resp.Code = ERROR_ALREADY_INVITED + resp.Message = fmt.Sprintf("%s",err) + break + } + + + //记录被邀请关系 + redishandler.GetRedisClient().HSet(redis.USER_BEINVITE_UUIDRELATION,strconv.Itoa(rdata.Selfuuid),strconv.Itoa(rdata.Inviteuuid)) + + //记录邀请关系 + rkey := redis.USER_INVITEREWARD_FETCH_REWARD + ":" + strconv.Itoa(rdata.Selfuuid) + redishandler.GetRedisClient().HSet(rkey,strconv.Itoa(rdata.Inviteuuid),"0") + + resp.Code = ERROR_OK + break + } + + //回包 + respstr, _ := json.Marshal(&resp) + fmt.Fprint(w, string(respstr)) +} + + func HandleFetchInviteReward(w http.ResponseWriter, data string) { SetHeader(w) @@ -289,7 +339,7 @@ func HandleFetchInviteReward(w http.ResponseWriter, data string) { } rkey := redis.USER_INVITEREWARD_FETCH_REWARD + ":" + strconv.Itoa(rdata.Selfuuid) - isexist,err := redishandler.GetRedisClient().HExists(rkey,strconv.Itoa(rdata.Fuuid)) + fetch,err := redishandler.GetRedisClient().HGet(rkey,strconv.Itoa(rdata.Fuuid)) if err != nil { logger.Error("HandleFetchInviteReward redis failed=%v", err) resp.Code = ERROR_JSONUNMASHFAILED @@ -297,7 +347,7 @@ func HandleFetchInviteReward(w http.ResponseWriter, data string) { break } - if isexist { + if fetch == "1" { logger.Error("HandleFetchInviteReward alreadyfetched failed=%v", err) resp.Code = ERROR_INVITEREAWARD_FETCHED resp.Message = "already fetched" @@ -305,7 +355,7 @@ func HandleFetchInviteReward(w http.ResponseWriter, data string) { } //将领取记录记录 - redishandler.GetRedisClient().HSet(rkey,strconv.Itoa(rdata.Fuuid),strconv.Itoa(rdata.Fuuid)) + redishandler.GetRedisClient().HSet(rkey,strconv.Itoa(rdata.Fuuid),"1") resp.Code = ERROR_OK break diff --git a/src/common/redis/def.go b/src/common/redis/def.go index 8abc1c3..dd418bd 100644 --- a/src/common/redis/def.go +++ b/src/common/redis/def.go @@ -16,5 +16,6 @@ const ( FRIEND_APPROVELIST_KEY = "CATCAFE_FRIEND_APPROVELIST_KEY" //待批准好友列表,需要在末尾加死":uuid" FRIEND_RECOMMANDLIST_KEY = "CATCAFE_FRIEND_RECOMMANDLIST_KEY" //推荐好友缓存key USER_ACCOUNT_PASSWORD_KEY = "CATCAFE_USER_ACCOUNT_PASSWORD_KEY" //玩家账号密码的key - USER_INVITEREWARD_FETCH_REWARD = "CATCAFE_USER_INVITEREWARD_FETCH_REWARD" //玩家邀请奖励领取状况 hset + USER_INVITEREWARD_FETCH_REWARD = "CATCAFE_USER_INVITEREWARD_FETCH_REWARD" //玩家邀请记录 hset key + uuid field为被邀请者的uuid value为领取状态 + USER_BEINVITE_UUIDRELATION = "CATCAFE_USER_BEINVITE_UUIDRELATION" //玩家被邀请关系记录表 ) diff --git a/src/mysql/dbmysql.go b/src/mysql/dbmysql.go index 12156ab..5e3208f 100644 --- a/src/mysql/dbmysql.go +++ b/src/mysql/dbmysql.go @@ -20,6 +20,7 @@ var ( type QuerInviteDesc struct { Uuid int NickName string + HeadUrl string IsFecthed int } @@ -151,49 +152,60 @@ func QueryAllData(f *os.File) error{ func QueryInvite(uuid int) ([]QuerInviteDesc,error){ var rtslice []QuerInviteDesc - for i:=0;i<10;i++ { - tablename := "b_user_ext_0" + strconv.Itoa(i) - cmd := "SELECT user_id,nickname, from " + tablename + " where invite_uid= " + strconv.Itoa(uuid) - rows, err := m_game_db.Query(cmd) - defer func() { - if rows != nil { - rows.Close() //可以关闭掉未scan连接一直占用 - } - }() - - if err != nil { - logger.Error("Query failed,err:%v", err) - continue - } - for rows.Next() { - var tmp QuerInviteDesc - err = rows.Scan(&tmp.Uuid, &tmp.NickName) //不scan会导致连接不释放 - if err != nil { - logger.Error("Scan failed,err:%v", err) - continue - } - tmp.IsFecthed = 0 - rtslice = append(rtslice,tmp) - } + //首先取出邀请关系id + rkey := redis.USER_INVITEREWARD_FETCH_REWARD + ":" + strconv.Itoa(uuid) + vv,err := redishandler.GetRedisClient().HGetAllKeys(rkey) + if err != nil { + logger.Error("QueryInvite err=%v",err) + return nil,err } - //需要查询一下当前领取状态 - rkey := redis.USER_INVITEREWARD_FETCH_REWARD + ":" + strconv.Itoa(uuid) - for k,val := range rtslice{ - isexist,err := redishandler.GetRedisClient().HExists(rkey,strconv.Itoa(val.Uuid)) + for _,val := range vv { + var tmp QuerInviteDesc + + bytestr := string(val.([]byte)) + bytenum,_ := strconv.Atoi(bytestr) + tmp.Uuid =bytenum + val,err :=redishandler.GetRedisClient().HGet(rkey,bytestr) if err != nil { - logger.Error("USER_INVITEREWARD_FETCH_REWARD failed err=%v",err) - rtslice[k].IsFecthed = 1 + tmp.IsFecthed = 1 + logger.Error("QueryInvite failed err=%v",err) continue } - if isexist { - //已经存在 - rtslice[k].IsFecthed = 1 - } + stat,_ := strconv.Atoi(val) + tmp.IsFecthed = stat + + rtslice = append(rtslice,tmp) } + //需要查询对应的数据 + for k,val := range rtslice { + for i:=0;i<10;i++ { + tablename := "b_user_ext_0" + strconv.Itoa(i) + cmd := "SELECT nickname,avatar_url from " + tablename + " where user_id= " + strconv.Itoa(val.Uuid) + rows, err := m_game_db.Query(cmd) + defer func() { + if rows != nil { + rows.Close() //可以关闭掉未scan连接一直占用 + } + }() + + if err != nil { + logger.Error("Query failed,err:%v", err) + continue + } + for rows.Next() { + err = rows.Scan(&rtslice[k].NickName, &rtslice[k].HeadUrl) //不scan会导致连接不释放 + if err != nil { + logger.Error("Scan failed,err:%v", err) + continue + } + } + } + } + return rtslice,nil } \ No newline at end of file -- libgit2 0.21.0