lib/vines/stanza/presence/subscribed.rb in vines-0.3.2 vs lib/vines/stanza/presence/subscribed.rb in vines-0.4.0
- old
+ new
@@ -5,59 +5,46 @@
class Presence
class Subscribed < Presence
register "/presence[@type='subscribed']"
def process
+ stamp_from
inbound? ? process_inbound : process_outbound
end
def process_outbound
- self['from'] = stream.user.jid.bare.to_s
to = stamp_to
-
stream.user.add_subscription_from(to)
storage.save_user(stream.user)
stream.update_user_streams(stream.user)
-
local? ? process_inbound : route
-
- contact = stream.user.contact(to)
- stream.interested_resources(stream.user.jid).each do |recipient|
- contact.send_roster_push(recipient)
- end
-
- presences = stream.available_resources(stream.user.jid).map do |c|
- c.last_broadcast_presence.clone.tap do |node|
- node['from'] = c.user.jid.to_s
- node['id'] = Kit.uuid
- node['to'] = to.to_s
- end
- end
-
- if local?
- stream.available_resources(to).each do |recipient|
- presences.each {|el| recipient.write(el) }
- end
- else
- presences.each {|el| router.route(el) }
- end
+ send_roster_push(to)
+ send_known_presence(to)
end
def process_inbound
- self['from'] = stream.user.jid.bare.to_s
to = stamp_to
-
user = storage(to.domain).find_user(to)
contact = user.contact(stream.user.jid) if user
return unless contact && contact.can_subscribe?
contact.subscribe_to
storage(to.domain).save_user(user)
stream.update_user_streams(user)
+ broadcast_subscription_change(contact)
+ end
- stream.interested_resources(to).each do |recipient|
- recipient.write(@node)
- contact.send_roster_push(recipient)
+ private
+
+ # After approving a contact's subscription to this user's presence,
+ # broadcast this user's most recent presence stanzas to the contact.
+ def send_known_presence(to)
+ stanzas = stream.available_resources(stream.user.jid).map do |stream|
+ stream.last_broadcast_presence.clone.tap do |node|
+ node['from'] = stream.user.jid.to_s
+ node['id'] = Kit.uuid
+ end
end
+ broadcast_to_available_resources(stanzas, to)
end
end
end
end
end