sum7
/
yaja
Archived
1
0
Fork 0
This repository has been archived on 2020-09-27. You can view files and clone it, but cannot push or open issues or pull requests.
yaja/client/client.go

81 lines
1.7 KiB
Go

package client
import (
"encoding/xml"
"fmt"
"net"
"strings"
"time"
log "github.com/sirupsen/logrus"
"dev.sum7.eu/genofire/yaja/xmpp"
"dev.sum7.eu/genofire/yaja/xmpp/base"
)
// Client holds XMPP connection opitons
type Client struct {
Protocol string // tcp tcp4 tcp6 are supported
Timeout time.Duration
conn net.Conn // connection to server
out *xml.Encoder
in *xml.Decoder
Logging *log.Entry
JID *xmppbase.JID
SkipError bool
msg chan interface{}
reply map[string]chan *xmpp.IQClient
}
func NewClient(jid *xmppbase.JID, password string) (*Client, error) {
client := &Client{
JID: jid,
Logging: log.New().WithField("jid", jid.String()),
}
return client, client.Connect(password)
}
func (client *Client) Connect(password string) error {
_, srvEntries, err := net.LookupSRV("xmpp-client", "tcp", client.JID.Domain)
addr := client.JID.Domain
if err == nil && len(srvEntries) > 0 {
bestSrv := srvEntries[0]
for _, srv := range srvEntries {
if srv.Priority <= bestSrv.Priority && srv.Weight >= bestSrv.Weight {
bestSrv = srv
addr = fmt.Sprintf("%s:%d", srv.Target, srv.Port)
}
}
}
if strings.LastIndex(addr, ":") <= strings.LastIndex(addr, "]") {
addr += ":5222"
}
if client.Protocol == "" {
client.Protocol = "tcp"
}
client.Logging.Debug("try tcp connect")
conn, err := net.DialTimeout(client.Protocol, addr, client.Timeout)
if err != nil {
return err
}
client.Logging.Debug("tcp connected")
client.setConnection(conn)
if err = client.connect(password); err != nil {
client.Close()
return err
}
return nil
}
// Close closes the XMPP connection
func (c *Client) Close() error {
if c.conn != nil {
return c.conn.Close()
}
return nil
}