123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- package account
- import (
- "context"
- mhayaTime "github.com/mhaya/extend/time"
- cutils "github.com/mhaya/extend/utils"
- "github.com/mhaya/game/game_cluster/internal/code"
- "github.com/mhaya/game/game_cluster/internal/constant"
- "github.com/mhaya/game/game_cluster/internal/data"
- "github.com/mhaya/game/game_cluster/internal/mdb"
- "github.com/mhaya/game/game_cluster/internal/mdb/models"
- "github.com/mhaya/game/game_cluster/internal/param"
- "github.com/mhaya/game/game_cluster/internal/third"
- cactor "github.com/mhaya/net/actor"
- "go.mongodb.org/mongo-driver/bson"
- "go.mongodb.org/mongo-driver/mongo/options"
- "strings"
- "time"
- )
- type (
- ActorAccount struct {
- cactor.Base
- time int64
- serverLoad map[string]string
- account models.Account
- }
- )
- func (p *ActorAccount) AliasID() string {
- return "account"
- }
- // OnInit center为后端节点,不直接与客户端通信,所以注册了一些remote函数,供RPC调用
- func (p *ActorAccount) OnInit() {
- p.Remote().Register("registerAccount", p.registerOrLoinAccount)
- p.Timer().Add(5*time.Second, p.load)
- p.Timer().Add(time.Minute, p.Stat)
- p.Timer().Add(1*time.Minute, p.PlayerIpStat)
- p.Timer().Add(time.Minute, p.playerLevelStat)
- p.Timer().AddFixedHour(23, 59, 59, p.Stat)
- //p.Timer().AddOnce(30*time.Second, RunToMongoDB)
- // p.Timer().AddOnce(30*time.Second, RunToMongoDB)
- }
- func (p *ActorAccount) Stat() {
- daily := mhayaTime.Now().DailyTOTimeStamp()
- var dailyRecord models.DailyRecord
- dailyRecord.Daily = daily
- platformConfig := data.PlatformConfig.GatMap()
- channelConfig := data.ChannelConfig.GatMap()
- for _, v := range platformConfig {
- for _, v2 := range channelConfig {
- p.dailyStat(v.Name, v2.Name, daily)
- }
- }
- }
- func (p *ActorAccount) playerLevelStat() {
- platformConfig := data.PlatformConfig.GatMap()
- channelConfig := data.ChannelConfig.GatMap()
- for _, v := range platformConfig {
- for _, v2 := range channelConfig {
- p.levelStat(v.Name, v2.Name)
- }
- }
- }
- func (p *ActorAccount) PlayerIpStat() {
- daily := mhayaTime.Now().DailyTOTimeStamp()
- platformConfig := data.PlatformConfig.GatMap()
- channelConfig := data.ChannelConfig.GatMap()
- for _, v := range platformConfig {
- for _, v2 := range channelConfig {
- p.ipStat(v.Name, v2.Name, daily)
- }
- }
- }
- func (p *ActorAccount) load() {
- m, err := mdb.RDB.HGetAll(context.Background(), constant.ServerLoadHKey).Result()
- if err != nil {
- return
- }
- var stat models.PlayerServerLoadStat
- stat.Name = "load"
- stat.Load = m
- stat.TotalUser = p.userStat()
- stat.UpdateTime = mhayaTime.Now().Unix()
- mdb.MDB.Collection(constant.CNameServerLoadStat).UpdateOne(context.Background(), bson.M{"name": "load"}, bson.M{"$set": &stat}, options.Update().SetUpsert(true))
- }
- func (p *ActorAccount) userStat() int64 {
- var num int64
- platformConfig := data.PlatformConfig.GatMap()
- channelConfig := data.ChannelConfig.GatMap()
- for _, v := range platformConfig {
- for _, v2 := range channelConfig {
- num += models.GetTotalPlayerRecordLen(v.Name, v2.Name)
- }
- }
- return num
- }
- func (p *ActorAccount) ipStat(platform, channel string, daily int64) {
- var ipMap = make(map[string]int)
- ret, err := models.GetAllDailyRecordNewUserRegister(platform, channel, models.DailyRecordNewRegistered)
- if err != nil {
- return
- }
- for _, v := range ret {
- c, _ := third.GetCountryByIP(v)
- ipMap[c] += 1
- }
- var stat models.PlayerCountryStat
- stat.Daily = daily
- stat.Platform = platform
- stat.Channel = channel
- stat.PlayerRegisterCountry = ipMap
- stat.UpdateTime = mhayaTime.Now().Unix()
- mdb.MDB.Collection(constant.CNamePlayerCountryByIPStat).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel, "daily": daily}, bson.M{"$set": &stat}, options.Update().SetUpsert(true))
- }
- func (p *ActorAccount) levelStat(platform, channel string) {
- level := make(map[string]int)
- ret, err := models.GetAllTotalPlayerRecord(platform, channel)
- if err != nil {
- return
- }
- for _, v := range ret {
- level[v] += 1
- }
- var stat models.PlayerLevelStat
- stat.Platform = platform
- stat.Channel = channel
- stat.ServerLevel = level
- stat.UpdateTime = mhayaTime.Now().Unix()
- mdb.MDB.Collection(constant.CNamePlayerLevelStat).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel}, bson.M{"$set": &stat}, options.Update().SetUpsert(true))
- }
- func (p *ActorAccount) dailyStat(platform, channel string, daily int64) *models.DailyRecord {
- var dailyRecord models.DailyRecord
- dailyRecord.Daily = daily
- dailyRecord.Platform = platform
- dailyRecord.Channel = channel
- dailyRecord.Registered = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewRegistered)
- dailyRecord.NewLogin = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewLogin)
- dailyRecord.OldLogin = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordOldLogin)
- dailyRecord.LoggedIn = dailyRecord.NewLogin + dailyRecord.OldLogin
- dailyRecord.NewActive = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordNewActive)
- dailyRecord.OldActive = models.GetAppointDailyRecordLen(platform, channel, daily, models.DailyRecordOldActive)
- dailyRecord.ActiveUsers = dailyRecord.NewActive + dailyRecord.NewActive
- point, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordTotalPoints)
- if err == nil {
- dailyRecord.TotalPoints = point
- }
- u, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordUProduced)
- if err == nil {
- dailyRecord.UProduced = cutils.QuoInt64ByRatioToFloat64(u, constant.MoneyRatio)
- }
- uCashOut, err := models.GetAppointDailyRecord(platform, channel, daily, models.DailyRecordUCashout)
- if err == nil {
- dailyRecord.UCashout = cutils.QuoInt64ByRatioToFloat64(uCashOut, constant.MoneyRatio)
- }
- dailyRecord.CreatedAt = mhayaTime.Now().Unix()
- dailyRecord.UpdatedAt = mhayaTime.Now().Unix()
- mdb.MDB.Collection(constant.CNamePlayerDailyRecord).UpdateOne(context.Background(), bson.M{"platform": platform, "channel": channel, "daily": daily}, bson.M{"$set": &dailyRecord}, options.Update().SetUpsert(true))
- return &dailyRecord
- }
- // registerDevAccount 注册开发者帐号
- func (p *ActorAccount) registerOrLoinAccount(req *param.LoginReq) (*param.LoginResp, int32) {
- if strings.TrimSpace(req.OpenID) == "" || strings.TrimSpace(req.IP) == "" || strings.TrimSpace(req.Platform) == "" || strings.TrimSpace(req.Channel) == "" {
- return nil, code.Error
- }
- account, err := p.account.AccountRegisterOrLogin(req)
- if err > 0 {
- return nil, code.Error
- }
- return ¶m.LoginResp{
- UserName: account.UserName,
- OpenId: account.OpenId,
- }, code.OK
- }
|