From 02fdd34ba068dddb0a7e117e4983d62e3d83b44e Mon Sep 17 00:00:00 2001 From: 陆恒 Date: Mon, 11 May 2020 11:25:56 +0800 Subject: [PATCH] 提交新增加邀请打工的接口 --- src/HttpServer/logic/datadef.go | 27 +++++++++++++++++++++++++++ src/HttpServer/logic/errordef.go | 2 ++ src/HttpServer/logic/function.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/HttpServer/logic/httpserver.go | 13 +++++++++++++ src/HttpServer/logic/logic.go | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------- src/common/redis/def.go | 1 + src/mysql/dbmysql.go | 30 ++++++++++++++++++++++++++++++ 7 files changed, 232 insertions(+), 17 deletions(-) diff --git a/src/HttpServer/logic/datadef.go b/src/HttpServer/logic/datadef.go index b6843af..40f0492 100644 --- a/src/HttpServer/logic/datadef.go +++ b/src/HttpServer/logic/datadef.go @@ -104,6 +104,30 @@ type QueryInviteResp struct { Data []QueryInviteData `json:"data"` } + +type InviteWorkReq struct{ + Uuid int `json:"uuid"` +} + +//邀请打工数据结构 +type InviteWorkDesc struct { + Uuid int `json:"uuid"` //打工者ID + InviteTime int `json:"invitetime"`//开始打工时间 + Nickname string `json:"nickname"`//昵称 + HeadUrl string `json:"headurl"`//头像 + +} + + +type InviteWorkResp struct { + Code int `json:"code"` + Message string `json:"message"` + Data []InviteWorkDesc `json:"data"` +} + + + + type FetchInviteReq struct{ Selfuuid int `json:"selfuuid"` Fuuid int `json:"fuuid"` @@ -118,6 +142,7 @@ type FetchInviteResp struct { type EnterInviteReq struct{ Selfuuid int `json:"selfuuid"` Inviteuuid int `json:"inviteuuid"` + Invitetype int `json:"invitetype"` } @@ -621,6 +646,8 @@ type QueryPlayerDataResp struct { //********************************************************************************************************** + + //玩家数据 type UserData struct { Userid int //玩家id diff --git a/src/HttpServer/logic/errordef.go b/src/HttpServer/logic/errordef.go index 0380ecd..e650681 100644 --- a/src/HttpServer/logic/errordef.go +++ b/src/HttpServer/logic/errordef.go @@ -41,4 +41,6 @@ const ( ERROR_TEAMISMAX= 36 //队伍人数已满 ERROR_INVITEREAWARD_FETCHED= 37 //邀请奖励已经领取 ERROR_ALREADY_INVITED= 38 //该玩家已经被邀请了 + ERROR_DAGONG_FULL= 39 //打工人数已经满了 无法继续打工 + ERROR_ALREADY_INWORK= 40 //正在打工中,无法再次打工 ) \ No newline at end of file diff --git a/src/HttpServer/logic/function.go b/src/HttpServer/logic/function.go index e0f6e1c..a6f9a7c 100644 --- a/src/HttpServer/logic/function.go +++ b/src/HttpServer/logic/function.go @@ -8,6 +8,7 @@ import ( "encoding/hex" "encoding/json" "errors" + "mysql" "net/http" "sort" "strconv" @@ -764,4 +765,69 @@ func GetAccountToken(acc string) string { } return token +} + +type WorkList []InviteWorkDesc + +func (wl *WorkList) IsInWork(uuid int) bool { + return false +} + +func GetdagongList(uuid int) (*WorkList,error) { + //需要判断 超过时间 四小时的删除 + vv,err := redishandler.GetRedisClient().HGet(redis.USER_INVITEWORK_RELATION,strconv.Itoa(uuid)) + + if err != nil { + logger.Error("GetdagongList err=%v",err) + return nil,err + } + + var list WorkList + err = json.Unmarshal([]byte(vv),&list) + if err != nil { + logger.Error("GetdagongList err=%v",err) + return nil,err + } + + nowtime := int(time.Now().Unix()) + for i:=0;i 4 * 3600 + list[i].InviteTime { + list = append(list[:i],list[i+1:]...) + i-- + } + } + + return &list,nil +} + +//加入打工列表 +func AddDagongList(uuid int,masteruuid int,list WorkList) error { + + nickname,headurl,err := mysql.QueryNameAndHead(uuid) + if err != nil { + logger.Error("AddDagongList err=%v",err) + return err + } + + var tmp InviteWorkDesc + tmp.HeadUrl = headurl + tmp.Uuid = uuid + tmp.Nickname = nickname + tmp.InviteTime = int(time.Now().Unix()) + + list = append(list,tmp) + + savestr,err := json.Marshal(&list) + if err != nil { + logger.Error("AddDagongList err=%v",err) + return err + } + + err = redishandler.GetRedisClient().HSet(redis.USER_INVITEWORK_RELATION,strconv.Itoa(masteruuid),string(savestr)) + if err != nil { + logger.Error("AddDagongList err=%v",err) + return err + } + + return nil } \ No newline at end of file diff --git a/src/HttpServer/logic/httpserver.go b/src/HttpServer/logic/httpserver.go index 05af615..2bc8758 100644 --- a/src/HttpServer/logic/httpserver.go +++ b/src/HttpServer/logic/httpserver.go @@ -82,6 +82,7 @@ func startServerHttpServe() { http.HandleFunc("/catcafe/user/queryInvite", QueryInvite) //查询玩家对应邀请关系 http.HandleFunc("/catcafe/user/fetchInviteReward",FetchInviteReward) //领取邀请奖励 http.HandleFunc("/catcafe/user/enterInvite",EnterInvite) //别的玩家(新玩家)通过邀请连接进来 + http.HandleFunc("/catcafe/user/queryInviteWork",QueryInviteWork) //获取邀请打工列表 err := http.ListenAndServe(conf.GetServerHttpAddrConf(), nil) @@ -228,6 +229,18 @@ func ClearData(w http.ResponseWriter, r *http.Request) { } +func QueryInviteWork(w http.ResponseWriter, r *http.Request) { + + result, _ := ioutil.ReadAll(r.Body) + r.Body.Close() + + s := string(result) + logger.Info("QueryInviteWork , body:%v,uuid=%v", s) + + HandleQueryInviteWork(w,s) + +} + func EnterInvite(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 cf4e719..dde09f9 100644 --- a/src/HttpServer/logic/logic.go +++ b/src/HttpServer/logic/logic.go @@ -274,44 +274,120 @@ func HandleQueryInvite(w http.ResponseWriter, data string) { } -func HandleEnterInvite(w http.ResponseWriter, data string) { + +func HandleQueryInviteWork(w http.ResponseWriter, data string) { SetHeader(w) - var resp EnterInviteResp + var resp InviteWorkResp resp.Code = 0 - var rdata EnterInviteReq + var rdata InviteWorkReq err := json.Unmarshal([]byte(data), &rdata) for { if err != nil { - logger.Error("HandleEnterInvite json unmarshal failed=%v", err) + logger.Error("HandleQueryInviteWork 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)) + dalist,err := GetdagongList(rdata.Uuid) if err != nil { - logger.Error("HandleEnterInvite redis failed=%v", err) - resp.Code = ERROR_JSONUNMASHFAILED + logger.Error("HandleQueryInviteWork GetdagongList failed") + resp.Code = ERROR_SRVDB_FAILED 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) + for _,val := range *dalist { + resp.Data = append(resp.Data,val) + } + + resp.Code = ERROR_OK + break + } + + //回包 + respstr, _ := json.Marshal(&resp) + 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 } + if rdata.Invitetype == 1 { + //邀请新用户 + //首先要判断一下这个玩家是否已经被邀请过了 + 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 + } - //记录被邀请关系 - redishandler.GetRedisClient().HSet(redis.USER_BEINVITE_UUIDRELATION,strconv.Itoa(rdata.Selfuuid),strconv.Itoa(rdata.Inviteuuid)) + 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") + }else { + //邀请打工 + invitelist,err := GetdagongList(rdata.Inviteuuid) + if err != nil { + logger.Error("HandleEnterInvite GetdagongList failed") + resp.Code = ERROR_SRVDB_FAILED + resp.Message = fmt.Sprintf("%s",err) + break + } + + if len(*invitelist) > 2 { + logger.Error("HandleEnterInvite dagong num is full") + resp.Code = ERROR_DAGONG_FULL + resp.Message = "dagong full" + break + } + + //需要判断是否已经处于打工中 + if invitelist.IsInWork(rdata.Selfuuid) { + logger.Error("HandleEnterInvite IsInWork") + resp.Code = ERROR_DAGONG_FULL + resp.Message = "ERROR_ALREADY_INWORK" + break + } + + err = AddDagongList(rdata.Selfuuid,rdata.Inviteuuid,*invitelist) + + if err != nil { + logger.Error("HandleEnterInvite ERROR_SRVDB_FAILED") + resp.Code = ERROR_SRVDB_FAILED + resp.Message = fmt.Sprintf("%s",err) + break + } + } - //记录邀请关系 - rkey := redis.USER_INVITEREWARD_FETCH_REWARD + ":" + strconv.Itoa(rdata.Selfuuid) - redishandler.GetRedisClient().HSet(rkey,strconv.Itoa(rdata.Inviteuuid),"0") resp.Code = ERROR_OK break diff --git a/src/common/redis/def.go b/src/common/redis/def.go index dd418bd..0400e9b 100644 --- a/src/common/redis/def.go +++ b/src/common/redis/def.go @@ -18,4 +18,5 @@ const ( USER_ACCOUNT_PASSWORD_KEY = "CATCAFE_USER_ACCOUNT_PASSWORD_KEY" //玩家账号密码的key USER_INVITEREWARD_FETCH_REWARD = "CATCAFE_USER_INVITEREWARD_FETCH_REWARD" //玩家邀请记录 hset key + uuid field为被邀请者的uuid value为领取状态 USER_BEINVITE_UUIDRELATION = "CATCAFE_USER_BEINVITE_UUIDRELATION" //玩家被邀请关系记录表 + USER_INVITEWORK_RELATION = "CATCAFE_USER_INVITEWORK_RELATION" //玩家被邀请打工记录表 ) diff --git a/src/mysql/dbmysql.go b/src/mysql/dbmysql.go index 4060e75..4645a0c 100644 --- a/src/mysql/dbmysql.go +++ b/src/mysql/dbmysql.go @@ -208,4 +208,34 @@ func QueryInvite(uuid int) ([]QuerInviteDesc,error){ } return rtslice,nil +} + +func QueryNameAndHead(uuid int) (string,string,error) { + var nickname string + var headurl string + 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(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) + return "","",err + } + for rows.Next() { + + err = rows.Scan(&nickname, &headurl) //不scan会导致连接不释放 + if err != nil { + logger.Error("Scan failed,err:%v", err) + return "","",err + } + } + } + + return nickname,headurl,nil } \ No newline at end of file -- libgit2 0.21.0