From f7b1e7ecb224aff66bbe67c28649890514b0b730 Mon Sep 17 00:00:00 2001 From: Chteufleur Date: Wed, 20 Apr 2016 22:10:37 +0200 Subject: [PATCH] Add params for presence and disco info - Add Show, Status, Photo and Nick into presence stanza - Add Node attribute into DiscoInfo payload --- src/xmpp/disco.go | 18 ++++++++++-------- src/xmpp/stanza.go | 13 +++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/xmpp/disco.go b/src/xmpp/disco.go index d9dea7f..3951d8b 100644 --- a/src/xmpp/disco.go +++ b/src/xmpp/disco.go @@ -6,8 +6,8 @@ import ( ) const ( - nsDiscoInfo = "http://jabber.org/protocol/disco#info" - nsDiscoItems = "http://jabber.org/protocol/disco#items" + NsDiscoInfo = "http://jabber.org/protocol/disco#info" + NsDiscoItems = "http://jabber.org/protocol/disco#items" ) // Service Discovery (XEP-0030) protocol. "Wraps" XMPP instance to provide a @@ -19,6 +19,7 @@ type Disco struct { // Iq get/result payload for "info" requests. type DiscoInfo struct { XMLName xml.Name `xml:"http://jabber.org/protocol/disco#info query"` + Node string `xml:"node,attr"` Identity []DiscoIdentity `xml:"identity"` Feature []DiscoFeature `xml:"feature"` } @@ -38,6 +39,7 @@ type DiscoFeature struct { // Iq get/result payload for "items" requests. type DiscoItems struct { XMLName xml.Name `xml:"http://jabber.org/protocol/disco#items query"` + Node string `xml:"node,attr"` Item []DiscoItem `xml:"item"` } @@ -49,13 +51,13 @@ type DiscoItem struct { } // Request information about the service identified by 'to'. -func (disco *Disco) Info(to string, from string) (*DiscoInfo, error) { +func (disco *Disco) Info(to, from string) (*DiscoInfo, error) { if from == "" { from = disco.XMPP.JID.Full() } - req := &Iq{Id: UUID4(), Type: "get", To: to, From: from} + req := &Iq{Id: UUID4(), Type: IqTypeGet, To: to, From: from} req.PayloadEncode(&DiscoInfo{}) resp, err := disco.XMPP.SendRecv(req) @@ -72,14 +74,14 @@ func (disco *Disco) Info(to string, from string) (*DiscoInfo, error) { } // Request items in the service identified by 'to'. -func (disco *Disco) Items(to string, from string) (*DiscoItems, error) { +func (disco *Disco) Items(to, from, node string) (*DiscoItems, error) { if from == "" { from = disco.XMPP.JID.Full() } - req := &Iq{Id: UUID4(), Type: "get", To: to, From: from} - req.PayloadEncode(&DiscoItems{}) + req := &Iq{Id: UUID4(), Type: IqTypeGet, To: to, From: from} + req.PayloadEncode(&DiscoItems{Node: node}) resp, err := disco.XMPP.SendRecv(req) if err != nil { @@ -94,7 +96,7 @@ func (disco *Disco) Items(to string, from string) (*DiscoItems, error) { return items, err } -var discoNamespacePrefix = strings.Split(nsDiscoInfo, "#")[0] +var discoNamespacePrefix = strings.Split(NsDiscoInfo, "#")[0] // Matcher instance to match stanzas with a disco payload. var DiscoPayloadMatcher = MatcherFunc( diff --git a/src/xmpp/stanza.go b/src/xmpp/stanza.go index 584793d..dd51f7f 100644 --- a/src/xmpp/stanza.go +++ b/src/xmpp/stanza.go @@ -6,6 +6,15 @@ import ( "fmt" ) + +const ( + IqTypeGet = "get" + IqTypeSet = "set" + IqTypeResult = "result" + IqTypeError = "error" +) + + // XMPP stanza. type Iq struct { XMLName xml.Name `xml:"iq"` @@ -72,6 +81,10 @@ type Presence struct { Type string `xml:"type,attr,omitempty"` To string `xml:"to,attr,omitempty"` From string `xml:"from,attr,omitempty"` + Show string `xml:"show"` // away, chat, dnd, xa + Status string `xml:"status"` // sb []clientText + Photo string `xml:"photo,omitempty"` // Avatar + Nick string `xml:"nick,omitempty"` // Nickname } // XMPP . May occur as a top-level stanza or embedded in another