@ -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 func i ton is called with an nil user.
// ErrUserIsNil is returned when a func ti on is called with an nil user.
ErrUserIsNil = errors . New ( "user is nil" )
// ErrCannotDownloadFile is returned when a function cannot download the requested file
ErrCannotDownloadFile = errors . New ( "cannot download file" )
)
// TalkUser represents a user of Nextcloud Talk
@ -53,36 +57,52 @@ type TalkUserConfig 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" `
GuestSignaling bool ` ocscapability:"guest-signaling" `
EmptyGroupRoom bool ` ocscapability:"empty-group-room" `
GuestDisplayNames bool ` ocscapability:"guest-display-names" `
MultiRoomUsers bool ` ocscapability:"multi-room-users" `
ChatV2 bool ` ocscapability:"chat-v2" `
Favorites bool ` ocscapability:"favorites" `
LastRoomActivity bool ` ocscapability:"last-room-activity" `
NoPing bool ` ocscapability:"no-ping" `
SystemMessages bool ` ocscapability:"system-messages" `
MentionFlag bool ` ocscapability:"mention-flag" `
InCallFlags bool ` ocscapability:"in-call-flags" `
InviteByMail bool ` ocscapability:"invite-by-mail" `
NotificationLevels bool ` ocscapability:"notification-levels" `
InviteGroupsAndMails bool ` ocscapability:"invite-groups-and-mails" `
LockedOneToOneRooms bool ` ocscapability:"locked-one-to-one-rooms" `
ReadOnlyRooms bool ` ocscapability:"read-only-rooms" `
ChatReadMarker bool ` ocscapability:"chat-read-marker" `
WebinaryLobby bool ` ocscapability:"webinary-lobby" `
StartCallFlag bool ` ocscapability:"start-call-flag" `
ChatReplies bool ` ocscapability:"chat-replies" `
CirclesSupport bool ` ocscapability:"circles-support" `
AttachmentsAllowed bool ` ocscapability:"config => attachments => allowed" `
ConversationsCanCreate bool ` ocscapability:"config => conversations => can-create" `
ForceMute bool ` ocscapability:"force-mute" `
ConversationV2 bool ` ocscapability:"conversation-v2" `
ChatReferenceID bool ` ocscapability:"chat-reference-id" `
Audio bool ` ocscapability:"audio" `
Video bool ` ocscapability:"video" `
Chat bool ` ocscapability:"chat" `
GuestSignaling bool ` ocscapability:"guest-signaling" `
EmptyGroupRoom bool ` ocscapability:"empty-group-room" `
GuestDisplayNames bool ` ocscapability:"guest-display-names" `
MultiRoomUsers bool ` ocscapability:"multi-room-users" `
ChatV2 bool ` ocscapability:"chat-v2" `
Favorites bool ` ocscapability:"favorites" `
LastRoomActivity bool ` ocscapability:"last-room-activity" `
NoPing bool ` ocscapability:"no-ping" `
SystemMessages bool ` ocscapability:"system-messages" `
MentionFlag bool ` ocscapability:"mention-flag" `
InCallFlags bool ` ocscapability:"in-call-flags" `
InviteByMail bool ` ocscapability:"invite-by-mail" `
NotificationLevels bool ` ocscapability:"notification-levels" `
InviteGroupsAndMails bool ` ocscapability:"invite-groups-and-mails" `
LockedOneToOneRooms bool ` ocscapability:"locked-one-to-one-rooms" `
ReadOnlyRooms bool ` ocscapability:"read-only-rooms" `
ChatReadMarker bool ` ocscapability:"chat-read-marker" `
WebinaryLobby bool ` ocscapability:"webinary-lobby" `
StartCallFlag bool ` ocscapability:"start-call-flag" `
ChatReplies bool ` ocscapability:"chat-replies" `
CirclesSupport bool ` ocscapability:"circles-support" `
AttachmentsAllowed bool ` ocscapability:"config => attachments => allowed" `
ConversationsCanCreate bool ` ocscapability:"config => conversations => can-create" `
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" `
SignalingV3 bool ` ocscapability:"signaling-v3" `
TempUserAvatarAPI bool ` ocscapability:"temp-user-avatar-api" `
MaxGifSizeConfig int ` ocscapability:"config => previews => max-gif-size" `
ChatMaxLength int ` ocscapability:"config => chat => max-length" `
}
// RoomInfo contains information about a room
@ -160,8 +180,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
capabilities , err := t . Capabilities ( )
if err != nil {
return nil , err
}
if capabilities . ConversationV4 {
endpoint = ocsRoomsv4Endpoint
}
client := t . RequestClient ( request . Client {
URL : ocsRoomsEndpoint ,
URL : e ndpoint,
} )
res , err := client . Do ( )
if err != nil {
@ -239,6 +268,22 @@ 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" ) ,
SignalingV3 : sliceContains ( sc . Features , "signaling-v3" ) ,
TempUserAvatarAPI : sliceContains ( sc . Features , "temp-user-avatar-api" ) ,
}
t . capabilities = tr
@ -264,7 +309,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