embulk-input-slack_message 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1f24a85713970b8586eaccf14732e5462b4618be
4
+ data.tar.gz: 19fc15c2631d750c37c488a63c57bcb3d60803cf
5
+ SHA512:
6
+ metadata.gz: 593e59cc7e4d1a424d8c09c108300f4fa5d50973b45fa053e51506366217e8c359d9a8b4dda3f67bae3c92b810f355d634e22803cd7bfd37a5874cc04388bc36
7
+ data.tar.gz: 97d36c2cc8b58ba63ccb611139dd9f4cf847ac227d1285fa0df9178c321bff29d54451c3ae35600ddb4edc82fa71d07556ca45c1704ee1f72dba9325a61e0212
@@ -0,0 +1,6 @@
1
+ *~
2
+ /pkg/
3
+ /tmp/
4
+ /.bundle/
5
+ /Gemfile.lock
6
+ /vendor/bundle
@@ -0,0 +1 @@
1
+ jruby-9.0.4.0
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org/'
2
+ gemspec
@@ -0,0 +1,21 @@
1
+
2
+ MIT License
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,74 @@
1
+ # Slack Message input plugin for Embulk
2
+
3
+ This plugin is embulk input from slack message.
4
+ Inspire of the [embulk-input-slack_history](https://github.com/yaggytter/embulk-input-slack-history/blob/master/lib/embulk/input/slack_history.rb)
5
+
6
+ ## Overview
7
+
8
+ * **Plugin type**: input
9
+ * **Resume supported**: no
10
+ * **Cleanup supported**: no
11
+ * **Guess supported**: yes
12
+
13
+ ## Advanced
14
+
15
+ ### Complete use name
16
+
17
+ User name be id come from slack in message.
18
+
19
+ This plugin complete user name.
20
+
21
+ ### Guess supported
22
+
23
+ This plugin guess supported.
24
+
25
+ Calculate between time from latest and oldest.
26
+
27
+ ## Configuration
28
+
29
+ channel settings is references slack description ([here](https://api.slack.com/methods/channels.history))
30
+
31
+ - **channel**: channel settings (hash, required)
32
+ - name: channel name (string, required)
33
+ - type: channel type (string, required. this param is originated)
34
+ - channel: public channel
35
+ - group: private group
36
+ - direct: direct message
37
+ - multi_direct: multi direct message
38
+ - latest: End of time range of messages to include in results. (string, default: now date)
39
+ - oldest: Start of time range of messages to include in results. (string, default: 0)
40
+ - count: Number of messages to return, between 1 and 1000 (long, default: 100)
41
+ - inclusive: Include messages with latest or oldest timestamp in results (long, default: 0)
42
+ - unreads: Include `unread_count_display` in the output? (long, default: 0)
43
+ - **token**: Slack API Token. Generate from [Slack Authentication](https://api.slack.com/web) (string, required)
44
+ - **repeat**: Adjustment of time when next config generation (mill seconds). (long, default: 0)
45
+
46
+ ## Example
47
+
48
+ ```yaml
49
+ in:
50
+ type: slack_message
51
+ channel:
52
+ name: general
53
+ type: channel
54
+ latest: '2016-02-16 00:00:00'
55
+ oldest: '2016-02-15 00:00:00'
56
+ count: 100
57
+ inclusive: 0
58
+ unreads: 0
59
+ token: 'aaaa-1111111111-2222222222-33333333333-bbbbbbbbbb'
60
+ repeat: 0
61
+ columns:
62
+ - {index: 0, name: datetime, type: timestamp, format: null}
63
+ - {index: 1, name: channel_id, type: string, format: null}
64
+ - {index: 2, name: channel_name, type: string, format: null}
65
+ - {index: 3, name: user_id, type: string, format: null}
66
+ - {index: 4, name: user_name, type: string, format: null}
67
+ - {index: 5, name: message, type: string, format: null}
68
+ ```
69
+
70
+ ## Build
71
+
72
+ ```
73
+ $ rake
74
+ ```
@@ -0,0 +1,3 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ task default: :build
@@ -0,0 +1,22 @@
1
+
2
+ Gem::Specification.new do |spec|
3
+ spec.name = "embulk-input-slack_message"
4
+ spec.version = "0.1.0"
5
+ spec.authors = ["yuemori"]
6
+ spec.summary = "Slack Message input plugin for Embulk"
7
+ spec.description = "Loads records from Slack Message."
8
+ spec.email = ["yuemori@aiming-inc.com"]
9
+ spec.licenses = ["MIT"]
10
+ spec.homepage = "https://github.com/yuemori/embulk-input-slack_message"
11
+
12
+ spec.files = `git ls-files`.split("\n") + Dir["classpath/*.jar"]
13
+ spec.test_files = spec.files.grep(%r{^(test|spec)/})
14
+ spec.require_paths = ["lib"]
15
+
16
+ spec.add_dependency 'rest-client'
17
+ spec.add_dependency 'activesupport'
18
+ spec.add_development_dependency 'embulk', ['>= 0.8.3']
19
+ spec.add_development_dependency 'bundler', ['>= 1.10.6']
20
+ spec.add_development_dependency 'rake', ['>= 10.0']
21
+ spec.add_development_dependency 'pry'
22
+ end
@@ -0,0 +1,93 @@
1
+ require 'slack'
2
+
3
+ module Embulk
4
+ module Input
5
+ class SlackMessage < InputPlugin
6
+ Plugin.register_input("slack_message", self)
7
+
8
+ def self.transaction(config, &control)
9
+ task = {
10
+ 'channel' => config.param('channel', :hash),
11
+ 'token' => config.param('token', :string),
12
+ 'repeat_at' => config.param('repeat_at', :long, default: 0)
13
+ }
14
+
15
+ yield(task, columns, 1)
16
+
17
+ channel = task['channel']
18
+ repeat_at = task['repeat_at']
19
+ latest = channel['latest'] ? Time.parse(channel['latest']).to_f : Time.now.to_f
20
+ oldest = channel['oldest'] ? Time.parse(channel['oldest']).to_f : 0
21
+
22
+ if repeat_at.zero?
23
+ time_diff = latest.to_i - oldest.to_i
24
+ channel = { oldest: Time.at(latest), latest: Time.at(latest + time_diff) }
25
+ else
26
+ channel = { oldest: oldest + repeat_at, latest: latest + repeat_at }
27
+ end
28
+
29
+ { channel: channel }
30
+ end
31
+
32
+ def self.columns
33
+ [
34
+ Column.new(0, "datetime", :timestamp),
35
+ Column.new(1, "channel_id", :string),
36
+ Column.new(2, "channel_name", :string),
37
+ Column.new(3, "user_id", :string),
38
+ Column.new(4, "user_name", :string),
39
+ Column.new(5, "message", :string)
40
+ ]
41
+ end
42
+
43
+ def self.guess(config)
44
+ channels = [
45
+ {
46
+ name: 'general',
47
+ type: 'channel',
48
+ latest: Time.now.strftime('%F %T'),
49
+ oldest: 0,
50
+ count: 100,
51
+ inclusive: 0,
52
+ unreads: 0
53
+ }
54
+ ]
55
+ { channel: channels.first, token: 'SLACK_API_TOKEN', repeat: 0, columns: Embulk::Schema.new(self.columns) }
56
+ end
57
+
58
+ def init
59
+ @channel = task["channel"]
60
+
61
+ token = task['token']
62
+ raise StandardError.new, 'slack token is not found' unless token
63
+
64
+ Slack.token = token
65
+ end
66
+
67
+ def run
68
+ latest = @channel['latest'] ? Time.parse(@channel['latest']).to_f : Time.now.to_f
69
+ oldest = @channel['oldest'] ? Time.parse(@channel['oldest']).to_f : 0
70
+ inclusive = @channel['inclusive'] || 0
71
+ count = @channel['count'] || 100
72
+ unreads = @channel['unreads'] || 0
73
+
74
+ options = {
75
+ latest: latest,
76
+ oldest: oldest,
77
+ inclusive: inclusive,
78
+ count: count,
79
+ unreads: unreads
80
+ }
81
+
82
+ Slack.messages(@channel['name'], @channel['type'], options).each do |message|
83
+ page_builder.add message
84
+ end
85
+
86
+ page_builder.finish
87
+
88
+ task_report = {}
89
+ return task_report
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,22 @@
1
+ require 'active_support'
2
+ require 'active_support/core_ext'
3
+ require 'rest-client'
4
+ require 'json'
5
+ require 'slack/client'
6
+
7
+ module Slack
8
+ class << self
9
+ attr_accessor :token
10
+ delegate :channels, :messages, :users, :options=, to: :client
11
+
12
+ def configure(&block)
13
+ yield configuration
14
+ end
15
+
16
+ private
17
+
18
+ def client
19
+ @client = Slack::Client.new(token)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,73 @@
1
+ module Slack
2
+ class Client
3
+ attr_reader :options, :token
4
+
5
+ def initialize(token)
6
+ @token = token
7
+ end
8
+
9
+ def messages(name, type, options)
10
+ channel = case type
11
+ when 'channel' then channels.find { |item| item['name'] == name }
12
+ when 'group' then groups.find { |item| item['name'] == name }
13
+ when 'direct' then im.find { |item| item['user'] == name }
14
+ when 'multi_direct' then mpim.find { |item| item['name'] == name }
15
+ end
16
+ messages = JSON.parse(get('channels.history', options.merge(channel: channel['id'])))['messages']
17
+ messages.select { |message| message['type'] == 'message' && message['subtype'].nil? }.map do |message|
18
+ [
19
+ Time.at(message['ts'].to_i),
20
+ channel['id'],
21
+ channel['name'],
22
+ message['user'],
23
+ user_by_id(message['user'])['name'],
24
+ filter_message(message['text'])
25
+ ]
26
+ end.reverse
27
+ end
28
+
29
+ def filter_message(text)
30
+ text = text.dup
31
+ scan = text.scan(/\<@[0-9A-Z]+\>/)
32
+ return text unless scan
33
+
34
+ scan.each do |pattern|
35
+ user_id = pattern.match(/<@(?<user_id>.*)>/)[:user_id]
36
+ text.gsub!(/#{pattern}/, "@#{user_by_id(user_id)['name']}")
37
+ end
38
+ text
39
+ end
40
+
41
+ def user_by_id(id)
42
+ users.find { |user| user['id'] == id }
43
+ end
44
+
45
+ def user_by_name(name)
46
+ users.find { |user| user['name'] == name }
47
+ end
48
+
49
+ def users
50
+ @users ||= JSON.parse(get('users.list', { presence: 0 }))['members']
51
+ end
52
+
53
+ def channels
54
+ @channels ||= JSON.parse(get('channels.list', { exclude_archived: 1 }))['channels']
55
+ end
56
+
57
+ def groups
58
+ @groups ||= JSON.parse(get('groups.list', { exclude_archived: 1 }))['groups']
59
+ end
60
+
61
+ def ims
62
+ @ims ||= JSON.parse(get('im.list'))['ims']
63
+ end
64
+
65
+ def mpim
66
+ @mpims ||= JSON.parse(get('mpim.list'))['groups']
67
+ end
68
+
69
+ def get(api, options = {})
70
+ RestClient.get("https://slack.com/api/#{api}", { params: options.merge(token: token) })
71
+ end
72
+ end
73
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: embulk-input-slack_message
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - yuemori
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: '0'
25
+ prerelease: false
26
+ type: :runtime
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ prerelease: false
40
+ type: :runtime
41
+ - !ruby/object:Gem::Dependency
42
+ name: embulk
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.8.3
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 0.8.3
53
+ prerelease: false
54
+ type: :development
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 1.10.6
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 1.10.6
67
+ prerelease: false
68
+ type: :development
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '10.0'
81
+ prerelease: false
82
+ type: :development
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ prerelease: false
96
+ type: :development
97
+ description: Loads records from Slack Message.
98
+ email:
99
+ - yuemori@aiming-inc.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".ruby-version"
106
+ - Gemfile
107
+ - LICENSE.txt
108
+ - README.md
109
+ - Rakefile
110
+ - embulk-input-slack_message.gemspec
111
+ - lib/embulk/input/slack_message.rb
112
+ - lib/slack.rb
113
+ - lib/slack/client.rb
114
+ homepage: https://github.com/yuemori/embulk-input-slack_message
115
+ licenses:
116
+ - MIT
117
+ metadata: {}
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 2.4.8
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: Slack Message input plugin for Embulk
138
+ test_files: []