Files
chain33-imparse/chat/parser.go
2022-03-17 15:54:23 +08:00

86 lines
1.8 KiB
Go

package chat
import (
"io"
"io/ioutil"
"github.com/golang/protobuf/proto"
comet "gitlab.33.cn/chat/im/api/comet/grpc"
"gitlab.33.cn/chat/imparse"
biz "gitlab.33.cn/chat/imparse/proto"
)
type _handleEvent func(*StandardFrame, []byte) (imparse.Frame, error)
var events = map[biz.Proto_EventType]_handleEvent{
biz.Proto_common: func(s *StandardFrame, body []byte) (imparse.Frame, error) {
var pro biz.Common
err := proto.Unmarshal(body, &pro)
if err != nil {
return nil, err
}
switch pro.ChannelType {
case biz.Channel_ToUser:
return NewPrivateFrame(s, &pro), nil
case biz.Channel_ToGroup:
return NewGroupFrame(s, &pro), nil
default:
return nil, imparse.ErrExecSupport
}
},
biz.Proto_Signal: func(s *StandardFrame, body []byte) (imparse.Frame, error) {
var pro biz.Signal
err := proto.Unmarshal(body, &pro)
if err != nil {
return nil, err
}
return NewNoticeFrame(s, &pro), nil
},
}
//标准解析器 定义了解析标准协议的方法
type StandardParse struct {
}
func (s *StandardParse) NewFrame(key, from string, in io.Reader, opts ...Option) (imparse.Frame, error) {
data, err := ioutil.ReadAll(in)
if err != nil {
return nil, err
}
//
var p comet.Proto
err = proto.Unmarshal(data, &p)
if err != nil {
return nil, err
}
switch p.GetVer() {
case 0, 1:
default:
}
switch p.GetOp() {
case int32(comet.Op_SendMsg):
case int32(comet.Op_Auth):
}
//业务服务协议解析
var pro biz.Proto
err = proto.Unmarshal(p.Body, &pro)
if err != nil {
return nil, err
}
//解析event事件
event, ok := events[pro.EventType]
if !ok || event == nil {
return nil, imparse.ErrorEnvType
}
frame, err := event(NewStandardFrame(&p, key, from, opts...), pro.Body)
if err != nil {
return nil, err
}
return frame, err
}