123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package server
- import (
- "encoding/json"
- "github.com/mitchellh/mapstructure"
- )
- type MessageType = uint8
- type ChatingContentType = uint8
- const (
- MessageTypeChating MessageType = 1 + iota // MessageTypeDialogue 语聊消息
- MessageTypeReply // MessageTypeReply 回复消息
- MessageTypeError // MessageTypeError 错误消息,当服务器出现错误时,会发送此消息
- MessageTypePing // MessageTypePing ping
- MessageTypePong // MessageTypePong pong
- MessageTypeEmpty // MessageTypeEmpty 空消息
- )
- const (
- ChatingContentTypeText ChatingContentType = 1 + iota // ChatingContentTypeText 语聊文字消息
- ChatingContentTypeMetadata // ChatingContentTypeMetadata 媒体文件消息
- )
- const (
- PingPayload byte = 0x70
- )
- type Message struct {
- Type MessageType `json:"type"`
- MessageId string `json:"messageId"` // MessageId 当前消息的Id
- Content any `json:"content"` // Content 内容
- receiver string `json:"-"` // Receiver 消息接受者
- }
- // ChatingContent to client dialogue message
- type ChatingContent struct {
- Receiver string `json:"receiver"`
- PayloadType ChatingContentType `json:"payloadType"`
- Payload any `json:"payload"`
- }
- // ContentText received a text message from the client
- type ContentText struct {
- Raw string `json:"raw"`
- }
- // ContentMetadata received media file message from client
- type ContentMetadata struct {
- Url string `json:"url"` // Url 文件地址
- FileType string `json:"fileType"` // FileType 文件类型
- Duration uint `json:"duration"` // Duration 视频/语音时长
- }
- // COntentReply to client after receiving the message
- type ContentReply struct {
- MessageId string `json:"messageId"` // MessageId 消息ID
- ReplyId string `json:"replyId"` // ReplyId 回复ID
- }
- type ContentError struct {
- Err string `json:"err"`
- }
- func (m *Message) IsNeedReply() bool {
- return m.MessageId != ""
- }
- func deserializeMessage(bytes []byte) *Message {
- if len(bytes) == 0 {
- return emptyMessage()
- }
- if bytes[0] == PingPayload {
- return pingMessage()
- }
- var message Message
- _ = json.Unmarshal(bytes, &message)
- switch message.Type {
- // Is it a chating message
- case MessageTypeChating:
- var chatingContent ChatingContent
- mapstructure.Decode(message.Content, &chatingContent)
- message.Content = chatingContent
- }
- return &message
- }
- func serializationMessage(message *Message) []byte {
- bytes, _ := json.Marshal(message)
- return bytes
- }
- // newReplyMessage new a to client reply message
- func newReplyMessage(messageId string) *Message {
- return &Message{MessageId: messageId, Type: MessageTypeReply}
- }
- func pingMessage() *Message {
- return &Message{Type: MessageTypePing}
- }
- func pongMessage() *Message {
- return &Message{Type: MessageTypePong}
- }
- func emptyMessage() *Message {
- return &Message{Type: MessageTypeEmpty}
- }
|