60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
// handler
|
|
package netlib
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
)
|
|
|
|
var handlers = make(map[int]Handler)
|
|
|
|
type Handler interface {
|
|
Process(session *Session, packetid int, data interface{}) error
|
|
}
|
|
|
|
type HandlerWrapper func(session *Session, packetid int, data interface{}) error
|
|
|
|
func (hw HandlerWrapper) Process(session *Session, packetid int, data interface{}) error {
|
|
return hw(session, packetid, data)
|
|
}
|
|
|
|
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 Register1ToMHandler(h Handler, packetIds ...int) {
|
|
for _, packetId := range packetIds {
|
|
RegisterHandler(packetId, h)
|
|
}
|
|
}
|
|
|
|
func RegisterRangeHandler(start, end int, h Handler) {
|
|
for ; start <= end; start++ {
|
|
RegisterHandler(start, h)
|
|
}
|
|
}
|
|
|
|
func GetHandler(packetId int) Handler {
|
|
if h, ok := handlers[packetId]; ok {
|
|
return h
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func Register(mainId int, msgType interface{}, h func(session *Session, packetId int, data interface{}) error) {
|
|
f := func() interface{} {
|
|
tp := reflect.TypeOf(msgType)
|
|
if tp.Kind() == reflect.Ptr {
|
|
tp = tp.Elem()
|
|
}
|
|
return reflect.New(tp).Interface()
|
|
}
|
|
RegisterFactory(mainId, PacketFactoryWrapper(f))
|
|
RegisterHandler(mainId, HandlerWrapper(h))
|
|
}
|