1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package online
- import (
- "runtime"
- "github.com/gorilla/websocket"
- "github.com/sirupsen/logrus"
- "gogs.daxia.dev/huanan/pkg.daxia.dev/encrypt"
- "gogs.daxia.dev/huanan/pkg.daxia.dev/gzip"
- "nn.daxia.dev/gameproto"
- "nn.daxia.dev/model"
- )
- type EmitData struct {
- UserID uint
- NotifyType gameproto.NotifyTypeEnum //通知类型
- Encrypt bool //是否需要加密
- Data string //发送内容
- }
- const GZipMinLen = 1024
- func SendMsg(conn *websocket.Conn, emitData EmitData) error {
- defer func() {
- if err := recover(); err != nil {
- logrus.Error(err)
- buf := make([]byte, 2048*5)
- n := runtime.Stack(buf, false)
- stackInfo := string(buf[:n])
- logrus.Errorf("panic stack info %s", stackInfo)
- }
- }()
- var err error
- data := []byte(emitData.Data)
- tmpData := make([]byte, 0, len(data)+1)
- notifyType := byte(int32(emitData.NotifyType))
- data = append(append(tmpData, notifyType), data...)
- dataType := uint8(gameproto.DataType_DataTypeNormal)
- emitData.Encrypt = false
- if emitData.Encrypt {
- data, _ = encrypt.AesEncrypt(data, model.AESKey)
- dataType = dataType | byte(gameproto.DataType_DataTypeEnc)
- }
- dataLen := len(data)
- if dataLen > GZipMinLen {
- data, err = gzip.GZIPEn([]byte(data))
- if err != nil {
- logrus.Error(err)
- return err
- }
- dataType = dataType | byte(gameproto.DataType_DataTypeGZip)
- }
- sendData := make([]byte, 0, dataLen+1)
- sendData = append(append(sendData, dataType), data...)
- //logData, _ := json.Marshal(emitData.Data)
- //logrus.Infof("write to user %d msg:%s", emitData.UserID, string(logData))
- err = conn.WriteMessage(websocket.BinaryMessage, []byte(sendData))
- if err != nil {
- logrus.Error(err, "_", emitData.UserID, "_", sendData)
- return err
- }
- return nil
- }
|