492 lines
14 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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...")
}()
}