migrate.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package toolmigrate
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/go-redis/redis/v8"
  6. _ "github.com/go-sql-driver/mysql"
  7. csnowflake "github.com/mhaya/extend/snowflake"
  8. "github.com/mhaya/game/game_cluster/internal/constant"
  9. "github.com/mhaya/game/game_cluster/internal/data"
  10. "github.com/mhaya/game/game_cluster/internal/mdb/models"
  11. "go.mongodb.org/mongo-driver/mongo"
  12. "go.mongodb.org/mongo-driver/mongo/options"
  13. "gorm.io/driver/mysql"
  14. "gorm.io/gorm"
  15. )
  16. var Mdb *mongo.Client
  17. var RDB redis.UniversalClient
  18. func InsertMongoPlayer(userS []FaUser) error {
  19. var playerData []*models.Player
  20. var docs []interface{}
  21. // 格式化数据存入mongodb
  22. for _, user := range userS {
  23. result, err := RDB.Get(context.Background(), user.Username).Result()
  24. if err != nil {
  25. return err
  26. }
  27. pid, err := RDB.Get(context.Background(), user.Pid).Result()
  28. if err != nil || pid == "" {
  29. pid = ""
  30. }
  31. var item = make(map[int]*models.Item)
  32. ret := data.ItemConfig.GetMap()
  33. for k, v := range ret {
  34. item[k] = &models.Item{
  35. ID: v.ID,
  36. ItemType: v.Type,
  37. ItemKey: v.ItemKey,
  38. }
  39. delete(item, models.ItemAllRoll)
  40. }
  41. pl := &models.Player{
  42. UserName: result,
  43. OpenId: user.Username,
  44. UserNameMaybe: user.Nickname,
  45. XID: user.XId,
  46. JoinIP: user.Joinip,
  47. Pid: pid,
  48. JoinTime: user.Jointime,
  49. CreateTime: user.Createtime,
  50. TonWall: user.Tonwall,
  51. UpdateTime: user.Updatetime,
  52. Level: int(user.Level),
  53. Item: item,
  54. }
  55. pl.Item.AddItem([]data.ItemReward{{ItemID: models.ItemScore, ItemBaseType: 1, Amount: int(user.Score)}})
  56. pl.Item.AddItem([]data.ItemReward{{ItemID: models.ItemRoll, ItemBaseType: 1, Amount: int(user.Roll)}})
  57. pl.Item.AddItem([]data.ItemReward{{ItemID: models.ItemInvite, ItemBaseType: 3, Amount: int(user.Invite)}})
  58. pl.Item.AddItem([]data.ItemReward{{ItemID: models.ItemDrawsNumber, ItemBaseType: 1, Amount: int(user.Drawsnumber)}})
  59. pl.Item.AddItem([]data.ItemReward{{ItemID: models.ItemTon, ItemBaseType: 1, Amount: MoneyRatioFloat64(user.WallTon)}})
  60. pl.Item.AddItem([]data.ItemReward{{ItemID: models.ItemU, ItemBaseType: 1, Amount: MoneyRatioFloat64(user.WallU)}})
  61. item[1].MaxNum = int(user.Allroll)
  62. playerData = append(playerData, pl)
  63. }
  64. // 将 playerData 转换为 []interface{} 类型
  65. docs = make([]interface{}, len(playerData))
  66. for i, player := range playerData {
  67. docs[i] = player
  68. }
  69. // 批量插入MongoDB
  70. collection := Mdb.Database("db_mhaya").Collection("player")
  71. _, err := collection.InsertMany(context.Background(), docs)
  72. if err != nil {
  73. return err
  74. }
  75. return nil
  76. }
  77. func MoneyRatioFloat64(f float64) int {
  78. return int(f * constant.MoneyRatio)
  79. }
  80. func InsertMongoBD() error {
  81. var userS []FaUser
  82. db, err := connectToDatabase()
  83. if err != nil {
  84. return err
  85. }
  86. db.Table("fa_user").Find(&userS)
  87. err = InsertMongoAccount(userS)
  88. if err != nil {
  89. return err
  90. }
  91. err = InsertMongoPlayer(userS)
  92. if err != nil {
  93. return err
  94. }
  95. return nil
  96. }
  97. func GetRedisConnect() {
  98. RDB = redis.NewUniversalClient(&redis.UniversalOptions{
  99. Addrs: []string{"127.0.0.1:6379"},
  100. Password: "",
  101. DB: 0,
  102. })
  103. }
  104. func InsertMongoAccount(userS []FaUser) error {
  105. var AccountData []models.Account
  106. // redis map 映射
  107. for _, user := range userS {
  108. RDB.Set(context.Background(), user.Username, Next(), 0)
  109. }
  110. for _, user := range userS {
  111. result, err := RDB.Get(context.Background(), user.Username).Result()
  112. if err != nil {
  113. return err
  114. }
  115. AccountData = append(AccountData, models.Account{
  116. Channel: "on",
  117. JoinIp: user.Joinip,
  118. JoinTime: user.Jointime,
  119. OpenId: user.Username,
  120. Platform: "tg",
  121. UserName: result,
  122. })
  123. }
  124. // 将 playerData 转换为 []interface{} 类型
  125. docs := make([]interface{}, len(AccountData))
  126. for i, player := range AccountData {
  127. docs[i] = player
  128. }
  129. // 批量插入MongoDB
  130. collection := Mdb.Database("db_mhaya").Collection("account")
  131. _, err := collection.InsertMany(context.Background(), docs)
  132. if err != nil {
  133. return err
  134. }
  135. return nil
  136. }
  137. func connectToMongoDB() error {
  138. // 假设使用标准库或第三方库进行 MongoDB 连接
  139. clientOptions := options.Client().ApplyURI("mongodb://192.168.0.185:27017")
  140. // 创建一个新的 MongoDB 客户端
  141. mdb, err := mongo.Connect(context.Background(), clientOptions)
  142. if err != nil {
  143. return err
  144. }
  145. // 检查连接是否成功
  146. err = mdb.Ping(context.Background(), nil)
  147. if err != nil {
  148. return err
  149. }
  150. Mdb = mdb
  151. return nil
  152. }
  153. func connectToDatabase() (*gorm.DB, error) {
  154. dsn := "root:root@tcp(127.0.0.1:3306)/load_db?charset=utf8mb4&parseTime=True&loc=Local"
  155. db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
  156. if err != nil {
  157. return nil, fmt.Errorf("failed to connect database: %v", err)
  158. }
  159. return db, nil
  160. }
  161. func Next() string {
  162. node, _ := csnowflake.NewNode(1)
  163. var sid string
  164. for {
  165. id := node.Generate()
  166. sid = id.Base58()
  167. if RDB.HExists(context.Background(), "PlayerID", sid).Val() {
  168. continue
  169. }
  170. RDB.HSet(context.Background(), "PlayerID", sid, 1)
  171. return sid
  172. }
  173. }
  174. func RunToMongoDB() {
  175. GetRedisConnect()
  176. err := connectToMongoDB()
  177. if err != nil {
  178. return
  179. }
  180. // err = InsertMongoBD()
  181. // if err != nil {
  182. // return
  183. // }
  184. }