sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/

lib/sup/contact.rb (1761B) - raw

      1 # encoding: utf-8
      2 
      3 module Redwood
      4 
      5 class ContactManager
      6   include Redwood::Singleton
      7 
      8   def initialize fn
      9     @fn = fn
     10 
     11     ## maintain the mapping between people and aliases. for contacts without
     12     ## aliases, there will be no @a2p entry, so @p2a.keys should be treated
     13     ## as the canonical list of contacts.
     14 
     15     @p2a = {} # person to alias
     16     @a2p = {} # alias to person
     17     @e2p = {} # email to person
     18 
     19     if File.exist? fn
     20       IO.foreach(fn) do |l|
     21         l =~ /^([^:]*): (.*)$/ or raise "can't parse #{fn} line #{l.inspect}"
     22         aalias, addr = $1, $2
     23         aalias = nil if aalias.empty?
     24         update_alias Person.from_address(addr), aalias
     25       end
     26     end
     27   end
     28 
     29   def contacts; @p2a.keys end
     30   def contacts_with_aliases; @a2p.values.uniq end
     31 
     32   def update_alias person, aalias=nil
     33     ## Deleting old data if it exists
     34     old_aalias = @p2a[person]
     35     if old_aalias
     36       @a2p.delete old_aalias
     37       @e2p.delete person.email
     38     end
     39     ## Update with new data
     40     @p2a[person] = aalias
     41     @a2p[aalias] = person unless aalias.nil?
     42     @e2p[person.email] = person
     43   end
     44 
     45   ## this may not actually be called anywhere, since we still keep contacts
     46   ## around without aliases to override any fullname changes.
     47   def drop_contact person
     48     aalias = @p2a[person]
     49     @p2a.delete person
     50     @e2p.delete person.email
     51     @a2p.delete aalias if aalias
     52   end
     53 
     54   def contact_for aalias; @a2p[aalias] end
     55   def alias_for person; @p2a[person] end
     56   def person_for email; @e2p[email] end
     57   def is_aliased_contact? person; !@p2a[person].nil? end
     58 
     59   def save
     60     File.open(@fn, "w:UTF-8") do |f|
     61       @p2a.sort_by { |(p, a)| [p.full_address, a] }.each do |(p, a)|
     62         f.puts "#{a || ''}: #{p.full_address}"
     63       end
     64     end
     65   end
     66 end
     67 
     68 end