Codebase list golang-github-nlopes-slack / run/f282e598-9350-4d40-ba4b-90cbf2cd4600/main stars.go
run/f282e598-9350-4d40-ba4b-90cbf2cd4600/main

Tree @run/f282e598-9350-4d40-ba4b-90cbf2cd4600/main (Download .tar.gz)

stars.go @run/f282e598-9350-4d40-ba4b-90cbf2cd4600/main

1b96f65
 
 
d4176bf
1b96f65
 
 
 
 
74f694f
 
 
1b96f65
 
 
 
 
 
 
 
4a9ff5f
1b96f65
4a9ff5f
 
1b96f65
8e0186d
1b96f65
 
4a9ff5f
1b96f65
 
74f694f
1b96f65
 
 
 
 
4a9ff5f
 
d4176bf
 
 
 
 
4a9ff5f
 
ba9c8fd
4a9ff5f
 
9ef10ad
4a9ff5f
 
9ef10ad
4a9ff5f
 
9ef10ad
4a9ff5f
ba9c8fd
8e0186d
95b04ee
4a9ff5f
 
2b8f4d3
 
4a9ff5f
 
 
 
d4176bf
 
 
 
 
4a9ff5f
 
ba9c8fd
4a9ff5f
 
9ef10ad
4a9ff5f
 
9ef10ad
4a9ff5f
 
9ef10ad
4a9ff5f
ba9c8fd
8e0186d
95b04ee
4a9ff5f
 
2b8f4d3
 
4a9ff5f
 
 
 
d4176bf
 
 
 
 
1b96f65
ba9c8fd
1b96f65
74f694f
1b96f65
 
 
 
 
 
 
 
ba9c8fd
4a9ff5f
95b04ee
1b96f65
 
 
95b04ee
 
 
1b96f65
95b04ee
1b96f65
 
4a9ff5f
d4176bf
 
 
4a9ff5f
 
 
 
 
 
 
 
 
 
 
 
d4176bf
 
 
 
 
 
 
 
4a9ff5f
 
 
 
 
 
 
 
 
package slack

import (
	"context"
	"net/url"
	"strconv"
)

const (
	DEFAULT_STARS_USER  = ""
	DEFAULT_STARS_COUNT = 100
	DEFAULT_STARS_PAGE  = 1
)

type StarsParameters struct {
	User  string
	Count int
	Page  int
}

type StarredItem Item

type listResponseFull struct {
	Items  []Item `json:"items"`
	Paging `json:"paging"`
	SlackResponse
}

// NewStarsParameters initialises StarsParameters with default values
func NewStarsParameters() StarsParameters {
	return StarsParameters{
		User:  DEFAULT_STARS_USER,
		Count: DEFAULT_STARS_COUNT,
		Page:  DEFAULT_STARS_PAGE,
	}
}

// AddStar stars an item in a channel
func (api *Client) AddStar(channel string, item ItemRef) error {
	return api.AddStarContext(context.Background(), channel, item)
}

// AddStarContext stars an item in a channel with a custom context
func (api *Client) AddStarContext(ctx context.Context, channel string, item ItemRef) error {
	values := url.Values{
		"channel": {channel},
		"token":   {api.token},
	}
	if item.Timestamp != "" {
		values.Set("timestamp", item.Timestamp)
	}
	if item.File != "" {
		values.Set("file", item.File)
	}
	if item.Comment != "" {
		values.Set("file_comment", item.Comment)
	}

	response := &SlackResponse{}
	if err := api.postMethod(ctx, "stars.add", values, response); err != nil {
		return err
	}

	return response.Err()
}

// RemoveStar removes a starred item from a channel
func (api *Client) RemoveStar(channel string, item ItemRef) error {
	return api.RemoveStarContext(context.Background(), channel, item)
}

// RemoveStarContext removes a starred item from a channel with a custom context
func (api *Client) RemoveStarContext(ctx context.Context, channel string, item ItemRef) error {
	values := url.Values{
		"channel": {channel},
		"token":   {api.token},
	}
	if item.Timestamp != "" {
		values.Set("timestamp", item.Timestamp)
	}
	if item.File != "" {
		values.Set("file", item.File)
	}
	if item.Comment != "" {
		values.Set("file_comment", item.Comment)
	}

	response := &SlackResponse{}
	if err := api.postMethod(ctx, "stars.remove", values, response); err != nil {
		return err
	}

	return response.Err()
}

// ListStars returns information about the stars a user added
func (api *Client) ListStars(params StarsParameters) ([]Item, *Paging, error) {
	return api.ListStarsContext(context.Background(), params)
}

// ListStarsContext returns information about the stars a user added with a custom context
func (api *Client) ListStarsContext(ctx context.Context, params StarsParameters) ([]Item, *Paging, error) {
	values := url.Values{
		"token": {api.token},
	}
	if params.User != DEFAULT_STARS_USER {
		values.Add("user", params.User)
	}
	if params.Count != DEFAULT_STARS_COUNT {
		values.Add("count", strconv.Itoa(params.Count))
	}
	if params.Page != DEFAULT_STARS_PAGE {
		values.Add("page", strconv.Itoa(params.Page))
	}

	response := &listResponseFull{}
	err := api.postMethod(ctx, "stars.list", values, response)
	if err != nil {
		return nil, nil, err
	}

	if err := response.Err(); err != nil {
		return nil, nil, err
	}

	return response.Items, &response.Paging, nil
}

// GetStarred returns a list of StarredItem items.
//
// The user then has to iterate over them and figure out what they should
// be looking at according to what is in the Type.
//    for _, item := range items {
//        switch c.Type {
//        case "file_comment":
//            log.Println(c.Comment)
//        case "file":
//             ...
//
//    }
// This function still exists to maintain backwards compatibility.
// I exposed it as returning []StarredItem, so it shall stay as StarredItem
func (api *Client) GetStarred(params StarsParameters) ([]StarredItem, *Paging, error) {
	return api.GetStarredContext(context.Background(), params)
}

// GetStarredContext returns a list of StarredItem items with a custom context
//
// For more details see GetStarred
func (api *Client) GetStarredContext(ctx context.Context, params StarsParameters) ([]StarredItem, *Paging, error) {
	items, paging, err := api.ListStarsContext(ctx, params)
	if err != nil {
		return nil, nil, err
	}
	starredItems := make([]StarredItem, len(items))
	for i, item := range items {
		starredItems[i] = StarredItem(item)
	}
	return starredItems, paging, nil
}