Compare commits
No commits in common. "5c38610b55efeaebfe3a633fd36f88321962127f" and "e5378e46f948498caf0f3fbaa94d1773e1e67f06" have entirely different histories.
5c38610b55
...
e5378e46f9
|
@ -133,12 +133,10 @@ type PlayerLoginEvent struct {
|
|||
IsNew int32 //是否是新用户,1是 0否
|
||||
DeviceId string //设备id
|
||||
ChannelId string //渠道id
|
||||
AppChannel string //包渠道
|
||||
ClientVer int32 // 客户端版本
|
||||
}
|
||||
|
||||
func CreatePlayerLoginEvent(snid int32, channel, promoter, platform, city, os, ip string, createTime,
|
||||
upgradeTime time.Time, isBindPhone int32, telephonePromoter int32, deviceId, channelId, appChannel string, clientVer int32) *PlayerLoginEvent {
|
||||
upgradeTime time.Time, isBindPhone int32, telephonePromoter int32, deviceId, channelId string) *PlayerLoginEvent {
|
||||
isNew := int32(0)
|
||||
if createTime.Local().YearDay() == time.Now().Local().YearDay() && createTime.Local().Year() == time.Now().Local().Year() {
|
||||
isNew = 1
|
||||
|
@ -160,11 +158,25 @@ func CreatePlayerLoginEvent(snid int32, channel, promoter, platform, city, os, i
|
|||
IsNew: isNew,
|
||||
DeviceId: deviceId,
|
||||
ChannelId: channelId,
|
||||
AppChannel: appChannel,
|
||||
ClientVer: clientVer,
|
||||
}
|
||||
}
|
||||
|
||||
func MarshalPlayerLoginEvent(source, snid int32, channel, promoter, platform, city, os, ip string,
|
||||
createTime, upgradeTime time.Time, isBindPhone int32, telephonePromoter int32, deviceId, channelId string) (data string, err error) {
|
||||
raw := &RabbitMQDataRaw{
|
||||
Source: source,
|
||||
Data: CreatePlayerLoginEvent(snid, channel, promoter, platform, city, os, ip, createTime,
|
||||
upgradeTime, isBindPhone, telephonePromoter, deviceId, channelId),
|
||||
}
|
||||
|
||||
d, e := json.Marshal(raw)
|
||||
if e == nil {
|
||||
data = string(d[:])
|
||||
}
|
||||
err = e
|
||||
return
|
||||
}
|
||||
|
||||
// 用户升级账号
|
||||
type PlayerBindPhoneEvent struct {
|
||||
SnId int32 //用户ID
|
||||
|
|
|
@ -1,58 +0,0 @@
|
|||
package mongo
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"mongo.games.com/game/mongo/internal"
|
||||
"mongo.games.com/goserver/core/logger"
|
||||
)
|
||||
|
||||
type Config = internal.Config
|
||||
type DatabaseConfig = internal.DatabaseConfig
|
||||
type Collection = internal.Collection
|
||||
|
||||
var _manager *internal.Manager
|
||||
var _conf *internal.Config
|
||||
|
||||
// GetConfig 获取配置
|
||||
func GetConfig() *Config {
|
||||
return _conf
|
||||
}
|
||||
|
||||
// Init 初始化
|
||||
func Init(conf *Config) error {
|
||||
_conf = conf
|
||||
_manager = internal.NewManager(_conf)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Restart 重启
|
||||
func Restart() {
|
||||
if _manager == nil {
|
||||
logger.Logger.Errorf("mongo manager is nil, please call Init() first")
|
||||
return
|
||||
}
|
||||
_manager.Restart(_conf)
|
||||
}
|
||||
|
||||
// GetGlobalCollection 获取全局库
|
||||
// database: 数据库名称
|
||||
// collection: 集合名称
|
||||
func GetGlobalCollection(database, collection string) (*Collection, error) {
|
||||
if _manager == nil {
|
||||
return nil, errors.New("mongo manager is nil, please call Init() first")
|
||||
}
|
||||
|
||||
return _manager.GetCollection("global", database, collection)
|
||||
}
|
||||
|
||||
// GetCollection 获取平台库
|
||||
// platform: 平台id
|
||||
// database: 数据库名称
|
||||
// collection: 集合名称
|
||||
func GetCollection(platform, database, collection string) (*Collection, error) {
|
||||
if _manager == nil {
|
||||
return nil, errors.New("mongo manager is nil, please call Init() first")
|
||||
}
|
||||
|
||||
return _manager.GetCollection(platform, database, collection)
|
||||
}
|
|
@ -1,185 +0,0 @@
|
|||
package internal
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
"mongo.games.com/goserver/core/logger"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
Global map[string]*DatabaseConfig
|
||||
Platforms map[string]map[string]*DatabaseConfig
|
||||
}
|
||||
|
||||
type DatabaseConfig struct {
|
||||
HostName string // 主机地址
|
||||
HostPort int32 // 端口
|
||||
Database string // 数据库名
|
||||
Username string // 用户名
|
||||
Password string // 密码
|
||||
Options string // 配置
|
||||
}
|
||||
|
||||
type Collection struct {
|
||||
Database *Database
|
||||
*mongo.Collection
|
||||
}
|
||||
|
||||
type Database struct {
|
||||
*DatabaseConfig
|
||||
Client *mongo.Client
|
||||
Database *mongo.Database
|
||||
Collection sync.Map
|
||||
}
|
||||
|
||||
func (d *Database) Connect() error {
|
||||
if d.DatabaseConfig == nil {
|
||||
err := fmt.Errorf("mongo Connect error, DatabaseConifg not found")
|
||||
logger.Logger.Error(err)
|
||||
return err
|
||||
}
|
||||
|
||||
login := ""
|
||||
if d.DatabaseConfig.Username != "" {
|
||||
login = d.DatabaseConfig.Username + ":" + d.DatabaseConfig.Password + "@"
|
||||
}
|
||||
host := d.DatabaseConfig.HostName
|
||||
if d.DatabaseConfig.HostName == "" {
|
||||
host = "127.0.0.1"
|
||||
}
|
||||
port := d.DatabaseConfig.HostPort
|
||||
if d.DatabaseConfig.HostPort == 0 {
|
||||
port = 27017
|
||||
}
|
||||
myOptions := d.DatabaseConfig.Options
|
||||
if myOptions != "" {
|
||||
myOptions = "?" + myOptions
|
||||
}
|
||||
|
||||
s := fmt.Sprintf("mongodb://%s%s:%d/admin%s", login, host, port, myOptions)
|
||||
client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(s))
|
||||
if err != nil {
|
||||
logger.Logger.Errorf("mongo Connect %v error: %v config:%+v", s, err, *d.DatabaseConfig)
|
||||
return err
|
||||
}
|
||||
logger.Logger.Tracef("mongo connect success %+v", *d.DatabaseConfig)
|
||||
d.Client = client
|
||||
d.Database = client.Database(d.DatabaseConfig.Database)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (d *Database) GetCollection(name string) (*Collection, error) {
|
||||
if d.Database == nil {
|
||||
err := fmt.Errorf("mongo GetCollection error, collection:%v, database is nil", name)
|
||||
logger.Logger.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
v, ok := d.Collection.Load(name)
|
||||
if !ok {
|
||||
v = &Collection{
|
||||
Database: d,
|
||||
Collection: d.Database.Collection(name),
|
||||
}
|
||||
d.Collection.Store(name, v)
|
||||
}
|
||||
c, _ := v.(*Collection)
|
||||
return c, nil
|
||||
}
|
||||
|
||||
type Manager struct {
|
||||
conf *Config
|
||||
global *sync.Map // 内部库名称:Database
|
||||
platforms *sync.Map // 平台id:内部库名称:Database
|
||||
}
|
||||
|
||||
func (m *Manager) GetCollection(key, database, collection string) (*Collection, error) {
|
||||
switch key {
|
||||
case "global":
|
||||
v, ok := m.global.Load(database)
|
||||
if !ok {
|
||||
db := &Database{
|
||||
DatabaseConfig: m.conf.Global[database],
|
||||
Collection: sync.Map{},
|
||||
}
|
||||
if err := db.Connect(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
v = db
|
||||
m.global.Store(database, v)
|
||||
}
|
||||
d, _ := v.(*Database)
|
||||
return d.GetCollection(collection)
|
||||
|
||||
default:
|
||||
var mp *sync.Map
|
||||
v, ok := m.platforms.Load(key) // 平台id
|
||||
if !ok {
|
||||
mp = new(sync.Map)
|
||||
m.platforms.Store(key, mp)
|
||||
} else {
|
||||
mp = v.(*sync.Map)
|
||||
}
|
||||
v, ok = mp.Load(database)
|
||||
if !ok {
|
||||
db := &Database{
|
||||
DatabaseConfig: m.conf.Platforms[key][database],
|
||||
Collection: sync.Map{},
|
||||
}
|
||||
if err := db.Connect(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
v = db
|
||||
mp.Store(database, v)
|
||||
}
|
||||
d, _ := v.(*Database)
|
||||
return d.GetCollection(collection)
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Manager) Restart(conf *Config) {
|
||||
logger.Logger.Infof("mongo manager restart...")
|
||||
global := m.global
|
||||
platforms := m.platforms
|
||||
time.AfterFunc(time.Minute, func() {
|
||||
logger.Logger.Infof("mongo manager restart close...")
|
||||
global.Range(func(key, value any) bool {
|
||||
if v, ok := value.(*Database); ok {
|
||||
v.Client.Disconnect(nil)
|
||||
}
|
||||
return true
|
||||
})
|
||||
|
||||
platforms.Range(func(key, value any) bool {
|
||||
if v, ok := value.(*sync.Map); ok {
|
||||
v.Range(func(key, value any) bool {
|
||||
if v, ok := value.(*Database); ok {
|
||||
v.Client.Disconnect(nil)
|
||||
}
|
||||
return true
|
||||
})
|
||||
}
|
||||
return true
|
||||
})
|
||||
})
|
||||
|
||||
m.conf = conf
|
||||
m.global = &sync.Map{}
|
||||
m.platforms = &sync.Map{}
|
||||
}
|
||||
|
||||
func (m *Manager) GetConfig() *Config {
|
||||
return m.conf
|
||||
}
|
||||
|
||||
func NewManager(conf *Config) *Manager {
|
||||
return &Manager{
|
||||
conf: conf,
|
||||
global: &sync.Map{},
|
||||
platforms: &sync.Map{},
|
||||
}
|
||||
}
|
|
@ -1983,18 +1983,18 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64)
|
|||
}
|
||||
}
|
||||
|
||||
// 客户端升级奖励
|
||||
// 老版本升级
|
||||
clientUpgradeConfig := PlatformMgrSingleton.GetConfig(p.Platform).ClientUpgrade
|
||||
if clientUpgradeConfig != nil && clientUpgradeConfig.GetOn() == common.On &&
|
||||
(len(model.GameParamData.ClientVersionChannel) == 0 || slices.Contains(model.GameParamData.ClientVersionChannel, p.LastChannel)) {
|
||||
if p.ClientVer < model.GameParamData.ClientVersion && cspl.GetClientVer() == model.GameParamData.ClientVersion {
|
||||
AddMailClientUpgrade(p.SnId, clientUpgradeConfig.GetReward())
|
||||
if p.ClientVer < model.GameParamData.ClientVersion {
|
||||
if cspl.GetClientVer() == model.GameParamData.ClientVersion {
|
||||
// 升级了
|
||||
p.ClientVer = model.GameParamData.ClientVersion
|
||||
AddMailClientUpgrade(p.SnId, clientUpgradeConfig.GetReward())
|
||||
}
|
||||
}
|
||||
}
|
||||
// 客户端升级
|
||||
if p.ClientVer < cspl.GetClientVer() && cspl.GetClientVer() <= model.GameParamData.ClientVersion {
|
||||
p.ClientVer = cspl.GetClientVer()
|
||||
}
|
||||
}
|
||||
|
||||
// 有缓存数据
|
||||
|
|
|
@ -2940,7 +2940,7 @@ func (this *Player) ReportLoginEvent() {
|
|||
}
|
||||
mq.Write(model.GenerateLogin(model.CreatePlayerLoginEvent(this.SnId,
|
||||
this.Channel, this.BeUnderAgentCode, this.Platform, this.City, this.DeviceOS, this.Ip,
|
||||
this.CreateTime, this.UpgradeTime, isBindPhone, this.TelephonePromoter, this.DeviceId, this.ChannelId, this.AppChannel, this.ClientVer)))
|
||||
this.CreateTime, this.UpgradeTime, isBindPhone, this.TelephonePromoter, this.DeviceId, this.ChannelId)))
|
||||
//登录通知
|
||||
//ActMonitorMgrSington.SendActMonitorEvent(ActState_Login, this.SnId, this.Name, this.Platform,
|
||||
// 0, 0, "", 0)
|
||||
|
|
Loading…
Reference in New Issue