X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=lib%2Fsup%2Fcontact.rb;h=c489aaff5a4d67ce9d7156a10013f329bf790f11;hb=beee5b381eb1d3e6b4541bacf039d62bf5914f29;hp=cf307610893f0ec97c08ad079a139b93a223be1f;hpb=4ab181a0665da2112394e09cb35e7a25b68543d1;p=sup diff --git a/lib/sup/contact.rb b/lib/sup/contact.rb index cf30761..c489aaf 100644 --- a/lib/sup/contact.rb +++ b/lib/sup/contact.rb @@ -5,33 +5,52 @@ class ContactManager def initialize fn @fn = fn - @people = {} + + ## maintain the mapping between people and aliases. for contacts without + ## aliases, there will be no @a2p entry, so @p2a.keys should be treated + ## as the canonical list of contacts. + + @p2a = {} # person to alias + @a2p = {} # alias to person if File.exists? fn IO.foreach(fn) do |l| - l =~ /^(\S+): (.*)$/ or raise "can't parse #{fn} line #{l.inspect}" + l =~ /^([^:]*): (.*)$/ or raise "can't parse #{fn} line #{l.inspect}" aalias, addr = $1, $2 - @people[aalias] = Person.for addr + p = Person.from_address addr + @p2a[p] = aalias + @a2p[aalias] = p unless aalias.nil? || aalias.empty? end end + end - self.class.i_am_the_instance self + def contacts; @p2a.keys end + def contacts_with_aliases; @a2p.values.uniq end + + def update_alias person, aalias=nil + if(old_aalias = @p2a[person]) # remove old alias + @a2p.delete old_aalias + end + @p2a[person] = aalias + @a2p[aalias] = person unless aalias.nil? || aalias.empty? end - def contacts; @people; end - def set_contact person, aalias - oldentry = @people.find { |a, p| p == person } - @people.delete oldentry.first if oldentry - @people[aalias] = person + ## this may not actually be called anywhere, since we still keep contacts + ## around without aliases to override any fullname changes. + def drop_contact person + aalias = @p2a[person] + @p2a.delete person + @a2p.delete aalias if aalias end - def drop_contact person; @people.find { |a, p| @people.delete a if p == person }; end - def delete t; @people.delete t; end - def resolve aalias; @people[aalias]; end + + def contact_for aalias; @a2p[aalias] end + def alias_for person; @p2a[person] end + def is_aliased_contact? person; !@p2a[person].nil? end def save File.open(@fn, "w") do |f| - @people.keys.sort.each do |aalias| - f.puts "#{aalias}: #{@people[aalias].full_address}" + @p2a.sort_by { |(p, a)| [p.full_address, a] }.each do |(p, a)| + f.puts "#{a || ''}: #{p.full_address}" end end end