lita-kintai 0.1.0

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: 348f5128d0cb518dc51f45824ede2d91e5f7b2e1
4
+ data.tar.gz: 3bbc13945826f589dc0041423eb1be635b44b931
5
+ SHA512:
6
+ metadata.gz: 6481e6aa3b2e772abcedf263a5cd0b54701b890de0e1d658c4cc3a1490a9bae308e5c89145aa90da1e5a58e992ed751f4d31940d9bc242fc34291faec3c058dd
7
+ data.tar.gz: e50ce592ff826485b8908d976b060d01708b244afa457d0b505868df0f7213319ef1e7cab00c94a661bc051583c1fb090907d1daf590ca39562246c7bdd4d82e
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+
19
+ /vendor/bundle
20
+ *.rdb
21
+ client_secret.json
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # lita-kintai
2
+
3
+ A lita handler for summarize attendance emails. Fuckin' legacy attendance management method by email!
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,148 @@
1
+ require 'google/apis/gmail_v1'
2
+ require 'googleauth'
3
+ require 'googleauth/stores/file_token_store'
4
+
5
+ require 'fileutils'
6
+ require 'date'
7
+
8
+ module Lita
9
+ module Handlers
10
+ class Kintai < Handler
11
+ config :query, type: String
12
+ config :template_header, type: String, default: ''
13
+ config :template_footer, type: String, default: ''
14
+
15
+ route(/kintai/i, :kintai)
16
+ route(/^code\s+(.+)/, :code)
17
+
18
+ OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'
19
+ APPLICATION_NAME = 'Lita Kintai'
20
+ CLIENT_SECRETS_PATH = 'client_secret.json'
21
+ CREDENTIALS_PATH = File.join(Dir.home, '.credentials',
22
+ "lita-kintai.yaml")
23
+ SCOPE = Google::Apis::GmailV1::AUTH_GMAIL_READONLY
24
+ USER_ID = 'default'
25
+
26
+ def kintai(response)
27
+ response.reply(current_kintai)
28
+ end
29
+
30
+ def code(response)
31
+ code = response.matches[0][0]
32
+ authorizer.get_and_store_credentials_from_code(
33
+ user_id: USER_ID, code: code, base_url: OOB_URI)
34
+
35
+ response.reply("Confirmed")
36
+ end
37
+
38
+ def current_kintai
39
+ if authorize.nil?
40
+ auth_url = authorizer.get_authorization_url(base_url: OOB_URI)
41
+ return <<-EOS
42
+ Authenticate your Google account.
43
+ Then tell me the code as follows: `code \#{your_code}`
44
+
45
+ #{auth_url}
46
+ EOS
47
+ end
48
+
49
+ kintai_info
50
+ end
51
+
52
+ def kintai_info
53
+ texts = ""
54
+ texts << "#{Date.today.strftime("%m/%d")} (#{%w(日 月 火 水 木 金 土)[Date.today.wday]})#{config.template_header}"
55
+
56
+ mails = find_mail(config.query)
57
+ # query の `newer:#{Date.today.strftime("%Y/%m/%d")}` 昨日のも一部返ってくる
58
+ # `newer_than:1d` だと24h以内になるので、ここで今日のだけにする
59
+ mails.select{ |m| m[:date] > Date.today.to_time }.each do |m|
60
+ name = m[:from].split("\"")[1]
61
+
62
+ text = m[:subject] + m[:body]
63
+
64
+ reason = "私用のため、"
65
+ if text.match(/電車|列車/)
66
+ reason = "電車遅延のため、"
67
+ end
68
+ if text.match(/体調|痛/)
69
+ reason = "体調不良のため、"
70
+ end
71
+ if text.match(/健康診断|検診|健診/)
72
+ reason = "健康診断のため、"
73
+ end
74
+
75
+ at = "出社時刻未定です。"
76
+ if hm = text.match(/([0-1][0-9]|[2][0-3]):[0-5][0-9]/)
77
+ at = "#{hm}頃出社予定です。"
78
+ elsif min = text.match(/([0-5][0-9])分/)
79
+ at = "10:#{min[1]}頃出社予定です。"
80
+ end
81
+
82
+ if text.match(/おやすみ|休み|有給|休暇/)
83
+ reason = "本日お休みです。"
84
+ at = ""
85
+ end
86
+
87
+ texts << "#{name}さん: #{reason}#{at}\n"
88
+ end
89
+
90
+ texts << config.template_footer
91
+ end
92
+
93
+ def authorize
94
+ return @service if !@servise.nil? && !@servise.authorization.nil?
95
+
96
+ credentials = authorizer.get_credentials(USER_ID)
97
+ if credentials
98
+ @service.authorization = credentials
99
+ return @service
100
+ end
101
+
102
+ return nil
103
+ end
104
+
105
+ def authorizer
106
+ return @authorizer unless @authorizer.nil?
107
+
108
+ @service = Google::Apis::GmailV1::GmailService.new
109
+ @service.client_options.application_name = APPLICATION_NAME
110
+
111
+ FileUtils.mkdir_p(File.dirname(CREDENTIALS_PATH))
112
+
113
+ client_id = Google::Auth::ClientId.from_file(CLIENT_SECRETS_PATH)
114
+ token_store = Google::Auth::Stores::FileTokenStore.new(
115
+ file: CREDENTIALS_PATH)
116
+ @authorizer = Google::Auth::UserAuthorizer.new(
117
+ client_id, SCOPE, token_store)
118
+ end
119
+
120
+ def find_mail(query)
121
+ ids = @service.list_user_messages('me', q: query)
122
+
123
+ return [] unless ids.messages
124
+ ids.messages.map do |message|
125
+ find_mail_by_id(message.id)
126
+ end
127
+ end
128
+
129
+ def find_mail_by_id(id)
130
+ results = @service.get_user_message('me', id)
131
+
132
+ body = results.payload.parts ?
133
+ results.payload.parts.first.body.data :
134
+ results.payload.body.data
135
+ headers = results.payload.headers
136
+
137
+ {
138
+ subject: headers.select { |e| e.name == 'Subject'}.first.value,
139
+ from: headers.select { |e| e.name == 'From'}.first.value,
140
+ date: Time.parse(headers.select { |e| e.name == 'Date'}.first.value),
141
+ body: body.force_encoding('utf-8'),
142
+ }
143
+ end
144
+
145
+ Lita.register_handler(self)
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,12 @@
1
+ require "lita"
2
+
3
+ Lita.load_locales Dir[File.expand_path(
4
+ File.join("..", "..", "locales", "*.yml"), __FILE__
5
+ )]
6
+
7
+ require "lita/handlers/kintai"
8
+
9
+ Lita::Handlers::Kintai.template_root File.expand_path(
10
+ File.join("..", "..", "templates"),
11
+ __FILE__
12
+ )
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "lita-kintai"
3
+ spec.version = "0.1.0"
4
+ spec.authors = ["Shoma SATO"]
5
+ spec.email = ["noir.neo.04@gmail.com"]
6
+ spec.description = "A lita handler for summarize attendance emails. Fuckin' legacy attendance management method by email!"
7
+ spec.summary = "A lita handler for summarize attendance emails."
8
+ spec.homepage = ""
9
+ spec.license = "MIT"
10
+ spec.metadata = { "lita_plugin_type" => "handler" }
11
+
12
+ spec.files = `git ls-files`.split($/)
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.require_paths = ["lib"]
16
+
17
+ spec.add_runtime_dependency "lita", ">= 4.7"
18
+ spec.add_runtime_dependency "google-api-client"
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.3"
21
+ spec.add_development_dependency "pry-byebug"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rack-test"
24
+ spec.add_development_dependency "rspec", ">= 3.0.0"
25
+ end
data/locales/en.yml ADDED
@@ -0,0 +1,4 @@
1
+ en:
2
+ lita:
3
+ handlers:
4
+ kintai:
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Lita::Handlers::Kintai, lita_handler: true do
4
+ it { is_expected.to route('kintai') }
5
+ it { is_expected.to route('kintai').to(:kintai) }
6
+ it { is_expected.to route('code 012abc') }
7
+ it { is_expected.to route('code 012abc').to(:code) }
8
+
9
+ describe '#kintai' do
10
+ context 'when authenticated' do
11
+ before do
12
+ allow_any_instance_of(Lita::Handlers::Kintai).to receive(:authorize).and_return(Google::Apis::GmailV1::GmailService.new)
13
+ allow_any_instance_of(Lita::Handlers::Kintai).to receive(:find_mail).and_return(
14
+ [
15
+ {
16
+ subject: '',
17
+ from: '',
18
+ date: Date.today.to_time,
19
+ body: '',
20
+ }
21
+ ]
22
+ )
23
+ end
24
+
25
+ it 'returns kintai list' do
26
+ send_message('kintai')
27
+ expect(replies.last).not_to be_nil
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,6 @@
1
+ require "lita-kintai"
2
+ require "lita/rspec"
3
+
4
+ # A compatibility mode is provided for older plugins upgrading from Lita 3. Since this plugin
5
+ # was generated with Lita 4, the compatibility mode should be left disabled.
6
+ Lita.version_3_compatibility_mode = false
File without changes
metadata ADDED
@@ -0,0 +1,157 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lita-kintai
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Shoma SATO
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-10-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lita
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '4.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: google-api-client
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rack-test
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: 3.0.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: 3.0.0
111
+ description: A lita handler for summarize attendance emails. Fuckin' legacy attendance
112
+ management method by email!
113
+ email:
114
+ - noir.neo.04@gmail.com
115
+ executables: []
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - Gemfile
121
+ - README.md
122
+ - Rakefile
123
+ - lib/lita-kintai.rb
124
+ - lib/lita/handlers/kintai.rb
125
+ - lita-kintai.gemspec
126
+ - locales/en.yml
127
+ - spec/lita/handlers/kintai_spec.rb
128
+ - spec/spec_helper.rb
129
+ - templates/.gitkeep
130
+ homepage: ''
131
+ licenses:
132
+ - MIT
133
+ metadata:
134
+ lita_plugin_type: handler
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ required_rubygems_version: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubyforge_project:
151
+ rubygems_version: 2.4.5
152
+ signing_key:
153
+ specification_version: 4
154
+ summary: A lita handler for summarize attendance emails.
155
+ test_files:
156
+ - spec/lita/handlers/kintai_spec.rb
157
+ - spec/spec_helper.rb