Class: Vines::Contact

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/vines/contact.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(args = {}) ⇒ Contact

Returns a new instance of Contact.

Raises:

  • (ArgumentError)


10
11
12
13
14
15
16
17
18
# File 'lib/vines/contact.rb', line 10

def initialize(args={})
  @jid = JID.new(args[:jid]).bare
  raise ArgumentError, 'invalid jid' if @jid.empty?
  @name = args[:name]
  @subscription = args[:subscription] || 'none'
  @from_diaspora = args[:from_diaspora] || false
  @ask = args[:ask]
  @groups = args[:groups] || []
end

Instance Attribute Details

#askObject

Returns the value of attribute ask.



7
8
9
# File 'lib/vines/contact.rb', line 7

def ask
  @ask
end

#from_diasporaObject

Returns the value of attribute from_diaspora.



7
8
9
# File 'lib/vines/contact.rb', line 7

def from_diaspora
  @from_diaspora
end

#groupsObject

Returns the value of attribute groups.



7
8
9
# File 'lib/vines/contact.rb', line 7

def groups
  @groups
end

#jidObject (readonly)

Returns the value of attribute jid.



8
9
10
# File 'lib/vines/contact.rb', line 8

def jid
  @jid
end

#nameObject

Returns the value of attribute name.



7
8
9
# File 'lib/vines/contact.rb', line 7

def name
  @name
end

#subscriptionObject

Returns the value of attribute subscription.



7
8
9
# File 'lib/vines/contact.rb', line 7

def subscription
  @subscription
end

Instance Method Details

#<=>(contact) ⇒ Object



20
21
22
# File 'lib/vines/contact.rb', line 20

def <=>(contact)
  contact.is_a?(Contact) ? self.jid.to_s <=> contact.jid.to_s : nil
end

#can_subscribe?Boolean

Returns true if this contact is in a state that allows the user to subscribe to their presence updates.

Returns:

  • (Boolean)


40
41
42
# File 'lib/vines/contact.rb', line 40

def can_subscribe?
  @ask == 'subscribe' && %w[none from].include?(@subscription)
end

#hashObject



26
27
28
# File 'lib/vines/contact.rb', line 26

def hash
  jid.to_s.hash
end

#send_roster_push(recipient) ⇒ Object

Write an iq stanza to the recipient stream representing this contact’s current roster item state.



88
89
90
91
92
93
94
95
96
97
98
# File 'lib/vines/contact.rb', line 88

def send_roster_push(recipient)
  doc = Nokogiri::XML::Document.new
  node = doc.create_element('iq',
    'id'   => Kit.uuid,
    'to'   => recipient.user.jid.to_s,
    'type' => 'set')
  node << doc.create_element('query', 'xmlns' => NAMESPACES[:roster]) do |query|
    query << to_roster_xml
  end
  recipient.write(node)
end

#subscribe_fromObject



53
54
55
56
# File 'lib/vines/contact.rb', line 53

def subscribe_from
  @subscription = (@subscription == 'none') ? 'from' : 'both'
  @ask = nil
end

#subscribe_toObject



44
45
46
47
# File 'lib/vines/contact.rb', line 44

def subscribe_to
  @subscription = (@subscription == 'none') ? 'to' : 'both'
  @ask = nil
end

#subscribed_from?Boolean

Returns true if the user has a presence subscription from this contact. The contact is subscribed to this user’s presence.

Returns:

  • (Boolean)


70
71
72
# File 'lib/vines/contact.rb', line 70

def subscribed_from?
  %w[from both].include?(@subscription)
end

#subscribed_to?Boolean

Returns true if the user is subscribed to this contact’s presence updates.

Returns:

  • (Boolean)


64
65
66
# File 'lib/vines/contact.rb', line 64

def subscribed_to?
  %w[to both].include?(@subscription)
end

#to_hObject

Returns a hash of this contact’s attributes suitable for persisting in a document store.



76
77
78
79
80
81
82
83
84
# File 'lib/vines/contact.rb', line 76

def to_h
  {
    'name' => @name,
    'subscription' => @subscription,
    'from_diaspora' => @from_diaspora,
    'ask' => @ask,
    'groups' => @groups.sort!
  }
end

#to_roster_xmlObject

Returns this contact as an xmpp <item> element.



101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/vines/contact.rb', line 101

def to_roster_xml
  doc = Nokogiri::XML::Document.new
  doc.create_element('item') do |el|
    el['ask'] = @ask unless @ask.nil? || @ask.empty?
    el['jid'] = @jid.bare.to_s
    el['name'] = @name unless @name.nil? || @name.empty?
    el['subscription'] = @subscription
    el['from_diaspora'] = @from_diaspora
    @groups.sort!.each do |group|
      el << doc.create_element('group', group)
    end
  end
end

#unsubscribe_fromObject



58
59
60
# File 'lib/vines/contact.rb', line 58

def unsubscribe_from
  @subscription = (@subscription == 'both') ? 'to' : 'none'
end

#unsubscribe_toObject



49
50
51
# File 'lib/vines/contact.rb', line 49

def unsubscribe_to
  @subscription = (@subscription == 'both') ? 'from' : 'none'
end

#update_from(contact) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/vines/contact.rb', line 30

def update_from(contact)
  @name = contact.name
  @subscription = contact.subscription
  @from_diaspora = contact.from_diaspora
  @ask = contact.ask
  @groups = contact.groups.clone
end