| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- 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
- 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)
- 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: //充值订单信息(玩家成功领取奖励)
- 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: util.GetTimeByUint64(logData.Param64List[1]),
- }
- 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...")
- }()
- }
|