X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=lib%2Fsup%2Fcontact.rb;h=51fd0e978c902f17485c8fcd81f20cc766b74157;hb=eabc808e1f79297aff65bb9e3adacf59a72b90ba;hp=badbc8426e447b02f2c18671c2c44ae86c8ac0a5;hpb=b7e2a834ea1110aafb8d5e706754607a352a0159;p=sup diff --git a/lib/sup/contact.rb b/lib/sup/contact.rb index badbc84..51fd0e9 100644 --- a/lib/sup/contact.rb +++ b/lib/sup/contact.rb @@ -5,43 +5,54 @@ class ContactManager def initialize fn @fn = fn - @p2a = {} # person to alias map - @a2p = {} # alias to person map + + ## 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 - p = Person.for addr + p = Person.from_address addr @p2a[p] = aalias - @a2p[aalias] = p + @a2p[aalias] = p unless aalias.nil? || aalias.empty? end end self.class.i_am_the_instance self end - def contacts; @p2a.keys; end - def set_contact person, aalias - if(pold = @a2p[aalias]) && (pold != person) - drop_contact pold + 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 + @a2p[aalias] = person unless aalias.nil? || aalias.empty? end + + ## this may not actually be called anywhere, since we still keep contacts + ## around without aliases to override any fullname changes. def drop_contact person - if(aalias = @p2a[person]) - @p2a.delete person - @a2p.delete aalias - end - end - def person_with aalias; @a2p[aalias]; end - def alias_for person; @p2a[person]; end - def is_contact? person; @p2a.member? person; end + aalias = @p2a[person] + @p2a.delete person + @a2p.delete aalias if 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| - @p2a.each do |p, a| - f.puts "#{a}: #{p.full_address}" + @p2a.sort_by { |(p, a)| [p.full_address, a] }.each do |(p, a)| + f.puts "#{a || ''}: #{p.full_address}" end end end