summaryrefslogtreecommitdiff
path: root/xmpp/iq.go
diff options
context:
space:
mode:
Diffstat (limited to 'xmpp/iq.go')
-rw-r--r--xmpp/iq.go81
1 files changed, 81 insertions, 0 deletions
diff --git a/xmpp/iq.go b/xmpp/iq.go
new file mode 100644
index 0000000..1cb7fd5
--- /dev/null
+++ b/xmpp/iq.go
@@ -0,0 +1,81 @@
+package xmpp
+
+import (
+ "encoding/xml"
+ "fmt"
+ "log"
+ "math/rand"
+)
+
+type iqRx struct {
+ XMLName xml.Name `xml:"jabber:client iq"`
+ Type string `xml:"type,attr"`
+ Id string `xml:"id,attr"`
+ Bind struct {
+ Jid string `xml:"jid"`
+ } `xml:"urn:ietf:params:xml:ns:xmpp-bind bind"`
+ Query []RosterItem `xml:"jabber:iq:roster query>item"`
+}
+
+type RosterItem struct {
+ Jid string `xml:"jid,attr"`
+ Subscription string `xml:"subscription,attr"`
+ Name string `xml:"name,attr"`
+}
+
+func (i iqRx) handle(s *session) {
+ if i.Bind.Jid != "" {
+ s.jid = i.Bind.Jid
+ s.sendPresence()
+ s.sendRosterGet()
+ return
+ }
+
+ if len(i.Query) > 0 {
+ log.Println("Got roster:")
+ for _, v := range i.Query {
+ log.Printf("- %s\n", v.Jid)
+ }
+ }
+}
+
+type bindSet struct {
+ XMLName xml.Name `xml:"jabber:client iq"`
+ Type string `xml:"type,attr,omitempty"`
+ Id string `xml:"id,attr,omitempty"`
+ Bind struct {
+ Resource string `xml:"resource,omitempty"`
+ } `xml:"urn:ietf:params:xml:ns:xmpp-bind bind,omitempty"`
+}
+
+func (s *session) sendBind() {
+ s.resourceReq = fmt.Sprintf("%016x", rand.Uint64())
+
+ req := bindSet{}
+ req.Id = s.resourceReq
+ req.Type = "set"
+ req.Bind.Resource = "limox-" + fmt.Sprintf("%08x", rand.Uint32())
+
+ err := s.tx.Encode(req)
+ if err != nil {
+ log.Println("Could not encode ressource binding!")
+ }
+}
+
+type rosterGet struct {
+ XMLName xml.Name `xml:"jabber:client iq"`
+ Type string `xml:"type,attr,omitempty"`
+ Id string `xml:"id,attr,omitempty"`
+ Query string `xml:"jabber:iq:roster query"`
+}
+
+func (s *session) sendRosterGet() {
+ req := rosterGet{}
+ req.Id = fmt.Sprintf("%016x", rand.Uint64())
+ req.Type = "get"
+
+ err := s.tx.Encode(req)
+ if err != nil {
+ log.Println("Could not encode ressource binding!")
+ }
+}