notify.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package online
  2. import (
  3. "runtime"
  4. "github.com/gorilla/websocket"
  5. "github.com/sirupsen/logrus"
  6. "gogs.daxia.dev/huanan/pkg.daxia.dev/encrypt"
  7. "gogs.daxia.dev/huanan/pkg.daxia.dev/gzip"
  8. "nn.daxia.dev/gameproto"
  9. "nn.daxia.dev/model"
  10. )
  11. type EmitData struct {
  12. UserID uint
  13. NotifyType gameproto.NotifyTypeEnum //通知类型
  14. Encrypt bool //是否需要加密
  15. Data string //发送内容
  16. }
  17. const GZipMinLen = 1024
  18. func SendMsg(conn *websocket.Conn, emitData EmitData) error {
  19. defer func() {
  20. if err := recover(); err != nil {
  21. logrus.Error(err)
  22. buf := make([]byte, 2048*5)
  23. n := runtime.Stack(buf, false)
  24. stackInfo := string(buf[:n])
  25. logrus.Errorf("panic stack info %s", stackInfo)
  26. }
  27. }()
  28. var err error
  29. data := []byte(emitData.Data)
  30. tmpData := make([]byte, 0, len(data)+1)
  31. notifyType := byte(int32(emitData.NotifyType))
  32. data = append(append(tmpData, notifyType), data...)
  33. dataType := uint8(gameproto.DataType_DataTypeNormal)
  34. emitData.Encrypt = false
  35. if emitData.Encrypt {
  36. data, _ = encrypt.AesEncrypt(data, model.AESKey)
  37. dataType = dataType | byte(gameproto.DataType_DataTypeEnc)
  38. }
  39. dataLen := len(data)
  40. if dataLen > GZipMinLen {
  41. data, err = gzip.GZIPEn([]byte(data))
  42. if err != nil {
  43. logrus.Error(err)
  44. return err
  45. }
  46. dataType = dataType | byte(gameproto.DataType_DataTypeGZip)
  47. }
  48. sendData := make([]byte, 0, dataLen+1)
  49. sendData = append(append(sendData, dataType), data...)
  50. //logData, _ := json.Marshal(emitData.Data)
  51. //logrus.Infof("write to user %d msg:%s", emitData.UserID, string(logData))
  52. err = conn.WriteMessage(websocket.BinaryMessage, []byte(sendData))
  53. if err != nil {
  54. logrus.Error(err, "_", emitData.UserID, "_", sendData)
  55. return err
  56. }
  57. return nil
  58. }