Compare commits
No commits in common. "8177397b26785c4ea1302102a2fa950d8c1fda97" and "b18696718913f551466937a74a839ace34898035" have entirely different histories.
8177397b26
...
b186967189
|
@ -940,10 +940,6 @@ func (this *StateOp) OnPlayerOp(s *base.Scene, p *base.Player, opcode int, param
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(params) == 1 {
|
|
||||||
sceneEx.SelectCards(playerEx, int(params[0]))
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(params) == 0 {
|
if len(params) == 0 {
|
||||||
playerEx.preCardsO = &rule.Group{Head: [3]int{-1, -1, -1}, Mid: [5]int{-1, -1, -1, -1, -1}, End: [5]int{-1, -1, -1, -1, -1}, PokerType: -1}
|
playerEx.preCardsO = &rule.Group{Head: [3]int{-1, -1, -1}, Mid: [5]int{-1, -1, -1, -1, -1}, End: [5]int{-1, -1, -1, -1, -1}, PokerType: -1}
|
||||||
}
|
}
|
||||||
|
@ -978,16 +974,13 @@ func (this *StateOp) OnLeave(s *base.Scene) {
|
||||||
for _, player := range sceneEx.players {
|
for _, player := range sceneEx.players {
|
||||||
if player != nil && player.IsGameing() {
|
if player != nil && player.IsGameing() {
|
||||||
|
|
||||||
if !player.IsRobot() {
|
mq.Write(model.ThirteenAutoLog{
|
||||||
mq.Write(model.ThirteenAutoLog{
|
Id: primitive.NewObjectID().Hex(),
|
||||||
Id: primitive.NewObjectID().Hex(),
|
LogId: sceneEx.logid,
|
||||||
Platform: player.Platform,
|
SnId: player.SnId,
|
||||||
LogId: sceneEx.logid,
|
AutoTime: player.AutoMill.Milliseconds(),
|
||||||
SnId: player.SnId,
|
HandTime: player.HandMill.Milliseconds(),
|
||||||
AutoTime: player.AutoMill.Milliseconds(),
|
}, mq.BackThirteenAutoLog)
|
||||||
HandTime: player.HandMill.Milliseconds(),
|
|
||||||
}, mq.BackThirteenAutoLog)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 使用预选牌
|
// 使用预选牌
|
||||||
if player.preCardsO != nil && player.preCardsO.PokerType != -1 && (player.cardsO == nil || player.cardsO.PokerType == -1) {
|
if player.preCardsO != nil && player.preCardsO.PokerType != -1 && (player.cardsO == nil || player.cardsO.PokerType == -1) {
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
package model
|
package model
|
||||||
|
|
||||||
type ThirteenAutoLog struct {
|
type ThirteenAutoLog struct {
|
||||||
Id string `gorm:"primaryKey"`
|
Id string
|
||||||
Platform string `gorm:"-"`
|
LogId string
|
||||||
LogId string `gorm:"index;column:logid"`
|
SnId int32
|
||||||
SnId int32 `gorm:"index;column:snid"`
|
AutoTime int64 // 自动时长,毫秒
|
||||||
AutoTime int64 // 自动时长,毫秒
|
HandTime int64 // 手动时长,毫秒
|
||||||
HandTime int64 // 手动时长,毫秒
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,9 +24,4 @@ update_invite_num: 30
|
||||||
# 几秒读取一次道具日志
|
# 几秒读取一次道具日志
|
||||||
update_second_item: 10
|
update_second_item: 10
|
||||||
# 一次最多读取多少道具日志
|
# 一次最多读取多少道具日志
|
||||||
update_item_num: 100
|
update_item_num: 100
|
||||||
|
|
||||||
# rabbitmq配置
|
|
||||||
rabbitmq:
|
|
||||||
url: amqp://win88:123456@127.0.0.1:5672/win99
|
|
||||||
exchange: win99
|
|
|
@ -15,10 +15,9 @@ import (
|
||||||
"mongo.games.com/goserver/core/utils"
|
"mongo.games.com/goserver/core/utils"
|
||||||
"mongo.games.com/goserver/core/viperx"
|
"mongo.games.com/goserver/core/viperx"
|
||||||
|
|
||||||
"mongo.games.com/game/mq"
|
|
||||||
mongomodel "mongo.games.com/game/statistics/modelmongo"
|
mongomodel "mongo.games.com/game/statistics/modelmongo"
|
||||||
mysqlmodel "mongo.games.com/game/statistics/modelmysql"
|
mysqlmodel "mongo.games.com/game/statistics/modelmysql"
|
||||||
_ "mongo.games.com/game/statistics/mq"
|
"mongo.games.com/game/statistics/static"
|
||||||
"mongo.games.com/game/statistics/syn"
|
"mongo.games.com/game/statistics/syn"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -93,32 +92,26 @@ func main() {
|
||||||
|
|
||||||
mysqlx.SetAutoMigrateTables(mysqlmodel.Tables)
|
mysqlx.SetAutoMigrateTables(mysqlmodel.Tables)
|
||||||
|
|
||||||
// mq
|
|
||||||
mq.StartConsumer(VP.GetString("rabbitmq.url"), VP.GetString("rabbitmq.exchange"), true)
|
|
||||||
|
|
||||||
wg := &sync.WaitGroup{}
|
wg := &sync.WaitGroup{}
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
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"))*time.Second, SyncSnId)
|
||||||
|
|
||||||
//DoTick(ctx, wg, time.Duration(VP.GetInt64("update_second_snid"))*time.Second, func(ctx context.Context) {
|
DoTick(ctx, wg, time.Duration(VP.GetInt64("update_second_snid"))*time.Second, func(ctx context.Context) {
|
||||||
// wg := new(sync.WaitGroup)
|
wg := new(sync.WaitGroup)
|
||||||
// for _, v := range VP.GetStringSlice("platforms") {
|
for _, v := range VP.GetStringSlice("platforms") {
|
||||||
// platform := v
|
platform := v
|
||||||
// wg.Add(1)
|
wg.Add(1)
|
||||||
// go func() {
|
go func() {
|
||||||
// defer wg.Done()
|
defer wg.Done()
|
||||||
// Static(platform)
|
Static(platform)
|
||||||
// }()
|
}()
|
||||||
// }
|
}
|
||||||
// wg.Wait()
|
wg.Wait()
|
||||||
//})
|
})
|
||||||
|
|
||||||
// 同步邀请数据
|
|
||||||
DoTick(ctx, wg, time.Duration(VP.GetInt64("update_second_invite"))*time.Second, SyncInvite)
|
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"),
|
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) {
|
func(ctx context.Context, platform string, batchSize int) {
|
||||||
err := syn.ItemGainDone(&syn.Data[mongomodel.ItemLog]{
|
err := syn.ItemGainDone(&syn.Data[mongomodel.ItemLog]{
|
||||||
|
@ -130,7 +123,7 @@ func main() {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
logger.Logger.Info("start success")
|
logger.Logger.Info("start")
|
||||||
|
|
||||||
c := make(chan os.Signal, 1)
|
c := make(chan os.Signal, 1)
|
||||||
signal.Notify(c, os.Interrupt, os.Kill)
|
signal.Notify(c, os.Interrupt, os.Kill)
|
||||||
|
@ -169,36 +162,36 @@ func SyncSnId(ctx context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Static 玩家id触发数据统计
|
// Static 玩家id触发数据统计
|
||||||
//func Static(platform string) {
|
func Static(platform string) {
|
||||||
// // 查询需要更新的玩家id
|
// 查询需要更新的玩家id
|
||||||
// var ids []*mysqlmodel.UserID
|
var ids []*mysqlmodel.UserID
|
||||||
// db, err := mysqlx.GetDatabase(platform)
|
db, err := mysqlx.GetDatabase(platform)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("GetDatabase error: %v", err)
|
logger.Logger.Errorf("GetDatabase error: %v", err)
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
// if err := db.Limit(VP.GetInt("update_snid_num")).Find(&ids).Error; err != nil {
|
if err := db.Limit(VP.GetInt("update_snid_num")).Find(&ids).Error; err != nil {
|
||||||
// logger.Logger.Warnf("Get UserID error: %v", err)
|
logger.Logger.Warnf("Get UserID error: %v", err)
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if len(ids) == 0 {
|
if len(ids) == 0 {
|
||||||
// logger.Logger.Tracef("Static: no need to update")
|
logger.Logger.Tracef("Static: no need to update")
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// // 统计玩家跳出记录
|
// 统计玩家跳出记录
|
||||||
// //if err := static.UserLogin(platform, ids); err != nil {
|
if err := static.UserLogin(platform, ids); err != nil {
|
||||||
// // logger.Logger.Errorf("StaticUserLogin error: %v", err)
|
logger.Logger.Errorf("StaticUserLogin error: %v", err)
|
||||||
// // return
|
return
|
||||||
// //}
|
}
|
||||||
//
|
|
||||||
// // 删除更新过的玩家id
|
// 删除更新过的玩家id
|
||||||
// if err := db.Delete(ids).Error; err != nil {
|
if err := db.Delete(ids).Error; err != nil {
|
||||||
// logger.Logger.Errorf("Delete error: %v", err)
|
logger.Logger.Errorf("Delete error: %v", err)
|
||||||
// return
|
return
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
|
|
||||||
// SyncInvite 同步邀请数据
|
// SyncInvite 同步邀请数据
|
||||||
func SyncInvite(ctx context.Context) {
|
func SyncInvite(ctx context.Context) {
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
package modelmysql
|
package modelmysql
|
||||||
|
|
||||||
import "mongo.games.com/game/model"
|
|
||||||
|
|
||||||
// 需要自动迁移的表添加在这里 Tables
|
// 需要自动迁移的表添加在这里 Tables
|
||||||
|
|
||||||
var Tables = []interface{}{
|
var Tables = []interface{}{
|
||||||
|
@ -16,5 +14,4 @@ var Tables = []interface{}{
|
||||||
&LogMid{},
|
&LogMid{},
|
||||||
&ItemGain{},
|
&ItemGain{},
|
||||||
&ItemTotalGain{},
|
&ItemTotalGain{},
|
||||||
&model.ThirteenAutoLog{},
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,35 +1 @@
|
||||||
package mq
|
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
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,355 +1,371 @@
|
||||||
package static
|
package static
|
||||||
|
|
||||||
//func getAccountTel(platform string, id int) (string, error) {
|
import (
|
||||||
// acc := &mongomodel.Account{}
|
"context"
|
||||||
// cc, err := mymongo.GetUserCollection(platform, mongomodel.UserAccount)
|
"errors"
|
||||||
// if err != nil {
|
|
||||||
// logger.Logger.Errorf("get collection %s error %v", mongomodel.UserAccount, err)
|
"go.mongodb.org/mongo-driver/bson"
|
||||||
// return "", err
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
// }
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
// dd := cc.FindOne(context.TODO(), bson.M{"snid": id}, options.FindOne().SetProjection(bson.M{"tel": 1}))
|
"mongo.games.com/goserver/core/logger"
|
||||||
// err = dd.Err()
|
|
||||||
// if err != nil {
|
mymongo "mongo.games.com/goserver/core/mongox"
|
||||||
// if errors.Is(err, mongo.ErrNoDocuments) {
|
mymysql "mongo.games.com/goserver/core/mysqlx"
|
||||||
// logger.Logger.Tracef("getAccountTel %v not found in user_account", id)
|
|
||||||
// return "", nil
|
mongomodel "mongo.games.com/game/statistics/modelmongo"
|
||||||
// }
|
mysqlmodel "mongo.games.com/game/statistics/modelmysql"
|
||||||
// logger.Logger.Errorf("getAccountTel %v get user_account err: %v", id, err)
|
)
|
||||||
// return "", err
|
|
||||||
// }
|
func getAccountTel(platform string, id int) (string, error) {
|
||||||
// if err := dd.Decode(acc); err != nil {
|
acc := &mongomodel.Account{}
|
||||||
// logger.Logger.Errorf("getAccountTel %v decode user_account err: %v", id, err)
|
cc, err := mymongo.GetUserCollection(platform, mongomodel.UserAccount)
|
||||||
// return "", err
|
if err != nil {
|
||||||
// }
|
logger.Logger.Errorf("get collection %s error %v", mongomodel.UserAccount, err)
|
||||||
// return acc.Tel, nil
|
return "", err
|
||||||
//}
|
}
|
||||||
//
|
dd := cc.FindOne(context.TODO(), bson.M{"snid": id}, options.FindOne().SetProjection(bson.M{"tel": 1}))
|
||||||
//// 游戏结束离开
|
err = dd.Err()
|
||||||
//func checkGameOver(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) {
|
if err != nil {
|
||||||
// // 最早的一条掉线记录并且是游戏结束离开
|
if errors.Is(err, mongo.ErrNoDocuments) {
|
||||||
// a := &mongomodel.LoginLog{}
|
logger.Logger.Tracef("getAccountTel %v not found in user_account", id)
|
||||||
// c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin)
|
return "", nil
|
||||||
// if err != nil {
|
}
|
||||||
// logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err)
|
logger.Logger.Errorf("getAccountTel %v get user_account err: %v", id, err)
|
||||||
// return false, err
|
return "", err
|
||||||
// }
|
}
|
||||||
// d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop, "gameid": 0, "lastgameid": bson.D{{"$gt", 0}}},
|
if err := dd.Decode(acc); err != nil {
|
||||||
// options.FindOne().SetSort(bson.D{{"time", 1}}))
|
logger.Logger.Errorf("getAccountTel %v decode user_account err: %v", id, err)
|
||||||
// err = d.Err()
|
return "", err
|
||||||
// if err != nil {
|
}
|
||||||
// if errors.Is(err, mongo.ErrNoDocuments) {
|
return acc.Tel, nil
|
||||||
// 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)
|
func checkGameOver(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) {
|
||||||
// return false, err
|
// 最早的一条掉线记录并且是游戏结束离开
|
||||||
// }
|
a := &mongomodel.LoginLog{}
|
||||||
// if err := d.Decode(a); err != nil {
|
c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin)
|
||||||
// logger.Logger.Errorf("checkGameOver %v decode log_login err: %v", id, err)
|
if err != nil {
|
||||||
// return false, err
|
logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err)
|
||||||
// }
|
return false, err
|
||||||
//
|
}
|
||||||
// // account tel
|
d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop, "gameid": 0, "lastgameid": bson.D{{"$gt", 0}}},
|
||||||
// tel, err := getAccountTel(platform, id)
|
options.FindOne().SetSort(bson.D{{"time", 1}}))
|
||||||
// if err != nil {
|
err = d.Err()
|
||||||
// logger.Logger.Warnf("get account tel %v err: %v", id, err)
|
if err != nil {
|
||||||
// }
|
if errors.Is(err, mongo.ErrNoDocuments) {
|
||||||
//
|
logger.Logger.Tracef("checkGameOver %v not found in log_login", id)
|
||||||
// update := &mysqlmodel.UserLogin{
|
return false, nil
|
||||||
// //OfflineTs: int(a.Ts),
|
}
|
||||||
// OfflineTime: a.Time,
|
logger.Logger.Errorf("checkGameOver %v get log_login err: %v", id, err)
|
||||||
// OutType: mysqlmodel.OutTypeGameOver,
|
return false, err
|
||||||
// GameID: a.LastGameID,
|
}
|
||||||
// Tel: tel,
|
if err := d.Decode(a); err != nil {
|
||||||
// DeviceName: a.DeviceName,
|
logger.Logger.Errorf("checkGameOver %v decode log_login err: %v", id, err)
|
||||||
// AppVersion: a.AppVersion,
|
return false, err
|
||||||
// BuildVersion: a.BuildVersion,
|
}
|
||||||
// AppChannel: a.AppChannel,
|
|
||||||
// ChannelId: a.ChannelId,
|
// account tel
|
||||||
// }
|
tel, err := getAccountTel(platform, id)
|
||||||
//
|
if err != nil {
|
||||||
// if err := db.Model(login).Select(
|
logger.Logger.Warnf("get account tel %v err: %v", id, err)
|
||||||
// "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)
|
update := &mysqlmodel.UserLogin{
|
||||||
// return false, err
|
//OfflineTs: int(a.Ts),
|
||||||
// }
|
OfflineTime: a.Time,
|
||||||
//
|
OutType: mysqlmodel.OutTypeGameOver,
|
||||||
// return true, nil
|
GameID: a.LastGameID,
|
||||||
//}
|
Tel: tel,
|
||||||
//
|
DeviceName: a.DeviceName,
|
||||||
//// 游戏中离开
|
AppVersion: a.AppVersion,
|
||||||
//func checkGaming(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) {
|
BuildVersion: a.BuildVersion,
|
||||||
// // 最早的一条掉线记录并且是游戏中掉线
|
AppChannel: a.AppChannel,
|
||||||
// a := &mongomodel.LoginLog{}
|
ChannelId: a.ChannelId,
|
||||||
// c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin)
|
}
|
||||||
// if err != nil {
|
|
||||||
// logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err)
|
if err := db.Model(login).Select(
|
||||||
// return false, err
|
"OfflineTime", "OutType", "GameID", "DeviceName", "AppVersion", "BuildVersion", "AppChannel", "Tel",
|
||||||
// }
|
).Updates(update).Error; err != nil {
|
||||||
// d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop, "gameid": bson.D{{"$gt", 0}}},
|
logger.Logger.Errorf("checkLogin %v update user_login err: %v", id, err)
|
||||||
// options.FindOne().SetSort(bson.D{{"time", 1}}))
|
return false, err
|
||||||
// err = d.Err()
|
}
|
||||||
// if err != nil {
|
|
||||||
// if errors.Is(err, mongo.ErrNoDocuments) {
|
return true, nil
|
||||||
// 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)
|
func checkGaming(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) {
|
||||||
// return false, err
|
// 最早的一条掉线记录并且是游戏中掉线
|
||||||
// }
|
a := &mongomodel.LoginLog{}
|
||||||
// if err := d.Decode(a); err != nil {
|
c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin)
|
||||||
// logger.Logger.Errorf("checkGaming %v decode log_login err: %v", id, err)
|
if err != nil {
|
||||||
// return false, err
|
logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err)
|
||||||
// }
|
return false, err
|
||||||
//
|
}
|
||||||
// // account tel
|
d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop, "gameid": bson.D{{"$gt", 0}}},
|
||||||
// tel, err := getAccountTel(platform, id)
|
options.FindOne().SetSort(bson.D{{"time", 1}}))
|
||||||
// if err != nil {
|
err = d.Err()
|
||||||
// logger.Logger.Warnf("get account tel %v err: %v", id, err)
|
if err != nil {
|
||||||
// }
|
if errors.Is(err, mongo.ErrNoDocuments) {
|
||||||
//
|
logger.Logger.Tracef("checkGaming %v not found in log_login", id)
|
||||||
// update := &mysqlmodel.UserLogin{
|
return false, nil
|
||||||
// //OfflineTs: int(a.Ts),
|
}
|
||||||
// OfflineTime: a.Time,
|
logger.Logger.Errorf("checkGaming %v get log_login err: %v", id, err)
|
||||||
// OutType: mysqlmodel.OutTypeGaming,
|
return false, err
|
||||||
// GameID: a.GameId,
|
}
|
||||||
// Tel: tel,
|
if err := d.Decode(a); err != nil {
|
||||||
// DeviceName: a.DeviceName,
|
logger.Logger.Errorf("checkGaming %v decode log_login err: %v", id, err)
|
||||||
// AppVersion: a.AppVersion,
|
return false, err
|
||||||
// BuildVersion: a.BuildVersion,
|
}
|
||||||
// AppChannel: a.AppChannel,
|
|
||||||
// ChannelId: a.ChannelId,
|
// account tel
|
||||||
// }
|
tel, err := getAccountTel(platform, id)
|
||||||
//
|
if err != nil {
|
||||||
// if err := db.Model(login).Select(
|
logger.Logger.Warnf("get account tel %v err: %v", id, err)
|
||||||
// "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)
|
update := &mysqlmodel.UserLogin{
|
||||||
// return false, err
|
//OfflineTs: int(a.Ts),
|
||||||
// }
|
OfflineTime: a.Time,
|
||||||
//
|
OutType: mysqlmodel.OutTypeGaming,
|
||||||
// return true, nil
|
GameID: a.GameId,
|
||||||
//}
|
Tel: tel,
|
||||||
//
|
DeviceName: a.DeviceName,
|
||||||
//// 登录后离开
|
AppVersion: a.AppVersion,
|
||||||
//func checkLogin(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) {
|
BuildVersion: a.BuildVersion,
|
||||||
// // 最早的一条掉线记录
|
AppChannel: a.AppChannel,
|
||||||
// a := &mongomodel.LoginLog{}
|
ChannelId: a.ChannelId,
|
||||||
// c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin)
|
}
|
||||||
// if err != nil {
|
|
||||||
// logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err)
|
if err := db.Model(login).Select(
|
||||||
// return false, err
|
"OfflineTime", "OutType", "GameID", "DeviceName", "AppVersion", "BuildVersion", "AppChannel", "Tel",
|
||||||
// }
|
).Updates(update).Error; err != nil {
|
||||||
// d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop}, options.FindOne().SetSort(bson.D{{"time", 1}}))
|
logger.Logger.Errorf("checkLogin %v update user_login err: %v", id, err)
|
||||||
// err = d.Err()
|
return false, err
|
||||||
// if err != nil {
|
}
|
||||||
// if errors.Is(err, mongo.ErrNoDocuments) {
|
|
||||||
// logger.Logger.Tracef("checkLogin %v not found in log_login", id)
|
return true, nil
|
||||||
// return false, nil
|
}
|
||||||
// }
|
|
||||||
// logger.Logger.Errorf("checkLogin %v get log_login err: %v", id, err)
|
// 登录后离开
|
||||||
// return false, err
|
func checkLogin(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) {
|
||||||
// }
|
// 最早的一条掉线记录
|
||||||
// if err := d.Decode(a); err != nil {
|
a := &mongomodel.LoginLog{}
|
||||||
// logger.Logger.Errorf("checkLogin %v decode log_login err: %v", id, err)
|
c, err := mymongo.GetLogCollection(platform, mongomodel.LogLogin)
|
||||||
// return false, err
|
if err != nil {
|
||||||
// }
|
logger.Logger.Errorf("get collection %s error %v", mongomodel.LogLogin, err)
|
||||||
//
|
return false, err
|
||||||
// // account tel
|
}
|
||||||
// tel, err := getAccountTel(platform, id)
|
d := c.FindOne(context.TODO(), bson.M{"snid": id, "logtype": mongomodel.LogTypeDrop}, options.FindOne().SetSort(bson.D{{"time", 1}}))
|
||||||
// if err != nil {
|
err = d.Err()
|
||||||
// logger.Logger.Warnf("get account tel %v err: %v", id, err)
|
if err != nil {
|
||||||
// }
|
if errors.Is(err, mongo.ErrNoDocuments) {
|
||||||
//
|
logger.Logger.Tracef("checkLogin %v not found in log_login", id)
|
||||||
// update := &mysqlmodel.UserLogin{
|
return false, nil
|
||||||
// //OfflineTs: int(a.Ts),
|
}
|
||||||
// OfflineTime: a.Time,
|
logger.Logger.Errorf("checkLogin %v get log_login err: %v", id, err)
|
||||||
// OutType: mysqlmodel.OutTypeLogin,
|
return false, err
|
||||||
// Tel: tel,
|
}
|
||||||
// DeviceName: a.DeviceName,
|
if err := d.Decode(a); err != nil {
|
||||||
// AppVersion: a.AppVersion,
|
logger.Logger.Errorf("checkLogin %v decode log_login err: %v", id, err)
|
||||||
// BuildVersion: a.BuildVersion,
|
return false, err
|
||||||
// AppChannel: a.AppChannel,
|
}
|
||||||
// ChannelId: a.ChannelId,
|
|
||||||
// }
|
// account tel
|
||||||
//
|
tel, err := getAccountTel(platform, id)
|
||||||
// if err := db.Model(login).Select(
|
if err != nil {
|
||||||
// "OfflineTime", "OutType", "DeviceName", "AppVersion", "BuildVersion", "AppChannel", "Tel",
|
logger.Logger.Warnf("get account tel %v err: %v", id, err)
|
||||||
// ).Updates(update).Error; err != nil {
|
}
|
||||||
// logger.Logger.Errorf("checkLogin %v update user_login err: %v", id, err)
|
|
||||||
// return false, err
|
update := &mysqlmodel.UserLogin{
|
||||||
// }
|
//OfflineTs: int(a.Ts),
|
||||||
//
|
OfflineTime: a.Time,
|
||||||
// return true, nil
|
OutType: mysqlmodel.OutTypeLogin,
|
||||||
//}
|
Tel: tel,
|
||||||
//
|
DeviceName: a.DeviceName,
|
||||||
//// 注册后离开
|
AppVersion: a.AppVersion,
|
||||||
//func checkRegister(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) {
|
BuildVersion: a.BuildVersion,
|
||||||
// a := &mongomodel.Account{}
|
AppChannel: a.AppChannel,
|
||||||
// c, err := mymongo.GetUserCollection(platform, mongomodel.UserAccount)
|
ChannelId: a.ChannelId,
|
||||||
// if err != nil {
|
}
|
||||||
// logger.Logger.Errorf("get collection %s error %v", mongomodel.UserAccount, err)
|
|
||||||
// return false, err
|
if err := db.Model(login).Select(
|
||||||
// }
|
"OfflineTime", "OutType", "DeviceName", "AppVersion", "BuildVersion", "AppChannel", "Tel",
|
||||||
// d := c.FindOne(context.TODO(), bson.M{"snid": id})
|
).Updates(update).Error; err != nil {
|
||||||
// err = d.Err()
|
logger.Logger.Errorf("checkLogin %v update user_login err: %v", id, err)
|
||||||
// if err != nil {
|
return false, err
|
||||||
// if errors.Is(err, mongo.ErrNoDocuments) {
|
}
|
||||||
// logger.Logger.Warnf("checkRegister %v not found in user_account", id)
|
|
||||||
// return false, nil
|
return true, nil
|
||||||
// }
|
}
|
||||||
// logger.Logger.Errorf("checkRegister %v get user_account err: %v", id, err)
|
|
||||||
// return false, err
|
// 注册后离开
|
||||||
// }
|
func checkRegister(db *mymysql.Database, login *mysqlmodel.UserLogin, platform string, id int) (bool, error) {
|
||||||
// if err := d.Decode(a); err != nil {
|
a := &mongomodel.Account{}
|
||||||
// logger.Logger.Errorf("checkRegister %v decode user_account err: %v", id, err)
|
c, err := mymongo.GetUserCollection(platform, mongomodel.UserAccount)
|
||||||
// return false, err
|
if err != nil {
|
||||||
// }
|
logger.Logger.Errorf("get collection %s error %v", mongomodel.UserAccount, err)
|
||||||
//
|
return false, err
|
||||||
// // account tel
|
}
|
||||||
// tel, err := getAccountTel(platform, id)
|
d := c.FindOne(context.TODO(), bson.M{"snid": id})
|
||||||
// if err != nil {
|
err = d.Err()
|
||||||
// logger.Logger.Warnf("get account tel %v err: %v", id, err)
|
if err != nil {
|
||||||
// }
|
if errors.Is(err, mongo.ErrNoDocuments) {
|
||||||
//
|
logger.Logger.Warnf("checkRegister %v not found in user_account", id)
|
||||||
// login.Snid = id
|
return false, nil
|
||||||
// //login.OnlineTs = int(a.RegisterTs)
|
}
|
||||||
// login.OnlineTime = a.RegisteTime
|
logger.Logger.Errorf("checkRegister %v get user_account err: %v", id, err)
|
||||||
// //login.OfflineTs = int(a.RegisterTs)
|
return false, err
|
||||||
// login.OfflineTime = a.RegisteTime
|
}
|
||||||
// login.OutType = mysqlmodel.OutTypRegister
|
if err := d.Decode(a); err != nil {
|
||||||
// login.Tel = tel
|
logger.Logger.Errorf("checkRegister %v decode user_account err: %v", id, err)
|
||||||
// login.DeviceName = a.DeviceName
|
return false, err
|
||||||
// login.AppVersion = a.AppVersion
|
}
|
||||||
// login.BuildVersion = a.BuildVersion
|
|
||||||
// login.AppChannel = a.AppChannel
|
// account tel
|
||||||
// login.ChannelId = a.ChannelId
|
tel, err := getAccountTel(platform, id)
|
||||||
//
|
if err != nil {
|
||||||
// if err := db.Create(login).Error; err != nil {
|
logger.Logger.Warnf("get account tel %v err: %v", id, err)
|
||||||
// logger.Logger.Errorf("checkRegister create err: %v", err)
|
}
|
||||||
// return false, err
|
|
||||||
// }
|
login.Snid = id
|
||||||
// return true, nil
|
//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 玩家跳出统计
|
// UserLogin 玩家跳出统计
|
||||||
//func UserLogin(platform string, ids []*mysqlmodel.UserID) error {
|
func UserLogin(platform string, ids []*mysqlmodel.UserID) error {
|
||||||
// f := func(id int) error {
|
f := func(id int) error {
|
||||||
// // 玩家是否已经统计结束,已经是游戏结束状态
|
// 玩家是否已经统计结束,已经是游戏结束状态
|
||||||
// login := &mysqlmodel.UserLogin{}
|
login := &mysqlmodel.UserLogin{}
|
||||||
// db, err := mymysql.GetDatabase(platform)
|
db, err := mymysql.GetDatabase(platform)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin get db err: %v", err)
|
logger.Logger.Errorf("UserLogin get db err: %v", err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// if err = db.Where("snid = ?", id).Find(login).Error; err != nil {
|
if err = db.Where("snid = ?", id).Find(login).Error; err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin find %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin find %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// switch login.OutType {
|
switch login.OutType {
|
||||||
// case mysqlmodel.OutTypeGameOver:
|
case mysqlmodel.OutTypeGameOver:
|
||||||
// return nil
|
return nil
|
||||||
//
|
|
||||||
// case mysqlmodel.OutTypeGaming:
|
case mysqlmodel.OutTypeGaming:
|
||||||
// _, err := checkGameOver(db, login, platform, id)
|
_, err := checkGameOver(db, login, platform, id)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// return nil
|
return nil
|
||||||
//
|
|
||||||
// case mysqlmodel.OutTypeLogin:
|
case mysqlmodel.OutTypeLogin:
|
||||||
// ret, err := checkGameOver(db, login, platform, id)
|
ret, err := checkGameOver(db, login, platform, id)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// if ret {
|
if ret {
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
// ret, err = checkGaming(db, login, platform, id)
|
ret, err = checkGaming(db, login, platform, id)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// if ret {
|
if ret {
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// case mysqlmodel.OutTypRegister:
|
case mysqlmodel.OutTypRegister:
|
||||||
// ret, err := checkGameOver(db, login, platform, id)
|
ret, err := checkGameOver(db, login, platform, id)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// if ret {
|
if ret {
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
// ret, err = checkGaming(db, login, platform, id)
|
ret, err = checkGaming(db, login, platform, id)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// if ret {
|
if ret {
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
// ret, err = checkLogin(db, login, platform, id)
|
ret, err = checkLogin(db, login, platform, id)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin checkLogin %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin checkLogin %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// if ret {
|
if ret {
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// default:
|
default:
|
||||||
// ret, err := checkRegister(db, login, platform, id)
|
ret, err := checkRegister(db, login, platform, id)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin checkRegister %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin checkRegister %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// if !ret {
|
if !ret {
|
||||||
// logger.Logger.Warnf("UserLogin not found user_account checkRegister %v err: %v", id, err)
|
logger.Logger.Warnf("UserLogin not found user_account checkRegister %v err: %v", id, err)
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// ret, err = checkGameOver(db, login, platform, id)
|
ret, err = checkGameOver(db, login, platform, id)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin checkGameOver %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// if ret {
|
if ret {
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
// ret, err = checkGaming(db, login, platform, id)
|
ret, err = checkGaming(db, login, platform, id)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin checkGaming %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// if ret {
|
if ret {
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
// ret, err = checkLogin(db, login, platform, id)
|
ret, err = checkLogin(db, login, platform, id)
|
||||||
// if err != nil {
|
if err != nil {
|
||||||
// logger.Logger.Errorf("UserLogin checkLogin %v err: %v", id, err)
|
logger.Logger.Errorf("UserLogin checkLogin %v err: %v", id, err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// if ret {
|
if ret {
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// return nil
|
return nil
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// for _, v := range ids {
|
for _, v := range ids {
|
||||||
// if err := f(v.Snid); err != nil {
|
if err := f(v.Snid); err != nil {
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// return nil
|
return nil
|
||||||
//}
|
}
|
||||||
|
|
|
@ -9,12 +9,12 @@ import (
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"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"
|
mongomodel "mongo.games.com/game/statistics/modelmongo"
|
||||||
mysqlmodel "mongo.games.com/game/statistics/modelmysql"
|
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"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -155,19 +155,19 @@ func LogLogin(platform string, batchSize int) ([]*mysqlmodel.LogLogin, error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
//for _, v := range ls {
|
for _, v := range ls {
|
||||||
// if err = tx.First(&mysqlmodel.UserID{}, "snid = ?", v.Snid).Error; err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
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)
|
logger.Logger.Errorf("mysql: SyncLogLogin failed to find user_id: %v", err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
//
|
|
||||||
// if errors.Is(err, gorm.ErrRecordNotFound) {
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
// if err = tx.Create(&mysqlmodel.UserID{Snid: v.Snid}).Error; err != nil {
|
if err = tx.Create(&mysqlmodel.UserID{Snid: v.Snid}).Error; err != nil {
|
||||||
// logger.Logger.Errorf("mysql: SyncLogLogin failed to create user_id: %v", err)
|
logger.Logger.Errorf("mysql: SyncLogLogin failed to create user_id: %v", err)
|
||||||
// return err
|
return err
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,3 +1 @@
|
||||||
游戏服mongodb同步到mysql
|
游戏服mongodb同步到mysql
|
||||||
|
|
||||||
datasync.go 同步模型
|
|
Loading…
Reference in New Issue