86 lines
1.8 KiB
Go
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
|
|
}
|