diff options
Diffstat (limited to 'vendor/github.com/nlopes/slack/users.go')
-rw-r--r-- | vendor/github.com/nlopes/slack/users.go | 597 |
1 files changed, 0 insertions, 597 deletions
diff --git a/vendor/github.com/nlopes/slack/users.go b/vendor/github.com/nlopes/slack/users.go deleted file mode 100644 index 4da8e4ce..00000000 --- a/vendor/github.com/nlopes/slack/users.go +++ /dev/null @@ -1,597 +0,0 @@ -package slack - -import ( - "context" - "encoding/json" - "net/url" - "strconv" - "time" -) - -const ( - DEFAULT_USER_PHOTO_CROP_X = -1 - DEFAULT_USER_PHOTO_CROP_Y = -1 - DEFAULT_USER_PHOTO_CROP_W = -1 -) - -// UserProfile contains all the information details of a given user -type UserProfile struct { - FirstName string `json:"first_name"` - LastName string `json:"last_name"` - RealName string `json:"real_name"` - RealNameNormalized string `json:"real_name_normalized"` - DisplayName string `json:"display_name"` - DisplayNameNormalized string `json:"display_name_normalized"` - Email string `json:"email"` - Skype string `json:"skype"` - Phone string `json:"phone"` - Image24 string `json:"image_24"` - Image32 string `json:"image_32"` - Image48 string `json:"image_48"` - Image72 string `json:"image_72"` - Image192 string `json:"image_192"` - ImageOriginal string `json:"image_original"` - Title string `json:"title"` - BotID string `json:"bot_id,omitempty"` - ApiAppID string `json:"api_app_id,omitempty"` - StatusText string `json:"status_text,omitempty"` - StatusEmoji string `json:"status_emoji,omitempty"` - StatusExpiration int `json:"status_expiration"` - Team string `json:"team"` - Fields UserProfileCustomFields `json:"fields"` -} - -// UserProfileCustomFields represents user profile's custom fields. -// Slack API's response data type is inconsistent so we use the struct. -// For detail, please see below. -// https://github.com/nlopes/slack/pull/298#discussion_r185159233 -type UserProfileCustomFields struct { - fields map[string]UserProfileCustomField -} - -// UnmarshalJSON is the implementation of the json.Unmarshaler interface. -func (fields *UserProfileCustomFields) UnmarshalJSON(b []byte) error { - // https://github.com/nlopes/slack/pull/298#discussion_r185159233 - if string(b) == "[]" { - return nil - } - return json.Unmarshal(b, &fields.fields) -} - -// MarshalJSON is the implementation of the json.Marshaler interface. -func (fields UserProfileCustomFields) MarshalJSON() ([]byte, error) { - if len(fields.fields) == 0 { - return []byte("[]"), nil - } - return json.Marshal(fields.fields) -} - -// ToMap returns a map of custom fields. -func (fields *UserProfileCustomFields) ToMap() map[string]UserProfileCustomField { - return fields.fields -} - -// Len returns the number of custom fields. -func (fields *UserProfileCustomFields) Len() int { - return len(fields.fields) -} - -// SetMap sets a map of custom fields. -func (fields *UserProfileCustomFields) SetMap(m map[string]UserProfileCustomField) { - fields.fields = m -} - -// FieldsMap returns a map of custom fields. -func (profile *UserProfile) FieldsMap() map[string]UserProfileCustomField { - return profile.Fields.ToMap() -} - -// SetFieldsMap sets a map of custom fields. -func (profile *UserProfile) SetFieldsMap(m map[string]UserProfileCustomField) { - profile.Fields.SetMap(m) -} - -// UserProfileCustomField represents a custom user profile field -type UserProfileCustomField struct { - Value string `json:"value"` - Alt string `json:"alt"` - Label string `json:"label"` -} - -// User contains all the information of a user -type User struct { - ID string `json:"id"` - TeamID string `json:"team_id"` - Name string `json:"name"` - Deleted bool `json:"deleted"` - Color string `json:"color"` - RealName string `json:"real_name"` - TZ string `json:"tz,omitempty"` - TZLabel string `json:"tz_label"` - TZOffset int `json:"tz_offset"` - Profile UserProfile `json:"profile"` - IsBot bool `json:"is_bot"` - IsAdmin bool `json:"is_admin"` - IsOwner bool `json:"is_owner"` - IsPrimaryOwner bool `json:"is_primary_owner"` - IsRestricted bool `json:"is_restricted"` - IsUltraRestricted bool `json:"is_ultra_restricted"` - IsStranger bool `json:"is_stranger"` - IsAppUser bool `json:"is_app_user"` - IsInvitedUser bool `json:"is_invited_user"` - Has2FA bool `json:"has_2fa"` - HasFiles bool `json:"has_files"` - Presence string `json:"presence"` - Locale string `json:"locale"` - Updated JSONTime `json:"updated"` - Enterprise EnterpriseUser `json:"enterprise_user,omitempty"` -} - -// UserPresence contains details about a user online status -type UserPresence struct { - Presence string `json:"presence,omitempty"` - Online bool `json:"online,omitempty"` - AutoAway bool `json:"auto_away,omitempty"` - ManualAway bool `json:"manual_away,omitempty"` - ConnectionCount int `json:"connection_count,omitempty"` - LastActivity JSONTime `json:"last_activity,omitempty"` -} - -type UserIdentityResponse struct { - User UserIdentity `json:"user"` - Team TeamIdentity `json:"team"` - SlackResponse -} - -type UserIdentity struct { - ID string `json:"id"` - Name string `json:"name"` - Email string `json:"email"` - Image24 string `json:"image_24"` - Image32 string `json:"image_32"` - Image48 string `json:"image_48"` - Image72 string `json:"image_72"` - Image192 string `json:"image_192"` - Image512 string `json:"image_512"` -} - -// EnterpriseUser is present when a user is part of Slack Enterprise Grid -// https://api.slack.com/types/user#enterprise_grid_user_objects -type EnterpriseUser struct { - ID string `json:"id"` - EnterpriseID string `json:"enterprise_id"` - EnterpriseName string `json:"enterprise_name"` - IsAdmin bool `json:"is_admin"` - IsOwner bool `json:"is_owner"` - Teams []string `json:"teams"` -} - -type TeamIdentity struct { - ID string `json:"id"` - Name string `json:"name"` - Domain string `json:"domain"` - Image34 string `json:"image_34"` - Image44 string `json:"image_44"` - Image68 string `json:"image_68"` - Image88 string `json:"image_88"` - Image102 string `json:"image_102"` - Image132 string `json:"image_132"` - Image230 string `json:"image_230"` - ImageDefault bool `json:"image_default"` - ImageOriginal string `json:"image_original"` -} - -type userResponseFull struct { - Members []User `json:"members,omitempty"` - User `json:"user,omitempty"` - UserPresence - SlackResponse - Metadata ResponseMetadata `json:"response_metadata"` -} - -type UserSetPhotoParams struct { - CropX int - CropY int - CropW int -} - -func NewUserSetPhotoParams() UserSetPhotoParams { - return UserSetPhotoParams{ - CropX: DEFAULT_USER_PHOTO_CROP_X, - CropY: DEFAULT_USER_PHOTO_CROP_Y, - CropW: DEFAULT_USER_PHOTO_CROP_W, - } -} - -func (api *Client) userRequest(ctx context.Context, path string, values url.Values) (*userResponseFull, error) { - response := &userResponseFull{} - err := api.postMethod(ctx, path, values, response) - if err != nil { - return nil, err - } - - return response, response.Err() -} - -// GetUserPresence will retrieve the current presence status of given user. -func (api *Client) GetUserPresence(user string) (*UserPresence, error) { - return api.GetUserPresenceContext(context.Background(), user) -} - -// GetUserPresenceContext will retrieve the current presence status of given user with a custom context. -func (api *Client) GetUserPresenceContext(ctx context.Context, user string) (*UserPresence, error) { - values := url.Values{ - "token": {api.token}, - "user": {user}, - } - - response, err := api.userRequest(ctx, "users.getPresence", values) - if err != nil { - return nil, err - } - return &response.UserPresence, nil -} - -// GetUserInfo will retrieve the complete user information -func (api *Client) GetUserInfo(user string) (*User, error) { - return api.GetUserInfoContext(context.Background(), user) -} - -// GetUserInfoContext will retrieve the complete user information with a custom context -func (api *Client) GetUserInfoContext(ctx context.Context, user string) (*User, error) { - values := url.Values{ - "token": {api.token}, - "user": {user}, - "include_locale": {strconv.FormatBool(true)}, - } - - response, err := api.userRequest(ctx, "users.info", values) - if err != nil { - return nil, err - } - return &response.User, nil -} - -// GetUsersOption options for the GetUsers method call. -type GetUsersOption func(*UserPagination) - -// GetUsersOptionLimit limit the number of users returned -func GetUsersOptionLimit(n int) GetUsersOption { - return func(p *UserPagination) { - p.limit = n - } -} - -// GetUsersOptionPresence include user presence -func GetUsersOptionPresence(n bool) GetUsersOption { - return func(p *UserPagination) { - p.presence = n - } -} - -func newUserPagination(c *Client, options ...GetUsersOption) (up UserPagination) { - up = UserPagination{ - c: c, - limit: 200, // per slack api documentation. - } - - for _, opt := range options { - opt(&up) - } - - return up -} - -// UserPagination allows for paginating over the users -type UserPagination struct { - Users []User - limit int - presence bool - previousResp *ResponseMetadata - c *Client -} - -// Done checks if the pagination has completed -func (UserPagination) Done(err error) bool { - return err == errPaginationComplete -} - -// Failure checks if pagination failed. -func (t UserPagination) Failure(err error) error { - if t.Done(err) { - return nil - } - - return err -} - -func (t UserPagination) Next(ctx context.Context) (_ UserPagination, err error) { - var ( - resp *userResponseFull - ) - - if t.c == nil || (t.previousResp != nil && t.previousResp.Cursor == "") { - return t, errPaginationComplete - } - - t.previousResp = t.previousResp.initialize() - - values := url.Values{ - "limit": {strconv.Itoa(t.limit)}, - "presence": {strconv.FormatBool(t.presence)}, - "token": {t.c.token}, - "cursor": {t.previousResp.Cursor}, - "include_locale": {strconv.FormatBool(true)}, - } - - if resp, err = t.c.userRequest(ctx, "users.list", values); err != nil { - return t, err - } - - t.c.Debugf("GetUsersContext: got %d users; metadata %v", len(resp.Members), resp.Metadata) - t.Users = resp.Members - t.previousResp = &resp.Metadata - - return t, nil -} - -// GetUsersPaginated fetches users in a paginated fashion, see GetUsersContext for usage. -func (api *Client) GetUsersPaginated(options ...GetUsersOption) UserPagination { - return newUserPagination(api, options...) -} - -// GetUsers returns the list of users (with their detailed information) -func (api *Client) GetUsers() ([]User, error) { - return api.GetUsersContext(context.Background()) -} - -// GetUsersContext returns the list of users (with their detailed information) with a custom context -func (api *Client) GetUsersContext(ctx context.Context) (results []User, err error) { - p := api.GetUsersPaginated() - for err == nil { - p, err = p.Next(ctx) - if err == nil { - results = append(results, p.Users...) - } else if rateLimitedError, ok := err.(*RateLimitedError); ok { - select { - case <-ctx.Done(): - err = ctx.Err() - case <-time.After(rateLimitedError.RetryAfter): - err = nil - } - } - } - - return results, p.Failure(err) -} - -// GetUserByEmail will retrieve the complete user information by email -func (api *Client) GetUserByEmail(email string) (*User, error) { - return api.GetUserByEmailContext(context.Background(), email) -} - -// GetUserByEmailContext will retrieve the complete user information by email with a custom context -func (api *Client) GetUserByEmailContext(ctx context.Context, email string) (*User, error) { - values := url.Values{ - "token": {api.token}, - "email": {email}, - } - response, err := api.userRequest(ctx, "users.lookupByEmail", values) - if err != nil { - return nil, err - } - return &response.User, nil -} - -// SetUserAsActive marks the currently authenticated user as active -func (api *Client) SetUserAsActive() error { - return api.SetUserAsActiveContext(context.Background()) -} - -// SetUserAsActiveContext marks the currently authenticated user as active with a custom context -func (api *Client) SetUserAsActiveContext(ctx context.Context) (err error) { - values := url.Values{ - "token": {api.token}, - } - - _, err = api.userRequest(ctx, "users.setActive", values) - return err -} - -// SetUserPresence changes the currently authenticated user presence -func (api *Client) SetUserPresence(presence string) error { - return api.SetUserPresenceContext(context.Background(), presence) -} - -// SetUserPresenceContext changes the currently authenticated user presence with a custom context -func (api *Client) SetUserPresenceContext(ctx context.Context, presence string) error { - values := url.Values{ - "token": {api.token}, - "presence": {presence}, - } - - _, err := api.userRequest(ctx, "users.setPresence", values) - return err -} - -// GetUserIdentity will retrieve user info available per identity scopes -func (api *Client) GetUserIdentity() (*UserIdentityResponse, error) { - return api.GetUserIdentityContext(context.Background()) -} - -// GetUserIdentityContext will retrieve user info available per identity scopes with a custom context -func (api *Client) GetUserIdentityContext(ctx context.Context) (response *UserIdentityResponse, err error) { - values := url.Values{ - "token": {api.token}, - } - response = &UserIdentityResponse{} - - err = api.postMethod(ctx, "users.identity", values, response) - if err != nil { - return nil, err - } - - if err := response.Err(); err != nil { - return nil, err - } - - return response, nil -} - -// SetUserPhoto changes the currently authenticated user's profile image -func (api *Client) SetUserPhoto(image string, params UserSetPhotoParams) error { - return api.SetUserPhotoContext(context.Background(), image, params) -} - -// SetUserPhotoContext changes the currently authenticated user's profile image using a custom context -func (api *Client) SetUserPhotoContext(ctx context.Context, image string, params UserSetPhotoParams) (err error) { - response := &SlackResponse{} - values := url.Values{ - "token": {api.token}, - } - if params.CropX != DEFAULT_USER_PHOTO_CROP_X { - values.Add("crop_x", strconv.Itoa(params.CropX)) - } - if params.CropY != DEFAULT_USER_PHOTO_CROP_Y { - values.Add("crop_y", strconv.Itoa(params.CropX)) - } - if params.CropW != DEFAULT_USER_PHOTO_CROP_W { - values.Add("crop_w", strconv.Itoa(params.CropW)) - } - - err = postLocalWithMultipartResponse(ctx, api.httpclient, api.endpoint+"users.setPhoto", image, "image", values, response, api) - if err != nil { - return err - } - - return response.Err() -} - -// DeleteUserPhoto deletes the current authenticated user's profile image -func (api *Client) DeleteUserPhoto() error { - return api.DeleteUserPhotoContext(context.Background()) -} - -// DeleteUserPhotoContext deletes the current authenticated user's profile image with a custom context -func (api *Client) DeleteUserPhotoContext(ctx context.Context) (err error) { - response := &SlackResponse{} - values := url.Values{ - "token": {api.token}, - } - - err = api.postMethod(ctx, "users.deletePhoto", values, response) - if err != nil { - return err - } - - return response.Err() -} - -// SetUserCustomStatus will set a custom status and emoji for the currently -// authenticated user. If statusEmoji is "" and statusText is not, the Slack API -// will automatically set it to ":speech_balloon:". Otherwise, if both are "" -// the Slack API will unset the custom status/emoji. If statusExpiration is set to 0 -// the status will not expire. -func (api *Client) SetUserCustomStatus(statusText, statusEmoji string, statusExpiration int64) error { - return api.SetUserCustomStatusContextWithUser(context.Background(), "", statusText, statusEmoji, statusExpiration) -} - -// SetUserCustomStatusContext will set a custom status and emoji for the currently authenticated user with a custom context -// -// For more information see SetUserCustomStatus -func (api *Client) SetUserCustomStatusContext(ctx context.Context, statusText, statusEmoji string, statusExpiration int64) error { - return api.SetUserCustomStatusContextWithUser(context.Background(), "", statusText, statusEmoji, statusExpiration) -} - -// SetUserCustomStatusWithUser will set a custom status and emoji for the provided user. -// -// For more information see SetUserCustomStatus -func (api *Client) SetUserCustomStatusWithUser(user, statusText, statusEmoji string, statusExpiration int64) error { - return api.SetUserCustomStatusContextWithUser(context.Background(), user, statusText, statusEmoji, statusExpiration) -} - -// SetUserCustomStatusContextWithUser will set a custom status and emoji for the provided user with a custom context -// -// For more information see SetUserCustomStatus -func (api *Client) SetUserCustomStatusContextWithUser(ctx context.Context, user, statusText, statusEmoji string, statusExpiration int64) error { - // XXX(theckman): this anonymous struct is for making requests to the Slack - // API for setting and unsetting a User's Custom Status/Emoji. To change - // these values we must provide a JSON document as the profile POST field. - // - // We use an anonymous struct over UserProfile because to unset the values - // on the User's profile we cannot use the `json:"omitempty"` tag. This is - // because an empty string ("") is what's used to unset the values. Check - // out the API docs for more details: - // - // - https://api.slack.com/docs/presence-and-status#custom_status - profile, err := json.Marshal( - &struct { - StatusText string `json:"status_text"` - StatusEmoji string `json:"status_emoji"` - StatusExpiration int64 `json:"status_expiration"` - }{ - StatusText: statusText, - StatusEmoji: statusEmoji, - StatusExpiration: statusExpiration, - }, - ) - - if err != nil { - return err - } - - values := url.Values{ - "user": {user}, - "token": {api.token}, - "profile": {string(profile)}, - } - - response := &userResponseFull{} - if err = api.postMethod(ctx, "users.profile.set", values, response); err != nil { - return err - } - - return response.Err() -} - -// UnsetUserCustomStatus removes the custom status message for the currently -// authenticated user. This is a convenience method that wraps (*Client).SetUserCustomStatus(). -func (api *Client) UnsetUserCustomStatus() error { - return api.UnsetUserCustomStatusContext(context.Background()) -} - -// UnsetUserCustomStatusContext removes the custom status message for the currently authenticated user -// with a custom context. This is a convenience method that wraps (*Client).SetUserCustomStatus(). -func (api *Client) UnsetUserCustomStatusContext(ctx context.Context) error { - return api.SetUserCustomStatusContext(ctx, "", "", 0) -} - -// GetUserProfile retrieves a user's profile information. -func (api *Client) GetUserProfile(userID string, includeLabels bool) (*UserProfile, error) { - return api.GetUserProfileContext(context.Background(), userID, includeLabels) -} - -type getUserProfileResponse struct { - SlackResponse - Profile *UserProfile `json:"profile"` -} - -// GetUserProfileContext retrieves a user's profile information with a context. -func (api *Client) GetUserProfileContext(ctx context.Context, userID string, includeLabels bool) (*UserProfile, error) { - values := url.Values{"token": {api.token}, "user": {userID}} - if includeLabels { - values.Add("include_labels", "true") - } - resp := &getUserProfileResponse{} - - err := api.postMethod(ctx, "users.profile.get", values, &resp) - if err != nil { - return nil, err - } - - if err := resp.Err(); err != nil { - return nil, err - } - - return resp.Profile, nil -} |