diff options
Diffstat (limited to 'xmpp/iq.go')
-rw-r--r-- | xmpp/iq.go | 81 |
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!") + } +} |