game_sync/common/handler.go

55 lines
1.4 KiB
Go

package common
import (
"fmt"
"reflect"
"mongo.games.com/goserver/core/netlib"
)
var handlers = make(map[int]Handler)
type Handler interface {
Process(s *netlib.Session, packetid int, data interface{}, sid int64) error
}
type HandlerWrapper func(s *netlib.Session, packetid int, data interface{}, sid int64) error
func (hw HandlerWrapper) Process(s *netlib.Session, packetid int, data interface{}, sid int64) error {
return hw(s, packetid, data, sid)
}
// RegisterHandler 消息注册
// Deprecated: use [common.Register] instead
func RegisterHandler(packetId int, h Handler) {
if _, ok := handlers[packetId]; ok {
panic(fmt.Sprintf("repeate register handler: %v Handler type=%v", packetId, reflect.TypeOf(h)))
}
handlers[packetId] = h
}
func GetHandler(packetId int) Handler {
if h, ok := handlers[packetId]; ok {
return h
}
return nil
}
func Register(mainId int, msgType interface{}, h func(s *netlib.Session, packetId int, data interface{}, sid int64) error) {
if _, ok := handlers[mainId]; ok {
panic(fmt.Sprintf("repeate register handler: %v Handler type=%v", mainId, reflect.TypeOf(h)))
}
handlers[mainId] = HandlerWrapper(h)
f := func() interface{} {
tp := reflect.TypeOf(msgType)
if tp.Kind() == reflect.Ptr {
tp = tp.Elem()
}
return reflect.New(tp).Interface()
}
netlib.RegisterFactory(mainId, netlib.PacketFactoryWrapper(f))
}