controller.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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/third/tg_sign"
  14. "github.com/mhaya/game/game_cluster/internal/token"
  15. "github.com/mhaya/game/game_cluster/nodes/web/sdk"
  16. mhayaLogger "github.com/mhaya/logger"
  17. mhayaActor "github.com/mhaya/net/actor"
  18. "github.com/mhaya/net/parser/pomelo"
  19. "time"
  20. )
  21. type Controller struct {
  22. mhayaGin.BaseController
  23. Users
  24. }
  25. type (
  26. Users struct {
  27. pomelo.ActorBase
  28. }
  29. User struct {
  30. pomelo.ActorBase
  31. childExitTime time.Duration
  32. }
  33. )
  34. func (p *Users) GetChildActor(userName string) (cfacade.IActor, bool) {
  35. childActor, ok := p.Child().Get(userName)
  36. if !ok {
  37. var err error
  38. childActor, err = p.Child().Create(userName, &User{})
  39. if err != nil {
  40. return nil, false
  41. }
  42. }
  43. return childActor, true
  44. }
  45. func (cu *User) OnInit() {
  46. cu.childExitTime = time.Minute * 50
  47. cu.Timer().Add(30*time.Second, cu.sessionClose)
  48. }
  49. func (cu *User) sessionClose() {
  50. deadline := time.Now().Add(-cu.childExitTime).Unix()
  51. if cu.LastAt() < deadline {
  52. cu.Exit()
  53. }
  54. }
  55. func (p *Controller) Init() {
  56. group := p.Group("/")
  57. group.POST("/auth", p.auth)
  58. group.POST("/login", p.login)
  59. group.POST("/start", p.start)
  60. group.POST("/guide", p.guide)
  61. group.POST("/roll", p.roll)
  62. group.POST("/lottery", p.lottery)
  63. group.POST("/getLotteryConfig", p.getLotteryConfig)
  64. group.POST("/signIn", p.signIn)
  65. group.POST("/signInList", p.signInList)
  66. group.POST("/rank", p.rank)
  67. group.POST("/countryRank", p.countryRank)
  68. group.POST("/invite", p.invite)
  69. group.POST("/inviteRewardRatio", p.inviteRewardRatio)
  70. group.POST("/inviteClaimRatio", p.inviteClaimRatio)
  71. group.POST("/inviteNodeReward", p.inviteNodeReward)
  72. group.POST("/itemWeekRecord", p.itemWeekRecord)
  73. group.POST("/inviteRewardRatioHistory", p.inviteRewardRatioHistory)
  74. group.POST("/share", p.share)
  75. group.POST("/claim", p.claim)
  76. group.POST("/weeklyRankConfig", p.weeklyRankConfig)
  77. group.POST("/jump", p.jump)
  78. group.POST("/savex", p.savex)
  79. group.POST("/savetonwall", p.savetonwall)
  80. group.POST("/getLevel", p.getLevel)
  81. group.POST("/cashOut", p.cashOut)
  82. group.POST("/setPwd", p.setPwd)
  83. group.POST("/cashOutList", p.cashOutList)
  84. group.POST("/getLotteryHistory", p.getLotteryHistory)
  85. system := mhayaActor.NewSystem()
  86. system.SetApp(p.App)
  87. parentActor := &Users{}
  88. system.CreateActor(p.App.NodeId(), parentActor)
  89. p.Users = *parentActor
  90. }
  91. func (p *Controller) Auth(c *mhayaGin.Context) (*token.Token, int32) {
  92. tokenString := c.GetHeader(constant.Token)
  93. if tokenString == "" {
  94. return nil, code.AccountTokenValidateFail
  95. }
  96. userToken, ok := token.DecodeToken(tokenString)
  97. if ok == false {
  98. return nil, code.AccountTokenValidateFail
  99. }
  100. platformRow := data.SdkConfig.Get(userToken.PID)
  101. if platformRow == nil {
  102. return nil, code.AccountTokenValidateFail
  103. }
  104. _, ok = token.Validate(userToken, platformRow.Salt)
  105. if ok == false {
  106. return nil, code.AccountTokenValidateFail
  107. }
  108. oldToken := mdb.RDB.Get(context.Background(), fmt.Sprintf("%v:%v", constant.Token, userToken.OpenID)).Val()
  109. if oldToken != tokenString {
  110. return nil, code.AccountTokenValidateFail
  111. }
  112. /*
  113. sdkInvoke, err := sdk.GetInvoke(userToken.PID)
  114. if err != nil {
  115. mhayaLogger.Warnf("[Auth] [pid = %d] get invoke error. params=%v", userToken.PID, userToken)
  116. return nil, code.AccountTokenValidateFail
  117. }
  118. s, newToken := sdkInvoke.Reconnect(userToken)
  119. if code.IsFail(s) {
  120. mhayaLogger.Warnf("[Auth] Reconnect err , errCode = %v", s)
  121. return nil, code.AccountTokenValidateFail
  122. }
  123. //如果重新刷新路由
  124. if newToken.TargetPath != userToken.TargetPath {
  125. config := data.SdkConfig.Get(newToken.PID)
  126. if config == nil {
  127. mhayaLogger.Warnf("[Auth] if config err. params=%v", newToken)
  128. return nil, code.AccountTokenValidateFail
  129. }
  130. base64Token := token.New(userToken.PID, userToken.OpenID, userToken.PlayerID, newToken.TargetPath, "", config.Salt).ToBase64()
  131. err = mdb.RDB.Set(context.Background(), fmt.Sprintf("%v:%v", constant.Token, userToken.OpenID), base64Token, mhayaTime.SecondsPerWeek*time.Second).Err()
  132. if err != nil {
  133. mhayaLogger.Warnf("[Auth] result set token err. result = %s", newToken)
  134. return nil, code.AccountTokenValidateFail
  135. }
  136. ctl, ok := p.GetChildActor(newToken.PlayerID)
  137. if !ok {
  138. mhayaLogger.Warnf("[Auth] result set token err. result = %s", newToken)
  139. return nil, code.AccountTokenValidateFail
  140. }
  141. ctl.Call(userToken.TargetPath, "sessionClose", nil)
  142. errCode := ctl.Call(newToken.TargetPath, "login", newToken)
  143. if code.IsFail(errCode) {
  144. mhayaLogger.Warnf("[Auth] result set token err. result = %s", newToken)
  145. return nil, code.AccountTokenValidateFail
  146. }
  147. }
  148. */
  149. return userToken, code.OK
  150. }
  151. // login 根据pid获取sdkConfig,与第三方进行帐号登陆效验
  152. func (p *Controller) auth(c *mhayaGin.Context) {
  153. var pa param.LoginReq
  154. //body := c.GetBody()
  155. if err := c.BindJSON(&pa); err != nil {
  156. mhayaLogger.Warnf("[auth] if auth err. params=%v", pa)
  157. code.RenderResult(c, code.LoginError)
  158. return
  159. }
  160. config := data.SdkConfig.Get(pa.Pid)
  161. if config == nil {
  162. mhayaLogger.Warnf("[auth] if config err. params=%v", pa)
  163. code.RenderResult(c, code.LoginError)
  164. return
  165. }
  166. //sdkConfig := data.SdkConfig.Get(2).Params
  167. //pa.Sign = "query_id=AAHdF6IQAAAAAN0XohDhrOrc&user=%7B%22id%22%3A279058397%2C%22first_name%22%3A%22Vladislav%22%2C%22last_name%22%3A%22Kibenko%22%2C%22username%22%3A%22vdkfrost%22%2C%22language_code%22%3A%22ru%22%2C%22is_premium%22%3Atrue%7D&auth_date=1662771648&hash=c501b71e775f74ce10e377dea85a7ea24ecd640b223ea86dfe453e0eaed2e2b2"
  168. //sdkConfig.BotToken = "5768337691:AAH5YkoiEuPk8-FZa32hStHTqXiLPtAEhx8"
  169. sg := p.App.Settings().GetBool("is_not_sign")
  170. if !sg {
  171. err := initdata.Validate(pa.Sign, config.Params.BotToken, 0)
  172. if err != nil {
  173. mhayaLogger.Warnf("[auth] if sign err. params=%v", pa)
  174. code.RenderResult(c, code.LoginError)
  175. return
  176. }
  177. }
  178. sdkInvoke, err := sdk.GetInvoke(config.ID)
  179. if err != nil {
  180. mhayaLogger.Warnf("[auth] [pid = %d] get invoke error. params=%v", pa.Pid, pa)
  181. code.RenderResult(c, code.PIDError)
  182. return
  183. }
  184. params := c.GetParams(true)
  185. params["openid"] = pa.OpenID
  186. params["platform"] = pa.Platform
  187. params["channel"] = pa.Channel
  188. params["sign"] = pa.Sign
  189. params["ip"] = c.ClientIP()
  190. // 输出客户端 IP 地址
  191. //mhayaLogger.Debugf("[auth] [c.ClientIP() => ip = %s]", c.ClientIP())
  192. // invoke login
  193. sdkInvoke.Login(config, params, func(statusCode int32, result sdk.Result, error ...error) {
  194. if code.IsFail(statusCode) {
  195. mhayaLogger.Warnf("login validate fail. code = %d, params = %v", statusCode, c.GetParams())
  196. if len(error) > 0 {
  197. mhayaLogger.Warnf("code = %d, error = %s", statusCode, error[0])
  198. }
  199. code.RenderResult(c, statusCode)
  200. return
  201. }
  202. if result == nil {
  203. mhayaLogger.Warnf("callback result map is nil. params= %v", c.GetParams())
  204. code.RenderResult(c, code.LoginError)
  205. return
  206. }
  207. openId, found := result["open_id"].(string)
  208. if found == false {
  209. mhayaLogger.Warnf("callback result map not found `open_id`. result = %v", result)
  210. code.RenderResult(c, code.LoginError)
  211. return
  212. }
  213. playerId, found := result["player_id"].(string)
  214. if found == false {
  215. mhayaLogger.Warnf("callback result map not found `open_id`. result = %s", result)
  216. code.RenderResult(c, code.LoginError)
  217. return
  218. }
  219. targetPath, found := result["target_path"].(string)
  220. if found == false {
  221. mhayaLogger.Warnf("callback result map not found `targetPath`. result = %s", result)
  222. code.RenderResult(c, code.LoginError)
  223. return
  224. }
  225. /* account, found := result["account"].(*models.Account)
  226. if found == false {
  227. mhayaLogger.Warnf("callback result map not found `account`. result = %s", result)
  228. code.RenderResult(c, code.LoginError)
  229. return
  230. }
  231. ctl, ok := p.GetChildActor(playerId)
  232. if !ok {
  233. mhayaLogger.Warnf("callback result GetChildActor err. result = %s", result)
  234. code.RenderResult(c, code.LoginError)
  235. return
  236. }
  237. dbPath := cfacade.NewChildPath("m-database", "dbs", playerId)
  238. ctl.Call(dbPath, "setAccountDb", account)
  239. */
  240. //重新获取认证 需要断天原来服务器
  241. oldToken := mdb.RDB.Get(context.Background(), fmt.Sprintf("%v:%v", constant.Token, openId)).Val()
  242. if len(oldToken) > 0 {
  243. userToken, ok := token.DecodeToken(oldToken)
  244. if ok == false {
  245. mhayaLogger.Warnf("callback result set token err. result = %s", result)
  246. code.RenderResult(c, code.LoginError)
  247. return
  248. }
  249. //如果分配在不同节点需要断开原来服务器
  250. if userToken.TargetPath != targetPath {
  251. ctl, ok := p.GetChildActor(playerId)
  252. if !ok {
  253. mhayaLogger.Warnf("callback result GetChildActor err. result = %s", result)
  254. code.RenderResult(c, code.LoginError)
  255. return
  256. }
  257. ctl.Call(userToken.TargetPath, "sessionClose", nil)
  258. }
  259. }
  260. base64Token := token.New(pa.Pid, openId, playerId, targetPath, "", config.Salt).ToBase64()
  261. err = mdb.RDB.Set(context.Background(), fmt.Sprintf("%v:%v", constant.Token, openId), base64Token, mhayaTime.SecondsPerWeek*time.Second).Err()
  262. if err != nil {
  263. mhayaLogger.Warnf("callback result set token err. result = %s", result)
  264. code.RenderResult(c, code.LoginError)
  265. return
  266. }
  267. code.RenderResult(c, code.OK, base64Token)
  268. })
  269. }