Merge remote-tracking branch 'origin/develop' into dev_slots

This commit is contained in:
tomas 2024-10-14 10:24:16 +08:00
commit 2201f656f1
36 changed files with 1960 additions and 940 deletions

22
.gitlab-ci.yml Normal file
View File

@ -0,0 +1,22 @@
stages:
- build
- deploy
variables:
GIT_DEPTH: 0
default:
tags:
- game-develop
build-job:
stage: build
script:
- echo "Compiling the code..."
- echo "Compile complete."
deploy-job:
stage: deploy
script:
- echo "Deploying application..."
- echo "Application successfully deployed."

29
common/functions.go Normal file
View File

@ -0,0 +1,29 @@
package common
import (
"fmt"
"github.com/spf13/viper"
)
var paths = []string{
".",
"./etc",
"./config",
}
func GetViper(name, filetype string) *viper.Viper {
vp := viper.New()
// 配置文件
vp.SetConfigName(name)
vp.SetConfigType(filetype)
for _, v := range paths {
vp.AddConfigPath(v)
}
err := vp.ReadInConfig()
if err != nil {
panic(fmt.Errorf("fatal error config file: %w", err))
}
return vp
}

View File

@ -9,5 +9,7 @@
"MatchAwardTitle": "{\"zh\":\"话费充值兑换码\",\"vi\":\"Mã nạp tiền ĐT\",\"en\":\"Phone recharge code\",\"kh\":\"កូដបញ្ចូលទូរស័ព្ទ\"}", "MatchAwardTitle": "{\"zh\":\"话费充值兑换码\",\"vi\":\"Mã nạp tiền ĐT\",\"en\":\"Phone recharge code\",\"kh\":\"កូដបញ្ចូលទូរស័ព្ទ\"}",
"MatchAward": "{\"zh\":\"恭喜您获得电话预付卡“%v$”话费充值奖励,兑换码:%v,请尽快使用\",\"vi\":\"Chúc mừng bạn đã nhận được Thẻ trả trước ĐT “%v$” phần thưởng nạp tiền tín dụng ĐT, mã đổi thưởng %v xin sử dụng ngay lập tức\",\"en\":\"Congratulations, you have received the phone prepaid card “%v$” mobile credit top-up reward, redemption code: %v please use it immediately.\",\"kh\":\"សូមអបអរសាទរ អ្នកទទួលបានរង្វាន់កាតបញ្ចូលទូរស័ព្ទ កាតទូរស័ព្ទបង់ប្រាក់ជាមុន “%v$”លេខកូដដោះដូរ %v សូមប្រើវាភ្លាមៗ\"}", "MatchAward": "{\"zh\":\"恭喜您获得电话预付卡“%v$”话费充值奖励,兑换码:%v,请尽快使用\",\"vi\":\"Chúc mừng bạn đã nhận được Thẻ trả trước ĐT “%v$” phần thưởng nạp tiền tín dụng ĐT, mã đổi thưởng %v xin sử dụng ngay lập tức\",\"en\":\"Congratulations, you have received the phone prepaid card “%v$” mobile credit top-up reward, redemption code: %v please use it immediately.\",\"kh\":\"សូមអបអរសាទរ អ្នកទទួលបានរង្វាន់កាតបញ្ចូលទូរស័ព្ទ កាតទូរស័ព្ទបង់ប្រាក់ជាមុន “%v$”លេខកូដដោះដូរ %v សូមប្រើវាភ្លាមៗ\"}",
"PermitAwardTitle": "{\"zh\":\"通行证排行奖励\",\"vi\":\"Vượt qua phần thưởng xếp hạng\",\"en\":\"Pass Ranking Rewards\",\"kh\":\"រង្វាន់ចំណាត់ថ្នាក់ឆ្លងកាត់\"}", "PermitAwardTitle": "{\"zh\":\"通行证排行奖励\",\"vi\":\"Vượt qua phần thưởng xếp hạng\",\"en\":\"Pass Ranking Rewards\",\"kh\":\"រង្វាន់ចំណាត់ថ្នាក់ឆ្លងកាត់\"}",
"PermitAward": "{\"zh\":\"恭喜您在上个赛季通行证排行中名次达到%v名排行奖励已发放请查收\",\"vi\":\"Chúc mừng bạn đã đạt được %v trong bảng xếp hạng vượt qua. Phần thưởng xếp hạng đã được phân phối, vui lòng kiểm tra.\",\"en\":\"Congratulations on reaching %vth place in the pass ranking. Ranking rewards have been issued. Please check.\",\"kh\":\"សូមអបអរសាទរចំពោះការឈានដល់ចំណាត់ថ្នាក់ទី %v ក្នុងចំណាត់ថ្នាក់ឆ្លងកាត់។ រង្វាន់ចំណាត់ថ្នាក់ត្រូវបានចេញ។ សូមត្រួតពិនិត្យ។\"}" "PermitAward": "{\"zh\":\"恭喜您在上个赛季通行证排行中名次达到%v名排行奖励已发放请查收\",\"vi\":\"Chúc mừng bạn đã đạt được %v trong bảng xếp hạng vượt qua. Phần thưởng xếp hạng đã được phân phối, vui lòng kiểm tra.\",\"en\":\"Congratulations on reaching %vth place in the pass ranking. Ranking rewards have been issued. Please check.\",\"kh\":\"សូមអបអរសាទរចំពោះការឈានដល់ចំណាត់ថ្នាក់ទី %v ក្នុងចំណាត់ថ្នាក់ឆ្លងកាត់។ រង្វាន់ចំណាត់ថ្នាក់ត្រូវបានចេញ។ សូមត្រួតពិនិត្យ។\"}",
"UpgradeTitle": "{\"zh\":\"更新奖励\",\"vi\":\"Phần thưởng cập nhật\",\"en\":\"Update Rewards\",\"kh\":\"រង្វាន់ដំឡើង\"}",
"Upgrade": "{\"zh\":\"感谢您更新客户端,更新奖励已发放至附近,请注意查收\",\"vi\":\"Cảm ơn bạn đã cập nhật ứng dụng khách. Phần thưởng cập nhật đã được phân phối gần đó, vui lòng chú ý kiểm tra nhận\",\"en\":\"Thank you for updating the client. The update reward has been distributed to everyone. Please check it carefully.\",\"kh\":\"អរគុណសម្រាប់ការធ្វើបច្ចុប្បន្នភាពហ្គេម។ រង្វាន់នៃការធ្វើបច្ចុប្បន្នភាពត្រូវបានចែកចាយទៅគ្រប់គ្នា។ សូមពិនិត្យអោយបានច្បាស់លាស់។\"}"
} }

View File

@ -9,8 +9,23 @@ import (
newMongo "go.mongodb.org/mongo-driver/mongo" newMongo "go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/options"
"mongo.games.com/goserver/core/logger" "mongo.games.com/goserver/core/logger"
"mongo.games.com/game/common"
"mongo.games.com/game/mongo"
) )
func init() {
// 读取配置文件
vp := common.GetViper("mgo", "json")
// mongo初始化
conf := &mongo.Config{}
err := vp.Unmarshal(conf)
if err != nil {
panic(fmt.Errorf("mongo config error: %v", err))
}
mongo.Init(conf)
}
var globalMongoSession *newMongo.Client var globalMongoSession *newMongo.Client
func mongoURI(user, password, host string, port int32, options string) string { func mongoURI(user, password, host string, port int32, options string) string {
@ -31,6 +46,8 @@ func mongoURI(user, password, host string, port int32, options string) string {
return url return url
} }
// NewMongoClient 创建mongo客户端
// Deprecated: use [mongo.games.com/game/mongo] instead
func NewMongoClient() (*newMongo.Client, error) { func NewMongoClient() (*newMongo.Client, error) {
if globalMongoSession != nil { if globalMongoSession != nil {
return globalMongoSession, nil return globalMongoSession, nil

View File

@ -69,7 +69,10 @@ func (svc *AnnouncerLogSvc) InsertAnnouncerLog(args []*model.AnnouncerLog, ret *
func (svc *AnnouncerLogSvc) FetchAnnouncerLog(args *model.FetchAnnouncerLogArgs, ret *[]model.AnnouncerLog) (err error) { func (svc *AnnouncerLogSvc) FetchAnnouncerLog(args *model.FetchAnnouncerLogArgs, ret *[]model.AnnouncerLog) (err error) {
*ret, err = FetchAnnouncerLog(args.Plt) *ret, err = FetchAnnouncerLog(args.Plt)
return if err != nil && !errors.Is(err, mgo.ErrNotFound) {
return err
}
return nil
} }
func (svc *AwardLogSvc) UpsertAnnouncerLog(args *model.FetchAnnouncerLogArgs, ret *model.AnnouncerLog) error { func (svc *AwardLogSvc) UpsertAnnouncerLog(args *model.FetchAnnouncerLogArgs, ret *model.AnnouncerLog) error {

View File

@ -2,6 +2,7 @@ package svc
import ( import (
"errors" "errors"
"github.com/globalsign/mgo"
"github.com/globalsign/mgo/bson" "github.com/globalsign/mgo/bson"
"mongo.games.com/game/dbproxy/mongo" "mongo.games.com/game/dbproxy/mongo"
"mongo.games.com/game/model" "mongo.games.com/game/model"
@ -34,7 +35,10 @@ type AwardLogSvc struct {
func (svc *AwardLogSvc) FetchAwardLog(args *model.FetchAwardLogArgs, ret *model.AwardLog) (err error) { func (svc *AwardLogSvc) FetchAwardLog(args *model.FetchAwardLogArgs, ret *model.AwardLog) (err error) {
*ret, err = FetchAwardLog(args.Plt) *ret, err = FetchAwardLog(args.Plt)
return if err != nil && !errors.Is(err, mgo.ErrNotFound) {
return err
}
return nil
} }
func (svc *AwardLogSvc) UpsertAwardLog(args *model.FetchAwardLogArgs, ret *model.AwardLog) error { func (svc *AwardLogSvc) UpsertAwardLog(args *model.FetchAwardLogArgs, ret *model.AwardLog) error {

View File

@ -20,7 +20,11 @@ func LoginLogsCollection(plt string) *mongo.Collection {
c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"logtype"}, Background: true, Sparse: true}) c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"logtype"}, Background: true, Sparse: true})
c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"ip"}, Background: true, Sparse: true}) c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"ip"}, Background: true, Sparse: true})
c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"time"}, Background: true, Sparse: true}) c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"time"}, Background: true, Sparse: true})
c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"-time"}, Background: true, Sparse: true})
c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"ts"}, Background: true, Sparse: true}) c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"ts"}, Background: true, Sparse: true})
c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"-ts"}, Background: true, Sparse: true})
c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"appchannel"}, Background: true, Sparse: true})
c_loginlogrec.EnsureIndex(mgo.Index{Key: []string{"clientver"}, Background: true, Sparse: true})
} }
return c_loginlogrec return c_loginlogrec
} }

View File

@ -45,4 +45,5 @@ const (
ETCDKEY_RoomType = "/game/room_type" // 房间类型配置 ETCDKEY_RoomType = "/game/room_type" // 房间类型配置
ETCDKEY_RoomConfig = "/game/room_config" // 房间配置 ETCDKEY_RoomConfig = "/game/room_config" // 房间配置
ETCDKEY_RoomConfigSystem = "/game/room_system" // 系统房间配置 ETCDKEY_RoomConfigSystem = "/game/room_system" // 系统房间配置
ETCDKEY_ClientUpgrade = "/game/client_upgrade" // 客户端升级奖励配置
) )

View File

@ -18,6 +18,7 @@ type PlayerEx struct {
IsWin bool // 是否抓到娃娃 IsWin bool // 是否抓到娃娃
gainCoin int64 // 本局赢的金币 gainCoin int64 // 本局赢的金币
taxCoin int64 //本局税收 taxCoin int64 //本局税收
lastIsWin bool // 上一局是否抓到娃娃
} }
func (this *PlayerEx) Clear(baseScore int32) { func (this *PlayerEx) Clear(baseScore int32) {
@ -27,6 +28,7 @@ func (this *PlayerEx) Clear(baseScore int32) {
this.gainCoin = 0 this.gainCoin = 0
this.IsWin = false this.IsWin = false
this.lastIsWin = false
} }
func (this *PlayerEx) CanOp(sceneEx *SceneEx) bool { func (this *PlayerEx) CanOp(sceneEx *SceneEx) bool {
@ -233,7 +235,7 @@ func (this *PlayerEx) SendPlayerGameBilled(RoundId int32) {
if this != nil { if this != nil {
result := 0 result := 0
if this.IsWin { if this.lastIsWin {
result = 1 result = 1
} }
pack := &clawdoll.SCCLAWDOLLRoundGameBilled{ pack := &clawdoll.SCCLAWDOLLRoundGameBilled{

View File

@ -804,6 +804,7 @@ func (this *StateBilled) OnEnter(s *base.Scene) {
sceneEx.SaveGamePlayerListLog(playerEx.SnId, logParam) sceneEx.SaveGamePlayerListLog(playerEx.SnId, logParam)
} }
playerEx.lastIsWin = playerEx.IsWin
playerEx.ReStartGame() playerEx.ReStartGame()
} }
} }
@ -933,6 +934,8 @@ func (this *StateWaitPayCoin) OnEnter(s *base.Scene) {
playingEx := sceneEx.GetPlayingEx() playingEx := sceneEx.GetPlayingEx()
if playingEx != nil { if playingEx != nil {
playingEx.SendPlayerGameBilled(int32(sceneEx.RoundId)) playingEx.SendPlayerGameBilled(int32(sceneEx.RoundId))
playingEx.lastIsWin = false
} }
} }

View File

@ -181,6 +181,10 @@ func DollMachineGrabResult(conn *machinedoll.Conn, snid, id int32) {
n, err := conn.Read(buf) n, err := conn.Read(buf)
if err != nil { if err != nil {
logger.Logger.Error("Failed to read response from client:", err) logger.Logger.Error("Failed to read response from client:", err)
err := conn.Conn.Close()
if err != nil {
return
}
return return
} }
// 将读取到的数据按照 221 进行分割 // 将读取到的数据按照 221 进行分割

View File

@ -383,7 +383,7 @@ var data = []byte{
0x00, //1 几币几玩占用位 0x00, //1 几币几玩占用位
0x2D, //2 游戏时间 0x2D, //2 游戏时间
0x01, //3 出奖模式0 无概率 1 随机模式 2 固定模式 3 冠兴模式 0x01, //3 出奖模式0 无概率 1 随机模式 2 固定模式 3 冠兴模式
0x0F, //4 出奖概率 0x0A, //4 出奖概率
0x00, //5 出奖概率占用位 0x00, //5 出奖概率占用位
0x00, //6 空中抓物 0关闭 1开启 0x00, //6 空中抓物 0关闭 1开启
0x00, //7 连续投币赠送 范围0~100 0x00, //7 连续投币赠送 范围0~100
@ -409,7 +409,7 @@ var data = []byte{
0x06, //25 放线长度占用位 0x06, //25 放线长度占用位
0x00, //26 礼品下放高度 0x00, //26 礼品下放高度
0x00, //27 礼品下放高度占用位 0x00, //27 礼品下放高度占用位
0x14, //28 甩抓长度 0x00, //28 甩抓长度
0x00, //29 甩抓保护 0x00, //29 甩抓保护
0x78, //30 甩抓电压 0x78, //30 甩抓电压

View File

@ -56,16 +56,17 @@ type ShopInfo struct {
Ratio int32 //权重 Ratio int32 //权重
EndTime int32 //新手礼包结束时间间隔 EndTime int32 //新手礼包结束时间间隔
//缓存数据 //缓存数据
AdLookedNum int32 //已经观看的次数 AdLookedNum int32 //已经观看的次数
AdReceiveNum int32 //已经领取的次数 AdReceiveNum int32 //已经领取的次数
RemainingTime int32 RemainingTime int32
LastLookTime int32 LastLookTime int32
RoleAdded int32 RoleAdded int32
PetAdded int32 PetAdded int32
RoleAddedId int32 //加成人物ID RoleAddedId int32 //加成人物ID
PetAddedId int32 //加成宠物ID PetAddedId int32 //加成宠物ID
FirstSwitch bool // 首冲翻倍 FirstSwitch bool // 首冲翻倍
AmountFinal int64 // 实际获得数量 FirstGiveSwitch bool // 首冲翻倍时加赠是否翻倍
AmountFinal int64 // 实际获得数量
} }
func (this *ShopInfo) GetName() string { func (this *ShopInfo) GetName() string {
@ -152,6 +153,8 @@ type AllConfig struct {
RoomTypeMap map[int32][]*webapi.RoomConfig // key: 房间类型id:房间配置 RoomTypeMap map[int32][]*webapi.RoomConfig // key: 房间类型id:房间配置
// 系统房间配置 // 系统房间配置
RoomConfigSystem map[int32]*webapi.RoomConfigSystem RoomConfigSystem map[int32]*webapi.RoomConfigSystem
// 客户端升级奖励配置
*webapi.ClientUpgrade
} }
type GlobalConfig struct { type GlobalConfig struct {
@ -235,28 +238,29 @@ func (cm *ConfigMgr) UpdateItemShop(list *webapi.ItemShopList) {
} }
shopInfos[itemShop.Id] = &ShopInfo{ shopInfos[itemShop.Id] = &ShopInfo{
Id: itemShop.Id, Id: itemShop.Id,
ItemId: itemShop.ItemId, ItemId: itemShop.ItemId,
Page: itemShop.Page, Page: itemShop.Page,
Order: itemShop.Order, Order: itemShop.Order,
Type: itemShop.Type, Type: itemShop.Type,
Location: itemShop.Location, Location: itemShop.Location,
Picture: itemShop.Picture, Picture: itemShop.Picture,
Name: itemShop.Name, Name: itemShop.Name,
Ad: itemShop.Ad, Ad: itemShop.Ad,
AdTime: itemShop.AdTime, AdTime: itemShop.AdTime,
RepeatTimes: itemShop.RepeatTimes, RepeatTimes: itemShop.RepeatTimes,
CoolingTime: itemShop.CoolingTime, CoolingTime: itemShop.CoolingTime,
Label: itemShop.Label, Label: itemShop.Label,
AddArea: itemShop.AddArea, AddArea: itemShop.AddArea,
Amount: int64(itemShop.Amount), Amount: int64(itemShop.Amount),
ConstType: itemShop.ConstType, ConstType: itemShop.ConstType,
CostArea: itemShop.CostArea, CostArea: itemShop.CostArea,
AddItemInfo: itemInfo, AddItemInfo: itemInfo,
VipLevel: itemShop.VipLevel, VipLevel: itemShop.VipLevel,
Ratio: itemShop.Ratio, Ratio: itemShop.Ratio,
EndTime: itemShop.EndTime, EndTime: itemShop.EndTime,
FirstSwitch: itemShop.FirstSwitch, FirstSwitch: itemShop.FirstSwitch,
FirstGiveSwitch: itemShop.OnFirstGiveDouble == common.On,
} }
} }
cm.GetConfig(list.Platform).ShopInfos = shopInfos cm.GetConfig(list.Platform).ShopInfos = shopInfos

View File

@ -133,10 +133,12 @@ type PlayerLoginEvent struct {
IsNew int32 //是否是新用户1是 0否 IsNew int32 //是否是新用户1是 0否
DeviceId string //设备id DeviceId string //设备id
ChannelId string //渠道id ChannelId string //渠道id
AppChannel string //包渠道
ClientVer int32 // 客户端版本
} }
func CreatePlayerLoginEvent(snid int32, channel, promoter, platform, city, os, ip string, createTime, func CreatePlayerLoginEvent(snid int32, channel, promoter, platform, city, os, ip string, createTime,
upgradeTime time.Time, isBindPhone int32, telephonePromoter int32, deviceId, channelId string) *PlayerLoginEvent { upgradeTime time.Time, isBindPhone int32, telephonePromoter int32, deviceId, channelId, appChannel string, clientVer int32) *PlayerLoginEvent {
isNew := int32(0) isNew := int32(0)
if createTime.Local().YearDay() == time.Now().Local().YearDay() && createTime.Local().Year() == time.Now().Local().Year() { if createTime.Local().YearDay() == time.Now().Local().YearDay() && createTime.Local().Year() == time.Now().Local().Year() {
isNew = 1 isNew = 1
@ -158,25 +160,11 @@ func CreatePlayerLoginEvent(snid int32, channel, promoter, platform, city, os, i
IsNew: isNew, IsNew: isNew,
DeviceId: deviceId, DeviceId: deviceId,
ChannelId: channelId, 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 { type PlayerBindPhoneEvent struct {
SnId int32 //用户ID SnId int32 //用户ID

View File

@ -91,6 +91,7 @@ type GameParam struct {
UseAdminPassword bool // 是否使用管理员密码 UseAdminPassword bool // 是否使用管理员密码
CloseCustomRoomCreate bool // 关闭自定义房间创建 CloseCustomRoomCreate bool // 关闭自定义房间创建
ClientVersion int32 // 客户端版本号 ClientVersion int32 // 客户端版本号
ClientVersionChannel []string // 客户端版本号包渠道
} }
var GameParamPath = "../data/gameparam.json" var GameParamPath = "../data/gameparam.json"

View File

@ -55,11 +55,12 @@ type LoginLog struct {
BuildVersion string BuildVersion string
AppChannel string AppChannel string
DeviceOS string DeviceOS string
ClientVer int32
} }
func NewLoginLog(snId, logType int32, tel, ip, platform, channel, promoter, packageId, city string, func NewLoginLog(snId, logType int32, tel, ip, platform, channel, promoter, packageId, city string,
clog *ClientLoginInfo, totalCoin int64, gameId, lastGameId int, clog *ClientLoginInfo, totalCoin int64, gameId, lastGameId int,
DeviceName, PackageName, AppVersion, BuildVersion, AppChannel, channelId string) *LoginLog { DeviceName, PackageName, AppVersion, BuildVersion, AppChannel, channelId string, clientVer int32) *LoginLog {
now := time.Now() now := time.Now()
cl := &LoginLog{LogId: bson.NewObjectId()} cl := &LoginLog{LogId: bson.NewObjectId()}
cl.SnId = snId cl.SnId = snId
@ -95,6 +96,7 @@ func NewLoginLog(snId, logType int32, tel, ip, platform, channel, promoter, pack
cl.AppVersion = AppVersion cl.AppVersion = AppVersion
cl.BuildVersion = BuildVersion cl.BuildVersion = BuildVersion
cl.AppChannel = AppChannel cl.AppChannel = AppChannel
cl.ClientVer = clientVer
return cl return cl
} }

View File

@ -73,14 +73,14 @@ type Message struct {
CreatTs int64 //创建时间戳 CreatTs int64 //创建时间戳
AttachState int32 //附件状态 AttachState int32 //附件状态
GiftId string // GiftId string //
Params []int32 //额外参数 Params []int64 //额外参数
Platform string //平台信息 Platform string //平台信息
ShowId int64 //区分主子游戏大厅 ShowId int64 //区分主子游戏大厅
Channel []string //渠道 Channel []string //渠道
} }
func NewMessage(pid string, srcId int32, srcName string, snid, mType int32, title, content string, coin, diamond int64, func NewMessage(pid string, srcId int32, srcName string, snid, mType int32, title, content string, coin, diamond int64,
state int32, addTime int64, attachState int32, giftId string, params []int32, platform string, showId int64, channel []string) *Message { state int32, addTime int64, attachState int32, giftId string, params []int64, platform string, showId int64, channel []string) *Message {
if srcName == "" { if srcName == "" {
srcName = "{\"zh\":\"系统\",\"vi\":\"GM\",\"en\":\"GM\",\"kh\":\"GM\"}" srcName = "{\"zh\":\"系统\",\"vi\":\"GM\",\"en\":\"GM\",\"kh\":\"GM\"}"
} }
@ -110,7 +110,7 @@ func NewMessage(pid string, srcId int32, srcName string, snid, mType int32, titl
return msg return msg
} }
func NewMessageByPlayer(pid string, oper, srcId int32, srcName string, snid, mType int32, title, content string, coin, diamond int64, func NewMessageByPlayer(pid string, oper, srcId int32, srcName string, snid, mType int32, title, content string, coin, diamond int64,
state int32, addTime int64, attachState int32, giftId string, params []int32, platform string, showId int64) *Message { state int32, addTime int64, attachState int32, giftId string, params []int64, platform string, showId int64) *Message {
msg := &Message{ msg := &Message{
Id: bson.NewObjectId(), Id: bson.NewObjectId(),

81
mongo/export.go Normal file
View File

@ -0,0 +1,81 @@
package mongo
import (
"errors"
"go.mongodb.org/mongo-driver/mongo"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/game/mongo/internal"
)
type Config = internal.Config
type DatabaseConfig = internal.DatabaseConfig
type Collection = internal.Collection
type Database = internal.Database
var _manager *internal.Manager
var _conf *internal.Config
// GetConfig 获取配置
func GetConfig() *Config {
return _conf
}
// Init 初始化
func Init(conf *Config) {
_conf = conf
_manager = internal.NewManager(_conf)
}
// Restart 重启
func Restart() {
if _manager == nil {
logger.Logger.Errorf("mongo manager is nil, please call Init() first")
return
}
_manager.Restart(_conf)
}
// Close 关闭
func Close() {
internal.Close(_manager)
}
// 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)
}
// GetClient 获取数据库连接
// 默认获取的是 Global, log 的数据库连接
func GetClient() (*mongo.Client, error) {
if _manager == nil {
return nil, errors.New("mongo manager is nil, please call Init() first")
}
c, err := _manager.GetCollection("global", "log", "empty")
if err != nil {
return nil, err
}
return c.Database.Client, nil
}

188
mongo/internal/mongo.go Normal file
View File

@ -0,0 +1,188 @@
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...")
old := *m
time.AfterFunc(time.Minute, func() {
Close(&old)
})
m.conf = conf
m.global = &sync.Map{}
m.platforms = &sync.Map{}
}
func Close(m *Manager) {
logger.Logger.Infof("mongo manager close")
m.global.Range(func(key, value any) bool {
if v, ok := value.(*Database); ok {
v.Client.Disconnect(nil)
}
return true
})
m.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
})
}
func (m *Manager) GetConfig() *Config {
return m.conf
}
func NewManager(conf *Config) *Manager {
return &Manager{
conf: conf,
global: &sync.Map{},
platforms: &sync.Map{},
}
}

View File

@ -75,6 +75,10 @@
- 2580~2599 - 2580~2599
- 2900~2999 - 2900~2999
### upgrade.proto
- 3100~3199
## gamesrv ## gamesrv
### fish ### fish

View File

@ -0,0 +1,360 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.27.1-devel
// protoc v3.19.4
// source: upgrade.proto
package upgrade
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
type PacketID int32
const (
// 3100~3199
PacketID_PacketID_Zero PacketID = 0
PacketID_PACKET_CSClientUpgrades PacketID = 3100
PacketID_PACKET_SCClientUpgrades PacketID = 3101
)
// Enum value maps for PacketID.
var (
PacketID_name = map[int32]string{
0: "PacketID_Zero",
3100: "PACKET_CSClientUpgrades",
3101: "PACKET_SCClientUpgrades",
}
PacketID_value = map[string]int32{
"PacketID_Zero": 0,
"PACKET_CSClientUpgrades": 3100,
"PACKET_SCClientUpgrades": 3101,
}
)
func (x PacketID) Enum() *PacketID {
p := new(PacketID)
*p = x
return p
}
func (x PacketID) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (PacketID) Descriptor() protoreflect.EnumDescriptor {
return file_upgrade_proto_enumTypes[0].Descriptor()
}
func (PacketID) Type() protoreflect.EnumType {
return &file_upgrade_proto_enumTypes[0]
}
func (x PacketID) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use PacketID.Descriptor instead.
func (PacketID) EnumDescriptor() ([]byte, []int) {
return file_upgrade_proto_rawDescGZIP(), []int{0}
}
type PropInfo struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
ItemId int32 `protobuf:"varint,1,opt,name=ItemId,proto3" json:"ItemId,omitempty"` //物品ID
ItemNum int64 `protobuf:"varint,2,opt,name=ItemNum,proto3" json:"ItemNum,omitempty"` //物品数量
}
func (x *PropInfo) Reset() {
*x = PropInfo{}
if protoimpl.UnsafeEnabled {
mi := &file_upgrade_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *PropInfo) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*PropInfo) ProtoMessage() {}
func (x *PropInfo) ProtoReflect() protoreflect.Message {
mi := &file_upgrade_proto_msgTypes[0]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use PropInfo.ProtoReflect.Descriptor instead.
func (*PropInfo) Descriptor() ([]byte, []int) {
return file_upgrade_proto_rawDescGZIP(), []int{0}
}
func (x *PropInfo) GetItemId() int32 {
if x != nil {
return x.ItemId
}
return 0
}
func (x *PropInfo) GetItemNum() int64 {
if x != nil {
return x.ItemNum
}
return 0
}
// 客户端升级奖励
//PACKET_CSClientUpgrades
type CSClientUpgrades struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
}
func (x *CSClientUpgrades) Reset() {
*x = CSClientUpgrades{}
if protoimpl.UnsafeEnabled {
mi := &file_upgrade_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *CSClientUpgrades) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CSClientUpgrades) ProtoMessage() {}
func (x *CSClientUpgrades) ProtoReflect() protoreflect.Message {
mi := &file_upgrade_proto_msgTypes[1]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use CSClientUpgrades.ProtoReflect.Descriptor instead.
func (*CSClientUpgrades) Descriptor() ([]byte, []int) {
return file_upgrade_proto_rawDescGZIP(), []int{1}
}
//PACKET_SCClientUpgrades
type SCClientUpgrades struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
On bool `protobuf:"varint,1,opt,name=On,proto3" json:"On,omitempty"` // 是否开启
OnForce bool `protobuf:"varint,2,opt,name=OnForce,proto3" json:"OnForce,omitempty"` // 是否强制升级(没有关闭按钮)
Award []*PropInfo `protobuf:"bytes,3,rep,name=Award,proto3" json:"Award,omitempty"` // 奖励
Version int32 `protobuf:"varint,4,opt,name=Version,proto3" json:"Version,omitempty"` // 版本号
}
func (x *SCClientUpgrades) Reset() {
*x = SCClientUpgrades{}
if protoimpl.UnsafeEnabled {
mi := &file_upgrade_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *SCClientUpgrades) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SCClientUpgrades) ProtoMessage() {}
func (x *SCClientUpgrades) ProtoReflect() protoreflect.Message {
mi := &file_upgrade_proto_msgTypes[2]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use SCClientUpgrades.ProtoReflect.Descriptor instead.
func (*SCClientUpgrades) Descriptor() ([]byte, []int) {
return file_upgrade_proto_rawDescGZIP(), []int{2}
}
func (x *SCClientUpgrades) GetOn() bool {
if x != nil {
return x.On
}
return false
}
func (x *SCClientUpgrades) GetOnForce() bool {
if x != nil {
return x.OnForce
}
return false
}
func (x *SCClientUpgrades) GetAward() []*PropInfo {
if x != nil {
return x.Award
}
return nil
}
func (x *SCClientUpgrades) GetVersion() int32 {
if x != nil {
return x.Version
}
return 0
}
var File_upgrade_proto protoreflect.FileDescriptor
var file_upgrade_proto_rawDesc = []byte{
0x0a, 0x0d, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x3c, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70,
0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x18, 0x01,
0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07,
0x49, 0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x49,
0x74, 0x65, 0x6d, 0x4e, 0x75, 0x6d, 0x22, 0x12, 0x0a, 0x10, 0x43, 0x53, 0x43, 0x6c, 0x69, 0x65,
0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x22, 0x7f, 0x0a, 0x10, 0x53, 0x43,
0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x73, 0x12, 0x0e,
0x0a, 0x02, 0x4f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x4f, 0x6e, 0x12, 0x18,
0x0a, 0x07, 0x4f, 0x6e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
0x07, 0x4f, 0x6e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x27, 0x0a, 0x05, 0x41, 0x77, 0x61, 0x72,
0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64,
0x65, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x41, 0x77, 0x61, 0x72,
0x64, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01,
0x28, 0x05, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2a, 0x59, 0x0a, 0x08, 0x50,
0x61, 0x63, 0x6b, 0x65, 0x74, 0x49, 0x44, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x61, 0x63, 0x6b, 0x65,
0x74, 0x49, 0x44, 0x5f, 0x5a, 0x65, 0x72, 0x6f, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41,
0x43, 0x4b, 0x45, 0x54, 0x5f, 0x43, 0x53, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67,
0x72, 0x61, 0x64, 0x65, 0x73, 0x10, 0x9c, 0x18, 0x12, 0x1c, 0x0a, 0x17, 0x50, 0x41, 0x43, 0x4b,
0x45, 0x54, 0x5f, 0x53, 0x43, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x67, 0x72, 0x61,
0x64, 0x65, 0x73, 0x10, 0x9d, 0x18, 0x42, 0x27, 0x5a, 0x25, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x2e,
0x67, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x61, 0x6d, 0x65, 0x2f, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x62,
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
file_upgrade_proto_rawDescOnce sync.Once
file_upgrade_proto_rawDescData = file_upgrade_proto_rawDesc
)
func file_upgrade_proto_rawDescGZIP() []byte {
file_upgrade_proto_rawDescOnce.Do(func() {
file_upgrade_proto_rawDescData = protoimpl.X.CompressGZIP(file_upgrade_proto_rawDescData)
})
return file_upgrade_proto_rawDescData
}
var file_upgrade_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_upgrade_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_upgrade_proto_goTypes = []interface{}{
(PacketID)(0), // 0: upgrade.PacketID
(*PropInfo)(nil), // 1: upgrade.PropInfo
(*CSClientUpgrades)(nil), // 2: upgrade.CSClientUpgrades
(*SCClientUpgrades)(nil), // 3: upgrade.SCClientUpgrades
}
var file_upgrade_proto_depIdxs = []int32{
1, // 0: upgrade.SCClientUpgrades.Award:type_name -> upgrade.PropInfo
1, // [1:1] is the sub-list for method output_type
1, // [1:1] is the sub-list for method input_type
1, // [1:1] is the sub-list for extension type_name
1, // [1:1] is the sub-list for extension extendee
0, // [0:1] is the sub-list for field type_name
}
func init() { file_upgrade_proto_init() }
func file_upgrade_proto_init() {
if File_upgrade_proto != nil {
return
}
if !protoimpl.UnsafeEnabled {
file_upgrade_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*PropInfo); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_upgrade_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CSClientUpgrades); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_upgrade_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SCClientUpgrades); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_upgrade_proto_rawDesc,
NumEnums: 1,
NumMessages: 3,
NumExtensions: 0,
NumServices: 0,
},
GoTypes: file_upgrade_proto_goTypes,
DependencyIndexes: file_upgrade_proto_depIdxs,
EnumInfos: file_upgrade_proto_enumTypes,
MessageInfos: file_upgrade_proto_msgTypes,
}.Build()
File_upgrade_proto = out.File
file_upgrade_proto_rawDesc = nil
file_upgrade_proto_goTypes = nil
file_upgrade_proto_depIdxs = nil
}

View File

@ -0,0 +1,27 @@
syntax = "proto3";
package upgrade;
option go_package = "mongo.games.com/game/protocol/upgrade";
enum PacketID {
// 3100~3199
PacketID_Zero = 0;
PACKET_CSClientUpgrades = 3100;
PACKET_SCClientUpgrades = 3101;
}
message PropInfo{
int32 ItemId = 1;//ID
int64 ItemNum = 2;//
}
//
//PACKET_CSClientUpgrades
message CSClientUpgrades{
}
//PACKET_SCClientUpgrades
message SCClientUpgrades{
bool On = 1; //
bool OnForce = 2; // ()
repeated PropInfo Award = 3; //
int32 Version = 4; //
}

File diff suppressed because it is too large Load Diff

View File

@ -90,7 +90,7 @@ message Platform {
bool IsCanUserBindPromoter = 33; //广 bool IsCanUserBindPromoter = 33; //广
int32 UserBindPromoterPrize = 34; // int32 UserBindPromoterPrize = 34; //
string MerchantKey = 35;// string MerchantKey = 35;//
map<int32,int64> BindTelReward = 36; // id map<int32, int64> BindTelReward = 36; // id
} }
// //
@ -190,7 +190,7 @@ message PlayerData{
int64 PlayerPoolUpper = 41; // int64 PlayerPoolUpper = 41; //
int64 PlayerPoolLower = 42; // int64 PlayerPoolLower = 42; //
int64 PlayerPoolRate = 43; // int64 PlayerPoolRate = 43; //
map<int64,int64> RankScore = 44; // 1 tienlen排位积分 map<int64, int64> RankScore = 44; // 1 tienlen排位积分
int64 RoleAdded = 45;// int64 RoleAdded = 45;//
int64 VipAdded = 46;//VIP加成 int64 VipAdded = 46;//VIP加成
int64 VipExp = 47;//VIP经验 int64 VipExp = 47;//VIP经验
@ -298,7 +298,7 @@ message CoinPoolSetting{
int32 LowerOddsMax = 12; // 线 int32 LowerOddsMax = 12; // 线
int32 ProfitRate = 13;// int32 ProfitRate = 13;//
int64 ResetTime = 14; // int64 ResetTime = 14; //
int32 Switch =15; // 0 1 int32 Switch = 15; // 0 1
int64 CoinValue = 16; // int64 CoinValue = 16; //
int64 ProfitPool = 17; // int64 ProfitPool = 17; //
int32 CtrlRate = 18; // int32 CtrlRate = 18; //
@ -364,8 +364,8 @@ message CommonNotice {
int32 CategoryType = 9; int32 CategoryType = 9;
string ImgUrl = 10; string ImgUrl = 10;
int32 NoticeId = 11; int32 NoticeId = 11;
int32 IsLoop=12; int32 IsLoop = 12;
int32 LoopTime=13; int32 LoopTime = 13;
repeated string OnChannelName = 14; repeated string OnChannelName = 14;
string Url = 15; string Url = 15;
} }
@ -390,15 +390,15 @@ message ExchangeShop {
int32 NotVipDayMaxLimit = 13;//VIP每日限购 int32 NotVipDayMaxLimit = 13;//VIP每日限购
int32 VipShopLimit = 14;//VIP限购总数 int32 VipShopLimit = 14;//VIP限购总数
int32 NotVipShopLimit = 15;//VIP限购总数 int32 NotVipShopLimit = 15;//VIP限购总数
int32 ShopType = 16; // int32 ShopType = 16; //
repeated TelChargeData TelData = 17; repeated TelChargeData TelData = 17;
repeated ItemInfo Items = 18; repeated ItemInfo Items = 18;
} }
message TelChargeData{ message TelChargeData{
int32 Id = 1; int32 Id = 1;
string Name = 2; string Name = 2;
string Url = 3; string Url = 3;
} }
// //
@ -406,7 +406,7 @@ message ExchangeType{
int32 Price = 1; // V卡数量 int32 Price = 1; // V卡数量
int32 JPrice = 2; // int32 JPrice = 2; //
int32 Cash = 3; // int32 Cash = 3; //
int32 DPrice = 4; // int32 DPrice = 4; //
int32 Id = 5; // int32 Id = 5; //
} }
@ -418,11 +418,11 @@ message ExchangeShopList{
} }
message ShopWeight{ message ShopWeight{
int32 ShopType = 1; int32 ShopType = 1;
int32 Weight = 2; int32 Weight = 2;
string Name = 3; string Name = 3;
int32 IsShow = 4; int32 IsShow = 4;
repeated int32 Location = 5; // repeated int32 Location = 5; //
} }
@ -444,11 +444,12 @@ message ItemShop {
int32 Amount = 15; // int32 Amount = 15; //
int32 ConstType = 16; // 1 2 3 4 int32 ConstType = 16; // 1 2 3 4
repeated int32 CostArea = 17; // repeated int32 CostArea = 17; //
map<int64,int64> Award = 18; // map<int64, int64> Award = 18; //
int32 VipLevel =19; //Vip等级限制 int32 VipLevel = 19; //Vip等级限制
int32 Ratio = 20; // int32 Ratio = 20; //
int32 EndTime = 21; // int32 EndTime = 21; //
bool FirstSwitch = 22; // bool FirstSwitch = 22; //
int32 OnFirstGiveDouble = 23; // 1 2
} }
// etcd /game/item_shop // etcd /game/item_shop
@ -499,7 +500,7 @@ message GameMatchDate {
repeated string OnChannelName = 23; // repeated string OnChannelName = 23; //
int32 CardType = 24; // int32 CardType = 24; //
int32 ShowId = 25; // int32 ShowId = 25; //
int32 AwardNum = 26; // int32 AwardNum = 26; //
int32 AudienceSwitch = 27; // 1 2 int32 AudienceSwitch = 27; // 1 2
} }
@ -624,23 +625,23 @@ message WelfareContinuousPayDataList{
message VIPcfg { message VIPcfg {
int32 VipId = 1; // int32 VipId = 1; //
map<int64,int64> Award = 2; // map<int64, int64> Award = 2; //
int32 VipEx = 3; // VIP经验 int32 VipEx = 3; // VIP经验
int64 Price = 4; // int64 Price = 4; //
map<int64,int64> Privilege1 = 5; //1 VIP比赛场免费次数 map<int64, int64> Privilege1 = 5; //1 VIP比赛场免费次数
repeated int32 Privilege2 = 6; // 0 1 repeated int32 Privilege2 = 6; // 0 1
repeated int32 Privilege3 = 7; repeated int32 Privilege3 = 7;
int32 Privilege4 = 8; int32 Privilege4 = 8;
int32 Privilege5 = 9; int32 Privilege5 = 9;
int32 Privilege6 = 10; int32 Privilege6 = 10;
map<int64,int64> Privilege7 = 11; map<int64, int64> Privilege7 = 11;
int32 Privilege7Price = 12; int32 Privilege7Price = 12;
int32 Privilege8 = 13; int32 Privilege8 = 13;
repeated int32 RewardOutlineID = 14; repeated int32 RewardOutlineID = 14;
int32 ShopId2 = 15; int32 ShopId2 = 15;
int32 ShopId7 = 16; int32 ShopId7 = 16;
int32 MatchFreeTimes = 17; // vip比赛场免费次数 int32 MatchFreeTimes = 17; // vip比赛场免费次数
map<int64,int64> Privilege9 = 18; // vip免费礼包vip等级领取一次 map<int64, int64> Privilege9 = 18; // vip免费礼包vip等级领取一次
} }
// etcd /game/VIPcfg VIP配置 // etcd /game/VIPcfg VIP配置
@ -667,9 +668,9 @@ message EntrySwitch{
} }
message ChessRankConfig { message ChessRankConfig {
string Name = 1; // string Name = 1; //
int32 Score = 2; // int32 Score = 2; //
repeated WelfareDate Item = 3; // repeated WelfareDate Item = 3; //
} }
message ChessRankcfgData{ message ChessRankcfgData{
@ -735,7 +736,7 @@ message ActInviteConfig {
string Platform = 1; string Platform = 1;
int64 BindScore = 2; // int64 BindScore = 2; //
int64 RechargeScore = 3; // int64 RechargeScore = 3; //
map<int64,int64> PayScore = 4; // map<int64, int64> PayScore = 4; //
repeated int64 Rates = 5; // repeated int64 Rates = 5; //
repeated RankAward Awards1 = 6; // repeated RankAward Awards1 = 6; //
repeated RankAward Awards2 = 7; // repeated RankAward Awards2 = 7; //
@ -787,36 +788,36 @@ message ActPermitConfig{
// //
message DiamondLotteryInfo{ message DiamondLotteryInfo{
int32 Id = 1; int32 Id = 1;
int32 Type = 2; int32 Type = 2;
string Name = 3; string Name = 3;
int32 ItemId = 4; int32 ItemId = 4;
int32 Grade = 5; int32 Grade = 5;
int32 Oddrate =6; int32 Oddrate = 6;
} }
// //
message DiamondLotteryPlayers{ message DiamondLotteryPlayers{
int32 uid = 1; int32 uid = 1;
int32 Count = 2; // int32 Count = 2; //
repeated AwardData Award = 3; //ID repeated AwardData Award = 3; //ID
} }
message AwardData{ message AwardData{
int32 AwardId = 1; int32 AwardId = 1;
int32 Weight = 2; int32 Weight = 2;
} }
message DiamondLotteryData{ message DiamondLotteryData{
string Channel = 1; // string Channel = 1; //
repeated DiamondLotteryInfo Info = 2; repeated DiamondLotteryInfo Info = 2;
int32 MaxScore = 3; // int32 MaxScore = 3; //
int32 DiamondNum = 4; // int32 DiamondNum = 4; //
repeated DiamondLotteryPlayers Players = 5;// repeated DiamondLotteryPlayers Players = 5;//
} }
// etcd /game/diamond_lottery // etcd /game/diamond_lottery
message DiamondLotteryConfig{ message DiamondLotteryConfig{
string Platform = 1; // string Platform = 1; //
repeated DiamondLotteryData LotteryData = 2; repeated DiamondLotteryData LotteryData = 2;
} }
// etcd /game/item // etcd /game/item
@ -826,19 +827,19 @@ message ItemConfig {
} }
message RankAwardInfo{ message RankAwardInfo{
int32 Id =1; int32 Id = 1;
int32 RankType =2; int32 RankType = 2;
int32 RankLevelId = 3; int32 RankLevelId = 3;
repeated ItemInfo Item = 4; // repeated ItemInfo Item = 4; //
} }
message RankTypeInfo{ message RankTypeInfo{
int32 Id =1; int32 Id = 1;
int32 Order = 2; int32 Order = 2;
string RankName = 3; string RankName = 3;
int32 RankType = 4; int32 RankType = 4;
int32 TurnOff = 5; // int32 TurnOff = 5; //
repeated RankAwardInfo Award= 6; repeated RankAwardInfo Award = 6;
} }
//etcd /game/RankType //etcd /game/RankType
message RankTypeConfig{ message RankTypeConfig{
@ -847,7 +848,7 @@ message RankTypeConfig{
} }
message SkinLevel { message SkinLevel {
int32 Level = 1; // int32 Level = 1; //
map<int32,int64> UpItem = 2; // map<int32, int64> UpItem = 2; //
int32 SkillId = 3; // id int32 SkillId = 3; // id
int32 SkillLevel = 4; // int32 SkillLevel = 4; //
int32 SkillValue = 5; // int32 SkillValue = 5; //
@ -856,7 +857,7 @@ message SkinLevel {
message SkinItem { message SkinItem {
int32 Id = 1; // id int32 Id = 1; // id
int32 UnlockType = 2; // 0使 1使使 2使 int32 UnlockType = 2; // 0使 1使使 2使
map<int32,int64> UnlockParam = 3; // map<int32, int64> UnlockParam = 3; //
int32 IsUpgrade = 4; // 1 2 int32 IsUpgrade = 4; // 1 2
int32 SkillType = 5; // 0 1穿 int32 SkillType = 5; // 0 1穿
repeated SkinLevel Levels = 6; // repeated SkinLevel Levels = 6; //
@ -864,27 +865,27 @@ message SkinItem {
// etcd /game/skin_config // etcd /game/skin_config
message SkinConfig { message SkinConfig {
string Platform = 1; // string Platform = 1; //
repeated SkinItem Items = 2; // repeated SkinItem Items = 2; //
} }
// etcd /game/awardlog_config // etcd /game/awardlog_config
message AwardLogConfig{ message AwardLogConfig{
string Platform = 1; // string Platform = 1; //
repeated AwardLogData AwardLog =2; repeated AwardLogData AwardLog = 2;
repeated AnnouncerLogInfo AnnouncerLog = 3; repeated AnnouncerLogInfo AnnouncerLog = 3;
} }
message AwardLogData{ message AwardLogData{
int32 TypeId = 1; //1 2 int32 TypeId = 1; //1 2
int32 SortId = 2; // 1- 2- int32 SortId = 2; // 1- 2-
repeated AwardLogInfo AwardLog =3; repeated AwardLogInfo AwardLog = 3;
} }
message AwardLogInfo{ message AwardLogInfo{
int32 ItemId = 2; //ID int32 ItemId = 2; //ID
int64 Num = 4; // int64 Num = 4; //
string Url = 5; //icon string Url = 5; //icon
int32 Order = 6; // int32 Order = 6; //
} }
// //
@ -893,7 +894,7 @@ message AnnouncerLogInfo{
string Name = 2; // string Name = 2; //
string Phone = 3; // string Phone = 3; //
int32 ItemId = 4; //ID int32 ItemId = 4; //ID
int32 TypeId = 5; //1- 2- int32 TypeId = 5; //1- 2-
} }
// etcd /game/guide_config // etcd /game/guide_config
@ -906,17 +907,17 @@ message GuideConfig {
// //
// etcd /game/machine_config // etcd /game/machine_config
message MachineConfig{ message MachineConfig{
string Platform = 1; // string Platform = 1; //
repeated MachineInfo Info = 2; repeated MachineInfo Info = 2;
} }
message MachineInfo{ message MachineInfo{
int32 MachineId = 1; //Id int32 MachineId = 1; //Id
int64 AppId = 2; int64 AppId = 2;
string ServerSecret = 3; string ServerSecret = 3;
string StreamId = 4; string StreamId = 4;
int32 CostItemNum = 5; // int32 CostItemNum = 5; //
int32 ItemId = 6; //Id int32 ItemId = 6; //Id
int32 ItemNum = 7; // int32 ItemNum = 7; //
string IconAddr = 8;// string IconAddr = 8;//
string Name = 9;// string Name = 9;//
} }
@ -980,3 +981,11 @@ message RoomConfigSystem{
int32 AutoCreateTime = 13; // int32 AutoCreateTime = 13; //
int32 On = 14; // 1 2 int32 On = 14; // 1 2
} }
// etcd /game/client_upgrade
message ClientUpgrade{
string Platform = 1; //
int32 On = 2; // 1 2
int32 OnForce = 3; // 1 2
repeated ItemInfo Reward = 4; //
}

View File

@ -280,7 +280,10 @@ func CSUpBagInfo(s *netlib.Session, packetid int, data interface{}, sid int64) e
if acceptPlayer != nil { if acceptPlayer != nil {
logger.Logger.Trace("道具赠送成功", msg.ItemId) logger.Logger.Trace("道具赠送成功", msg.ItemId)
remark := fmt.Sprintf("赠送给玩家(%v)", msg.AcceptSnId) remark := fmt.Sprintf("赠送给玩家(%v)", msg.AcceptSnId)
BagMgrSingleton.AddMailByItem(p.Platform, p.SnId, p.Name, msg.AcceptSnId, msg.ShowId, []int32{msg.ItemId, msg.ItemNum}) AddMailByItem(p.Platform, p.SnId, p.Name, msg.AcceptSnId, msg.ShowId, []*model.Item{{
ItemId: msg.GetItemId(),
ItemNum: int64(msg.GetItemNum()),
}})
BagMgrSingleton.AddItems(&model.AddItemParam{ BagMgrSingleton.AddItems(&model.AddItemParam{
Platform: p.Platform, Platform: p.Platform,
SnId: p.SnId, SnId: p.SnId,
@ -305,7 +308,10 @@ func CSUpBagInfo(s *netlib.Session, packetid int, data interface{}, sid int64) e
if data != nil && aPlayer != nil { if data != nil && aPlayer != nil {
logger.Logger.Trace("道具赠送成功", msg.ItemId) logger.Logger.Trace("道具赠送成功", msg.ItemId)
remark := fmt.Sprintf("赠送给玩家(%v)", msg.AcceptSnId) remark := fmt.Sprintf("赠送给玩家(%v)", msg.AcceptSnId)
BagMgrSingleton.AddMailByItem(p.Platform, p.SnId, p.Name, msg.AcceptSnId, msg.ShowId, []int32{msg.ItemId, msg.ItemNum}) AddMailByItem(p.Platform, p.SnId, p.Name, msg.AcceptSnId, msg.ShowId, []*model.Item{{
ItemId: msg.GetItemId(),
ItemNum: int64(msg.GetItemNum()),
}})
BagMgrSingleton.AddItems(&model.AddItemParam{ BagMgrSingleton.AddItems(&model.AddItemParam{
Platform: p.Platform, Platform: p.Platform,
SnId: p.SnId, SnId: p.SnId,

View File

@ -10,6 +10,7 @@ import (
"math/rand" "math/rand"
"net/url" "net/url"
"regexp" "regexp"
"slices"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -84,7 +85,7 @@ func (this *CSInviteCodePlayerHandler) Process(s *netlib.Session, packetid int,
} }
//发送邮件 //发送邮件
var otherParams []int32 var otherParams []int64
newMsg := model.NewMessage("", p.SnId, "", p.SnId, model.MSGTYPE_INVITECODE, p.Name, inviteCode, coin, 0, newMsg := model.NewMessage("", p.SnId, "", p.SnId, model.MSGTYPE_INVITECODE, p.Name, inviteCode, coin, 0,
model.MSGSTATE_UNREAD, time.Now().Unix(), 0, "", otherParams, p.Platform, model.HallAll, nil) model.MSGSTATE_UNREAD, time.Now().Unix(), 0, "", otherParams, p.Platform, model.HallAll, nil)
err = model.InsertMessage(p.Platform, newMsg) err = model.InsertMessage(p.Platform, newMsg)
@ -1982,14 +1983,18 @@ func CSPlayerData(s *netlib.Session, packetid int, data interface{}, sid int64)
} }
} }
// 老版本升级 // 客户端升级奖励
if p.ClientVer < model.GameParamData.ClientVersion { clientUpgradeConfig := PlatformMgrSingleton.GetConfig(p.Platform).ClientUpgrade
if cspl.GetClientVer() == model.GameParamData.ClientVersion { if clientUpgradeConfig != nil && clientUpgradeConfig.GetOn() == common.On &&
// 升级了 (len(model.GameParamData.ClientVersionChannel) == 0 || slices.Contains(model.GameParamData.ClientVersionChannel, p.LastChannel)) {
p.ClientVer = model.GameParamData.ClientVersion if p.ClientVer < model.GameParamData.ClientVersion && cspl.GetClientVer() == model.GameParamData.ClientVersion {
//todo 发奖 AddMailClientUpgrade(p.SnId, clientUpgradeConfig.GetReward())
} }
} }
// 客户端升级
if p.ClientVer < cspl.GetClientVer() && cspl.GetClientVer() <= model.GameParamData.ClientVersion {
p.ClientVer = cspl.GetClientVer()
}
} }
// 有缓存数据 // 有缓存数据

View File

@ -14,6 +14,7 @@ import (
"mongo.games.com/game/model" "mongo.games.com/game/model"
"mongo.games.com/game/mq" "mongo.games.com/game/mq"
"mongo.games.com/game/proto" "mongo.games.com/game/proto"
"mongo.games.com/game/protocol/upgrade"
webapiproto "mongo.games.com/game/protocol/webapi" webapiproto "mongo.games.com/game/protocol/webapi"
"mongo.games.com/game/protocol/welfare" "mongo.games.com/game/protocol/welfare"
"mongo.games.com/game/srvdata" "mongo.games.com/game/srvdata"
@ -1309,6 +1310,39 @@ func (this *CSDiamondBankTakeDiamondHandler) Process(s *netlib.Session, packetid
return nil return nil
}*/ }*/
func CSClientUpgrades(s *netlib.Session, packetid int, data interface{}, sid int64) error {
logger.Logger.Tracef("CSClientUpgrades Process recv %v", data)
_, ok := data.(*upgrade.CSClientUpgrades)
if !ok {
return nil
}
p := PlayerMgrSington.GetPlayer(sid)
if p == nil {
return nil
}
cfg := PlatformMgrSingleton.GetConfig(p.Platform).ClientUpgrade
if cfg == nil {
return nil
}
pack := &upgrade.SCClientUpgrades{
On: cfg.GetOn() == common.On,
OnForce: cfg.GetOnForce() == common.On,
Version: model.GameParamData.ClientVersion,
}
for _, v := range cfg.GetReward() {
pack.Award = append(pack.Award, &upgrade.PropInfo{
ItemId: v.GetItemId(),
ItemNum: v.GetItemNum(),
})
}
p.SendToClient(int(upgrade.PacketID_PACKET_SCClientUpgrades), pack)
logger.Logger.Tracef("SCClientUpgrades: %v", pack)
return nil
}
func init() { func init() {
// 领取救济金 // 领取救济金
common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_GETRELIEFFUND), &CSGetReliefFundHandler{}) common.RegisterHandler(int(welfare.SPacketID_PACKET_CS_WELF_GETRELIEFFUND), &CSGetReliefFundHandler{})
@ -1374,4 +1408,6 @@ func init() {
common.Register(int(welfare.SPacketID_PACKET_CSPermitExchange), welfare.CSPermitExchange{}, CSPermitExchange) common.Register(int(welfare.SPacketID_PACKET_CSPermitExchange), welfare.CSPermitExchange{}, CSPermitExchange)
// 赛季典藏通行证商品信息 // 赛季典藏通行证商品信息
common.Register(int(welfare.SPacketID_PACKET_CSPermitShop), welfare.CSPermitShop{}, CSPermitShop) common.Register(int(welfare.SPacketID_PACKET_CSPermitShop), welfare.CSPermitShop{}, CSPermitShop)
// 客户端升级奖励信息
common.Register(int(upgrade.PacketID_PACKET_CSClientUpgrades), upgrade.CSClientUpgrades{}, CSClientUpgrades)
} }

128
worldsrv/addmail.go Normal file
View File

@ -0,0 +1,128 @@
package main
import (
"mongo.games.com/game/protocol/webapi"
"time"
"github.com/globalsign/mgo/bson"
"mongo.games.com/goserver/core/basic"
"mongo.games.com/goserver/core/i18n"
"mongo.games.com/goserver/core/logger"
"mongo.games.com/goserver/core/task"
"mongo.games.com/game/model"
)
type AddMailParam struct {
Platform string // 平台
Tp int32 // 邮件类型
SrcId int32 // 发送人
SrcName string // 发送人名字
SnId int32 // 收件人玩家id
Title string // 标题
Content string // 内容
Items []*model.Item // 道具
ShowId int64 // 显示位置
Channel []string // 包渠道
}
func AddMail(param *AddMailParam) {
logger.Logger.Tracef("AddMail %+v", *param)
if param.SnId <= 0 || param.Title == "" || param.Content == "" {
return
}
p := PlayerMgrSington.GetPlayerBySnId(param.SnId)
if p != nil {
param.Platform = p.Platform
}
if param.Platform == "" {
return
}
opener := int32(1)
if param.SrcId <= 0 {
opener = 0
}
var params []int64
for _, v := range param.Items {
params = append(params, int64(v.ItemId))
params = append(params, v.ItemNum)
}
var msg *model.Message
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
msg = &model.Message{
Id: bson.NewObjectId(),
MType: param.Tp,
Title: param.Title,
Content: param.Content,
Oper: opener,
SrcId: param.SrcId,
SrcName: param.SrcName,
SnId: param.SnId,
State: model.MSGSTATE_UNREAD,
CreatTs: time.Now().Unix(),
AttachState: model.MSGATTACHSTATE_DEFAULT,
Params: params,
Platform: param.Platform,
ShowId: param.ShowId,
Channel: param.Channel,
}
if msg.Pid == "" {
msg.Pid = msg.Id.Hex()
}
return model.InsertMessage(param.Platform, msg)
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if data == nil {
if p := PlayerMgrSington.GetPlayerBySnId(param.SnId); p != nil {
p.AddMessage(msg)
}
} else {
logger.Logger.Errorf("AddMail Error %v", data)
}
}), "AddMail").Start()
}
// AddMailByItem 赠送道具到邮件
// srcId 发送人 srcName发送人名字
// showId 显示位置
func AddMailByItem(platform string, srcId int32, srcName string, snid int32, showId int64, items []*model.Item) {
content := i18n.Tr("languages", "GiftMail", srcName, srcName, srcName, srcName)
title := i18n.Tr("languages", "GiftMailTitle")
AddMail(&AddMailParam{
Platform: platform,
Tp: model.MSGTYPE_ITEM,
SrcId: srcId,
SrcName: srcName,
SnId: snid,
Title: title,
Content: content,
Items: items,
ShowId: showId,
})
}
func AddMailClientUpgrade(snid int32, items []*webapi.ItemInfo) {
var arr []*model.Item
for _, v := range items {
arr = append(arr, &model.Item{
ItemId: v.ItemId,
ItemNum: v.ItemNum,
})
}
title := i18n.Tr("languages", "UpgradeTitle")
content := i18n.Tr("languages", "Upgrade")
AddMail(&AddMailParam{
Tp: model.MSGTYPE_ITEM,
SnId: snid,
Title: title,
Content: content,
Items: arr,
ShowId: model.HallAll,
})
}

View File

@ -806,29 +806,6 @@ func (this *BagMgr) AddItemsOffline(param *model.AddItemParam, callback func(err
})).StartByExecutor(fmt.Sprintf("Player%v", param.SnId)) })).StartByExecutor(fmt.Sprintf("Player%v", param.SnId))
} }
// AddMailByItem 赠送道具到邮件
// srcId 发送人 srcName发送人名字
// showId 显示位置
// items[0]:道具id items[1]:道具数量 items[2]:道具id items[3]:道具数量
func (this *BagMgr) AddMailByItem(platform string, srcId int32, srcName string, snid int32, showId int64, items []int32) {
logger.Logger.Trace("AddMailByItem:", srcId, srcName, items)
var newMsg *model.Message
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
content := i18n.Tr("languages", "GiftMail", srcName, srcName, srcName, srcName)
title := i18n.Tr("languages", "GiftMailTitle")
newMsg = model.NewMessageByPlayer("", 1, srcId, srcName, snid, model.MSGTYPE_ITEM, title, content,
0, 0, model.MSGSTATE_UNREAD, time.Now().Unix(), 0, "", items, platform, showId)
return model.InsertMessage(platform, newMsg)
}), task.CompleteNotifyWrapper(func(data interface{}, t task.Task) {
if data == nil {
p := PlayerMgrSington.GetPlayerBySnId(snid)
if p != nil {
p.AddMessage(newMsg)
}
}
}), "AddMailByItem").Start()
}
// VerifyUpJybInfo 兑换礼包 // VerifyUpJybInfo 兑换礼包
func (this *BagMgr) VerifyUpJybInfo(p *Player, args *model.VerifyUpJybInfoArgs) { func (this *BagMgr) VerifyUpJybInfo(p *Player, args *model.VerifyUpJybInfoArgs) {

View File

@ -100,6 +100,8 @@ func init() {
etcd.Register(etcd.ETCDKEY_RoomType, webapi.RoomType{}, handlerEvent) etcd.Register(etcd.ETCDKEY_RoomType, webapi.RoomType{}, handlerEvent)
//娃娃机配置 //娃娃机配置
etcd.Register(etcd.ETCDKEY_MACHINE, webapi.MachineConfig{}, platformConfigEvent) etcd.Register(etcd.ETCDKEY_MACHINE, webapi.MachineConfig{}, platformConfigEvent)
//客户端升级奖励配置
etcd.Register(etcd.ETCDKEY_ClientUpgrade, webapi.ClientUpgrade{}, platformConfigEvent)
} }
func platformConfigEvent(ctx context.Context, completeKey string, isInit bool, event *clientv3.Event, data interface{}) { func platformConfigEvent(ctx context.Context, completeKey string, isInit bool, event *clientv3.Event, data interface{}) {
@ -334,6 +336,8 @@ func platformConfigEvent(ctx context.Context, completeKey string, isInit bool, e
if !isInit { if !isInit {
PlayerMgrSington.BroadcastDataConfigToPlatform(config.Platform, common.DataConfigSprite) PlayerMgrSington.BroadcastDataConfigToPlatform(config.Platform, common.DataConfigSprite)
} }
case *webapi.ClientUpgrade:
PlatformMgrSingleton.GetConfig(config.Platform).ClientUpgrade = config
default: default:
logger.Logger.Errorf("etcd completeKey:%s, Not processed", completeKey) logger.Logger.Errorf("etcd completeKey:%s, Not processed", completeKey)
} }

View File

@ -92,14 +92,14 @@ func (r *PermitMgr) OnDayTimer() {
rank := k + 1 rank := k + 1
for _, rankInfo := range cfg { for _, rankInfo := range cfg {
var has bool var has bool
var items []int32 var items []int64
for r := rankInfo.GetStart(); r <= rankInfo.GetEnd(); r++ { for r := rankInfo.GetStart(); r <= rankInfo.GetEnd(); r++ {
if rank == int(r) { if rank == int(r) {
has = true has = true
var awards []model.AwardItem var awards []model.AwardItem
for _, item := range rankInfo.GetItemId() { for _, item := range rankInfo.GetItemId() {
items = append(items, item.GetItemId()) items = append(items, int64(item.GetItemId()))
items = append(items, int32(item.GetItemNum())) items = append(items, item.GetItemNum())
awards = append(awards, model.AwardItem{ awards = append(awards, model.AwardItem{
Id: item.GetItemId(), Id: item.GetItemId(),
Num: item.GetItemNum(), Num: item.GetItemNum(),

View File

@ -358,7 +358,7 @@ func (this *Player) OnLogined() {
} }
mq.Write(model.NewLoginLog(this.SnId, common.LoginLogTypeLogin, this.Tel, this.Ip, mq.Write(model.NewLoginLog(this.SnId, common.LoginLogTypeLogin, this.Tel, this.Ip,
this.Platform, this.Channel, this.BeUnderAgentCode, this.PackageID, this.City, clog, this.GetTotalCoin(), 0, 0, this.Platform, this.Channel, this.BeUnderAgentCode, this.PackageID, this.City, clog, this.GetTotalCoin(), 0, 0,
this.DeviceName, this.PackageName, this.AppVersion, this.BuildVersion, this.AppChannel, this.ChannelId)) this.DeviceName, this.PackageName, this.AppVersion, this.BuildVersion, this.AppChannel, this.ChannelId, this.ClientVer))
this.OnlineLogLogin() this.OnlineLogLogin()
@ -431,7 +431,7 @@ func (this *Player) OnRehold() {
} }
mq.Write(model.NewLoginLog(this.SnId, common.LoginLogTypeRehold, this.Tel, this.Ip, mq.Write(model.NewLoginLog(this.SnId, common.LoginLogTypeRehold, this.Tel, this.Ip,
this.Platform, this.Channel, this.BeUnderAgentCode, this.PackageID, this.City, clog, this.GetTotalCoin(), this.Platform, this.Channel, this.BeUnderAgentCode, this.PackageID, this.City, clog, this.GetTotalCoin(),
gameid, 0, this.DeviceName, this.PackageName, this.AppVersion, this.BuildVersion, this.AppChannel, this.ChannelId)) gameid, 0, this.DeviceName, this.PackageName, this.AppVersion, this.BuildVersion, this.AppChannel, this.ChannelId, this.ClientVer))
this.OnlineLogRehold() this.OnlineLogRehold()
} }
@ -683,7 +683,7 @@ func (this *Player) SendMessage(showId int64) {
Grade: proto.Int64(msg.Grade), Grade: proto.Int64(msg.Grade),
State: proto.Int32(msg.State), State: proto.Int32(msg.State),
Ts: proto.Int32(int32(msg.CreatTs)), Ts: proto.Int32(int32(msg.CreatTs)),
Params: msg.Params, Params: common.CopySliceInt64ToInt32(msg.Params), //todo 修改协议
AttachState: proto.Int32(msg.AttachState), AttachState: proto.Int32(msg.AttachState),
GiftId: proto.String(msg.GiftId), GiftId: proto.String(msg.GiftId),
GiftState: proto.Int32(giftState), GiftState: proto.Int32(giftState),
@ -1039,7 +1039,7 @@ func (this *Player) TestMail() {
var newMsg *model.Message var newMsg *model.Message
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
var otherParams []int32 var otherParams []int64
otherParams = append(otherParams, 10001, 3) otherParams = append(otherParams, 10001, 3)
otherParams = append(otherParams, 20001, 3) otherParams = append(otherParams, 20001, 3)
otherParams = append(otherParams, 20002, 3) otherParams = append(otherParams, 20002, 3)
@ -1059,7 +1059,7 @@ func (this *Player) TestSubMail() {
var newMsg *model.Message var newMsg *model.Message
task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} { task.New(nil, task.CallableWrapper(func(o *basic.Object) interface{} {
var otherParams []int32 var otherParams []int64
otherParams = append(otherParams, 10001, 3) otherParams = append(otherParams, 10001, 3)
otherParams = append(otherParams, 20001, 3) otherParams = append(otherParams, 20001, 3)
otherParams = append(otherParams, 20002, 3) otherParams = append(otherParams, 20002, 3)
@ -1106,8 +1106,8 @@ func (this *Player) GetMessageAttach(id string) {
if num := len(msg.Params); num > 0 && num%2 == 0 { if num := len(msg.Params); num > 0 && num%2 == 0 {
for i := 0; i < num; i += 2 { for i := 0; i < num; i += 2 {
items = append(items, &model.Item{ items = append(items, &model.Item{
ItemId: msg.Params[i], // 物品id ItemId: int32(msg.Params[i]), // 物品id
ItemNum: int64(msg.Params[i+1]), // 数量 ItemNum: msg.Params[i+1], // 数量
ObtainTime: time.Now().Unix(), ObtainTime: time.Now().Unix(),
}) })
if gainWay == common.GainWayItemPermitRank { if gainWay == common.GainWayItemPermitRank {
@ -1119,7 +1119,7 @@ func (this *Player) GetMessageAttach(id string) {
} }
if tp != -1 { if tp != -1 {
mq.Write(model.GenerateSystemFreeGive(this.SnId, this.Name, this.Platform, this.Channel, mq.Write(model.GenerateSystemFreeGive(this.SnId, this.Name, this.Platform, this.Channel,
model.SystemFreeGive_GiveType_TaskPermitRank, tp, int64(msg.Params[i+1]))) model.SystemFreeGive_GiveType_TaskPermitRank, tp, msg.Params[i+1]))
} }
} }
} }
@ -1283,7 +1283,7 @@ func (this *Player) DropLine() {
} }
mq.Write(model.NewLoginLog(this.SnId, common.LoginLogTypeDrop, this.Tel, this.Ip, mq.Write(model.NewLoginLog(this.SnId, common.LoginLogTypeDrop, this.Tel, this.Ip,
this.Platform, this.Channel, this.BeUnderAgentCode, this.PackageID, this.City, clog, this.GetTotalCoin(), this.Platform, this.Channel, this.BeUnderAgentCode, this.PackageID, this.City, clog, this.GetTotalCoin(),
gameid, this.LastGameId, this.DeviceName, this.PackageName, this.AppVersion, this.BuildVersion, this.AppChannel, this.ChannelId)) gameid, this.LastGameId, this.DeviceName, this.PackageName, this.AppVersion, this.BuildVersion, this.AppChannel, this.ChannelId, this.ClientVer))
this.SendPlayerCoin() this.SendPlayerCoin()
this.OnlineLogDrop() this.OnlineLogDrop()
@ -1408,7 +1408,7 @@ func (this *Player) OnLogouted() {
if !this.IsRob { if !this.IsRob {
mq.Write(model.NewLoginLog(this.SnId, common.LoginLogTypeLogout, this.Tel, this.Ip, mq.Write(model.NewLoginLog(this.SnId, common.LoginLogTypeLogout, this.Tel, this.Ip,
this.Platform, this.Channel, this.BeUnderAgentCode, this.PackageID, this.City, clog, this.GetTotalCoin(), this.Platform, this.Channel, this.BeUnderAgentCode, this.PackageID, this.City, clog, this.GetTotalCoin(),
0, 0, this.DeviceName, this.PackageName, this.AppVersion, this.BuildVersion, this.AppChannel, this.ChannelId)) 0, 0, this.DeviceName, this.PackageName, this.AppVersion, this.BuildVersion, this.AppChannel, this.ChannelId, this.ClientVer))
this.OnlineLogLogout() this.OnlineLogLogout()
} }
@ -2940,7 +2940,7 @@ func (this *Player) ReportLoginEvent() {
} }
mq.Write(model.GenerateLogin(model.CreatePlayerLoginEvent(this.SnId, mq.Write(model.GenerateLogin(model.CreatePlayerLoginEvent(this.SnId,
this.Channel, this.BeUnderAgentCode, this.Platform, this.City, this.DeviceOS, this.Ip, this.Channel, this.BeUnderAgentCode, this.Platform, this.City, this.DeviceOS, this.Ip,
this.CreateTime, this.UpgradeTime, isBindPhone, this.TelephonePromoter, this.DeviceId, this.ChannelId))) this.CreateTime, this.UpgradeTime, isBindPhone, this.TelephonePromoter, this.DeviceId, this.ChannelId, this.AppChannel, this.ClientVer)))
//登录通知 //登录通知
//ActMonitorMgrSington.SendActMonitorEvent(ActState_Login, this.SnId, this.Name, this.Platform, //ActMonitorMgrSington.SendActMonitorEvent(ActState_Login, this.SnId, this.Name, this.Platform,
// 0, 0, "", 0) // 0, 0, "", 0)

View File

@ -61,7 +61,7 @@ func (this *PlayerRankSeason) sendEmailAward(rankType int32) {
var coin int64 var coin int64
var diamond int64 var diamond int64
var otherParams []int32 var otherParams []int64
for _, v := range item.Awards { for _, v := range item.Awards {
switch v.Id { switch v.Id {
case 1: // 金币 case 1: // 金币
@ -70,7 +70,7 @@ func (this *PlayerRankSeason) sendEmailAward(rankType int32) {
diamond = int64(v.Num) diamond = int64(v.Num)
default: default:
// 道具 // 道具
otherParams = []int32{v.Id, v.Num} otherParams = []int64{int64(v.Id), int64(v.Num)}
} }
} }
@ -767,12 +767,12 @@ func (r *RankMatchMgr) RankAward() {
logger.Logger.Errorf("RankMatchMgr OnDayTimer FindPlayerPermitList player is nil %v", list.List[k].SnId) logger.Logger.Errorf("RankMatchMgr OnDayTimer FindPlayerPermitList player is nil %v", list.List[k].SnId)
continue continue
} }
var items []int32 var items []int64
for _, award := range rankAward { for _, award := range rankAward {
if award.RankLevelId == rankId { if award.RankLevelId == rankId {
for _, itemInfo := range award.Item { for _, itemInfo := range award.Item {
items = append(items, itemInfo.ItemId) items = append(items, int64(itemInfo.ItemId))
items = append(items, int32(itemInfo.ItemNum)) items = append(items, itemInfo.ItemNum)
} }
break break
} }
@ -839,12 +839,12 @@ func (r *RankMatchMgr) RankAward() {
logger.Logger.Errorf("RankMatchMgr OnDayTimer FindWinCoinListTienlen player is nil %v", ret.List[k].SnId) logger.Logger.Errorf("RankMatchMgr OnDayTimer FindWinCoinListTienlen player is nil %v", ret.List[k].SnId)
continue continue
} }
var items []int32 var items []int64
for _, award := range rankAward { for _, award := range rankAward {
if award.RankLevelId == rankId { if award.RankLevelId == rankId {
for _, itemInfo := range award.Item { for _, itemInfo := range award.Item {
items = append(items, itemInfo.ItemId) items = append(items, int64(itemInfo.ItemId))
items = append(items, int32(itemInfo.ItemNum)) items = append(items, itemInfo.ItemNum)
} }
break break
} }

View File

@ -661,7 +661,11 @@ func (this *ShopMgr) GetAmountFinal(p *Player, shopId, vipShopId int32) int64 {
// 首充翻倍 // 首充翻倍
if shopInfo.FirstSwitch { if shopInfo.FirstSwitch {
if !slices.Contains(p.ShopID, int(shopInfo.Id)) { if !slices.Contains(p.ShopID, int(shopInfo.Id)) {
addTotal *= 2 if shopInfo.FirstGiveSwitch {
addTotal *= 2
} else {
addTotal += shopInfo.Amount
}
} }
} }
default: default:

View File

@ -2059,17 +2059,17 @@ func (this *Tournament) OnHourTimer() {
} }
} }
for sortId := range this.players { for sortId := range this.players {
has := false
for _, tm := range this.matches { for _, tm := range this.matches {
if _, ok := tm[sortId]; !ok { if _, ok := tm[sortId]; ok {
for _, v := range this.players[sortId] { has = true
if v != nil { break
logger.Logger.Errorf("比赛异常,比赛已经不存在了 %v", v.tm)
}
break
}
this.StopMatch(0, sortId)
} }
} }
if !has {
logger.Logger.Errorf("比赛异常,比赛已经不存在了 %v", sortId)
delete(this.players, sortId)
}
} }
} }

View File

@ -1439,7 +1439,7 @@ func init() {
// var otherParams []int32 // var otherParams []int32
newMsg = model.NewMessage("", int32(srcSnid), "", int32(destSnid), int32(messageType), title, content, coin, diamond, newMsg = model.NewMessage("", int32(srcSnid), "", int32(destSnid), int32(messageType), title, content, coin, diamond,
model.MSGSTATE_UNREAD, time.Now().Unix(), model.MSGATTACHSTATE_DEFAULT, "", otherParams, platform, showId, channel) model.MSGSTATE_UNREAD, time.Now().Unix(), model.MSGATTACHSTATE_DEFAULT, "", common.CopySliceInt32ToInt64(otherParams), platform, showId, channel)
if newMsg != nil { if newMsg != nil {
err := model.InsertMessage(platform, newMsg) err := model.InsertMessage(platform, newMsg)
if err != nil { if err != nil {
@ -1452,7 +1452,7 @@ func init() {
if destSnid == 0 { if destSnid == 0 {
for _, psnid := range onlinePlayerSnid { for _, psnid := range onlinePlayerSnid {
newMsg := model.NewMessage(newMsg.Id.Hex(), newMsg.SrcId, "", psnid, newMsg.MType, newMsg.Title, newMsg.Content, newMsg.Coin, newMsg.Diamond, newMsg := model.NewMessage(newMsg.Id.Hex(), newMsg.SrcId, "", psnid, newMsg.MType, newMsg.Title, newMsg.Content, newMsg.Coin, newMsg.Diamond,
newMsg.State, newMsg.CreatTs, newMsg.AttachState, newMsg.GiftId, otherParams, platform, newMsg.ShowId, channel) newMsg.State, newMsg.CreatTs, newMsg.AttachState, newMsg.GiftId, common.CopySliceInt32ToInt64(otherParams), platform, newMsg.ShowId, channel)
if newMsg != nil { if newMsg != nil {
dbMsgs = append(dbMsgs, newMsg) dbMsgs = append(dbMsgs, newMsg)
} }