game/server/db/server/handlerUser.go
2025-06-14 16:40:15 +08:00

155 lines
4.4 KiB
Go

package server
import (
"encoding/json"
"game/common/model/user"
"game/common/proto/pb"
"game/server/db/operation"
"github.com/fox/fox/ipb"
"github.com/fox/fox/ksync"
"github.com/fox/fox/log"
)
// 获取帐号
func (s *DbService) onGetUserAccount(iMsg *ipb.InternalMsg) *ipb.InternalMsg {
operationDb[user.UserAccount](iMsg, func(us *user.UserAccount) (*user.UserAccount, pb.ErrCode) {
return operation.NewUserAccountOp().GetUserAccount(us.Username)
})
return iMsg
}
// 创建帐号
func (s *DbService) onCreateUserAccount(iMsg *ipb.InternalMsg) *ipb.InternalMsg {
operationDb[user.UserAccount](iMsg, operation.NewUserAccountOp().CreateUserAccount)
return iMsg
}
type result[T any] struct {
ret T
}
// 装饰器
// 返回值存在iMsg.Msg中
func operationDb[T any](iMsg *ipb.InternalMsg, operation func(table *T) (*T, pb.ErrCode)) {
t := result[T]{}
err := json.Unmarshal(iMsg.Msg, &t.ret)
if err != nil {
log.ErrorF("error unmarshalling user account %v", err)
iMsg.RpcCode = int32(pb.ErrCode_SystemErr)
return
}
table, code := operation(&t.ret)
if code != pb.ErrCode_OK {
iMsg.RpcCode = int32(code)
return
}
iMsg.Msg, err = json.Marshal(table)
if err != nil {
log.ErrorF("error marshalling user account %v", err)
iMsg.RpcCode = int32(pb.ErrCode_SystemErr)
return
}
//log.DebugF("iMsg.Msg:%v", string(iMsg.Msg))
return
}
// 修改密码
func (s *DbService) onUpdateUserAccount(iMsg *ipb.InternalMsg) *ipb.InternalMsg {
operationDb[user.UserAccount](iMsg, operation.NewUserAccountOp().UpdateUserPassword)
return iMsg
}
// 日志操作无需返回值
func (s *DbService) onLogUserAccountLogin(iMsg *ipb.InternalMsg) *ipb.InternalMsg {
operationDb[user.UserLoginLog](iMsg, func(us *user.UserLoginLog) (*user.UserLoginLog, pb.ErrCode) {
operation.NewUserAccountOp().RecordLoginLog(us)
return nil, pb.ErrCode_OK
})
return iMsg
}
// 获取用户数据,没有则创建
func (s *DbService) onGetUserByAccountId(iMsg *ipb.InternalMsg) *ipb.InternalMsg {
operationDb[user.User](iMsg, func(us *user.User) (*user.User, pb.ErrCode) {
return operation.NewUserOp().GetUserByAccountId(us.AccountId)
})
return iMsg
}
// 获取用户数据,没有则创建
func (s *DbService) onGetUserByUid(iMsg *ipb.InternalMsg) *ipb.InternalMsg {
operationDb[user.User](iMsg, func(us *user.User) (*user.User, pb.ErrCode) {
return operation.NewUserOp().Find(us.ID)
})
return iMsg
}
// 获取用户数据,没有则创建
func (s *DbService) onGetUserResources(iMsg *ipb.InternalMsg) *ipb.InternalMsg {
operationDb[user.UserResources](iMsg, func(res *user.UserResources) (*user.UserResources, pb.ErrCode) {
if us1, code := operation.NewUserResourcesOp().Find(res.UID); code != pb.ErrCode_OK {
return operation.NewUserResourcesOp().Create(res)
} else {
return us1, code
}
})
return iMsg
}
// 添加用户资源,负数为减少
func (s *DbService) onAddUserResources(iMsg *ipb.InternalMsg) *ipb.InternalMsg {
addUserRes := &user.AddUserRes{}
err := json.Unmarshal(iMsg.Msg, addUserRes)
if err != nil {
log.ErrorF("err:%v unmarshalling user resources %v", err, string(iMsg.Msg))
iMsg.RpcCode = int32(pb.ErrCode_SystemErr)
return iMsg
}
rets, code := operation.NewUserResourcesOp().Add(iMsg.UserId, addUserRes.AddRes)
if code != pb.ErrCode_OK {
iMsg.RpcCode = int32(code)
return iMsg
}
iMsg.Msg, err = json.Marshal(rets)
if err != nil {
log.ErrorF("error marshalling user account %v", err)
iMsg.RpcCode = int32(pb.ErrCode_SystemErr)
return iMsg
}
logOp := operation.NewUserResourcesLogOp()
ksync.GoSafe(func() {
for resName, resAfterValue := range rets {
resAddValue := addUserRes.AddRes[resName]
logOp.Create(&user.UserResourcesLog{
UID: iMsg.UserId,
ResName: resName,
ResAddValue: resAddValue,
ResAfterValue: resAfterValue,
GameId: addUserRes.GameId,
GameNo: addUserRes.GameNo,
Reason: addUserRes.Reason,
})
}
}, nil)
return iMsg
}
// 获取用户数据
func (s *DbService) onGetGameUser(iMsg *ipb.InternalMsg) *ipb.InternalMsg {
operationDb[user.GameUser](iMsg, func(gameUser *user.GameUser) (*user.GameUser, pb.ErrCode) {
us, code := operation.NewUserOp().Find(gameUser.ID)
if code != pb.ErrCode_OK {
return nil, code
}
res, code1 := operation.NewUserResourcesOp().Find(gameUser.ID)
if code1 != pb.ErrCode_OK {
return nil, code
}
gameUser.User = *us
gameUser.UserResources = *res
return gameUser, pb.ErrCode_OK
})
return iMsg
}