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

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

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

1b96f65
 
 
d4176bf
1b96f65
 
 
 
 
74f694f
1b96f65
 
 
 
 
 
 
 
 
8e0186d
1b96f65
 
55d471b
1b96f65
633c675
17eae63
1b96f65
 
95b04ee
1b96f65
95b04ee
1b96f65
 
 
8b3b6ec
 
1b96f65
 
55d471b
16288f9
d4176bf
 
 
 
 
1b96f65
ba9c8fd
74f694f
1b96f65
ba9c8fd
95b04ee
1b96f65
 
 
 
 
 
55d471b
16288f9
 
d4176bf
 
 
 
 
 
1b96f65
ba9c8fd
74f694f
1b96f65
ba9c8fd
95b04ee
1b96f65
 
 
74f694f
1b96f65
 
55d471b
16288f9
d4176bf
 
 
 
9ef10ad
1b96f65
ba9c8fd
74f694f
1b96f65
 
ba9c8fd
95b04ee
9ef10ad
1b96f65
 
55d471b
16288f9
d4176bf
 
 
 
 
1b96f65
ba9c8fd
74f694f
1b96f65
 
 
 
 
 
 
 
 
 
05742bd
 
 
 
 
 
 
e9bad08
 
 
 
 
 
 
ba9c8fd
95b04ee
1b96f65
 
 
 
 
 
55d471b
16288f9
d4176bf
 
 
 
 
1b96f65
ba9c8fd
1b96f65
ba9c8fd
95b04ee
1b96f65
 
 
 
 
package slack

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

type imChannel struct {
	ID string `json:"id"`
}

type imResponseFull struct {
	NoOp          bool      `json:"no_op"`
	AlreadyClosed bool      `json:"already_closed"`
	AlreadyOpen   bool      `json:"already_open"`
	Channel       imChannel `json:"channel"`
	IMs           []IM      `json:"ims"`
	History
	SlackResponse
}

// IM contains information related to the Direct Message channel
type IM struct {
	Conversation
	IsUserDeleted bool `json:"is_user_deleted"`
}

func (api *Client) imRequest(ctx context.Context, path string, values url.Values) (*imResponseFull, error) {
	response := &imResponseFull{}
	err := api.postMethod(ctx, path, values, response)
	if err != nil {
		return nil, err
	}

	return response, response.Err()
}

// CloseIMChannel closes the direct message channel
func (api *Client) CloseIMChannel(channel string) (bool, bool, error) {
	return api.CloseIMChannelContext(context.Background(), channel)
}

// CloseIMChannelContext closes the direct message channel with a custom context
func (api *Client) CloseIMChannelContext(ctx context.Context, channel string) (bool, bool, error) {
	values := url.Values{
		"token":   {api.token},
		"channel": {channel},
	}

	response, err := api.imRequest(ctx, "im.close", values)
	if err != nil {
		return false, false, err
	}
	return response.NoOp, response.AlreadyClosed, nil
}

// OpenIMChannel opens a direct message channel to the user provided as argument
// Returns some status and the channel ID
func (api *Client) OpenIMChannel(user string) (bool, bool, string, error) {
	return api.OpenIMChannelContext(context.Background(), user)
}

// OpenIMChannelContext opens a direct message channel to the user provided as argument with a custom context
// Returns some status and the channel ID
func (api *Client) OpenIMChannelContext(ctx context.Context, user string) (bool, bool, string, error) {
	values := url.Values{
		"token": {api.token},
		"user":  {user},
	}

	response, err := api.imRequest(ctx, "im.open", values)
	if err != nil {
		return false, false, "", err
	}
	return response.NoOp, response.AlreadyOpen, response.Channel.ID, nil
}

// MarkIMChannel sets the read mark of a direct message channel to a specific point
func (api *Client) MarkIMChannel(channel, ts string) (err error) {
	return api.MarkIMChannelContext(context.Background(), channel, ts)
}

// MarkIMChannelContext sets the read mark of a direct message channel to a specific point with a custom context
func (api *Client) MarkIMChannelContext(ctx context.Context, channel, ts string) error {
	values := url.Values{
		"token":   {api.token},
		"channel": {channel},
		"ts":      {ts},
	}

	_, err := api.imRequest(ctx, "im.mark", values)
	return err
}

// GetIMHistory retrieves the direct message channel history
func (api *Client) GetIMHistory(channel string, params HistoryParameters) (*History, error) {
	return api.GetIMHistoryContext(context.Background(), channel, params)
}

// GetIMHistoryContext retrieves the direct message channel history with a custom context
func (api *Client) GetIMHistoryContext(ctx context.Context, channel string, params HistoryParameters) (*History, error) {
	values := url.Values{
		"token":   {api.token},
		"channel": {channel},
	}
	if params.Latest != DEFAULT_HISTORY_LATEST {
		values.Add("latest", params.Latest)
	}
	if params.Oldest != DEFAULT_HISTORY_OLDEST {
		values.Add("oldest", params.Oldest)
	}
	if params.Count != DEFAULT_HISTORY_COUNT {
		values.Add("count", strconv.Itoa(params.Count))
	}
	if params.Inclusive != DEFAULT_HISTORY_INCLUSIVE {
		if params.Inclusive {
			values.Add("inclusive", "1")
		} else {
			values.Add("inclusive", "0")
		}
	}
	if params.Unreads != DEFAULT_HISTORY_UNREADS {
		if params.Unreads {
			values.Add("unreads", "1")
		} else {
			values.Add("unreads", "0")
		}
	}

	response, err := api.imRequest(ctx, "im.history", values)
	if err != nil {
		return nil, err
	}
	return &response.History, nil
}

// GetIMChannels returns the list of direct message channels
func (api *Client) GetIMChannels() ([]IM, error) {
	return api.GetIMChannelsContext(context.Background())
}

// GetIMChannelsContext returns the list of direct message channels with a custom context
func (api *Client) GetIMChannelsContext(ctx context.Context) ([]IM, error) {
	values := url.Values{
		"token": {api.token},
	}

	response, err := api.imRequest(ctx, "im.list", values)
	if err != nil {
		return nil, err
	}
	return response.IMs, nil
}