102 lines
2.2 KiB
Go
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
|
|
}
|