diff options
Diffstat (limited to 'teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs')
4 files changed, 286 insertions, 0 deletions
diff --git a/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/capabilities.go b/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/capabilities.go new file mode 100644 index 0000000..8b2919f --- /dev/null +++ b/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/capabilities.go @@ -0,0 +1,46 @@ +// 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. + +package ocs + +// Capabilities describes the response from the capabilities request +type Capabilities struct { + ocs + Data struct { + Capabilities struct { + SpreedCapabilities SpreedCapabilities `json:"spreed"` + } `json:"capabilities"` + } `json:"data"` +} + +// SpreedCapabilities describes the Nextcloud Talk capabilities response +type SpreedCapabilities struct { + Features []string `json:"features"` + Config struct { + Attachments struct { + Allowed bool `json:"allowed"` + Folder string `json:"folder"` + } `json:"attachments"` + Chat struct { + MaxLength int `json:"max-length"` + ReadPrivacy int `json:"read-privacy"` + } `json:"chat"` + Conversations struct { + CanCreate bool `json:"can-create"` + } `json:"conversations"` + Previews struct { + MaxGifSize int `json:"max-gif-size"` + } `json:"previews"` + } `json:"config"` +} diff --git a/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/message.go b/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/message.go new file mode 100644 index 0000000..1a8f95d --- /dev/null +++ b/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/message.go @@ -0,0 +1,177 @@ +// 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. + +package ocs + +import ( + "encoding/json" + "strings" +) + +// MessageType describes what kind of message a returned Nextcloud Talk message is +type MessageType string + +// ActorType describes what kind of actor a returned Nextcloud Talk message is from +type ActorType string + +const ( + // MessageComment is a Nextcloud Talk message that is a comment + MessageComment MessageType = "comment" + + // MessageSystem is a Nextcloud Talk message that is a system + MessageSystem MessageType = "system" + + // MessageCommand is a Nextcloud Talk message that is a command + MessageCommand MessageType = "command" + + // MessageDelete is a Nextcloud Talk message indicating a message that was deleted + // + // If a message has been deleted, a message of MessageType MessageSystem is + // sent through the channel for which the parent message's MessageType is MessageDelete. + // So, in order to check if a new message is a message deletion request, a check + // like this can be used: + // msg.MessageType == ocs.MessageSystem && msg.Parent != nil && msg.Parent.MessageType == ocs.MessageDelete + MessageDelete MessageType = "comment_deleted" + + // ActorUser is a Nextcloud Talk message sent by a user + ActorUser ActorType = "users" + + // ActorGuest is a Nextcloud Talk message sent by a guest + ActorGuest ActorType = "guests" +) + +// TalkRoomMessageData describes the data part of a ocs response for a Talk room message +// +// Error will be set if a message request ran into an error. +type TalkRoomMessageData struct { + Error error `json:"-"` + Message string `json:"message"` + ID int `json:"id"` + ActorType ActorType `json:"actorType"` + ActorID string `json:"actorId"` + ActorDisplayName string `json:"actorDisplayName"` + SystemMessage string `json:"systemMessage"` + Timestamp int `json:"timestamp"` + MessageType MessageType `json:"messageType"` + Deleted bool `json:"deleted"` + Parent *TalkRoomMessageData `json:"parent"` + 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 +} + +// DisplayName returns the display name for the sender of the message (" (Guest)" is appended if sent by a guest user) +func (m *TalkRoomMessageData) DisplayName() string { + if m.ActorType == ActorGuest { + if m.ActorDisplayName == "" { + return "Guest" + } + return m.ActorDisplayName + " (Guest)" + } + return m.ActorDisplayName +} + +// 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/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/ocs.go b/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/ocs.go new file mode 100644 index 0000000..28607b6 --- /dev/null +++ b/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/ocs.go @@ -0,0 +1,25 @@ +// 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. + +package ocs + +type ocs struct { + OCSMeta ocsMeta `json:"meta"` +} + +type ocsMeta struct { + Status string `json:"status"` + StatusCode int `json:"statuscode"` + Message string `json:"message"` +} diff --git a/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/ros.go b/teleirc/matterbridge/vendor/gomod.garykim.dev/nc-talk/ocs/ros.go new file mode 100644 index 0000000..82f72bb --- /dev/null +++ b/teleirc/matterbridge/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" +) |
