Skip to content

Commit

Permalink
Add capabilities and minimum compatability with Talk 12.0
Browse files Browse the repository at this point in the history
Signed-off-by: Gary Kim <[email protected]>
  • Loading branch information
gary-kim committed May 24, 2021
1 parent fac5c4c commit 11a7491
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
4 changes: 4 additions & 0 deletions ocs/capabilities.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,13 @@ type SpreedCapabilities struct {
} `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"`
}
51 changes: 48 additions & 3 deletions user/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,16 @@ import (

const (
ocsCapabilitiesEndpoint = "/ocs/v2.php/cloud/capabilities"
ocsRoomsEndpoint = "/ocs/v2.php/apps/spreed/api/v2/room"
ocsRoomsv2Endpoint = "/ocs/v2.php/apps/spreed/api/v2/room"
ocsRoomsv4Endpoint = "/ocs/v2.php/apps/spreed/api/v4/room"
)

var (
// ErrUserIsNil is returned when a funciton is called with an nil user.
ErrUserIsNil = errors.New("user is nil")

// ErrCannotDownloadFile
ErrCannotDownloadFile = errors.New("cannot download file")
)

// TalkUser represents a user of Nextcloud Talk
Expand Down Expand Up @@ -83,6 +87,20 @@ type Capabilities struct {
ForceMute bool `ocscapability:"force-mute"`
ConversationV2 bool `ocscapability:"conversation-v2"`
ChatReferenceID bool `ocscapability:"chat-reference-id"`
ConversationV3 bool `ocscapability:"conversation-v3"`
ConversationV4 bool `ocscapability:"conversation-v4"`
SIPSupport bool `ocscapability:"sip-support"`
ChatReadStatus bool `ocscapability:"chat-read-status"`
ListableRooms bool `ocscapability:"listable-rooms"`
PhonebookSearch bool `ocscapability:"phonebook-search"`
RaiseHand bool `ocscapability:"raise-hand"`
RoomDescription bool `ocscapability:"room-description"`
DeleteMessages bool `ocscapability:"delete-messages"`
RichObjectSharing bool `ocscapability:"rich-object-sharing"`
ConversationCallFlags bool `ocscapability:"conversation-call-flags"`
GeoLocationSharing bool `ocscapability:"geo-location-sharing"`
ReadPrivacyConfig bool `ocscapability:"config => chat => read-privacy"`
MaxGifSizeConfig int `ocscapability:"config => previews => max-gif-size"`
}

// RoomInfo contains information about a room
Expand Down Expand Up @@ -160,8 +178,17 @@ func (t *TalkUser) RequestClient(client request.Client) *request.Client {

// GetRooms returns a list of all rooms the user is in
func (t *TalkUser) GetRooms() (*[]RoomInfo, error) {
endpoint := ocsRoomsv2Endpoint
cap, err := t.Capabilities()
if err != nil {
return nil, err
}
if (cap.ConversationV4) {
endpoint = ocsRoomsv4Endpoint
}

client := t.RequestClient(request.Client{
URL: ocsRoomsEndpoint,
URL: endpoint,
})
res, err := client.Do()
if err != nil {
Expand Down Expand Up @@ -239,6 +266,20 @@ func (t *TalkUser) Capabilities() (*Capabilities, error) {
ConversationV2: sliceContains(sc.Features, "conversation-v2"),
ChatReferenceID: sliceContains(sc.Features, "chat-reference-id"),
ChatMaxLength: sc.Config.Chat.MaxLength,
ConversationV3: sliceContains(sc.Features, "conversation-v3"),
ConversationV4: sliceContains(sc.Features, "conversation-v4"),
SIPSupport: sliceContains(sc.Features, "sip-support"),
ChatReadStatus: sliceContains(sc.Features, "chat-read-status"),
ListableRooms: sliceContains(sc.Features, "listable-rooms"),
PhonebookSearch: sliceContains(sc.Features, "phonebook-search"),
RaiseHand: sliceContains(sc.Features, "raise-hand"),
RoomDescription: sliceContains(sc.Features, "room-description"),
ReadPrivacyConfig: sc.Config.Chat.ReadPrivacy != 0,
MaxGifSizeConfig: sc.Config.Previews.MaxGifSize,
DeleteMessages: sliceContains(sc.Features, "delete-messages"),
RichObjectSharing: sliceContains(sc.Features, "rich-object-sharing"),
ConversationCallFlags: sliceContains(sc.Features, "conversation-call-flags"),
GeoLocationSharing: sliceContains(sc.Features, "geo-location-sharing"),
}

t.capabilities = tr
Expand All @@ -264,7 +305,11 @@ func (t *TalkUser) DownloadFile(path string) (data *[]byte, err error) {
URL: url,
})
res, err := c.Do()
if err != nil || res.StatusCode() != 200 {
if err != nil {
return
}
if res.StatusCode() != 200 {
err = ErrCannotDownloadFile
return
}
data = &res.Data
Expand Down

0 comments on commit 11a7491

Please sign in to comment.