Commit 02fdd34ba068dddb0a7e117e4983d62e3d83b44e

Authored by 陆恒
1 parent a696d23c
Exists in master

提交新增加邀请打工的接口

src/HttpServer/logic/datadef.go
@@ -104,6 +104,30 @@ type QueryInviteResp struct { @@ -104,6 +104,30 @@ type QueryInviteResp struct {
104 Data []QueryInviteData `json:"data"` 104 Data []QueryInviteData `json:"data"`
105 } 105 }
106 106
  107 +
  108 +type InviteWorkReq struct{
  109 + Uuid int `json:"uuid"`
  110 +}
  111 +
  112 +//邀请打工数据结构
  113 +type InviteWorkDesc struct {
  114 + Uuid int `json:"uuid"` //打工者ID
  115 + InviteTime int `json:"invitetime"`//开始打工时间
  116 + Nickname string `json:"nickname"`//昵称
  117 + HeadUrl string `json:"headurl"`//头像
  118 +
  119 +}
  120 +
  121 +
  122 +type InviteWorkResp struct {
  123 + Code int `json:"code"`
  124 + Message string `json:"message"`
  125 + Data []InviteWorkDesc `json:"data"`
  126 +}
  127 +
  128 +
  129 +
  130 +
107 type FetchInviteReq struct{ 131 type FetchInviteReq struct{
108 Selfuuid int `json:"selfuuid"` 132 Selfuuid int `json:"selfuuid"`
109 Fuuid int `json:"fuuid"` 133 Fuuid int `json:"fuuid"`
@@ -118,6 +142,7 @@ type FetchInviteResp struct { @@ -118,6 +142,7 @@ type FetchInviteResp struct {
118 type EnterInviteReq struct{ 142 type EnterInviteReq struct{
119 Selfuuid int `json:"selfuuid"` 143 Selfuuid int `json:"selfuuid"`
120 Inviteuuid int `json:"inviteuuid"` 144 Inviteuuid int `json:"inviteuuid"`
  145 + Invitetype int `json:"invitetype"`
121 } 146 }
122 147
123 148
@@ -621,6 +646,8 @@ type QueryPlayerDataResp struct { @@ -621,6 +646,8 @@ type QueryPlayerDataResp struct {
621 //********************************************************************************************************** 646 //**********************************************************************************************************
622 647
623 648
  649 +
  650 +
624 //玩家数据 651 //玩家数据
625 type UserData struct { 652 type UserData struct {
626 Userid int //玩家id 653 Userid int //玩家id
src/HttpServer/logic/errordef.go
@@ -41,4 +41,6 @@ const ( @@ -41,4 +41,6 @@ const (
41 ERROR_TEAMISMAX= 36 //队伍人数已满 41 ERROR_TEAMISMAX= 36 //队伍人数已满
42 ERROR_INVITEREAWARD_FETCHED= 37 //邀请奖励已经领取 42 ERROR_INVITEREAWARD_FETCHED= 37 //邀请奖励已经领取
43 ERROR_ALREADY_INVITED= 38 //该玩家已经被邀请了 43 ERROR_ALREADY_INVITED= 38 //该玩家已经被邀请了
  44 + ERROR_DAGONG_FULL= 39 //打工人数已经满了 无法继续打工
  45 + ERROR_ALREADY_INWORK= 40 //正在打工中,无法再次打工
44 ) 46 )
45 \ No newline at end of file 47 \ No newline at end of file
src/HttpServer/logic/function.go
@@ -8,6 +8,7 @@ import ( @@ -8,6 +8,7 @@ import (
8 "encoding/hex" 8 "encoding/hex"
9 "encoding/json" 9 "encoding/json"
10 "errors" 10 "errors"
  11 + "mysql"
11 "net/http" 12 "net/http"
12 "sort" 13 "sort"
13 "strconv" 14 "strconv"
@@ -764,4 +765,69 @@ func GetAccountToken(acc string) string { @@ -764,4 +765,69 @@ func GetAccountToken(acc string) string {
764 } 765 }
765 766
766 return token 767 return token
  768 +}
  769 +
  770 +type WorkList []InviteWorkDesc
  771 +
  772 +func (wl *WorkList) IsInWork(uuid int) bool {
  773 + return false
  774 +}
  775 +
  776 +func GetdagongList(uuid int) (*WorkList,error) {
  777 + //需要判断 超过时间 四小时的删除
  778 + vv,err := redishandler.GetRedisClient().HGet(redis.USER_INVITEWORK_RELATION,strconv.Itoa(uuid))
  779 +
  780 + if err != nil {
  781 + logger.Error("GetdagongList err=%v",err)
  782 + return nil,err
  783 + }
  784 +
  785 + var list WorkList
  786 + err = json.Unmarshal([]byte(vv),&list)
  787 + if err != nil {
  788 + logger.Error("GetdagongList err=%v",err)
  789 + return nil,err
  790 + }
  791 +
  792 + nowtime := int(time.Now().Unix())
  793 + for i:=0;i<len(list);i++ {
  794 + if nowtime > 4 * 3600 + list[i].InviteTime {
  795 + list = append(list[:i],list[i+1:]...)
  796 + i--
  797 + }
  798 + }
  799 +
  800 + return &list,nil
  801 +}
  802 +
  803 +//加入打工列表
  804 +func AddDagongList(uuid int,masteruuid int,list WorkList) error {
  805 +
  806 + nickname,headurl,err := mysql.QueryNameAndHead(uuid)
  807 + if err != nil {
  808 + logger.Error("AddDagongList err=%v",err)
  809 + return err
  810 + }
  811 +
  812 + var tmp InviteWorkDesc
  813 + tmp.HeadUrl = headurl
  814 + tmp.Uuid = uuid
  815 + tmp.Nickname = nickname
  816 + tmp.InviteTime = int(time.Now().Unix())
  817 +
  818 + list = append(list,tmp)
  819 +
  820 + savestr,err := json.Marshal(&list)
  821 + if err != nil {
  822 + logger.Error("AddDagongList err=%v",err)
  823 + return err
  824 + }
  825 +
  826 + err = redishandler.GetRedisClient().HSet(redis.USER_INVITEWORK_RELATION,strconv.Itoa(masteruuid),string(savestr))
  827 + if err != nil {
  828 + logger.Error("AddDagongList err=%v",err)
  829 + return err
  830 + }
  831 +
  832 + return nil
767 } 833 }
768 \ No newline at end of file 834 \ No newline at end of file
src/HttpServer/logic/httpserver.go
@@ -82,6 +82,7 @@ func startServerHttpServe() { @@ -82,6 +82,7 @@ func startServerHttpServe() {
82 http.HandleFunc("/catcafe/user/queryInvite", QueryInvite) //查询玩家对应邀请关系 82 http.HandleFunc("/catcafe/user/queryInvite", QueryInvite) //查询玩家对应邀请关系
83 http.HandleFunc("/catcafe/user/fetchInviteReward",FetchInviteReward) //领取邀请奖励 83 http.HandleFunc("/catcafe/user/fetchInviteReward",FetchInviteReward) //领取邀请奖励
84 http.HandleFunc("/catcafe/user/enterInvite",EnterInvite) //别的玩家(新玩家)通过邀请连接进来 84 http.HandleFunc("/catcafe/user/enterInvite",EnterInvite) //别的玩家(新玩家)通过邀请连接进来
  85 + http.HandleFunc("/catcafe/user/queryInviteWork",QueryInviteWork) //获取邀请打工列表
85 86
86 87
87 err := http.ListenAndServe(conf.GetServerHttpAddrConf(), nil) 88 err := http.ListenAndServe(conf.GetServerHttpAddrConf(), nil)
@@ -228,6 +229,18 @@ func ClearData(w http.ResponseWriter, r *http.Request) { @@ -228,6 +229,18 @@ func ClearData(w http.ResponseWriter, r *http.Request) {
228 } 229 }
229 230
230 231
  232 +func QueryInviteWork(w http.ResponseWriter, r *http.Request) {
  233 +
  234 + result, _ := ioutil.ReadAll(r.Body)
  235 + r.Body.Close()
  236 +
  237 + s := string(result)
  238 + logger.Info("QueryInviteWork , body:%v,uuid=%v", s)
  239 +
  240 + HandleQueryInviteWork(w,s)
  241 +
  242 +}
  243 +
231 func EnterInvite(w http.ResponseWriter, r *http.Request) { 244 func EnterInvite(w http.ResponseWriter, r *http.Request) {
232 245
233 result, _ := ioutil.ReadAll(r.Body) 246 result, _ := ioutil.ReadAll(r.Body)
src/HttpServer/logic/logic.go
@@ -274,44 +274,120 @@ func HandleQueryInvite(w http.ResponseWriter, data string) { @@ -274,44 +274,120 @@ func HandleQueryInvite(w http.ResponseWriter, data string) {
274 } 274 }
275 275
276 276
277 -func HandleEnterInvite(w http.ResponseWriter, data string) { 277 +
  278 +func HandleQueryInviteWork(w http.ResponseWriter, data string) {
278 279
279 SetHeader(w) 280 SetHeader(w)
280 - var resp EnterInviteResp 281 + var resp InviteWorkResp
281 resp.Code = 0 282 resp.Code = 0
282 - var rdata EnterInviteReq 283 + var rdata InviteWorkReq
283 err := json.Unmarshal([]byte(data), &rdata) 284 err := json.Unmarshal([]byte(data), &rdata)
284 for { 285 for {
285 if err != nil { 286 if err != nil {
286 - logger.Error("HandleEnterInvite json unmarshal failed=%v", err) 287 + logger.Error("HandleQueryInviteWork json unmarshal failed=%v", err)
287 resp.Code = ERROR_JSONUNMASHFAILED 288 resp.Code = ERROR_JSONUNMASHFAILED
288 resp.Message = "json unmarshal failed" 289 resp.Message = "json unmarshal failed"
289 break 290 break
290 } 291 }
291 292
292 - //首先要判断一下这个玩家是否已经被邀请过了  
293 - exist,err := redishandler.GetRedisClient().HExists(redis.USER_BEINVITE_UUIDRELATION,strconv.Itoa(rdata.Selfuuid)) 293 + dalist,err := GetdagongList(rdata.Uuid)
294 if err != nil { 294 if err != nil {
295 - logger.Error("HandleEnterInvite redis failed=%v", err)  
296 - resp.Code = ERROR_JSONUNMASHFAILED 295 + logger.Error("HandleQueryInviteWork GetdagongList failed")
  296 + resp.Code = ERROR_SRVDB_FAILED
297 resp.Message = fmt.Sprintf("%s",err) 297 resp.Message = fmt.Sprintf("%s",err)
298 break 298 break
299 } 299 }
300 300
301 - if exist {  
302 - logger.Error("HandleEnterInvite already invited")  
303 - resp.Code = ERROR_ALREADY_INVITED  
304 - resp.Message = fmt.Sprintf("%s",err) 301 + for _,val := range *dalist {
  302 + resp.Data = append(resp.Data,val)
  303 + }
  304 +
  305 + resp.Code = ERROR_OK
  306 + break
  307 + }
  308 +
  309 + //回包
  310 + respstr, _ := json.Marshal(&resp)
  311 + fmt.Fprint(w, string(respstr))
  312 +}
  313 +
  314 +
  315 +
  316 +func HandleEnterInvite(w http.ResponseWriter, data string) {
  317 +
  318 + SetHeader(w)
  319 + var resp EnterInviteResp
  320 + resp.Code = 0
  321 + var rdata EnterInviteReq
  322 + err := json.Unmarshal([]byte(data), &rdata)
  323 + for {
  324 + if err != nil {
  325 + logger.Error("HandleEnterInvite json unmarshal failed=%v", err)
  326 + resp.Code = ERROR_JSONUNMASHFAILED
  327 + resp.Message = "json unmarshal failed"
305 break 328 break
306 } 329 }
307 330
  331 + if rdata.Invitetype == 1 {
  332 + //邀请新用户
  333 + //首先要判断一下这个玩家是否已经被邀请过了
  334 + exist,err := redishandler.GetRedisClient().HExists(redis.USER_BEINVITE_UUIDRELATION,strconv.Itoa(rdata.Selfuuid))
  335 + if err != nil {
  336 + logger.Error("HandleEnterInvite redis failed=%v", err)
  337 + resp.Code = ERROR_JSONUNMASHFAILED
  338 + resp.Message = fmt.Sprintf("%s",err)
  339 + break
  340 + }
308 341
309 - //记录被邀请关系  
310 - redishandler.GetRedisClient().HSet(redis.USER_BEINVITE_UUIDRELATION,strconv.Itoa(rdata.Selfuuid),strconv.Itoa(rdata.Inviteuuid)) 342 + if exist {
  343 + logger.Error("HandleEnterInvite already invited")
  344 + resp.Code = ERROR_ALREADY_INVITED
  345 + resp.Message = fmt.Sprintf("%s",err)
  346 + break
  347 + }
  348 +
  349 +
  350 + //记录被邀请关系
  351 + redishandler.GetRedisClient().HSet(redis.USER_BEINVITE_UUIDRELATION,strconv.Itoa(rdata.Selfuuid),strconv.Itoa(rdata.Inviteuuid))
  352 +
  353 + //记录邀请关系
  354 + rkey := redis.USER_INVITEREWARD_FETCH_REWARD + ":" + strconv.Itoa(rdata.Selfuuid)
  355 + redishandler.GetRedisClient().HSet(rkey,strconv.Itoa(rdata.Inviteuuid),"0")
  356 + }else {
  357 + //邀请打工
  358 + invitelist,err := GetdagongList(rdata.Inviteuuid)
  359 + if err != nil {
  360 + logger.Error("HandleEnterInvite GetdagongList failed")
  361 + resp.Code = ERROR_SRVDB_FAILED
  362 + resp.Message = fmt.Sprintf("%s",err)
  363 + break
  364 + }
  365 +
  366 + if len(*invitelist) > 2 {
  367 + logger.Error("HandleEnterInvite dagong num is full")
  368 + resp.Code = ERROR_DAGONG_FULL
  369 + resp.Message = "dagong full"
  370 + break
  371 + }
  372 +
  373 + //需要判断是否已经处于打工中
  374 + if invitelist.IsInWork(rdata.Selfuuid) {
  375 + logger.Error("HandleEnterInvite IsInWork")
  376 + resp.Code = ERROR_DAGONG_FULL
  377 + resp.Message = "ERROR_ALREADY_INWORK"
  378 + break
  379 + }
  380 +
  381 + err = AddDagongList(rdata.Selfuuid,rdata.Inviteuuid,*invitelist)
  382 +
  383 + if err != nil {
  384 + logger.Error("HandleEnterInvite ERROR_SRVDB_FAILED")
  385 + resp.Code = ERROR_SRVDB_FAILED
  386 + resp.Message = fmt.Sprintf("%s",err)
  387 + break
  388 + }
  389 + }
311 390
312 - //记录邀请关系  
313 - rkey := redis.USER_INVITEREWARD_FETCH_REWARD + ":" + strconv.Itoa(rdata.Selfuuid)  
314 - redishandler.GetRedisClient().HSet(rkey,strconv.Itoa(rdata.Inviteuuid),"0")  
315 391
316 resp.Code = ERROR_OK 392 resp.Code = ERROR_OK
317 break 393 break
src/common/redis/def.go
@@ -18,4 +18,5 @@ const ( @@ -18,4 +18,5 @@ const (
18 USER_ACCOUNT_PASSWORD_KEY = "CATCAFE_USER_ACCOUNT_PASSWORD_KEY" //玩家账号密码的key 18 USER_ACCOUNT_PASSWORD_KEY = "CATCAFE_USER_ACCOUNT_PASSWORD_KEY" //玩家账号密码的key
19 USER_INVITEREWARD_FETCH_REWARD = "CATCAFE_USER_INVITEREWARD_FETCH_REWARD" //玩家邀请记录 hset key + uuid field为被邀请者的uuid value为领取状态 19 USER_INVITEREWARD_FETCH_REWARD = "CATCAFE_USER_INVITEREWARD_FETCH_REWARD" //玩家邀请记录 hset key + uuid field为被邀请者的uuid value为领取状态
20 USER_BEINVITE_UUIDRELATION = "CATCAFE_USER_BEINVITE_UUIDRELATION" //玩家被邀请关系记录表 20 USER_BEINVITE_UUIDRELATION = "CATCAFE_USER_BEINVITE_UUIDRELATION" //玩家被邀请关系记录表
  21 + USER_INVITEWORK_RELATION = "CATCAFE_USER_INVITEWORK_RELATION" //玩家被邀请打工记录表
21 ) 22 )
src/mysql/dbmysql.go
@@ -208,4 +208,34 @@ func QueryInvite(uuid int) ([]QuerInviteDesc,error){ @@ -208,4 +208,34 @@ func QueryInvite(uuid int) ([]QuerInviteDesc,error){
208 } 208 }
209 209
210 return rtslice,nil 210 return rtslice,nil
  211 +}
  212 +
  213 +func QueryNameAndHead(uuid int) (string,string,error) {
  214 + var nickname string
  215 + var headurl string
  216 + for i:=0;i<10;i++ {
  217 + tablename := "b_user_ext_0" + strconv.Itoa(i)
  218 + cmd := "SELECT nickname,avatar_url from " + tablename + " where user_id= " + strconv.Itoa(uuid)
  219 + rows, err := m_game_db.Query(cmd)
  220 + defer func() {
  221 + if rows != nil {
  222 + rows.Close() //可以关闭掉未scan连接一直占用
  223 + }
  224 + }()
  225 +
  226 + if err != nil {
  227 + logger.Error("Query failed,err:%v", err)
  228 + return "","",err
  229 + }
  230 + for rows.Next() {
  231 +
  232 + err = rows.Scan(&nickname, &headurl) //不scan会导致连接不释放
  233 + if err != nil {
  234 + logger.Error("Scan failed,err:%v", err)
  235 + return "","",err
  236 + }
  237 + }
  238 + }
  239 +
  240 + return nickname,headurl,nil
211 } 241 }
212 \ No newline at end of file 242 \ No newline at end of file