refactor(logic): 重构逻辑模块
- 移除了 player.go 中的 SendPackBytes 方法 - 将 TomeeHeader 中的 CMDID 改为 CMD,类型从 uint32 改为 EnumCommandID - 删除了 controller 文件夹下的 service.go 和 login.go - 新增了 login 文件夹下的 PlayerLoginService.go - 优化了 main.go 中的 Start 函数,使用 controller.Recv 作为回调
This commit is contained in:
167
logic/controller/controller.go
Normal file
167
logic/controller/controller.go
Normal file
@@ -0,0 +1,167 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"blazing/common/core"
|
||||
"blazing/common/socket/cmd"
|
||||
"blazing/common/socket/handler"
|
||||
"blazing/logic/service"
|
||||
|
||||
"bytes"
|
||||
"context"
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"github.com/gogf/gf/v2/os/glog"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"github.com/lunixbochs/struc"
|
||||
"github.com/panjf2000/gnet/v2"
|
||||
)
|
||||
|
||||
var maincontroller = NewController() //注入service
|
||||
// 分发cmd逻辑实现Controller
|
||||
type Controller struct {
|
||||
}
|
||||
|
||||
func NewController() *Controller {
|
||||
return &Controller{}
|
||||
}
|
||||
|
||||
func parseCmd[T any](a T, data []byte) T {
|
||||
// := info.NewLoginSidInfo()
|
||||
struc.Unpack(bytes.NewBuffer(data), &a)
|
||||
return a
|
||||
//fmt.Println(pinfo)
|
||||
//login.OnData_1001(pinfo, player)
|
||||
//fmt.Println(data)
|
||||
}
|
||||
|
||||
func init() { //默认初始化扫描
|
||||
|
||||
// 获取对象的反射值和类型
|
||||
value := reflect.ValueOf(maincontroller)
|
||||
|
||||
// 获取类型
|
||||
typ := value.Type()
|
||||
|
||||
for i := 0; i < typ.NumMethod(); i++ {
|
||||
method := typ.Method(i)
|
||||
|
||||
// TODO 接收者 + 2个参数 一个是类型,一个是player
|
||||
//method.Type.In(1) == reflect.TypeOf([]byte{}
|
||||
|
||||
// 获取方法值
|
||||
methodValue := value.MethodByName(method.Name)
|
||||
methodValue.Type().NumIn()
|
||||
var func_cmd uint32
|
||||
//params := []reflect.Value{}
|
||||
//fmt.Println(methodValue.Type().NumIn())
|
||||
for i := 0; i < methodValue.Type().NumIn(); i++ {
|
||||
|
||||
ttt := methodValue.Type().In(i)
|
||||
|
||||
func_cmd = gconv.Uint32(getcmd(ttt))
|
||||
|
||||
}
|
||||
if !cmd.Isexist(cmd.CommandID, cmd.EnumCommandID(func_cmd)) {
|
||||
fmt.Println("ID方法存在cmd未注册", func_cmd)
|
||||
|
||||
}
|
||||
|
||||
// fmt.Println(methodValue.Interface().(func(gnet.Conn, handler.TomeeHeader)))
|
||||
_, ok := core.Maincmdcache.LoadOrStore(func_cmd, methodValue) //TODO 待实现对不同用户初始化方法以取消全局cmdcache
|
||||
|
||||
if ok { //方法已存在init
|
||||
glog.Error(context.Background(), "方法已存在init,不会初始化后面的方法", func_cmd)
|
||||
}
|
||||
}
|
||||
}
|
||||
func getcmd(t reflect.Type) cmd.EnumCommandID {
|
||||
// 处理指针类型
|
||||
if t.Kind() == reflect.Ptr {
|
||||
t = t.Elem() // 获取指针指向的类型
|
||||
}
|
||||
|
||||
// 确保是结构体
|
||||
if t.Kind() != reflect.Struct {
|
||||
fmt.Println("非结构体类型")
|
||||
return 0
|
||||
}
|
||||
|
||||
// 遍历结构体字段
|
||||
// fmt.Printf("结构体 %s 的字段信息:\n", t.Name())
|
||||
for i := 0; i < t.NumField(); i++ {
|
||||
field := t.Field(i)
|
||||
// fmt.Printf("- 字段名: %s\n", field.Name)
|
||||
|
||||
if field.Type == reflect.TypeOf(handler.TomeeHeader{}) {
|
||||
// fmt.Println(reflect.ValueOf(field))
|
||||
|
||||
return cmd.EnumCommandID(gconv.Uint32(field.Tag.Get("cmd")))
|
||||
|
||||
}
|
||||
// fmt.Printf(" 类型: %v\n", field.Type)
|
||||
// fmt.Printf(" 标签: %q\n", field.Tag)
|
||||
|
||||
// 递归处理嵌套结构体
|
||||
if field.Type.Kind() == reflect.Struct ||
|
||||
(field.Type.Kind() == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct) {
|
||||
fmt.Println(" 嵌套结构体字段:")
|
||||
nestedType := field.Type
|
||||
if nestedType.Kind() == reflect.Ptr {
|
||||
nestedType = nestedType.Elem()
|
||||
}
|
||||
getcmd(nestedType)
|
||||
}
|
||||
// fmt.Println()
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
// 遍历结构体方法并执行RECV_cmd
|
||||
func Recv(c gnet.Conn, data handler.TomeeHeader) {
|
||||
|
||||
tt, ok := core.Maincmdcache.Load(data.CMD)
|
||||
if !ok {
|
||||
|
||||
glog.Error(context.Background(), data.CMD, "cmd未注册")
|
||||
return //TODO 待实现cmd未注册
|
||||
}
|
||||
cmdlister := tt.(reflect.Value)
|
||||
// fmt.Println(cmdlister)
|
||||
|
||||
params := []reflect.Value{}
|
||||
|
||||
funct := cmdlister.Type().NumIn()
|
||||
|
||||
// 如果需要可设置的变量(用于修改值),创建指针并解引用
|
||||
ptrValue := reflect.New(cmdlister.Type().In(0))
|
||||
struc.Unpack(bytes.NewBuffer(data.Data), ptrValue)
|
||||
// ttt := cmdlister.Type().In(0)
|
||||
ptrValue1 := ptrValue.Elem()
|
||||
switch funct {
|
||||
case 1:
|
||||
// struc.Unpack(bytes.NewBuffer(data), &a)
|
||||
// return a
|
||||
params = append(params, ptrValue1)
|
||||
|
||||
case 2:
|
||||
params = append(params, ptrValue1, reflect.ValueOf(service.GetPlayer(c, data.UserID)))
|
||||
|
||||
}
|
||||
|
||||
ret := cmdlister.Call(params)
|
||||
switch ret[0].Interface().(type) {
|
||||
case []byte: //原始包
|
||||
|
||||
c.Write(ret[0].Interface().([]byte)) //这里直接发送原始包,应该是已经拼接过的原始包,通常不同使用
|
||||
|
||||
//case uint32: //错误码 实际上这里包含在结构体里了 ,错误码应该构造在返回之前
|
||||
|
||||
default:
|
||||
|
||||
var data1 bytes.Buffer
|
||||
struc.Pack(&data1, &data)
|
||||
c.Write(data1.Bytes())
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,15 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"blazing/common/data/entity"
|
||||
"blazing/logic/service/login"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// 处理命令: 1001
|
||||
func (h Controller) Login(data login.LoginSidInfo, player *entity.Player) interface{} {
|
||||
func (h Controller) Login(data login.LoginSidInfo) interface{} { //这个时候player应该是空的
|
||||
|
||||
fmt.Println(login.CheakSession(data, player))
|
||||
fmt.Println(login.CheakSession(data)) //检查结构体
|
||||
|
||||
t1, _ := hex.DecodeString("0000045D37000003E9000186A600000000000186A6683F89CF6E69656F0000000000000000000000000008000F00000000000000000000000000000000000000000000000000000001000001DB0000018B000000000000A8C000000000000000000000000000000000000000080001388000000001000000017FFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000000000000000000000064000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001FFFFFFFF000000004E4F4E4F0000000000000000000000000000000000000001000000010000000100000001000000010000000100000001000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000100000064000000000000000000000000000000000000001F000000000000006400000000000093F4000093F4000000D5000000F7000000AD00000088000000920000008C0000009C00000000000000000000000000000000000000000000000000000004000027900000001B00004E6200000014000028380000002800004E3E0000002368493DC60000000000000000000000000000000000000000000100000000000000A937000007D1000186A600000000000186A66E69656F00000000000000000000000000000000000000000000000F0000000000000000000001DB0000018B0000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000")
|
||||
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
|
||||
"github.com/lunixbochs/struc"
|
||||
)
|
||||
|
||||
// 分发cmd逻辑实现Controller
|
||||
type Controller struct {
|
||||
}
|
||||
|
||||
func NewController() *Controller {
|
||||
return &Controller{}
|
||||
}
|
||||
|
||||
func parseCmd[T any](a T, data []byte) T {
|
||||
// := info.NewLoginSidInfo()
|
||||
struc.Unpack(bytes.NewBuffer(data), &a)
|
||||
return a
|
||||
//fmt.Println(pinfo)
|
||||
//login.OnData_1001(pinfo, player)
|
||||
//fmt.Println(data)
|
||||
}
|
||||
Reference in New Issue
Block a user