diff options
author | Gary Kim <gary@garykim.dev> | 2020-07-26 20:51:07 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-26 14:51:07 +0200 |
commit | 2d2bebe976972242cade57cb9512c8fd6326be58 (patch) | |
tree | 34af45321d90e082fa69f02e62ac5c1174c0c5cb /vendor/gomod.garykim.dev/nc-talk/user/user.go | |
parent | e1629994bdbb4257fe91cff0b3fc665814c66ac8 (diff) | |
download | matterbridge-msglm-2d2bebe976972242cade57cb9512c8fd6326be58.tar.gz matterbridge-msglm-2d2bebe976972242cade57cb9512c8fd6326be58.tar.bz2 matterbridge-msglm-2d2bebe976972242cade57cb9512c8fd6326be58.zip |
Fix Nextcloud Talk connection failure (#1179)
Fix #1177
Signed-off-by: Gary Kim <gary@garykim.dev>
Diffstat (limited to 'vendor/gomod.garykim.dev/nc-talk/user/user.go')
-rw-r--r-- | vendor/gomod.garykim.dev/nc-talk/user/user.go | 84 |
1 files changed, 60 insertions, 24 deletions
diff --git a/vendor/gomod.garykim.dev/nc-talk/user/user.go b/vendor/gomod.garykim.dev/nc-talk/user/user.go index c4411ba2..03d7ec8b 100644 --- a/vendor/gomod.garykim.dev/nc-talk/user/user.go +++ b/vendor/gomod.garykim.dev/nc-talk/user/user.go @@ -15,10 +15,12 @@ package user import ( - "encoding/xml" - "reflect" + "encoding/json" + "strings" "github.com/monaco-io/request" + + "gomod.garykim.dev/nc-talk/ocs" ) const ( @@ -35,6 +37,8 @@ type TalkUser struct { // Capabilities describes the capabilities that the Nextcloud Talk instance is capable of. Visit https://nextcloud-talk.readthedocs.io/en/latest/capabilities/ for more info. type Capabilities struct { + AttachmentsFolder string `ocscapability:"config => attachments => folder"` + ChatMaxLength int Audio bool `ocscapability:"audio"` Video bool `ocscapability:"video"` Chat bool `ocscapability:"chat"` @@ -60,18 +64,12 @@ type Capabilities struct { ChatReplies bool `ocscapability:"chat-replies"` CirclesSupport bool `ocscapability:"circles-support"` AttachmentsAllowed bool `ocscapability:"config => attachments => allowed"` - AttachmentsFolder bool `ocscapability:"config => attachments => folder"` ConversationsCanCreate bool `ocscapability:"config => conversations => can-create"` ForceMute bool `ocscapability:"force-mute"` ConversationV2 bool `ocscapability:"conversation-v2"` ChatReferenceID bool `ocscapability:"chat-reference-id"` } -type capabilitiesRequest struct { - XMLName xml.Name `xml:"ocs"` - Capabilities []string `xml:"ocs>data>capabilities>spreed>features>element"` -} - // RequestClient returns a monaco-io that is preconfigured to make OCS API calls func (t *TalkUser) RequestClient(client request.Client) *request.Client { if client.Header == nil { @@ -87,6 +85,12 @@ func (t *TalkUser) RequestClient(client request.Client) *request.Client { Username: t.User, Password: t.Pass, } + + // Set Nextcloud URL if there is no host + if !strings.HasPrefix(client.URL, t.NextcloudURL) { + client.URL = t.NextcloudURL + "/" + client.URL + } + return &client } @@ -98,35 +102,67 @@ func (t *TalkUser) Capabilities() (*Capabilities, error) { client := t.RequestClient(request.Client{ URL: ocsCapabilitiesEndpoint, - Header: map[string]string{ - "Accept": "application/xml", - }, }) res, err := client.Do() if err != nil { return nil, err } - capabilities := &capabilitiesRequest{} - err = xml.Unmarshal(res.Data, capabilities) + capabilitiesRequest := &struct { + Ocs ocs.Capabilities `json:"ocs"` + }{} + + err = json.Unmarshal(res.Data, capabilitiesRequest) if err != nil { return nil, err } - tr := &Capabilities{} + sc := capabilitiesRequest.Ocs.Data.Capabilities.SpreedCapabilities - c := reflect.ValueOf(tr) - for i := 0; i < c.NumField(); i++ { - field := c.Field(i) - tag := field.Type().Field(0).Tag.Get("ocscapability") - - for _, capability := range capabilities.Capabilities { - if capability == tag && field.CanSet() { - field.SetBool(true) - } - } + tr := &Capabilities{ + Audio: sliceContains(sc.Features, "audio"), + Video: sliceContains(sc.Features, "video"), + Chat: sliceContains(sc.Features, "chat"), + GuestSignaling: sliceContains(sc.Features, "guest-signaling"), + EmptyGroupRoom: sliceContains(sc.Features, "empty-group-room"), + GuestDisplayNames: sliceContains(sc.Features, "guest-display-names"), + MultiRoomUsers: sliceContains(sc.Features, "multi-room-users"), + ChatV2: sliceContains(sc.Features, "chat-v2"), + Favorites: sliceContains(sc.Features, "favorites"), + LastRoomActivity: sliceContains(sc.Features, "last-room-activity"), + NoPing: sliceContains(sc.Features, "no-ping"), + SystemMessages: sliceContains(sc.Features, "system-messages"), + MentionFlag: sliceContains(sc.Features, "mention-flag"), + InCallFlags: sliceContains(sc.Features, "in-call-flags"), + InviteByMail: sliceContains(sc.Features, "invite-by-mail"), + NotificationLevels: sliceContains(sc.Features, "notification-levels"), + InviteGroupsAndMails: sliceContains(sc.Features, "invite-groups-and-mails"), + LockedOneToOneRooms: sliceContains(sc.Features, "locked-one-to-one-rooms"), + ReadOnlyRooms: sliceContains(sc.Features, "read-only-rooms"), + ChatReadMarker: sliceContains(sc.Features, "chat-read-marker"), + WebinaryLobby: sliceContains(sc.Features, "webinary-lobby"), + StartCallFlag: sliceContains(sc.Features, "start-call-flag"), + ChatReplies: sliceContains(sc.Features, "chat-replies"), + CirclesSupport: sliceContains(sc.Features, "circles-support"), + AttachmentsAllowed: sc.Config.Attachments.Allowed, + AttachmentsFolder: sc.Config.Attachments.Folder, + ConversationsCanCreate: sc.Config.Conversations.CanCreate, + ForceMute: sliceContains(sc.Features, "force-mute"), + ConversationV2: sliceContains(sc.Features, "conversation-v2"), + ChatReferenceID: sliceContains(sc.Features, "chat-reference-id"), + ChatMaxLength: sc.Config.Chat.MaxLength, } t.capabilities = tr return tr, nil } + +// sliceContains does the slice contain the string +func sliceContains(s []string, search string) bool { + for _, n := range s { + if n == search { + return true + } + } + return false +} |