File: xmpp_pubsub.go

package info (click to toggle)
golang-github-mattn-go-xmpp 0.2.12-1~bpo12%2B1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-backports
  • size: 192 kB
  • sloc: makefile: 2
file content (146 lines) | stat: -rw-r--r-- 3,199 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package xmpp

import (
	"encoding/xml"
	"fmt"
)

var (
	itemsIDs []string
	subIDs   []string
	unsubIDs []string
)

const (
	XMPPNS_PUBSUB       = "http://jabber.org/protocol/pubsub"
	XMPPNS_PUBSUB_EVENT = "http://jabber.org/protocol/pubsub#event"
)

type clientPubsubItem struct {
	XMLName xml.Name `xml:"item"`
	ID      string   `xml:"id,attr"`
	Body    []byte   `xml:",innerxml"`
}

type clientPubsubItems struct {
	XMLName xml.Name           `xml:"items"`
	Node    string             `xml:"node,attr"`
	Items   []clientPubsubItem `xml:"item"`
}

type clientPubsubEvent struct {
	XMLName xml.Name          `xml:"event"`
	XMLNS   string            `xml:"xmlns,attr"`
	Items   clientPubsubItems `xml:"items"`
}

type clientPubsubError struct {
	XMLName xml.Name
}

type clientPubsubSubscription struct {
	XMLName xml.Name `xml:"subscription"`
	Node    string   `xml:"node,attr"`
	JID     string   `xml:"jid,attr"`
	SubID   string   `xml:"subid,attr"`
}

type PubsubEvent struct {
	Node  string
	Items []PubsubItem
}

type PubsubSubscription struct {
	SubID  string
	JID    string
	Node   string
	Errors []string
}
type PubsubUnsubscription PubsubSubscription

type PubsubItem struct {
	ID       string
	InnerXML []byte
}

type PubsubItems struct {
	Node  string
	Items []PubsubItem
}

// Converts []clientPubsubItem to []PubsubItem
func pubsubItemsToReturn(items []clientPubsubItem) []PubsubItem {
	var tmp []PubsubItem
	for _, i := range items {
		tmp = append(tmp, PubsubItem{
			ID:       i.ID,
			InnerXML: i.Body,
		})
	}

	return tmp
}

func pubsubClientToReturn(event clientPubsubEvent) PubsubEvent {
	return PubsubEvent{
		Node:  event.Items.Node,
		Items: pubsubItemsToReturn(event.Items.Items),
	}
}

func pubsubStanza(body string) string {
	return fmt.Sprintf("<pubsub xmlns='%s'>%s</pubsub>",
		XMPPNS_PUBSUB, body)
}

func pubsubSubscriptionStanza(node, jid string) string {
	body := fmt.Sprintf("<subscribe node='%s' jid='%s'/>",
		xmlEscape(node),
		xmlEscape(jid))
	return pubsubStanza(body)
}

func pubsubUnsubscriptionStanza(node, jid string) string {
	body := fmt.Sprintf("<unsubscribe node='%s' jid='%s'/>",
		xmlEscape(node),
		xmlEscape(jid))
	return pubsubStanza(body)
}

func (c *Client) PubsubSubscribeNode(node, jid string) error {
	id := getUUIDv4()
	subIDs = append(subIDs, id)
	_, err := c.RawInformation(c.jid,
		jid,
		id,
		"set",
		pubsubSubscriptionStanza(node, c.jid))
	return err
}

func (c *Client) PubsubUnsubscribeNode(node, jid string) error {
	id := getUUIDv4()
	unsubIDs = append(unsubIDs, id)
	_, err := c.RawInformation(c.jid,
		jid,
		id,
		"set",
		pubsubUnsubscriptionStanza(node, c.jid))
	return err
}

func (c *Client) PubsubRequestLastItems(node, jid string) error {
	id := getUUIDv4()
	itemsIDs = append(itemsIDs, id)
	body := fmt.Sprintf("<items node='%s'/>", node)
	_, err := c.RawInformation(c.jid, jid, id, "get", pubsubStanza(body))
	return err
}

func (c *Client) PubsubRequestItem(node, jid, id string) error {
	stanzaID := getUUIDv4()
	itemsIDs = append(itemsIDs, stanzaID)
	body := fmt.Sprintf("<items node='%s'><item id='%s'/></items>", node, id)
	_, err := c.RawInformation(c.jid, jid, stanzaID, "get", pubsubStanza(body))
	return err
}