Codebase list golang-github-nlopes-slack / d8daca0 websocket.go
d8daca0

Tree @d8daca0 (Download .tar.gz)

websocket.go @d8daca0

1b96f65
 
 
 
 
 
 
 
 
 
16288f9
 
d8daca0
 
16288f9
1b96f65
16288f9
676c3c4
 
334c7e2
 
 
16288f9
648871c
334c7e2
16288f9
 
82e7260
 
 
1b96f65
 
16288f9
 
 
 
 
 
 
1b96f65
334c7e2
 
82e7260
16288f9
 
82e7260
 
 
16288f9
 
 
82e7260
 
 
 
 
 
 
16288f9
 
82e7260
 
16288f9
 
 
 
9a9d871
16288f9
 
9a9d871
 
16288f9
1b96f65
package slack

import (
	"log"
	"sync"
	"time"

	"golang.org/x/net/websocket"
)

// RTM represents a managed websocket connection. It also supports
// all the methods of the `Slack` type.
//
// Create this element with Client's NewRTM().
type RTM struct {
	mutex     sync.Mutex
	messageID int
	pings     map[int]time.Time

	// Connection life-cycle
	conn             *websocket.Conn
	IncomingEvents   chan SlackEvent
	outgoingMessages chan OutgoingMessage

	// Slack is the main API, embedded
	Client
	websocketURL string

	// UserDetails upon connection
	info *Info
}

// NewRTM returns a RTM, which provides a fully managed connection to
// Slack's websocket-based Real-Time Messaging protocol.
func newRTM(api *Client) *RTM {
	return &RTM{
		Client:         *api,
		pings:          make(map[int]time.Time),
		IncomingEvents: make(chan SlackEvent, 50),
	}
}

// Disconnect and wait, blocking until a successful disconnection.
func (rtm *RTM) Disconnect() error {
	log.Println("RTM::Disconnect not implemented!")
	return nil
}

// Reconnect only makes sense if you've successfully disconnectd with Disconnect().
func (rtm *RTM) Reconnect() error {
	log.Println("RTM::Reconnect not implemented!")
	return nil
}

// GetInfo returns the info structure received when calling
// "startrtm", holding all channels, groups and other metadata needed
// to implement a full chat client. It will be non-nil after a call to
// StartRTM().
func (rtm *RTM) GetInfo() *Info {
	return rtm.info
}

// SendMessage submits a simple message through the websocket.  For
// more complicated messages, use `rtm.PostMessage` with a complete
// struct describing your attachments and all.
func (rtm *RTM) SendMessage(msg *OutgoingMessage) {
	if msg == nil {
		rtm.Debugln("Error: Attempted to SendMessage(nil)")
		return
	}

	rtm.outgoingMessages <- *msg
}