1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
// Provides access to Rocket.Chat's realtime API via ddp
package realtime
import (
"fmt"
"math/rand"
"net/url"
"strconv"
"time"
"github.com/gopackage/ddp"
)
type Client struct {
ddp *ddp.Client
}
// Creates a new instance and connects to the websocket.
func NewClient(serverURL *url.URL, debug bool) (*Client, error) {
rand.Seed(time.Now().UTC().UnixNano())
wsURL := "ws"
port := 80
if serverURL.Scheme == "https" {
wsURL = "wss"
port = 443
}
if len(serverURL.Port()) > 0 {
port, _ = strconv.Atoi(serverURL.Port())
}
wsURL = fmt.Sprintf("%s://%v:%v%s/websocket", wsURL, serverURL.Hostname(), port, serverURL.Path)
// log.Println("About to connect to:", wsURL, port, serverURL.Scheme)
c := new(Client)
c.ddp = ddp.NewClient(wsURL, serverURL.String())
if debug {
c.ddp.SetSocketLogActive(true)
}
if err := c.ddp.Connect(); err != nil {
return nil, err
}
return c, nil
}
type statusListener struct {
listener func(int)
}
func (s statusListener) Status(status int) {
s.listener(status)
}
func (c *Client) AddStatusListener(listener func(int)) {
c.ddp.AddStatusListener(statusListener{listener: listener})
}
func (c *Client) Reconnect() {
c.ddp.Reconnect()
}
// ConnectionAway sets connection status to away
func (c *Client) ConnectionAway() error {
_, err := c.ddp.Call("UserPresence:away")
if err != nil {
return err
}
return nil
}
// ConnectionOnline sets connection status to online
func (c *Client) ConnectionOnline() error {
_, err := c.ddp.Call("UserPresence:online")
if err != nil {
return err
}
return nil
}
// Close closes the ddp session
func (c *Client) Close() {
c.ddp.Close()
}
// Some of the rocketchat objects need unique IDs specified by the client
func (c *Client) newRandomId() string {
return fmt.Sprintf("%f", rand.Float64())
}
|