hail.rb 2015.10.11.20.41

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 00e972e037991b6d9657fe533f509be688a0bfda
4
+ data.tar.gz: 852c08fa7becff0b4106fe65631228eef0c9e318
5
+ SHA512:
6
+ metadata.gz: 0cacdfd50a685ac0d53566264b01cd03ba2d98da2c03320f2842510f239097352bd5a07fac1d1ced002a2d77341629cd004a4629f92ac360a9e1cc691dc4b46f
7
+ data.tar.gz: 6296f602edb6a4ac98c43ac1146cc34c8bef4e050b4e469c64742e7ca76c5282e7bb7b1a28e40e9560cdfdccd3f49c17efa79965c91336396bf908f70de3e681
data/bin/hail ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'hail'
3
+ require 'pry'
4
+ Hail.new
@@ -0,0 +1,35 @@
1
+ require 'date'
2
+ require 'base64'
3
+
4
+ class Hail::Account
5
+ def initialize(config)
6
+ @config = config
7
+ end
8
+
9
+ def connect
10
+ @imap = Net::IMAP.new(@config[:address], @config[:port], @config[:tls])
11
+ @imap.authenticate('LOGIN', @config[:user], @config[:password])
12
+
13
+ @imap.select('INBOX')
14
+ list =[]
15
+
16
+
17
+ list = {name: [], subject: [], date: []}
18
+ @imap.sort(["REVERSE", "SUBJECT"], ["ALL"], "US-ASCII").each do |message_id|
19
+ envelope = @imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"]
20
+ list[:name] << Hail::Mail.header_readable(envelope.from[0].name)
21
+ list[:subject] << Hail::Mail.header_readable(envelope.subject)
22
+
23
+ date = @imap.fetch(message_id, "INTERNALDATE")[0].attr["INTERNALDATE"]
24
+ date = DateTime.parse(date)
25
+ if Date.today === date
26
+ date = date.strftime("%H:%M")
27
+ else
28
+ date = date.strftime("%d/%m/%Y %H:%M")
29
+ end
30
+ list[:date] << date.to_s
31
+ end
32
+
33
+ Hail::GUI.instance.buffer! list
34
+ end
35
+ end
@@ -0,0 +1,14 @@
1
+ class Hail::Accounts < Hash
2
+ def initialize()
3
+ super
4
+ file = YAML.load_file(Dir.home + "/.config/hail/account.yaml")
5
+ file.each do |account, account_config|
6
+ self[account] = Hail::Account.new(account_config)
7
+ end
8
+ end
9
+
10
+ def []=(key, value)
11
+ value.connect
12
+ super
13
+ end
14
+ end
data/lib/hail/gui.rb ADDED
@@ -0,0 +1,97 @@
1
+ require 'singleton'
2
+
3
+ class Hail::GUI
4
+ include Singleton
5
+
6
+ def initialize()
7
+ @buffer = []
8
+ @render_buffer = 0
9
+ Curses.init_screen()
10
+ end
11
+
12
+ def win
13
+ @win
14
+ end
15
+
16
+ def render
17
+ @win = Curses::Window.new(0, 0, 0, 0)
18
+ area = {height: win.maxy, width: win.maxx, top: 0, left: 0}
19
+
20
+ win.clear
21
+ @buffer[@render_buffer].to_hg(area) if not @buffer[@render_buffer].nil?
22
+ win.refresh
23
+ win.getch
24
+ end
25
+
26
+ def buffer=(buffer)
27
+ @render_buffer = buffer
28
+ end
29
+
30
+ def buffer!(buffer)
31
+ @buffer.insert(-1, buffer)
32
+ @buffer[-1]
33
+ end
34
+ end
35
+
36
+ class Hash
37
+ def to_hg(area)
38
+ width = area[:width] / self.length
39
+ i = 0
40
+ self.each do |k,v|
41
+ header = [k.to_s, "-" * (width - 5)]
42
+ subarea = {height: area[:height], width: i+1*width, top: area[:top], left: area[:left]+(i*width)}
43
+ header.to_hg(subarea)
44
+
45
+ #List
46
+ subarea = {height: area[:height] - header.__hg_height, width: i+1*width, top: area[:top] + header.__hg_height, left: area[:left]+(i*width)}
47
+ v.to_hg(subarea)
48
+ i += 1
49
+ end
50
+ end
51
+ end
52
+
53
+ class Array
54
+ def __hg_height
55
+ height = 0
56
+ self.each do |v|
57
+ height += v.__hg_height
58
+ end
59
+ height
60
+ end
61
+
62
+ def to_hg(area)
63
+ top = area[:top]
64
+ self.each do |v|
65
+ subarea = {height: area[:top]-top, width: area[:width], top: top, left: area[:left]}
66
+ if not v.nil?
67
+ v.to_hg(subarea)
68
+ top = top + v.__hg_height
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ class String
75
+ def __hg_height
76
+ 1
77
+ end
78
+
79
+ def __truncate(truncate_at, options = {})
80
+ return dup unless length > truncate_at
81
+
82
+ omission = options[:omission] || '...'
83
+ length_with_room_for_omission = truncate_at - omission.length
84
+ stop = if options[:separator]
85
+ rindex(options[:separator], length_with_room_for_omission) || length_with_room_for_omission
86
+ else
87
+ length_with_room_for_omission
88
+ end
89
+
90
+ "#{self[0, stop]}#{omission}"
91
+ end
92
+
93
+ def to_hg(area)
94
+ Hail::GUI.instance.win.setpos(area[:top], area[:left])
95
+ Hail::GUI.instance.win.addstr(self.__truncate(area[:width]-3))
96
+ end
97
+ end
data/lib/hail/mail.rb ADDED
@@ -0,0 +1,14 @@
1
+ class Hail::Mail
2
+ def self.header_readable(str)
3
+ decode = ""
4
+ if not str.nil?
5
+ str.gsub(/=\?([^?]*)\?(\w)\?([^?]*)\?=/) do |match|
6
+ decode = ""
7
+ if $2 == "B"
8
+ decode = Base64.decode64($3)
9
+ end
10
+ decode
11
+ end
12
+ end
13
+ end
14
+ end
data/lib/hail.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'yaml'
2
+ require 'net/imap'
3
+ require 'curses'
4
+
5
+ class Hail
6
+ def initialize()
7
+ @accounts = Accounts.new
8
+
9
+ while true
10
+ GUI.instance.render
11
+ end
12
+ end
13
+ end
14
+
15
+ require 'hail/accounts'
16
+ require 'hail/account'
17
+ require 'hail/gui'
18
+ require 'hail/mail'
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hail.rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 2015.10.11.20.41
5
+ platform: ruby
6
+ authors:
7
+ - Adrien Jeser
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-10-11 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: ''
14
+ email: adrien@jeser.me
15
+ executables:
16
+ - hail
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/hail
21
+ - lib/hail.rb
22
+ - lib/hail/account.rb
23
+ - lib/hail/accounts.rb
24
+ - lib/hail/gui.rb
25
+ - lib/hail/mail.rb
26
+ homepage: http://rubygems.org/gems/hail-mua
27
+ licenses:
28
+ - GPL3
29
+ metadata: {}
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project:
46
+ rubygems_version: 2.2.2
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: hail!
50
+ test_files: []