controller.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package controller
  2. import (
  3. "context"
  4. "fmt"
  5. mhayaGin "github.com/mhaya/components/gin"
  6. mhayaTime "github.com/mhaya/extend/time"
  7. cfacade "github.com/mhaya/facade"
  8. "github.com/mhaya/game/game_cluster/internal/code"
  9. "github.com/mhaya/game/game_cluster/internal/constant"
  10. "github.com/mhaya/game/game_cluster/internal/data"
  11. "github.com/mhaya/game/game_cluster/internal/mdb"
  12. "github.com/mhaya/game/game_cluster/internal/param"
  13. "github.com/mhaya/game/game_cluster/internal/token"
  14. "github.com/mhaya/game/game_cluster/nodes/web/sdk"
  15. mhayaLogger "github.com/mhaya/logger"
  16. mhayaActor "github.com/mhaya/net/actor"
  17. "github.com/mhaya/net/parser/pomelo"
  18. "time"
  19. )
  20. type Controller struct {
  21. mhayaGin.BaseController
  22. Users
  23. }
  24. type (
  25. Users struct {
  26. pomelo.ActorBase
  27. }
  28. User struct {
  29. pomelo.ActorBase
  30. childExitTime time.Duration
  31. }
  32. )
  33. func (p *Users) GetChildActor(userName string) (cfacade.IActor, bool) {
  34. childActor, ok := p.Child().Get(userName)
  35. if !ok {
  36. var err error
  37. childActor, err = p.Child().Create(userName, &User{})
  38. if err != nil {
  39. return nil, false
  40. }
  41. }
  42. return childActor, true
  43. }
  44. func (cu *User) OnInit() {
  45. cu.childExitTime = time.Minute * 5
  46. cu.Timer().Add(10*time.Second, cu.sessionClose)
  47. }
  48. func (cu *User) sessionClose() {
  49. deadline := time.Now().Add(-cu.childExitTime).Unix()
  50. if cu.LastAt() < deadline {
  51. cu.Exit()
  52. }
  53. }
  54. func (p *Controller) Init() {
  55. group := p.Group("/")
  56. group.POST("/auth", p.auth)
  57. group.POST("/login", p.login)
  58. group.POST("/start", p.start)
  59. group.POST("/guide", p.guide)
  60. group.POST("/roll", p.roll)
  61. group.POST("/lottery", p.lottery)
  62. group.POST("/getLotteryConfig", p.getLotteryConfig)
  63. group.POST("/signIn", p.signIn)
  64. group.POST("/rank", p.rank)
  65. group.POST("/invite", p.invite)
  66. group.POST("/share", p.share)
  67. group.POST("/claim", p.claim)
  68. group.POST("/weeklyRankConfig", p.weeklyRankConfig)
  69. group.POST("/jump", p.jump)
  70. group.POST("/savex", p.savex)
  71. group.POST("/savetonwall", p.savetonwall)
  72. group.POST("/getLevel", p.getLevel)
  73. group.POST("/cashOut", p.cashOut)
  74. group.POST("/setPwd", p.setPwd)
  75. group.POST("/cashOutList", p.cashOutList)
  76. system := mhayaActor.NewSystem()
  77. system.SetApp(p.App)
  78. parentActor := &Users{}
  79. system.CreateActor(p.App.NodeId(), parentActor)
  80. p.Users = *parentActor
  81. }
  82. func (p *Controller) Auth(c *mhayaGin.Context) (*token.Token, int32) {
  83. tokenString := c.GetHeader(constant.Token)
  84. if tokenString == "" {
  85. return nil, code.AccountTokenValidateFail
  86. }
  87. userToken, ok := token.DecodeToken(tokenString)
  88. if ok == false {
  89. return nil, code.AccountTokenValidateFail
  90. }
  91. platformRow := data.SdkConfig.Get(userToken.PID)
  92. if platformRow == nil {
  93. return nil, code.AccountTokenValidateFail
  94. }
  95. _, ok = token.Validate(userToken, platformRow.Salt)
  96. if ok == false {
  97. return nil, code.AccountTokenValidateFail
  98. }
  99. oldToken := mdb.RDB.Get(context.Background(), fmt.Sprintf("%v:%v", constant.Token, userToken.OpenID)).Val()
  100. if oldToken != tokenString {
  101. return nil, code.AccountTokenValidateFail
  102. }
  103. return userToken, code.OK
  104. }
  105. // login 根据pid获取sdkConfig,与第三方进行帐号登陆效验
  106. func (p *Controller) auth(c *mhayaGin.Context) {
  107. var pa param.LoginReq
  108. //body := c.GetBody()
  109. if err := c.BindJSON(&pa); err != nil {
  110. mhayaLogger.Warnf("if login err {. params=%s", pa)
  111. code.RenderResult(c, code.PIDError)
  112. return
  113. }
  114. config := data.SdkConfig.Get(pa.Pid)
  115. if config == nil {
  116. mhayaLogger.Warnf("if platformConfig == nil {. params=%s", c.GetParams())
  117. code.RenderResult(c, code.LoginError)
  118. return
  119. }
  120. sdkInvoke, err := sdk.GetInvoke(config.ID)
  121. if err != nil {
  122. mhayaLogger.Warnf("[pid = %d] get invoke error. params=%s", pa.Pid, pa)
  123. code.RenderResult(c, code.PIDError)
  124. return
  125. }
  126. params := c.GetParams(true)
  127. params["openid"] = pa.OpenID
  128. params["platform"] = pa.Platform
  129. params["channel"] = pa.Channel
  130. params["ip"] = c.ClientIP()
  131. // invoke login
  132. sdkInvoke.Login(config, params, func(statusCode int32, result sdk.Params, error ...error) {
  133. if code.IsFail(statusCode) {
  134. mhayaLogger.Warnf("login validate fail. code = %d, params = %s", statusCode, c.GetParams())
  135. if len(error) > 0 {
  136. mhayaLogger.Warnf("code = %d, error = %s", statusCode, error[0])
  137. }
  138. code.RenderResult(c, statusCode)
  139. return
  140. }
  141. if result == nil {
  142. mhayaLogger.Warnf("callback result map is nil. params= %s", c.GetParams())
  143. code.RenderResult(c, code.LoginError)
  144. return
  145. }
  146. openId, found := result.GetString("open_id")
  147. if found == false {
  148. mhayaLogger.Warnf("callback result map not found `open_id`. result = %s", result)
  149. code.RenderResult(c, code.LoginError)
  150. return
  151. }
  152. playerId, found := result.GetString("player_id")
  153. if found == false {
  154. mhayaLogger.Warnf("callback result map not found `open_id`. result = %s", result)
  155. code.RenderResult(c, code.LoginError)
  156. return
  157. }
  158. targetPath, found := result.GetString("target_path")
  159. if found == false {
  160. mhayaLogger.Warnf("callback result map not found `targetPath`. result = %s", result)
  161. code.RenderResult(c, code.LoginError)
  162. return
  163. }
  164. //重新获取认证 需要断天原来服务器
  165. oldToken := mdb.RDB.Get(context.Background(), fmt.Sprintf("%v:%v", constant.Token, openId)).Val()
  166. if len(oldToken) > 0 {
  167. userToken, ok := token.DecodeToken(oldToken)
  168. if ok == false {
  169. return
  170. }
  171. //如果分配在不同节点需要断开原来服务器
  172. if userToken.TargetPath != targetPath {
  173. ctl, ok := p.GetChildActor(userToken.PlayerID)
  174. if !ok {
  175. return
  176. }
  177. ctl.Call(userToken.TargetPath, "sessionClose", nil)
  178. }
  179. }
  180. base64Token := token.New(pa.Pid, openId, playerId, targetPath, "", config.Salt).ToBase64()
  181. err = mdb.RDB.Set(context.Background(), fmt.Sprintf("%v:%v", constant.Token, openId), base64Token, mhayaTime.SecondsPerWeek*time.Second).Err()
  182. if err != nil {
  183. mhayaLogger.Warnf("callback result set token err. result = %s", result)
  184. code.RenderResult(c, code.LoginError)
  185. return
  186. }
  187. code.RenderResult(c, code.OK, base64Token)
  188. })
  189. }