#!/usr/bin/ruby
# 
# watchmail.imap -- status info on IMAP mailboxes

require "net/imap"

SERVERS = [ 
  {
      'label' => 'notes',
       'host' => 'localhost',
       'port' => '25143',
       'user' => 'richl',
   'password' => "password",
  'namespace' => '',
    'folders' => ['postponed-msgs', 'INBOX', nil, 'IN.*', nil, '@*']
  },
  {
      'label' => 'personal',
       'host' => 'mail.lafferty.ca',
       'port' => '143',
       'user' => 'lafferty',
   'password' => "password",
  'namespace' => 'INBOX.',
    'folders' => ['INBOX', nil, 'IN.*']
  },
]
              
$bold = `tput bold`
$sgr0 = `tput sgr0`

def mailstats(server, mbox)

    count = server['imap'].status(mbox, ['MESSAGES', 'UNSEEN'])

    mbox.sub!(server['namespace'],'')
    
    if (count['MESSAGES'] > 0)
        sprintf("%s%15s  %4d%s  %4d\n", 
            count['UNSEEN'] > 0 ? $bold : "", 
            mbox, 
            count['UNSEEN'], 
            count['UNSEEN'] > 0 ? $sgr0 : "", 
            count['MESSAGES'])
    else
        ""
    end

end


while true do

   out = Time.now.to_s + "\n\n";
   
   SERVERS.each do |server|

      out += $bold + server['label'] + $sgr0 + "\n\n"
      
      if (! server.key?("imap") or server['imap'].disconnected?)
          server['imap'] = Net::IMAP.new(server['host'], port = server['port'])
          server['imap'].authenticate('LOGIN', server['user'], server['password'])
      end
   
      server['folders'].each do |folder|
          if (folder == nil)
              out += "\n"
          elsif (folder =~ /\*/)
              server['imap'].list(server['namespace'], folder).sort {|a,b| a.name <=> b.name}.each do |imapf|
                  out += mailstats(server, imapf.name)
              end
          else 
              out += mailstats(server, folder)
          end
      end # folders

      out += "\n"

   end # servers

   system("clear")
   print out + $sgr0

   sleep 30
end
