From ad39c75e5d9256909ca82426b43e85cdb3fdb573 Mon Sep 17 00:00:00 2001 From: Gary Kim Date: Fri, 14 Aug 2020 22:35:02 +0800 Subject: [PATCH] Fix error when sending a message with no RCS data Signed-off-by: Gary Kim --- ocs/message.go | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ room/room.go | 12 +++------ 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/ocs/message.go b/ocs/message.go index 668ff08..e23078d 100644 --- a/ocs/message.go +++ b/ocs/message.go @@ -15,6 +15,7 @@ package ocs import ( + "encoding/json" "strings" ) @@ -41,6 +42,11 @@ type TalkRoomMessageData struct { SystemMessage string `json:"systemMessage"` Timestamp int `json:"timestamp"` MessageType MessageType `json:"messageType"` + MessageParameters map[string]RichObjectString `json:"-"` +} + +// talkRoomMessageParameters is used to unmarshal only MessageParameters +type talkRoomMessageParameters struct { MessageParameters map[string]RichObjectString `json:"messageParameters"` } @@ -59,12 +65,78 @@ func (m *TalkRoomMessageData) PlainMessage() string { // TalkRoomMessage describes an ocs response for a Talk room message type TalkRoomMessage struct { + OCS talkRoomMessage `json:"ocs"` +} + +type talkRoomMessage struct { ocs TalkRoomMessage []TalkRoomMessageData `json:"data"` } +// TalkRoomMessageDataUnmarshal unmarshals given ocs request data and returns a TalkRoomMessageData +func TalkRoomMessageDataUnmarshal(data *[]byte) (*TalkRoomMessage, error) { + message := &TalkRoomMessage{} + err := json.Unmarshal(*data, message) + if err != nil { + return nil, err + } + + // Get RCS + var rcs struct { + OCS struct { + ocs + TalkRoomMessage []talkRoomMessageParameters `json:"data"` + } `json:"ocs"` + } + err = json.Unmarshal(*data, &rcs) + // There is no RCS data + if err != nil { + for i := range message.OCS.TalkRoomMessage { + message.OCS.TalkRoomMessage[i].MessageParameters = map[string]RichObjectString{} + } + return message, nil + } + + // There is RCS data + for i := range message.OCS.TalkRoomMessage { + message.OCS.TalkRoomMessage[i].MessageParameters = rcs.OCS.TalkRoomMessage[i].MessageParameters + } + return message, nil +} + // TalkRoomSentResponse describes an ocs response for what is returned when a message is sent type TalkRoomSentResponse struct { + OCS talkRoomSentResponse `json:"ocs"` +} + +type talkRoomSentResponse struct { ocs TalkRoomMessage TalkRoomMessageData `json:"data"` } + +// TalkRoomSentResponseUnmarshal unmarshals given ocs request data and returns a TalkRoomMessageData +func TalkRoomSentResponseUnmarshal(data *[]byte) (*TalkRoomSentResponse, error) { + message := &TalkRoomSentResponse{} + err := json.Unmarshal(*data, message) + if err != nil { + return nil, err + } + + // Get RCS + var rcs struct { + OCS struct { + ocs + TalkRoomMessage talkRoomMessageParameters `json:"data"` + } `json:"ocs"` + } + err = json.Unmarshal(*data, &rcs) + // There is no RCS data + if err != nil { + message.OCS.TalkRoomMessage.MessageParameters = map[string]RichObjectString{} + return message, nil + } + + // There is RCS data + message.OCS.TalkRoomMessage.MessageParameters = rcs.OCS.TalkRoomMessage.MessageParameters + return message, nil +} diff --git a/room/room.go b/room/room.go index 3eedf59..5452993 100644 --- a/room/room.go +++ b/room/room.go @@ -16,7 +16,6 @@ package room import ( "context" - "encoding/json" "errors" "io/ioutil" "time" @@ -79,10 +78,10 @@ func (t *TalkRoom) SendMessage(msg string) (*ocs.TalkRoomMessageData, error) { if res.StatusCode() != 201 { return nil, ErrUnexpectedReturnCode } - var msgInfo struct { - OCS ocs.TalkRoomSentResponse `json:"ocs"` + msgInfo, err := ocs.TalkRoomSentResponseUnmarshal(&res.Data) + if err != nil { + return nil, err } - err = json.Unmarshal(res.Data, &msgInfo) return &msgInfo.OCS.TalkRoomMessage, err } @@ -129,14 +128,11 @@ func (t *TalkRoom) ReceiveMessages(ctx context.Context) (chan ocs.TalkRoomMessag } if res.StatusCode == 200 { lastKnown = res.Header.Get("X-Chat-Last-Given") - var message struct { - OCS ocs.TalkRoomMessage `json:"ocs"` - } data, err := ioutil.ReadAll(res.Body) if err != nil { continue } - err = json.Unmarshal(data, &message) + message, err := ocs.TalkRoomMessageDataUnmarshal(&data) if err != nil { continue }