Implement IQ responses to version, last activity, client time
* Implement IqVersionResponse(), XEP-0092 * Implement JabberIqLastResponse(), XEP-0012 * Implement UrnXmppTimeResponse(), XEP-0202 * Fix function descriptions
This commit is contained in:
@@ -3,6 +3,7 @@ package xmpp
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const IQTypeGet = "get"
|
const IQTypeGet = "get"
|
||||||
@@ -16,24 +17,24 @@ func (c *Client) Discovery() (string, error) {
|
|||||||
return c.RawInformationQuery(c.jid, c.domain, reqID, IQTypeGet, XMPPNS_DISCO_ITEMS, "")
|
return c.RawInformationQuery(c.jid, c.domain, reqID, IQTypeGet, XMPPNS_DISCO_ITEMS, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Discover information about a node. Empty node queries info about server itself.
|
// DiscoverNodeInfo discovers information about a node. Empty node queries info about server itself.
|
||||||
func (c *Client) DiscoverNodeInfo(node string) (string, error) {
|
func (c *Client) DiscoverNodeInfo(node string) (string, error) {
|
||||||
query := fmt.Sprintf("<query xmlns='%s' node='%s'/>", XMPPNS_DISCO_INFO, node)
|
query := fmt.Sprintf("<query xmlns='%s' node='%s'/>", XMPPNS_DISCO_INFO, node)
|
||||||
return c.RawInformation(c.jid, c.domain, "info3", IQTypeGet, query)
|
return c.RawInformation(c.jid, c.domain, "info3", IQTypeGet, query)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Discover information about given item from given jid.
|
// DiscoverInfo discovers information about given item from given jid.
|
||||||
func (c *Client) DiscoverInfo(from string, to string) (string, error) {
|
func (c *Client) DiscoverInfo(from string, to string) (string, error) {
|
||||||
query := fmt.Sprintf("<query xmlns='%s'/>", XMPPNS_DISCO_INFO)
|
query := fmt.Sprintf("<query xmlns='%s'/>", XMPPNS_DISCO_INFO)
|
||||||
return c.RawInformation(from, to, "info3", IQTypeGet, query)
|
return c.RawInformation(from, to, "info3", IQTypeGet, query)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Discover items that the server exposes
|
// DiscoverServerItems discover items that the server exposes
|
||||||
func (c *Client) DiscoverServerItems() (string, error) {
|
func (c *Client) DiscoverServerItems() (string, error) {
|
||||||
return c.DiscoverEntityItems(c.domain)
|
return c.DiscoverEntityItems(c.domain)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Discover items that an entity exposes
|
// DiscoverEntityItems discovers items that an entity exposes.
|
||||||
func (c *Client) DiscoverEntityItems(jid string) (string, error) {
|
func (c *Client) DiscoverEntityItems(jid string) (string, error) {
|
||||||
query := fmt.Sprintf("<query xmlns='%s'/>", XMPPNS_DISCO_ITEMS)
|
query := fmt.Sprintf("<query xmlns='%s'/>", XMPPNS_DISCO_ITEMS)
|
||||||
return c.RawInformation(c.jid, jid, "info1", IQTypeGet, query)
|
return c.RawInformation(c.jid, jid, "info1", IQTypeGet, query)
|
||||||
@@ -46,9 +47,73 @@ func (c *Client) RawInformationQuery(from, to, id, iqType, requestNamespace, bod
|
|||||||
return id, err
|
return id, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// rawInformation send a IQ request with the payload body to the server
|
// RawInformation sends a IQ request with the payload body to the server.
|
||||||
func (c *Client) RawInformation(from, to, id, iqType, body string) (string, error) {
|
func (c *Client) RawInformation(from, to, id, iqType, body string) (string, error) {
|
||||||
const xmlIQ = "<iq from='%s' to='%s' id='%s' type='%s'>%s</iq>"
|
const xmlIQ = "<iq from='%s' to='%s' id='%s' type='%s'>%s</iq>"
|
||||||
_, err := fmt.Fprintf(StanzaWriter, xmlIQ, xmlEscape(from), xmlEscape(to), id, iqType, body)
|
_, err := fmt.Fprintf(StanzaWriter, xmlIQ, xmlEscape(from), xmlEscape(to), id, iqType, body)
|
||||||
return id, err
|
return id, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IqVersionResponse responding with software version, according to xep-0092.
|
||||||
|
func (c *Client) IqVersionResponse(v IQ, name, version, os string) (string, error) {
|
||||||
|
if name == "" {
|
||||||
|
name = "go-xmpp"
|
||||||
|
}
|
||||||
|
|
||||||
|
if version == "" {
|
||||||
|
version = "undefined"
|
||||||
|
}
|
||||||
|
|
||||||
|
query := "<query xmlns=\"jabber:iq:version\">" //nolint:wsl
|
||||||
|
query += fmt.Sprintf("<name>%s</name>", name)
|
||||||
|
query += fmt.Sprintf("<version>%s</version>", version)
|
||||||
|
|
||||||
|
if os != "" {
|
||||||
|
query += fmt.Sprintf("<os>%s</os>", os)
|
||||||
|
}
|
||||||
|
|
||||||
|
query += "</query>"
|
||||||
|
|
||||||
|
return c.RawInformation(
|
||||||
|
v.To,
|
||||||
|
v.From,
|
||||||
|
v.ID,
|
||||||
|
IQTypeResult,
|
||||||
|
query,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// JabberIqLastResponse responding with relative time since last activity.
|
||||||
|
// Here lastActivity is unix time stamp when last activity took place since.
|
||||||
|
func (c *Client) JabberIqLastResponse(v IQ, lastActivity int64) (string, error) {
|
||||||
|
query := fmt.Sprintf(
|
||||||
|
"<query xmlns=\"jabber:iq:last\" seconds=\"%d\" />",
|
||||||
|
time.Now().Unix()-lastActivity,
|
||||||
|
)
|
||||||
|
|
||||||
|
return c.RawInformation(
|
||||||
|
v.To,
|
||||||
|
v.From,
|
||||||
|
v.ID,
|
||||||
|
IQTypeResult,
|
||||||
|
query,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// UrnXmppTimeResponse implements response to query entity's current time (xep-0202).
|
||||||
|
// TimezoneOffset have format +HH:MM or -HH:MM
|
||||||
|
func (c *Client) UrnXmppTimeResponse(v IQ, timezoneOffset string) (string, error) {
|
||||||
|
query := fmt.Sprintf(
|
||||||
|
"<time xmlns=\"urn:xmpp:time\"><tzo>%s</tzo><utc>%s</utc></time>",
|
||||||
|
timezoneOffset,
|
||||||
|
time.Now().UTC().Format(time.RFC3339),
|
||||||
|
)
|
||||||
|
|
||||||
|
return c.RawInformation(
|
||||||
|
v.To,
|
||||||
|
v.From,
|
||||||
|
v.ID,
|
||||||
|
IQTypeResult,
|
||||||
|
query,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user