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

102 lines
2.2 KiB
Go

package chat
import (
"context"
"fmt"
"time"
"github.com/golang/protobuf/proto"
"gitlab.33.cn/chat/imparse"
biz "gitlab.33.cn/chat/imparse/proto"
"gitlab.33.cn/chat/imparse/util"
)
//private
type SignalFrame struct {
*StandardFrame
base *biz.Signal
mid int64
createTime uint64
}
func NewNoticeFrame(standardFrame *StandardFrame, bizPro *biz.Signal) *SignalFrame {
frame := &SignalFrame{
StandardFrame: standardFrame,
base: bizPro,
}
frame.SetBody(frame)
return frame
}
func (p *SignalFrame) Type() imparse.FrameType {
return SignalFrameType
}
func (p *SignalFrame) Filter(ctx context.Context, db imparse.Cache, filters ...imparse.Filter) (uint64, error) {
var err error
for _, filter := range filters {
err = filter(ctx, p)
if err != nil {
return 0, err
}
}
p.mid, err = db.GetMid(ctx)
if err != nil {
return 0, err
}
p.createTime = uint64(util.TimeNowUnixNano() / int64(time.Millisecond))
return p.createTime, nil
}
func (p *SignalFrame) Transport(ctx context.Context, exec imparse.Exec) error {
data, err := p.PushData()
if err != nil {
return err
}
return exec.Transport(ctx, p.mid, p.GetKey(), p.GetFrom(), p.GetTarget(), p.GetTransmissionMethod(), p.Type(), data)
}
func (p *SignalFrame) Ack(ctx context.Context, exec imparse.Exec) (int64, error) {
return p.mid, nil
}
func (p *SignalFrame) AckBody() ([]byte, error) {
body, err := proto.Marshal(p.base)
if err != nil {
return nil, fmt.Errorf("marshal NotifyMsg err: %v", err)
}
if err != nil {
return nil, fmt.Errorf("marshal NotifyMsgAck err: %v", err)
}
data, err := proto.Marshal(&biz.Proto{
EventType: biz.Proto_Signal,
Body: body,
})
if err != nil {
return nil, fmt.Errorf("marshal Proto err: %v", err)
}
return data, err
}
func (p *SignalFrame) PushBody() ([]byte, error) {
var err error
var data []byte
pro := biz.Proto{
EventType: biz.Proto_Signal,
}
pro.Body, err = proto.Marshal(p.base)
if err != nil {
return nil, fmt.Errorf("marshal NotifyMsg err: %v", err)
}
data, err = proto.Marshal(&pro)
if err != nil {
return nil, fmt.Errorf("marshal Proto err: %v", err)
}
return data, err
}
func (p *SignalFrame) GetBase() *biz.Signal {
return p.base
}