diff --git a/statistics/etc/config.yaml b/statistics/etc/config.yaml index ba82d5c..d8ddbd7 100644 --- a/statistics/etc/config.yaml +++ b/statistics/etc/config.yaml @@ -24,4 +24,9 @@ update_invite_num: 30 # 几秒读取一次道具日志 update_second_item: 10 # 一次最多读取多少道具日志 -update_item_num: 100 \ No newline at end of file +update_item_num: 100 + +# rabbitmq配置 +rabbitmq: + url: amqp://win88:123456@127.0.0.1:5672/win99 + exchange: win99 \ No newline at end of file diff --git a/statistics/main.go b/statistics/main.go index c738b31..822bf92 100644 --- a/statistics/main.go +++ b/statistics/main.go @@ -15,9 +15,10 @@ import ( "mongo.games.com/goserver/core/utils" "mongo.games.com/goserver/core/viperx" + "mongo.games.com/game/mq" mongomodel "mongo.games.com/game/statistics/modelmongo" mysqlmodel "mongo.games.com/game/statistics/modelmysql" - "mongo.games.com/game/statistics/static" + _ "mongo.games.com/game/statistics/mq" "mongo.games.com/game/statistics/syn" ) @@ -92,26 +93,32 @@ func main() { mysqlx.SetAutoMigrateTables(mysqlmodel.Tables) + // mq + mq.StartConsumer(VP.GetString("rabbitmq.url"), VP.GetString("rabbitmq.exchange"), true) + wg := &sync.WaitGroup{} ctx, cancel := context.WithCancel(context.Background()) + // 同步注册和登录日志 DoTick(ctx, wg, time.Duration(VP.GetInt64("update_second"))*time.Second, SyncSnId) - DoTick(ctx, wg, time.Duration(VP.GetInt64("update_second_snid"))*time.Second, func(ctx context.Context) { - wg := new(sync.WaitGroup) - for _, v := range VP.GetStringSlice("platforms") { - platform := v - wg.Add(1) - go func() { - defer wg.Done() - Static(platform) - }() - } - wg.Wait() - }) + //DoTick(ctx, wg, time.Duration(VP.GetInt64("update_second_snid"))*time.Second, func(ctx context.Context) { + // wg := new(sync.WaitGroup) + // for _, v := range VP.GetStringSlice("platforms") { + // platform := v + // wg.Add(1) + // go func() { + // defer wg.Done() + // Static(platform) + // }() + // } + // wg.Wait() + //}) + // 同步邀请数据 DoTick(ctx, wg, time.Duration(VP.GetInt64("update_second_invite"))*time.Second, SyncInvite) + // 同步道具日志数据 DoTickPlatform(ctx, wg, time.Duration(VP.GetInt64("update_second_item"))*time.Second, VP.GetInt("update_item_num"), func(ctx context.Context, platform string, batchSize int) { err := syn.ItemGainDone(&syn.Data[mongomodel.ItemLog]{ @@ -123,7 +130,7 @@ func main() { } }) - logger.Logger.Info("start") + logger.Logger.Info("start success") c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, os.Kill) @@ -162,36 +169,36 @@ func SyncSnId(ctx context.Context) { } // Static 玩家id触发数据统计 -func Static(platform string) { - // 查询需要更新的玩家id - var ids []*mysqlmodel.UserID - db, err := mysqlx.GetDatabase(platform) - if err != nil { - logger.Logger.Errorf("GetDatabase error: %v", err) - return - } - if err := db.Limit(VP.GetInt("update_snid_num")).Find(&ids).Error; err != nil { - logger.Logger.Warnf("Get UserID error: %v", err) - return - } - - if len(ids) == 0 { - logger.Logger.Tracef("Static: no need to update") - return - } - - // 统计玩家跳出记录 - if err := static.UserLogin(platform, ids); err != nil { - logger.Logger.Errorf("StaticUserLogin error: %v", err) - return - } - - // 删除更新过的玩家id - if err := db.Delete(ids).Error; err != nil { - logger.Logger.Errorf("Delete error: %v", err) - return - } -} +//func Static(platform string) { +// // 查询需要更新的玩家id +// var ids []*mysqlmodel.UserID +// db, err := mysqlx.GetDatabase(platform) +// if err != nil { +// logger.Logger.Errorf("GetDatabase error: %v", err) +// return +// } +// if err := db.Limit(VP.GetInt("update_snid_num")).Find(&ids).Error; err != nil { +// logger.Logger.Warnf("Get UserID error: %v", err) +// return +// } +// +// if len(ids) == 0 { +// logger.Logger.Tracef("Static: no need to update") +// return +// } +// +// // 统计玩家跳出记录 +// //if err := static.UserLogin(platform, ids); err != nil { +// // logger.Logger.Errorf("StaticUserLogin error: %v", err) +// // return +// //} +// +// // 删除更新过的玩家id +// if err := db.Delete(ids).Error; err != nil { +// logger.Logger.Errorf("Delete error: %v", err) +// return +// } +//} // SyncInvite 同步邀请数据 func SyncInvite(ctx context.Context) { diff --git a/statistics/modelmysql/tables.go b/statistics/modelmysql/tables.go index 8f9bd15..e235936 100644 --- a/statistics/modelmysql/tables.go +++ b/statistics/modelmysql/tables.go @@ -1,5 +1,7 @@ package modelmysql +import "mongo.games.com/game/model" + // 需要自动迁移的表添加在这里 Tables var Tables = []interface{}{ @@ -14,4 +16,5 @@ var Tables = []interface{}{ &LogMid{}, &ItemGain{}, &ItemTotalGain{}, + &model.ThirteenAutoLog{}, } diff --git a/statistics/mq/handler.go b/statistics/mq/handler.go index 71893fd..657e5ea 100644 --- a/statistics/mq/handler.go +++ b/statistics/mq/handler.go @@ -1 +1,35 @@ package mq + +import ( + "mongo.games.com/goserver/core/logger" + "mongo.games.com/goserver/core/mysqlx" + + "mongo.games.com/game/model" + "mongo.games.com/game/mq" +) + +func init() { + mq.RegisterHandler(&mq.RegisterHandlerParam{ + Name: mq.BackThirteenAutoLog, + Data: &model.ThirteenAutoLog{}, + Handler: func(data interface{}) (err error) { + d, ok := data.(*model.ThirteenAutoLog) + if !ok { + return nil + } + + db, err := mysqlx.GetDatabase(d.Platform) + if err != nil { + logger.Logger.Errorf("mysql: SyncThirteenAutoLog failed to get database: %v", err) + return err + } + + if err = db.Create(d).Error; err != nil { + logger.Logger.Errorf("mysql: SyncThirteenAutoLog failed to create thirteen_auto_log: %v", err) + return err + } + + return nil + }, + }) +} diff --git a/statistics/static/user_login.go b/statistics/static/user_login.go index d217e2c..9aa1f85 100644 --- a/statistics/static/user_login.go +++ b/statistics/static/user_login.go @@ -1,371 +1,355 @@ package static -import ( - "context" - "errors" - - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" - "mongo.games.com/goserver/core/logger" - - mymongo "mongo.games.com/goserver/core/mongox" - mymysql "mongo.games.com/goserver/core/mysqlx" - - mongomodel "mongo.games.com/game/statistics/modelmongo" - mysqlmodel "mongo.games.com/game/statistics/modelmysql" -) - -func getAccountTel(platform string, id int) (string, error) { - acc := &mongomodel.Account{} - cc, err := mymongo.GetUserCollection(platform, mongomodel.UserAccount) - if err != nil { - logger.Logger.Errorf("get collection %s error %v", mongomodel.UserAccount, err) - return "", err - } - dd := cc.FindOne(context.TODO(), bson.M{"snid": id}, options.FindOne().SetProjection(bson.M{"tel": 1})) - err = dd.Err() - if err != nil { - if errors.Is(err, mongo.ErrNoDocuments) { - logger.Logger.Tracef("getAccountTel %v not found in user_account", id) - return "", nil - } - logger.Logger.Errorf("getAccountTel %v get user_account err: %v", id, err) - return "", err - } - if err := dd.Decode(acc); err != nil { - logger.Logger.Errorf("getAccountTel %v decode user_account err: %v", id, err) - return "", err - } - return acc.Tel, nil -} - -// 游戏结束离开 -func checkGameOver(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) { - // 最早的一条掉线记录并且是游戏结束离开 - a := &mongomodel.LoginLog{} - c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin) - if err != nil { - logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err) - return false, err - } - d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop, "gameid": 0, "lastgameid": bson.D{{"$gt", 0}}}, - options.FindOne().SetSort(bson.D{{"time", 1}})) - err = d.Err() - if err != nil { - if errors.Is(err, mongo.ErrNoDocuments) { - logger.Logger.Tracef("checkGameOver %v not found in log_login", id) - return false, nil - } - logger.Logger.Errorf("checkGameOver %v get log_login err: %v", id, err) - return false, err - } - if err := d.Decode(a); err != nil { - logger.Logger.Errorf("checkGameOver %v decode log_login err: %v", id, err) - return false, err - } - - // account tel - tel, err := getAccountTel(platform, id) - if err != nil { - logger.Logger.Warnf("get account tel %v err: %v", id, err) - } - - update := &mysqlmodel.UserLogin{ - //OfflineTs: int(a.Ts), - OfflineTime: a.Time, - OutType: mysqlmodel.OutTypeGameOver, - GameID: a.LastGameID, - Tel: tel, - DeviceName: a.DeviceName, - AppVersion: a.AppVersion, - BuildVersion: a.BuildVersion, - AppChannel: a.AppChannel, - ChannelId: a.ChannelId, - } - - if err := db.Model(login).Select( - "OfflineTime", "OutType", "GameID", "DeviceName", "AppVersion", "BuildVersion", "AppChannel", "Tel", - ).Updates(update).Error; err != nil { - logger.Logger.Errorf("checkLogin %v update user_login err: %v", id, err) - return false, err - } - - return true, nil -} - -// 游戏中离开 -func checkGaming(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) { - // 最早的一条掉线记录并且是游戏中掉线 - a := &mongomodel.LoginLog{} - c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin) - if err != nil { - logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err) - return false, err - } - d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop, "gameid": bson.D{{"$gt", 0}}}, - options.FindOne().SetSort(bson.D{{"time", 1}})) - err = d.Err() - if err != nil { - if errors.Is(err, mongo.ErrNoDocuments) { - logger.Logger.Tracef("checkGaming %v not found in log_login", id) - return false, nil - } - logger.Logger.Errorf("checkGaming %v get log_login err: %v", id, err) - return false, err - } - if err := d.Decode(a); err != nil { - logger.Logger.Errorf("checkGaming %v decode log_login err: %v", id, err) - return false, err - } - - // account tel - tel, err := getAccountTel(platform, id) - if err != nil { - logger.Logger.Warnf("get account tel %v err: %v", id, err) - } - - update := &mysqlmodel.UserLogin{ - //OfflineTs: int(a.Ts), - OfflineTime: a.Time, - OutType: mysqlmodel.OutTypeGaming, - GameID: a.GameId, - Tel: tel, - DeviceName: a.DeviceName, - AppVersion: a.AppVersion, - BuildVersion: a.BuildVersion, - AppChannel: a.AppChannel, - ChannelId: a.ChannelId, - } - - if err := db.Model(login).Select( - "OfflineTime", "OutType", "GameID", "DeviceName", "AppVersion", "BuildVersion", "AppChannel", "Tel", - ).Updates(update).Error; err != nil { - logger.Logger.Errorf("checkLogin %v update user_login err: %v", id, err) - return false, err - } - - return true, nil -} - -// 登录后离开 -func checkLogin(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) { - // 最早的一条掉线记录 - a := &mongomodel.LoginLog{} - c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin) - if err != nil { - logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err) - return false, err - } - d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop}, options.FindOne().SetSort(bson.D{{"time", 1}})) - err = d.Err() - if err != nil { - if errors.Is(err, mongo.ErrNoDocuments) { - logger.Logger.Tracef("checkLogin %v not found in log_login", id) - return false, nil - } - logger.Logger.Errorf("checkLogin %v get log_login err: %v", id, err) - return false, err - } - if err := d.Decode(a); err != nil { - logger.Logger.Errorf("checkLogin %v decode log_login err: %v", id, err) - return false, err - } - - // account tel - tel, err := getAccountTel(platform, id) - if err != nil { - logger.Logger.Warnf("get account tel %v err: %v", id, err) - } - - update := &mysqlmodel.UserLogin{ - //OfflineTs: int(a.Ts), - OfflineTime: a.Time, - OutType: mysqlmodel.OutTypeLogin, - Tel: tel, - DeviceName: a.DeviceName, - AppVersion: a.AppVersion, - BuildVersion: a.BuildVersion, - AppChannel: a.AppChannel, - ChannelId: a.ChannelId, - } - - if err := db.Model(login).Select( - "OfflineTime", "OutType", "DeviceName", "AppVersion", "BuildVersion", "AppChannel", "Tel", - ).Updates(update).Error; err != nil { - logger.Logger.Errorf("checkLogin %v update user_login err: %v", id, err) - return false, err - } - - return true, nil -} - -// 注册后离开 -func checkRegister(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) { - a := &mongomodel.Account{} - c, err := mymongo.GetUserCollection(platform, mongomodel.UserAccount) - if err != nil { - logger.Logger.Errorf("get collection %s error %v", mongomodel.UserAccount, err) - return false, err - } - d := c.FindOne(context.TODO(), bson.M{"snid": id}) - err = d.Err() - if err != nil { - if errors.Is(err, mongo.ErrNoDocuments) { - logger.Logger.Warnf("checkRegister %v not found in user_account", id) - return false, nil - } - logger.Logger.Errorf("checkRegister %v get user_account err: %v", id, err) - return false, err - } - if err := d.Decode(a); err != nil { - logger.Logger.Errorf("checkRegister %v decode user_account err: %v", id, err) - return false, err - } - - // account tel - tel, err := getAccountTel(platform, id) - if err != nil { - logger.Logger.Warnf("get account tel %v err: %v", id, err) - } - - login.Snid = id - //login.OnlineTs = int(a.RegisterTs) - login.OnlineTime = a.RegisteTime - //login.OfflineTs = int(a.RegisterTs) - login.OfflineTime = a.RegisteTime - login.OutType = mysqlmodel.OutTypRegister - login.Tel = tel - login.DeviceName = a.DeviceName - login.AppVersion = a.AppVersion - login.BuildVersion = a.BuildVersion - login.AppChannel = a.AppChannel - login.ChannelId = a.ChannelId - - if err := db.Create(login).Error; err != nil { - logger.Logger.Errorf("checkRegister create err: %v", err) - return false, err - } - return true, nil -} +//func getAccountTel(platform string, id int) (string, error) { +// acc := &mongomodel.Account{} +// cc, err := mymongo.GetUserCollection(platform, mongomodel.UserAccount) +// if err != nil { +// logger.Logger.Errorf("get collection %s error %v", mongomodel.UserAccount, err) +// return "", err +// } +// dd := cc.FindOne(context.TODO(), bson.M{"snid": id}, options.FindOne().SetProjection(bson.M{"tel": 1})) +// err = dd.Err() +// if err != nil { +// if errors.Is(err, mongo.ErrNoDocuments) { +// logger.Logger.Tracef("getAccountTel %v not found in user_account", id) +// return "", nil +// } +// logger.Logger.Errorf("getAccountTel %v get user_account err: %v", id, err) +// return "", err +// } +// if err := dd.Decode(acc); err != nil { +// logger.Logger.Errorf("getAccountTel %v decode user_account err: %v", id, err) +// return "", err +// } +// return acc.Tel, nil +//} +// +//// 游戏结束离开 +//func checkGameOver(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) { +// // 最早的一条掉线记录并且是游戏结束离开 +// a := &mongomodel.LoginLog{} +// c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin) +// if err != nil { +// logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err) +// return false, err +// } +// d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop, "gameid": 0, "lastgameid": bson.D{{"$gt", 0}}}, +// options.FindOne().SetSort(bson.D{{"time", 1}})) +// err = d.Err() +// if err != nil { +// if errors.Is(err, mongo.ErrNoDocuments) { +// logger.Logger.Tracef("checkGameOver %v not found in log_login", id) +// return false, nil +// } +// logger.Logger.Errorf("checkGameOver %v get log_login err: %v", id, err) +// return false, err +// } +// if err := d.Decode(a); err != nil { +// logger.Logger.Errorf("checkGameOver %v decode log_login err: %v", id, err) +// return false, err +// } +// +// // account tel +// tel, err := getAccountTel(platform, id) +// if err != nil { +// logger.Logger.Warnf("get account tel %v err: %v", id, err) +// } +// +// update := &mysqlmodel.UserLogin{ +// //OfflineTs: int(a.Ts), +// OfflineTime: a.Time, +// OutType: mysqlmodel.OutTypeGameOver, +// GameID: a.LastGameID, +// Tel: tel, +// DeviceName: a.DeviceName, +// AppVersion: a.AppVersion, +// BuildVersion: a.BuildVersion, +// AppChannel: a.AppChannel, +// ChannelId: a.ChannelId, +// } +// +// if err := db.Model(login).Select( +// "OfflineTime", "OutType", "GameID", "DeviceName", "AppVersion", "BuildVersion", "AppChannel", "Tel", +// ).Updates(update).Error; err != nil { +// logger.Logger.Errorf("checkLogin %v update user_login err: %v", id, err) +// return false, err +// } +// +// return true, nil +//} +// +//// 游戏中离开 +//func checkGaming(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) { +// // 最早的一条掉线记录并且是游戏中掉线 +// a := &mongomodel.LoginLog{} +// c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin) +// if err != nil { +// logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err) +// return false, err +// } +// d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop, "gameid": bson.D{{"$gt", 0}}}, +// options.FindOne().SetSort(bson.D{{"time", 1}})) +// err = d.Err() +// if err != nil { +// if errors.Is(err, mongo.ErrNoDocuments) { +// logger.Logger.Tracef("checkGaming %v not found in log_login", id) +// return false, nil +// } +// logger.Logger.Errorf("checkGaming %v get log_login err: %v", id, err) +// return false, err +// } +// if err := d.Decode(a); err != nil { +// logger.Logger.Errorf("checkGaming %v decode log_login err: %v", id, err) +// return false, err +// } +// +// // account tel +// tel, err := getAccountTel(platform, id) +// if err != nil { +// logger.Logger.Warnf("get account tel %v err: %v", id, err) +// } +// +// update := &mysqlmodel.UserLogin{ +// //OfflineTs: int(a.Ts), +// OfflineTime: a.Time, +// OutType: mysqlmodel.OutTypeGaming, +// GameID: a.GameId, +// Tel: tel, +// DeviceName: a.DeviceName, +// AppVersion: a.AppVersion, +// BuildVersion: a.BuildVersion, +// AppChannel: a.AppChannel, +// ChannelId: a.ChannelId, +// } +// +// if err := db.Model(login).Select( +// "OfflineTime", "OutType", "GameID", "DeviceName", "AppVersion", "BuildVersion", "AppChannel", "Tel", +// ).Updates(update).Error; err != nil { +// logger.Logger.Errorf("checkLogin %v update user_login err: %v", id, err) +// return false, err +// } +// +// return true, nil +//} +// +//// 登录后离开 +//func checkLogin(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) { +// // 最早的一条掉线记录 +// a := &mongomodel.LoginLog{} +// c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin) +// if err != nil { +// logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err) +// return false, err +// } +// d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop}, options.FindOne().SetSort(bson.D{{"time", 1}})) +// err = d.Err() +// if err != nil { +// if errors.Is(err, mongo.ErrNoDocuments) { +// logger.Logger.Tracef("checkLogin %v not found in log_login", id) +// return false, nil +// } +// logger.Logger.Errorf("checkLogin %v get log_login err: %v", id, err) +// return false, err +// } +// if err := d.Decode(a); err != nil { +// logger.Logger.Errorf("checkLogin %v decode log_login err: %v", id, err) +// return false, err +// } +// +// // account tel +// tel, err := getAccountTel(platform, id) +// if err != nil { +// logger.Logger.Warnf("get account tel %v err: %v", id, err) +// } +// +// update := &mysqlmodel.UserLogin{ +// //OfflineTs: int(a.Ts), +// OfflineTime: a.Time, +// OutType: mysqlmodel.OutTypeLogin, +// Tel: tel, +// DeviceName: a.DeviceName, +// AppVersion: a.AppVersion, +// BuildVersion: a.BuildVersion, +// AppChannel: a.AppChannel, +// ChannelId: a.ChannelId, +// } +// +// if err := db.Model(login).Select( +// "OfflineTime", "OutType", "DeviceName", "AppVersion", "BuildVersion", "AppChannel", "Tel", +// ).Updates(update).Error; err != nil { +// logger.Logger.Errorf("checkLogin %v update user_login err: %v", id, err) +// return false, err +// } +// +// return true, nil +//} +// +//// 注册后离开 +//func checkRegister(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) { +// a := &mongomodel.Account{} +// c, err := mymongo.GetUserCollection(platform, mongomodel.UserAccount) +// if err != nil { +// logger.Logger.Errorf("get collection %s error %v", mongomodel.UserAccount, err) +// return false, err +// } +// d := c.FindOne(context.TODO(), bson.M{"snid": id}) +// err = d.Err() +// if err != nil { +// if errors.Is(err, mongo.ErrNoDocuments) { +// logger.Logger.Warnf("checkRegister %v not found in user_account", id) +// return false, nil +// } +// logger.Logger.Errorf("checkRegister %v get user_account err: %v", id, err) +// return false, err +// } +// if err := d.Decode(a); err != nil { +// logger.Logger.Errorf("checkRegister %v decode user_account err: %v", id, err) +// return false, err +// } +// +// // account tel +// tel, err := getAccountTel(platform, id) +// if err != nil { +// logger.Logger.Warnf("get account tel %v err: %v", id, err) +// } +// +// login.Snid = id +// //login.OnlineTs = int(a.RegisterTs) +// login.OnlineTime = a.RegisteTime +// //login.OfflineTs = int(a.RegisterTs) +// login.OfflineTime = a.RegisteTime +// login.OutType = mysqlmodel.OutTypRegister +// login.Tel = tel +// login.DeviceName = a.DeviceName +// login.AppVersion = a.AppVersion +// login.BuildVersion = a.BuildVersion +// login.AppChannel = a.AppChannel +// login.ChannelId = a.ChannelId +// +// if err := db.Create(login).Error; err != nil { +// logger.Logger.Errorf("checkRegister create err: %v", err) +// return false, err +// } +// return true, nil +//} // UserLogin 玩家跳出统计 -func UserLogin(platform string, ids []*mysqlmodel.UserID) error { - f := func(id int) error { - // 玩家是否已经统计结束,已经是游戏结束状态 - login := &mysqlmodel.UserLogin{} - db, err := mymysql.GetDatabase(platform) - if err != nil { - logger.Logger.Errorf("UserLogin get db err: %v", err) - return err - } - if err = db.Where("snid = ?", id).Find(login).Error; err != nil { - logger.Logger.Errorf("UserLogin find %v err: %v", id, err) - return err - } - - switch login.OutType { - case mysqlmodel.OutTypeGameOver: - return nil - - case mysqlmodel.OutTypeGaming: - _, err := checkGameOver(db, login, platform, id) - if err != nil { - logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err) - return err - } - return nil - - case mysqlmodel.OutTypeLogin: - ret, err := checkGameOver(db, login, platform, id) - if err != nil { - logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err) - return err - } - if ret { - return nil - } - ret, err = checkGaming(db, login, platform, id) - if err != nil { - logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err) - return err - } - if ret { - return nil - } - - case mysqlmodel.OutTypRegister: - ret, err := checkGameOver(db, login, platform, id) - if err != nil { - logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err) - return err - } - if ret { - return nil - } - ret, err = checkGaming(db, login, platform, id) - if err != nil { - logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err) - return err - } - if ret { - return nil - } - ret, err = checkLogin(db, login, platform, id) - if err != nil { - logger.Logger.Errorf("UserLogin checkLogin %v err: %v", id, err) - return err - } - if ret { - return nil - } - - default: - ret, err := checkRegister(db, login, platform, id) - if err != nil { - logger.Logger.Errorf("UserLogin checkRegister %v err: %v", id, err) - return err - } - if !ret { - logger.Logger.Warnf("UserLogin not found user_account checkRegister %v err: %v", id, err) - return nil - } - - ret, err = checkGameOver(db, login, platform, id) - if err != nil { - logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err) - return err - } - if ret { - return nil - } - ret, err = checkGaming(db, login, platform, id) - if err != nil { - logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err) - return err - } - if ret { - return nil - } - ret, err = checkLogin(db, login, platform, id) - if err != nil { - logger.Logger.Errorf("UserLogin checkLogin %v err: %v", id, err) - return err - } - if ret { - return nil - } - return nil - } - - return nil - } - - for _, v := range ids { - if err := f(v.Snid); err != nil { - return err - } - } - - return nil -} +//func UserLogin(platform string, ids []*mysqlmodel.UserID) error { +// f := func(id int) error { +// // 玩家是否已经统计结束,已经是游戏结束状态 +// login := &mysqlmodel.UserLogin{} +// db, err := mymysql.GetDatabase(platform) +// if err != nil { +// logger.Logger.Errorf("UserLogin get db err: %v", err) +// return err +// } +// if err = db.Where("snid = ?", id).Find(login).Error; err != nil { +// logger.Logger.Errorf("UserLogin find %v err: %v", id, err) +// return err +// } +// +// switch login.OutType { +// case mysqlmodel.OutTypeGameOver: +// return nil +// +// case mysqlmodel.OutTypeGaming: +// _, err := checkGameOver(db, login, platform, id) +// if err != nil { +// logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err) +// return err +// } +// return nil +// +// case mysqlmodel.OutTypeLogin: +// ret, err := checkGameOver(db, login, platform, id) +// if err != nil { +// logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err) +// return err +// } +// if ret { +// return nil +// } +// ret, err = checkGaming(db, login, platform, id) +// if err != nil { +// logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err) +// return err +// } +// if ret { +// return nil +// } +// +// case mysqlmodel.OutTypRegister: +// ret, err := checkGameOver(db, login, platform, id) +// if err != nil { +// logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err) +// return err +// } +// if ret { +// return nil +// } +// ret, err = checkGaming(db, login, platform, id) +// if err != nil { +// logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err) +// return err +// } +// if ret { +// return nil +// } +// ret, err = checkLogin(db, login, platform, id) +// if err != nil { +// logger.Logger.Errorf("UserLogin checkLogin %v err: %v", id, err) +// return err +// } +// if ret { +// return nil +// } +// +// default: +// ret, err := checkRegister(db, login, platform, id) +// if err != nil { +// logger.Logger.Errorf("UserLogin checkRegister %v err: %v", id, err) +// return err +// } +// if !ret { +// logger.Logger.Warnf("UserLogin not found user_account checkRegister %v err: %v", id, err) +// return nil +// } +// +// ret, err = checkGameOver(db, login, platform, id) +// if err != nil { +// logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err) +// return err +// } +// if ret { +// return nil +// } +// ret, err = checkGaming(db, login, platform, id) +// if err != nil { +// logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err) +// return err +// } +// if ret { +// return nil +// } +// ret, err = checkLogin(db, login, platform, id) +// if err != nil { +// logger.Logger.Errorf("UserLogin checkLogin %v err: %v", id, err) +// return err +// } +// if ret { +// return nil +// } +// return nil +// } +// +// return nil +// } +// +// for _, v := range ids { +// if err := f(v.Snid); err != nil { +// return err +// } +// } +// +// return nil +//} diff --git a/statistics/syn/log_login.go b/statistics/syn/log_login.go index 7f338e1..5a1c8e7 100644 --- a/statistics/syn/log_login.go +++ b/statistics/syn/log_login.go @@ -9,12 +9,12 @@ import ( "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "gorm.io/gorm" - - mongomodel "mongo.games.com/game/statistics/modelmongo" - mysqlmodel "mongo.games.com/game/statistics/modelmysql" "mongo.games.com/goserver/core/logger" mymongo "mongo.games.com/goserver/core/mongox" mymysql "mongo.games.com/goserver/core/mysqlx" + + mongomodel "mongo.games.com/game/statistics/modelmongo" + mysqlmodel "mongo.games.com/game/statistics/modelmysql" ) /* @@ -155,19 +155,19 @@ func LogLogin(platform string, batchSize int) ([]*mysqlmodel.LogLogin, error) { return err } - for _, v := range ls { - if err = tx.First(&mysqlmodel.UserID{}, "snid = ?", v.Snid).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { - logger.Logger.Errorf("mysql: SyncLogLogin failed to find user_id: %v", err) - return err - } - - if errors.Is(err, gorm.ErrRecordNotFound) { - if err = tx.Create(&mysqlmodel.UserID{Snid: v.Snid}).Error; err != nil { - logger.Logger.Errorf("mysql: SyncLogLogin failed to create user_id: %v", err) - return err - } - } - } + //for _, v := range ls { + // if err = tx.First(&mysqlmodel.UserID{}, "snid = ?", v.Snid).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { + // logger.Logger.Errorf("mysql: SyncLogLogin failed to find user_id: %v", err) + // return err + // } + // + // if errors.Is(err, gorm.ErrRecordNotFound) { + // if err = tx.Create(&mysqlmodel.UserID{Snid: v.Snid}).Error; err != nil { + // logger.Logger.Errorf("mysql: SyncLogLogin failed to create user_id: %v", err) + // return err + // } + // } + //} return nil }) diff --git a/statistics/syn/readme b/statistics/syn/readme index 37acc1c..ca251d5 100644 --- a/statistics/syn/readme +++ b/statistics/syn/readme @@ -1 +1,3 @@ -游戏服mongodb同步到mysql \ No newline at end of file +游戏服mongodb同步到mysql + +datasync.go 同步模型 \ No newline at end of file