138 local s = self:service(service); |
138 local s = self:service(service); |
139 return node and s:node(node) or s; |
139 return node and s:node(node) or s; |
140 end |
140 end |
141 |
141 |
142 function pubsub_node:hook(callback, prio) |
142 function pubsub_node:hook(callback, prio) |
|
143 self._hooks = self._hooks or setmetatable({}, { __mode = 'kv' }); |
143 local function hook(event) |
144 local function hook(event) |
144 -- FIXME service == nil would mean anyone, |
145 -- FIXME service == nil would mean anyone, |
145 -- publishing would be go to your bare jid. |
146 -- publishing would be go to your bare jid. |
146 -- So if you're only interestied in your own |
147 -- So if you're only interestied in your own |
147 -- events, hook your own bare jid. |
148 -- events, hook your own bare jid. |
148 if (not event.service or event.from == self.service) and event.node == self.node then |
149 if (not event.service or event.from == self.service) and event.node == self.node then |
149 return callback(event) |
150 return callback(event) |
150 end |
151 end |
151 end |
152 end |
|
153 self._hooks[callback] = hook; |
152 self.stream:hook("pubsub/event", hook, prio); |
154 self.stream:hook("pubsub/event", hook, prio); |
153 return hook; |
155 return hook; |
154 end |
156 end |
155 |
157 |
156 function pubsub_node:unhook(callback) |
158 function pubsub_node:unhook(callback) |
157 self.stream:unhook("pubsub/event", callback); |
159 if callback then |
|
160 local hook = self._hooks[callback]; |
|
161 self.stream:unhook("pubsub/event", hook); |
|
162 elseif self._hooks then |
|
163 for hook in pairs(self._hooks) do |
|
164 self.stream:unhook("pubsub/event", hook); |
|
165 end |
|
166 end |
158 end |
167 end |
159 |
168 |
160 function pubsub_node:create(config, callback) |
169 function pubsub_node:create(config, callback) |
161 if config ~= nil then |
170 if config ~= nil then |
162 error("Not implemented yet."); |
171 error("Not implemented yet."); |