mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1084 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			149 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
#! /usr/local/bin/ruby
 | 
						|
 | 
						|
if ARGV[0] != '-d'
 | 
						|
  unless $DEBUG
 | 
						|
    exit if fork
 | 
						|
  end
 | 
						|
else
 | 
						|
  ARGV.shift
 | 
						|
end
 | 
						|
 | 
						|
if ARGV.length == 0
 | 
						|
  if ENV['MAIL']
 | 
						|
    $spool = ENV['MAIL']
 | 
						|
  else  
 | 
						|
    $spool = '/usr/spool/mail/' + ENV['USER']
 | 
						|
  end
 | 
						|
else 
 | 
						|
  $spool = ARGV[0]
 | 
						|
end
 | 
						|
 | 
						|
require "parsedate"
 | 
						|
require "base64"
 | 
						|
 | 
						|
include ParseDate
 | 
						|
 | 
						|
class Mail
 | 
						|
  def Mail.new(f)
 | 
						|
    if !f.kind_of?(IO)
 | 
						|
      f = open(f, "r")
 | 
						|
      me = super
 | 
						|
      f.close
 | 
						|
    else
 | 
						|
      me = super
 | 
						|
    end
 | 
						|
    return me
 | 
						|
  end
 | 
						|
 | 
						|
  def initialize(f)
 | 
						|
    @header = {}
 | 
						|
    @body = []
 | 
						|
    while line = f.gets()
 | 
						|
      line.chop!
 | 
						|
      next if /^From / =~ line	# skip From-line  
 | 
						|
      break if /^$/ =~ line	# end of header
 | 
						|
      if /^(\S+):\s*(.*)/ =~ line
 | 
						|
	@header[attr = $1.capitalize] = $2
 | 
						|
      elsif attr
 | 
						|
	sub(/^\s*/, '')
 | 
						|
	@header[attr] += "\n" + $_
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    return unless $_
 | 
						|
 | 
						|
    while line = f.gets()
 | 
						|
      break if /^From / =~ line
 | 
						|
      @body.push($_)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def header
 | 
						|
    return @header
 | 
						|
  end
 | 
						|
 | 
						|
  def body
 | 
						|
    return @body
 | 
						|
  end
 | 
						|
 | 
						|
end
 | 
						|
 | 
						|
require "tkscrollbox"
 | 
						|
 | 
						|
$top = TkRoot.new
 | 
						|
$top.withdraw
 | 
						|
$list = TkScrollbox.new($top) {
 | 
						|
  relief 'raised'
 | 
						|
  width 80
 | 
						|
  height 8
 | 
						|
  setgrid 'yes'
 | 
						|
  pack
 | 
						|
}
 | 
						|
TkButton.new($top) {
 | 
						|
  text 'Dismiss'
 | 
						|
  command proc {$top.withdraw}
 | 
						|
  pack('fill'=>'both','expand'=>'yes')
 | 
						|
}
 | 
						|
$top.bind "Control-c", proc{exit}
 | 
						|
$top.bind "Control-q", proc{exit}
 | 
						|
$top.bind "space", proc{exit}
 | 
						|
 | 
						|
$spool_size = 0
 | 
						|
$check_time = Time.now
 | 
						|
 | 
						|
def check
 | 
						|
  $check_time = Time.now
 | 
						|
  size = File.size($spool)
 | 
						|
  if size and size != $spool_size
 | 
						|
    $spool_size = size
 | 
						|
    pop_up if size > 0
 | 
						|
  end
 | 
						|
  Tk.after 5000, proc{check}
 | 
						|
end
 | 
						|
 | 
						|
if defined? Thread
 | 
						|
  Thread.start do
 | 
						|
    loop do
 | 
						|
      sleep 600
 | 
						|
      if Time.now - $check_time > 200
 | 
						|
	Tk.after 5000, proc{check}
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
def pop_up
 | 
						|
  outcount = 0;
 | 
						|
  $list.delete 0, 'end'
 | 
						|
  f = open($spool, "r")
 | 
						|
  while !f.eof?
 | 
						|
    mail = Mail.new(f)
 | 
						|
    date, from, subj =  mail.header['Date'], mail.header['From'], mail.header['Subject']
 | 
						|
    next if !date
 | 
						|
    y = m = d = 0
 | 
						|
    y, m, d = parsedate(date) if date
 | 
						|
    from = "sombody@somewhere" if ! from
 | 
						|
    subj = "(nil)" if ! subj
 | 
						|
    from = decode_b(from)
 | 
						|
    subj = decode_b(subj)
 | 
						|
    $list.insert 'end', format('%-02d/%02d/%02d [%-28.28s] %s',y,m,d,from,subj)
 | 
						|
    outcount += 1
 | 
						|
  end
 | 
						|
  f.close
 | 
						|
  if outcount == 0
 | 
						|
    $list.insert 'end', "You have no mail."
 | 
						|
  else
 | 
						|
    $list.see 'end'
 | 
						|
  end
 | 
						|
  $top.deiconify
 | 
						|
  Tk.after 2000, proc{$top.withdraw}
 | 
						|
end
 | 
						|
 | 
						|
$list.insert 'end', "You have no mail."
 | 
						|
check
 | 
						|
Tk.after 2000, proc{$top.withdraw}
 | 
						|
begin
 | 
						|
  Tk.mainloop
 | 
						|
rescue
 | 
						|
  `echo #$! > /tmp/tkbiff`
 | 
						|
end
 |