diff options
Diffstat (limited to 'vendor/gomod.garykim.dev/nc-talk/ocs')
-rw-r--r-- | vendor/gomod.garykim.dev/nc-talk/ocs/message.go | 104 | ||||
-rw-r--r-- | vendor/gomod.garykim.dev/nc-talk/ocs/ros.go | 38 |
2 files changed, 135 insertions, 7 deletions
diff --git a/vendor/gomod.garykim.dev/nc-talk/ocs/message.go b/vendor/gomod.garykim.dev/nc-talk/ocs/message.go index 6093e638..e23078de 100644 --- a/vendor/gomod.garykim.dev/nc-talk/ocs/message.go +++ b/vendor/gomod.garykim.dev/nc-talk/ocs/message.go @@ -14,6 +14,11 @@ package ocs +import ( + "encoding/json" + "strings" +) + // MessageType describes what kind of message a returned Nextcloud Talk message is type MessageType string @@ -30,23 +35,108 @@ const ( // TalkRoomMessageData describes the data part of a ocs response for a Talk room message type TalkRoomMessageData struct { - Message string `json:"message"` - ID int `json:"id"` - ActorID string `json:"actorId"` - ActorDisplayName string `json:"actorDisplayName"` - SystemMessage string `json:"systemMessage"` - Timestamp int `json:"timestamp"` - MessageType MessageType `json:"messageType"` + Message string `json:"message"` + ID int `json:"id"` + ActorID string `json:"actorId"` + ActorDisplayName string `json:"actorDisplayName"` + 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"` +} + +// PlainMessage returns the message string with placeholders replaced +// +// * User and group placeholders will be replaced with the name of the user or group respectively. +// +// * File placeholders will be replaced with the name of the file. +func (m *TalkRoomMessageData) PlainMessage() string { + tr := m.Message + for key, value := range m.MessageParameters { + tr = strings.ReplaceAll(tr, "{"+key+"}", value.Name) + } + return tr } // 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/vendor/gomod.garykim.dev/nc-talk/ocs/ros.go b/vendor/gomod.garykim.dev/nc-talk/ocs/ros.go new file mode 100644 index 00000000..82f72bb0 --- /dev/null +++ b/vendor/gomod.garykim.dev/nc-talk/ocs/ros.go @@ -0,0 +1,38 @@ +// Copyright (c) 2020 Gary Kim <gary@garykim.dev>, All Rights Reserved +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// File describes Nextcloud's Rich Object Strings (https://github.com/nextcloud/server/issues/1706) + +package ocs + +// RichObjectString describes the content of placeholders in TalkRoomMessageData +type RichObjectString struct { + Type RichObjectStringType `json:"type"` + ID string `json:"id"` + Name string `json:"name"` + Path string `json:"path"` + Link string `json:"link"` +} + +// RichObjectStringType describes what a rich object string is describing +type RichObjectStringType string + +const ( + // ROSTypeUser describes a rich object string that is a user + ROSTypeUser RichObjectStringType = "user" + // ROSTypeGroup describes a rich object string that is a group + ROSTypeGroup RichObjectStringType = "group" + // ROSTypeFile describes a rich object string that is a file + ROSTypeFile RichObjectStringType = "file" +) |