492 lines
14 KiB
Go
492 lines
14 KiB
Go
package model
|
||
|
||
import (
|
||
"rocommon/service"
|
||
"rocommon/util"
|
||
"roserver/serverproto"
|
||
"runtime/debug"
|
||
"strconv"
|
||
"time"
|
||
)
|
||
|
||
//mysql 数据库表结构
|
||
//ro_gs_online_st
|
||
|
||
//role表结构
|
||
type RoleTable struct {
|
||
Uid uint64
|
||
Serverid int32
|
||
Device_id string
|
||
Nick_name string
|
||
Base_level int32
|
||
Create_date time.Time
|
||
Last_login_date time.Time
|
||
Ban_date time.Time
|
||
Ban_chat_date time.Time
|
||
Map_level int32
|
||
Max_fight_power uint32
|
||
Fight_power int32
|
||
Active_code string
|
||
Open_id string
|
||
Sub_platform string
|
||
Tower_level int32
|
||
Vip int32
|
||
Money uint64
|
||
Zeny uint64
|
||
Total_recharge float32
|
||
Last_recharge_time time.Time
|
||
}
|
||
|
||
func (RoleTable) TableName() string {
|
||
return "role"
|
||
}
|
||
|
||
type RoleLogTable struct {
|
||
Uid uint64
|
||
Type int32
|
||
Sub_type int32
|
||
Log_date time.Time
|
||
Old_val uint64
|
||
New_val uint64
|
||
Delta_val uint64
|
||
Param int32
|
||
Strparam string
|
||
}
|
||
|
||
func (RoleLogTable) TableName() string {
|
||
return "role_log"
|
||
}
|
||
|
||
type ServerOnlineLog struct {
|
||
Server_id int32
|
||
Server_sub_id int32
|
||
Log_date time.Time
|
||
Online_num int32
|
||
}
|
||
|
||
func (ServerOnlineLog) TableName() string {
|
||
return "server_online_log"
|
||
}
|
||
|
||
type RoleOrderList struct {
|
||
Uid uint64
|
||
Rmb int32
|
||
Reward_list string
|
||
Order_id uint64
|
||
Order_date time.Time `gorm:"column:order_date;type:datetime"`
|
||
Goods_type int32
|
||
Goods_id int32
|
||
Sdk_order_id string
|
||
}
|
||
|
||
func (RoleOrderList) TableName() string {
|
||
return "role_order_list"
|
||
}
|
||
|
||
type RoleMsgTable struct {
|
||
Uid uint64
|
||
Target_uid uint64
|
||
Msg_type int32
|
||
Content string
|
||
Msg_date time.Time
|
||
}
|
||
|
||
func (RoleMsgTable) TableName() string {
|
||
return "role_msg"
|
||
}
|
||
|
||
func UpdatePlayerBriefInfo2Mysql(uid uint64, briefInfo *serverproto.CommonPlayerBriefInfo, bCreate bool, activeCode, openId, subPlatform string) {
|
||
MysqlUpdateMag.dataLock.Lock()
|
||
if data, ok := MysqlUpdateMag.mysqlPlayerBriefInfoList[uid]; ok {
|
||
if bCreate {
|
||
data.bCreate = true
|
||
}
|
||
data.briefInfo = briefInfo
|
||
if activeCode != "" {
|
||
data.activeCode = activeCode
|
||
}
|
||
if openId != "" {
|
||
data.openId = openId
|
||
}
|
||
if subPlatform != "" {
|
||
data.subPlatform = subPlatform
|
||
}
|
||
} else {
|
||
data = &mysqlPlayerBriefInfo{
|
||
uid: uid,
|
||
briefInfo: briefInfo,
|
||
bCreate: bCreate,
|
||
activeCode: activeCode,
|
||
openId: openId,
|
||
subPlatform: subPlatform,
|
||
}
|
||
MysqlUpdateMag.mysqlPlayerBriefInfoList[uid] = data
|
||
}
|
||
MysqlUpdateMag.dataLock.Unlock()
|
||
}
|
||
|
||
//使用说明 https://gorm.io/zh_CN/docs/query.html
|
||
func doUpdatePlayerBriefInfo2MysqlORM(mysqlMag *MysqlUpdateManager, uid uint64, briefInfo *serverproto.CommonPlayerBriefInfo, bCreate bool, activeCode, openId, subPlatform string) {
|
||
if service.GetMysqlORM() == nil {
|
||
util.ErrorF("mysql connector invalid UpdatePlayerBriefInfo2Mysql")
|
||
mysqlMag.mysqlUpdatePool.Release()
|
||
return
|
||
}
|
||
|
||
go func() {
|
||
defer func() {
|
||
mysqlMag.mysqlUpdatePool.Release()
|
||
//打印奔溃信息
|
||
if err := recover(); err != nil {
|
||
util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
|
||
}
|
||
}()
|
||
|
||
isCreateRole := bCreate
|
||
//zoneId := int32(service.GetServiceConfig().Node.Zone)
|
||
zoneId := briefInfo.GetSelectZone()
|
||
now := util.GetCurrentTimeNow()
|
||
|
||
tmpRole := &RoleTable{
|
||
Nick_name: string(briefInfo.NickName),
|
||
Base_level: briefInfo.Level,
|
||
Map_level: briefInfo.MapLevelId,
|
||
Fight_power: briefInfo.FightPower,
|
||
Max_fight_power: briefInfo.MaxFightPower,
|
||
Active_code: activeCode,
|
||
Open_id: openId,
|
||
Tower_level: briefInfo.TowerLevel,
|
||
Vip: briefInfo.VipLevel,
|
||
Money: briefInfo.Rmb,
|
||
Zeny: briefInfo.Zeny,
|
||
Total_recharge: briefInfo.TotalRecharge,
|
||
}
|
||
|
||
var err error = nil
|
||
if isCreateRole {
|
||
tmpRole.Uid = uid
|
||
tmpRole.Create_date = now
|
||
tmpRole.Last_login_date = now
|
||
tmpRole.Serverid = zoneId
|
||
tmpRole.Sub_platform = subPlatform
|
||
//创建记录并更新未给出的字段。
|
||
err = service.GetMysqlORM().DbConnORM().Omit("ban_date", "ban_chat_date", "last_recharge_time").Create(tmpRole).Error
|
||
} else {
|
||
hasRole := &RoleTable{}
|
||
service.GetMysqlORM().DbConnORM().Select("uid").Where("uid = ?", uid).Find(hasRole)
|
||
//service.GetMysqlORM().DbConnORM().Where("uid = ? ", uid).First(hasRole)
|
||
if hasRole.Uid <= 0 {
|
||
tmpRole.Uid = uid
|
||
tmpRole.Create_date = now
|
||
tmpRole.Last_login_date = now
|
||
tmpRole.Serverid = zoneId
|
||
tmpRole.Sub_platform = subPlatform
|
||
//创建记录并更新未给出的字段
|
||
err = service.GetMysqlORM().DbConnORM().Omit("ban_date", "ban_chat_date", "last_recharge_time").Create(tmpRole).Error
|
||
} else {
|
||
//结构体模式默认值不会更新,做特殊处理
|
||
if tmpRole.Money <= 0 {
|
||
tmpRole.Money = 1
|
||
}
|
||
if tmpRole.Zeny <= 0 {
|
||
tmpRole.Zeny = 1
|
||
}
|
||
|
||
if briefInfo.OnlineTime > 0 {
|
||
tmpRole.Last_login_date = now
|
||
}
|
||
if briefInfo.LastRechargeTime > 0 {
|
||
lastRechargeTime := util.GetTimeByUint64(briefInfo.LastRechargeTime)
|
||
tmpRole.Last_recharge_time = lastRechargeTime
|
||
}
|
||
err = service.GetMysqlORM().DbConnORM().Model(&RoleTable{}).Where("uid = ?", uid).Updates(tmpRole).Error
|
||
}
|
||
}
|
||
|
||
//err := service.GetMysqlORM().DbConnORM().Error
|
||
if err != nil {
|
||
util.ErrorF("uid=%v doUpdatePlayerBriefInfo2MysqlORM err=%v", uid, err)
|
||
}
|
||
//util.InfoF("doUpdatePlayerBriefInfo2Mysql end...")
|
||
}()
|
||
}
|
||
|
||
func UpdatePlayerRes2Mysql(uid uint64, saveInfo *serverproto.RoleRes2MysqlInfo) {
|
||
MysqlUpdateMag.dataLock.Lock()
|
||
if data, ok := MysqlUpdateMag.mysqlResInfoList[uid]; ok {
|
||
data.saveInfo = saveInfo
|
||
} else {
|
||
data = &mysqlResInfo{
|
||
uid: uid,
|
||
saveInfo: saveInfo,
|
||
}
|
||
MysqlUpdateMag.mysqlResInfoList[uid] = data
|
||
}
|
||
MysqlUpdateMag.dataLock.Unlock()
|
||
}
|
||
|
||
//更新资源数据到mysql
|
||
func doUpdatePlayerRes2MysqlORM(mysqlMag *MysqlUpdateManager, uid uint64, saveInfo *serverproto.RoleRes2MysqlInfo) {
|
||
if service.GetMysqlORM() == nil {
|
||
util.ErrorF("mysql connector invalid doUpdatePlayerRes2MysqlORM")
|
||
mysqlMag.mysqlUpdatePool.Release()
|
||
return
|
||
}
|
||
|
||
go func() {
|
||
defer func() {
|
||
mysqlMag.mysqlUpdatePool.Release()
|
||
//打印奔溃信息
|
||
if err := recover(); err != nil {
|
||
util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
|
||
}
|
||
}()
|
||
|
||
var err error = nil
|
||
//util.InfoF("doUpdatePlayerRes2Mysql start...")
|
||
// Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更
|
||
// 新时,默认情况下,GORM 只会更新非零值的字段
|
||
err = service.GetMysqlORM().DbConnORM().Model(&RoleTable{}).Where("uid = ?", uid).Updates(
|
||
map[string]interface{}{
|
||
"money": uint64(saveInfo.Money),
|
||
"total_recharge": saveInfo.TotalRecharge,
|
||
"vip": saveInfo.VipLevel,
|
||
}).Error
|
||
//err := service.GetMysqlORM().DbConnORM().Error
|
||
if err != nil {
|
||
util.ErrorF("uid=%v doUpdatePlayerRes2MysqlORM err=%v", uid, err)
|
||
}
|
||
//util.InfoF("doUpdatePlayerRes2Mysql end...")
|
||
}()
|
||
}
|
||
|
||
func UpdatePlayerBanInfo2Mysql(uid uint64, banTime uint64, banType int32) {
|
||
//banType 1封号,2禁言
|
||
MysqlUpdateMag.dataLock.Lock()
|
||
if data, ok := MysqlUpdateMag.mysqlBanInfoList[uid]; ok {
|
||
data.banTime = banTime
|
||
} else {
|
||
data = &mysqlBanInfo{
|
||
uid: uid,
|
||
banTime: banTime,
|
||
banType: banType,
|
||
}
|
||
MysqlUpdateMag.mysqlBanInfoList[uid] = data
|
||
}
|
||
MysqlUpdateMag.dataLock.Unlock()
|
||
}
|
||
|
||
func DoUpdatePlayerBanInfo2MysqlORM(mysqlMag *MysqlUpdateManager, uid uint64, banTime uint64, banType int32) {
|
||
if service.GetMysqlORM() == nil {
|
||
util.ErrorF("mysql connector invalid UpdatePlayerBanInfo2Mysql")
|
||
if mysqlMag != nil {
|
||
mysqlMag.mysqlUpdatePool.Release()
|
||
}
|
||
return
|
||
}
|
||
|
||
go func() {
|
||
defer func() {
|
||
if mysqlMag != nil {
|
||
mysqlMag.mysqlUpdatePool.Release()
|
||
}
|
||
//打印奔溃信息
|
||
if err := recover(); err != nil {
|
||
util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
|
||
}
|
||
}()
|
||
|
||
var err error = nil
|
||
updateRole := &RoleTable{}
|
||
if banTime > 0 {
|
||
if banType == 1 {
|
||
tmpBanTime := util.GetTimeByUint64(banTime * 1000)
|
||
updateRole.Ban_date = tmpBanTime
|
||
} else if banType == 2 {
|
||
tmpBanTime := util.GetTimeByUint64(banTime * 1000)
|
||
updateRole.Ban_chat_date = tmpBanTime
|
||
}
|
||
err = service.GetMysqlORM().DbConnORM().Model(&RoleTable{}).Where("uid = ? ", uid).Updates(updateRole).Error
|
||
} else {
|
||
if banType == 1 {
|
||
err = service.GetMysqlORM().DbConnORM().Model(&RoleTable{}).Where("uid = ? ", uid).Updates(
|
||
map[string]interface{}{
|
||
"ban_date": nil,
|
||
}).Error
|
||
} else if banType == 2 {
|
||
err = service.GetMysqlORM().DbConnORM().Model(&RoleTable{}).Where("uid = ? ", uid).Updates(
|
||
map[string]interface{}{
|
||
"ban_chat_date": nil,
|
||
}).Error
|
||
}
|
||
}
|
||
|
||
//err := service.GetMysqlORM().DbConnORM().Error
|
||
if err != nil {
|
||
util.ErrorF("uid=%v DoUpdatePlayerBanInfo2Mysql err=%v", uid, err)
|
||
}
|
||
|
||
//util.InfoF("doUpdatePlayerBanInfo2Mysql start...")
|
||
//util.InfoF("doUpdatePlayerBanInfo2Mysql end...")
|
||
}()
|
||
}
|
||
|
||
func UpdatePlayerChatMsg2Mysql(uid, targetUid uint64, msgType int32, content *serverproto.ChatMessageInfo) {
|
||
MysqlUpdateMag.dataLock.Lock()
|
||
|
||
MysqlUpdateMag.mysqlChatInfoList = append(MysqlUpdateMag.mysqlChatInfoList, &mysqlChatInfo{
|
||
uid: uid,
|
||
targetUid: targetUid,
|
||
msgType: msgType,
|
||
content: content,
|
||
})
|
||
|
||
MysqlUpdateMag.dataLock.Unlock()
|
||
}
|
||
|
||
func doUpdatePlayerChatMsg2MysqlORM(mysqlMag *MysqlUpdateManager, chatList *[]*mysqlChatInfo) {
|
||
if service.GetMysqlORM() == nil {
|
||
util.ErrorF("mysql connector invalid UpdatePlayerChatMsg2Mysql")
|
||
mysqlMag.mysqlUpdatePool.Release()
|
||
return
|
||
}
|
||
|
||
go func() {
|
||
defer func() {
|
||
mysqlMag.mysqlUpdatePool.Release()
|
||
//打印奔溃信息
|
||
if err := recover(); err != nil {
|
||
util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
|
||
}
|
||
}()
|
||
|
||
for idx := 0; idx < len(*chatList); idx++ {
|
||
chatInfo := (*chatList)[idx]
|
||
|
||
tmpSendTime := util.GetTimeByUint64(chatInfo.content.SendTime)
|
||
saveRoleMsg := &RoleMsgTable{
|
||
Uid: chatInfo.uid,
|
||
Msg_type: chatInfo.msgType,
|
||
Content: string(chatInfo.content.Message),
|
||
Msg_date: tmpSendTime,
|
||
Target_uid: chatInfo.targetUid,
|
||
}
|
||
err := service.GetMysqlORM().DbConnORM().Create(saveRoleMsg).Error
|
||
|
||
//err := service.GetMysqlORM().DbConnORM().Error
|
||
if err != nil {
|
||
util.ErrorF("uid=%v doUpdatePlayerChatMsg2MysqlORM err=%v", chatInfo.uid, err)
|
||
}
|
||
}
|
||
}()
|
||
}
|
||
|
||
func UpdatePlayerLog2Mysql(logList []*serverproto.SSRoleLogData) {
|
||
MysqlUpdateMag.dataLock.Lock()
|
||
MysqlUpdateMag.mysqlLogInfoList = append(MysqlUpdateMag.mysqlLogInfoList, logList...)
|
||
MysqlUpdateMag.dataLock.Unlock()
|
||
}
|
||
|
||
func doUpdatePlayerLog2MysqlORM(mysqlMag *MysqlUpdateManager, logList *[]*serverproto.SSRoleLogData) {
|
||
if service.GetMysqlORM() == nil {
|
||
util.ErrorF("mysql connector invalid UpdatePlayerLog2Mysql")
|
||
mysqlMag.mysqlUpdatePool.Release()
|
||
return
|
||
}
|
||
|
||
go func() {
|
||
defer func() {
|
||
mysqlMag.mysqlUpdatePool.Release()
|
||
//打印奔溃信息
|
||
if err := recover(); err != nil {
|
||
util.InfoF("Stack---::%v\n%s\n", err, string(debug.Stack()))
|
||
}
|
||
}()
|
||
|
||
now := util.GetCurrentTimeNow()
|
||
for idx := 0; idx < len(*logList); idx++ {
|
||
logData := (*logList)[idx]
|
||
var err error = nil
|
||
switch (serverproto.MysqlLogType)(logData.Type) {
|
||
case serverproto.MysqlLogType_LType_OnlineNum: //服务器当前在线人数
|
||
saveOnlineTableData := &ServerOnlineLog{
|
||
Server_id: logData.ParamList[0],
|
||
Server_sub_id: logData.ParamList[1],
|
||
Online_num: logData.ParamList[2],
|
||
Log_date: now,
|
||
}
|
||
err = service.GetMysqlORM().DbConnORM().Create(saveOnlineTableData).Error
|
||
case serverproto.MysqlLogType_LType_OrderList: //充值订单信息(玩家成功领取奖励)
|
||
orderDate := util.GetTimeByUint64(logData.Param64List[1])
|
||
util.InfoF("Order_date: ", logData.Param64List[1], orderDate.Format("2006-01-02 15:04:05"))
|
||
saveOrderTableData := &RoleOrderList{
|
||
Uid: logData.Uid,
|
||
Rmb: logData.ParamList[0],
|
||
Goods_type: logData.ParamList[1],
|
||
Goods_id: logData.ParamList[2],
|
||
Order_id: logData.Param64List[0],
|
||
Order_date: orderDate,
|
||
}
|
||
if len(logData.StrList) > 0 {
|
||
saveOrderTableData.Sdk_order_id = logData.StrList[0]
|
||
}
|
||
rewardStr := ""
|
||
for k := 0; k < len(logData.RewardList); k++ {
|
||
kvVal := logData.RewardList[k]
|
||
if k == 0 {
|
||
rewardStr += strconv.Itoa(int(kvVal.Key)) + ":" + strconv.Itoa(int(kvVal.Value))
|
||
} else {
|
||
rewardStr += ";" + strconv.Itoa(int(kvVal.Key)) + ":" + strconv.Itoa(int(kvVal.Value))
|
||
}
|
||
}
|
||
saveOrderTableData.Reward_list = rewardStr
|
||
util.InfoF("uid=%v sdkorderid=%v rmb=%v", logData.Uid, saveOrderTableData.Sdk_order_id, saveOrderTableData.Rmb)
|
||
err = service.GetMysqlORM().DbConnORM().Create(saveOrderTableData).Error
|
||
default:
|
||
saveLogTableData := &RoleLogTable{
|
||
Uid: logData.Uid,
|
||
Type: logData.Type,
|
||
Sub_type: logData.SubType,
|
||
Log_date: now,
|
||
}
|
||
if len(logData.ParamList) == 4 {
|
||
saveLogTableData.Old_val = uint64(logData.ParamList[0])
|
||
saveLogTableData.New_val = uint64(logData.ParamList[1])
|
||
saveLogTableData.Delta_val = uint64(logData.ParamList[2])
|
||
saveLogTableData.Param = logData.ParamList[3]
|
||
} else if len(logData.ParamList) == 3 {
|
||
saveLogTableData.Old_val = uint64(logData.ParamList[0])
|
||
saveLogTableData.New_val = uint64(logData.ParamList[1])
|
||
saveLogTableData.Delta_val = uint64(logData.ParamList[2])
|
||
} else {
|
||
if len(logData.ParamList) == 1 {
|
||
saveLogTableData.Delta_val = uint64(logData.ParamList[0])
|
||
} else {
|
||
//写入设备号和IP
|
||
paramStr := ""
|
||
for k := 0; k < len(logData.StrList); k++ {
|
||
paramStr += logData.StrList[k]
|
||
if k > 0 && k < len(logData.StrList)-1 {
|
||
paramStr += ";"
|
||
}
|
||
}
|
||
saveLogTableData.Strparam = paramStr
|
||
}
|
||
}
|
||
err = service.GetMysqlORM().DbConnORM().Create(saveLogTableData).Error
|
||
}
|
||
if err != nil {
|
||
util.ErrorF("doUpdatePlayerLog2MysqlORM err=%v", err)
|
||
}
|
||
}
|
||
//
|
||
//err := service.GetMysqlORM().DbConnORM().Error
|
||
//if err != nil {
|
||
//
|
||
//}
|
||
|
||
//util.InfoF("doUpdatePlayerLog2Mysql start...")
|
||
//util.InfoF("doUpdatePlayerLog2Mysql end...")
|
||
}()
|
||
}
|