quick_sdk.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. package sdk
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/go-redis/redis/v8"
  6. jsoniter "github.com/json-iterator/go"
  7. mhayaGin "github.com/mhaya/components/gin"
  8. cerror "github.com/mhaya/error"
  9. cstring "github.com/mhaya/extend/string"
  10. mhayaTime "github.com/mhaya/extend/time"
  11. cfacade "github.com/mhaya/facade"
  12. "github.com/mhaya/game/game_cluster/internal/code"
  13. "github.com/mhaya/game/game_cluster/internal/constant"
  14. "github.com/mhaya/game/game_cluster/internal/data"
  15. "github.com/mhaya/game/game_cluster/internal/guid"
  16. "github.com/mhaya/game/game_cluster/internal/mdb"
  17. "github.com/mhaya/game/game_cluster/internal/mdb/models"
  18. "github.com/mhaya/game/game_cluster/internal/param"
  19. sessionKey "github.com/mhaya/game/game_cluster/internal/session_key"
  20. initdata "github.com/mhaya/game/game_cluster/internal/third/tg_sign"
  21. "github.com/mhaya/game/game_cluster/internal/token"
  22. clog "github.com/mhaya/logger"
  23. "go.mongodb.org/mongo-driver/bson"
  24. "go.mongodb.org/mongo-driver/mongo"
  25. "sort"
  26. "time"
  27. )
  28. type quickSdk struct {
  29. app cfacade.IApplication
  30. }
  31. func (quickSdk) SdkId() int {
  32. return QuickSDK
  33. }
  34. func (p quickSdk) Login(config *data.SdkConfigRow, params Params, callback Callback) {
  35. openid, found := params.GetString("openid")
  36. if found == false || cstring.IsBlank(openid) {
  37. err := cerror.Error("openid is nil")
  38. callback(code.LoginError, nil, err)
  39. return
  40. }
  41. ip, found := params.GetString("ip")
  42. if found == false || cstring.IsBlank(ip) {
  43. err := cerror.Error("ip is nil")
  44. callback(code.LoginError, nil, err)
  45. return
  46. }
  47. plt, found := params.GetString("platform")
  48. if found == false || cstring.IsBlank(plt) {
  49. err := cerror.Error("platform is nil")
  50. callback(code.LoginError, nil, err)
  51. return
  52. }
  53. channel, found := params.GetString("channel")
  54. if found == false || cstring.IsBlank(channel) {
  55. err := cerror.Error("channel is nil")
  56. callback(code.LoginError, nil, err)
  57. return
  58. }
  59. sign, _ := params.GetString("sign")
  60. req := &param.LoginReq{
  61. OpenID: openid,
  62. IP: ip,
  63. Platform: plt,
  64. Channel: channel,
  65. Sign: sign,
  66. }
  67. account, err := AccountRegisterOrLogin(req)
  68. if err > 0 {
  69. callback(code.LoginError, nil)
  70. return
  71. }
  72. nodeId, ok := SetNode(p.app)
  73. if code.IsFail(ok) {
  74. clog.Warnf("[RegisterAccount] openID = %s,nodeID=%v, errCode = %v", openid, nodeId, err)
  75. callback(code.LoginError, nil)
  76. return
  77. }
  78. targetPath := cfacade.NewChildPath(nodeId, "player"+nodeId, account.UserName)
  79. callback(code.OK, map[string]interface{}{
  80. sessionKey.PlayerID: account.UserName, //返回 quick的uid做为 open id
  81. sessionKey.OpenID: openid,
  82. sessionKey.TargetPath: targetPath,
  83. "account": account,
  84. })
  85. }
  86. func (p quickSdk) Reconnect(token *token.Token) (int32, *token.Token) {
  87. list := p.app.Discovery().ListByType("game")
  88. targetPath, err := cfacade.ToActorPath(token.TargetPath)
  89. if err != nil {
  90. clog.Warnf("[Reconnect] Target path error. targetPath = %v, error = %v", token.TargetPath, err)
  91. return code.AccountAuthFail, nil
  92. }
  93. isNew := false
  94. for _, v := range list {
  95. if v.GetNodeId() == targetPath.NodeID {
  96. isNew = true
  97. break
  98. }
  99. }
  100. if !isNew {
  101. nodeId, ok := SetNode(p.app)
  102. if code.IsFail(ok) {
  103. clog.Warnf("[RegisterAccount] openID = %s,nodeID=%v, errCode = %v", token.OpenID, nodeId, err)
  104. return code.AccountAuthFail, nil
  105. }
  106. path := cfacade.NewChildPath(nodeId, "player"+nodeId, token.PlayerID)
  107. token.TargetPath = path
  108. }
  109. return code.OK, token
  110. }
  111. func (p quickSdk) PayCallback(config *data.SdkConfigRow, c *mhayaGin.Context) {
  112. // TODO 这里实现quick sdk 支付回调的逻辑
  113. c.RenderHTML("FAIL")
  114. }
  115. func AccountRegisterOrLogin(req *param.LoginReq) (*models.Account, int32) {
  116. var account models.Account
  117. ctx := context.Background()
  118. acc, err := mdb.RDB.Get(ctx, fmt.Sprintf("%v:%v", constant.CNameAccount, req.OpenID)).Bytes()
  119. if err != nil && err != redis.Nil {
  120. clog.Debugf("[Account] AccountRegisterOrLogin error: %v", err)
  121. }
  122. findFilter := bson.M{"openId": req.OpenID}
  123. if len(acc) > 0 {
  124. err = jsoniter.Unmarshal(acc, &account)
  125. if err != nil {
  126. clog.Debugf("[Account] unmarshal AccountRegisterOrLogin data error: %v", err)
  127. return nil, code.LoginError
  128. }
  129. } else {
  130. err = mdb.MDB.Collection(constant.CNameAccount).FindOne(context.Background(), findFilter).Decode(&account)
  131. if err != nil && err != mongo.ErrNoDocuments {
  132. clog.Errorf("Failed to AccountRegisterOrLogin select err request: %v err = %v", req, err.Error())
  133. return nil, code.LoginError
  134. }
  135. }
  136. // todo 测试代码
  137. curLvID, _ := mdb.RDB.Get(context.Background(), constant.RocketLvKey).Int()
  138. if curLvID < 100 {
  139. curLvID = 100
  140. mdb.RDB.Set(context.Background(), constant.RocketLvKey, curLvID, 0)
  141. }
  142. user := initdata.GetUserInfo(req.Sign)
  143. //设置IP 规则
  144. num, ok := models.SetPlayerBlacklistIpRecord(req.IP, req.OpenID)
  145. if ok {
  146. clog.Errorf("Failed to SetPlayerBlacklistIpRecord err request: %v,num:%v", req, num)
  147. return nil, code.LoginError
  148. }
  149. if account.OpenId != "" {
  150. if account.Platform == "on" {
  151. //统计新注册
  152. models.SetAppointDailyRecordNewUserRegisterHash(req.Platform, req.Channel, account.UserName, account.JoinIp, mhayaTime.CreateFromTimestamp(account.JoinTime).Unix(), models.DailyRecordNewRegistered)
  153. }
  154. if (len(user.Username) > 0 && account.Account != user.Username) || user.IsPremium != account.IsPremium || req.IP != account.LoginIp || account.Platform != req.Platform {
  155. account.Account = user.Username
  156. account.IsPremium = user.IsPremium
  157. account.LoginIp = req.IP
  158. account.Platform = req.Platform
  159. //mdb.MDB.Collection(constant.CNameAccount).UpdateOne(context.Background(), findFilter, bson.M{"$set": bson.M{"platform": req.Platform, "account": user.Username, "isPremium": user.IsPremium, "loginIp": req.IP}})
  160. jsonData, _ := jsoniter.Marshal(&account)
  161. err = mdb.RDB.Set(context.Background(), fmt.Sprintf("%v:%v", constant.CNameAccount, account.OpenId), jsonData, time.Hour*3*24).Err()
  162. err = mdb.RDB.HSet(ctx, constant.NewAccounts, account.OpenId, 0).Err()
  163. if err != nil {
  164. clog.Errorf("Failed to AccountRegisterOrLogin request: %v err = %v", account, err.Error())
  165. return nil, code.LoginError
  166. }
  167. }
  168. return &account, code.OK
  169. }
  170. devAccountTable := &models.Account{
  171. UserName: guid.Next(),
  172. OpenId: req.OpenID,
  173. Platform: req.Platform,
  174. Channel: req.Channel,
  175. Account: user.Username,
  176. IsPremium: user.IsPremium,
  177. IsNew: true,
  178. LoginIp: req.IP,
  179. JoinIp: req.IP,
  180. JoinTime: mhayaTime.Now().Unix(),
  181. }
  182. player := models.NewPlayer(token.New(req.Pid, req.OpenID, devAccountTable.UserName, "", "", ""))
  183. jsonData, err := jsoniter.Marshal(&player)
  184. if err != nil {
  185. clog.Errorf("Failed to AccountRegisterOrLogin request: %v err = %v", devAccountTable, err.Error())
  186. return nil, code.LoginError
  187. }
  188. err = mdb.RDB.Set(ctx, fmt.Sprintf("%v:%v", constant.CNamePlayer, req.OpenID), jsonData, time.Hour*3*24).Err()
  189. if err != nil {
  190. clog.Errorf("Failed to AccountRegisterOrLogin request: %v err = %v", devAccountTable, err.Error())
  191. return nil, code.LoginError
  192. }
  193. jsonData, err = jsoniter.Marshal(&devAccountTable)
  194. if err != nil {
  195. clog.Errorf("Failed to AccountRegisterOrLogin request: %v err = %v", devAccountTable, err.Error())
  196. return nil, code.LoginError
  197. }
  198. err = mdb.RDB.Set(context.Background(), fmt.Sprintf("%v:%v", constant.CNameAccount, devAccountTable.OpenId), jsonData, time.Hour*3*24).Err()
  199. if err != nil {
  200. clog.Errorf("Failed to AccountRegisterOrLogin request: %v err = %v", devAccountTable, err.Error())
  201. return nil, code.LoginError
  202. }
  203. err = mdb.RDB.HSet(ctx, constant.NewAccounts, devAccountTable.OpenId, 1).Err()
  204. if err != nil {
  205. clog.Errorf("Failed to AccountRegisterOrLogin request: %v err = %v", devAccountTable, err.Error())
  206. return nil, code.LoginError
  207. }
  208. /* _, err = mdb.MDB.Collection(constant.CNameAccount).InsertOne(context.Background(), devAccountTable)
  209. if err != nil {
  210. clog.Errorf("Failed to AccountRegisterOrLogin request: %v err = %v", devAccountTable, err.Error())
  211. return nil, code.LoginError
  212. }*/
  213. //统计新注册
  214. models.SetDailyRecordNewUserRegisterHash(req.Platform, req.Channel, devAccountTable.UserName, req.IP, models.DailyRecordNewRegistered)
  215. // 新用户触发币安升级逻辑
  216. // 当前级别
  217. lvID, _ := mdb.RDB.Get(context.Background(), constant.RocketLvKey).Int()
  218. userNum := mdb.RDB.IncrBy(context.Background(), constant.TotalUserKey, 1).Val()
  219. /* // 当前用户数
  220. userNum, _ := mdb.MDB.Collection(constant.CNamePlayer).CountDocuments(context.Background(), bson.M{})*/
  221. roConfig := data.RocketLvConfig.GetAll()
  222. // 当前经验
  223. var curExperience int64
  224. // 当前升级所需经验
  225. var curLvNeed int64
  226. keys := []int{}
  227. for _, row := range roConfig {
  228. keys = append(keys, row.ID)
  229. }
  230. sort.Ints(keys)
  231. for _, id := range keys {
  232. lvRow := roConfig[id]
  233. if id == lvID {
  234. curLvNeed = int64(lvRow.LvNeed)
  235. break
  236. }
  237. curExperience += int64(lvRow.LvNeed)
  238. }
  239. //curLvID, _ := mdb.RDB.Get(context.Background(), constant.RocketLvKey).Int()
  240. //if curLvID < 100 {
  241. // curLvID = 100
  242. //}
  243. if userNum-curExperience >= curLvNeed {
  244. // 触发升级
  245. // 并发控制
  246. if lvID == curLvID {
  247. mdb.RDB.Set(context.Background(), constant.RocketLvKey, curLvID+1, 0)
  248. }
  249. }
  250. return devAccountTable, code.OK
  251. }