lita-slack 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.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/LICENSE +19 -0
- data/README.md +50 -0
- data/Rakefile +6 -0
- data/lib/lita-slack.rb +1 -0
- data/lib/lita/adapters/slack.rb +86 -0
- data/lita-slack.gemspec +24 -0
- data/spec/lita/adapters/slack_spec.rb +53 -0
- data/spec/spec_helper.rb +2 -0
- metadata +140 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 756bfd5bc0c402ad707500b2d06fe4131ae61414
|
4
|
+
data.tar.gz: ba2490c9f35bfbe7dda51dffb5d18da5c18b5bba
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 99dd9b57499029f4feb8bd8624ed6c6f710c100f0b11cdcbb52ed9752516d6652a7e3b92e3ce3278299c604fb74b6a672bede4ea81b036af18605411dc3b58b6
|
7
|
+
data.tar.gz: bc4639ebffb94030a59873e206a7708945a5b4b304a6d2d53be946233f0c3254eb2c1d6937b7a2f777ae88ece3af6b7aab7a0b10492f44b60eebcaf414d77e96
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2013 kenjij
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in
|
11
|
+
all copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# lita-slack
|
2
|
+
|
3
|
+
**lita-slack** is an adapter for [Lita](https://github.com/jimmycuadra/lita) that allows you to use the robot with [Slack](https://slack.com/). As **lita-slack** is one way, robot messages to Slack, it depends on [lita-slack-handler](https://github.com/kenjij/lita-slack-handler) gem to receive messages from Slack.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add **lita-slack** and **lita-slack-handler** to your Lita instance's Gemfile:
|
8
|
+
|
9
|
+
``` ruby
|
10
|
+
gem "lita-slack"
|
11
|
+
gem "lita-slack-handler"
|
12
|
+
```
|
13
|
+
|
14
|
+
## Configuration
|
15
|
+
|
16
|
+
**First, you need to make sure your Slack team has [Incoming WebHooks](https://my.slack.com/services/new/incoming-webhook) integration setup. For configuration regarding lita-slack-handler, see its [README](https://github.com/kenjij/lita-slack-handler).**
|
17
|
+
|
18
|
+
Then, define the following attributes:
|
19
|
+
|
20
|
+
### Required attributes
|
21
|
+
|
22
|
+
* `incoming_token` (String) – Slack integration token.
|
23
|
+
* `team_domain` (String) – Slack team domain; subdomain of slack.com.
|
24
|
+
|
25
|
+
### Optional attributes
|
26
|
+
|
27
|
+
* `incoming_url` (String) – Default: https://<team_domain>.slack.com/services/hooks/incoming-webhook
|
28
|
+
* `username` (String) – Display name of the robot; default: whatever is set in Slack integration
|
29
|
+
* `add_mention` (Bool) – Always prefix message with mention of the user which it's directed to; this triggers a notification.
|
30
|
+
|
31
|
+
### Example lita_config.rb
|
32
|
+
|
33
|
+
``` ruby
|
34
|
+
Lita.configure do |config|
|
35
|
+
config.robot.name = "Lita"
|
36
|
+
config.robot.mention_name = "@lita"
|
37
|
+
# Select the Slack adapter
|
38
|
+
config.robot.adapter = :slack
|
39
|
+
# lita-slack adapter config
|
40
|
+
config.adapter.incoming_token = "aN1NvAlIdDuMmYt0k3n"
|
41
|
+
config.adapter.team_domain = "example"
|
42
|
+
config.adapter.username = "lita"
|
43
|
+
# Some more handlers and other config
|
44
|
+
# .....
|
45
|
+
end
|
46
|
+
```
|
47
|
+
|
48
|
+
## License
|
49
|
+
|
50
|
+
[MIT](http://opensource.org/licenses/MIT)
|
data/Rakefile
ADDED
data/lib/lita-slack.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "lita/adapters/slack"
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'lita'
|
2
|
+
require 'faraday'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Lita
|
6
|
+
module Adapters
|
7
|
+
class Slack < Adapter
|
8
|
+
# Required Lita config keys (via lita_config.rb)
|
9
|
+
require_configs :incoming_token, :team_domain
|
10
|
+
|
11
|
+
def initialize(robot)
|
12
|
+
log.debug 'Slack::initialize started'
|
13
|
+
super
|
14
|
+
# Set config default values
|
15
|
+
config.incoming_url ||= "https://#{config.team_domain}.slack.com/services/hooks/incoming-webhook"
|
16
|
+
config.username ||= nil
|
17
|
+
config.add_mention ||= false
|
18
|
+
log.debug 'Slack::initialize ending'
|
19
|
+
end
|
20
|
+
|
21
|
+
# Adapter main run loop
|
22
|
+
def run
|
23
|
+
log.debug 'Slack::run started'
|
24
|
+
sleep
|
25
|
+
rescue Interrupt
|
26
|
+
shut_down
|
27
|
+
end
|
28
|
+
|
29
|
+
def send_messages(target, strings)
|
30
|
+
log.debug 'Slack::send_messages started'
|
31
|
+
status = http_post prepare_payload(target, strings)
|
32
|
+
log.error "Slack::send_messages failed to send (#{status})" if status != 200
|
33
|
+
log.debug 'Slack::send_messages ending'
|
34
|
+
end
|
35
|
+
|
36
|
+
def set_topic(target, topic)
|
37
|
+
# Slack currently provides no method
|
38
|
+
log.info 'Slack::set_topic no implementation'
|
39
|
+
end
|
40
|
+
|
41
|
+
def shut_down
|
42
|
+
end
|
43
|
+
|
44
|
+
def prepare_payload(target, strings)
|
45
|
+
if not defined?(target.room)
|
46
|
+
channel_id = nil
|
47
|
+
log.warn "Slack::prepare_payload proceeding without channel designation"
|
48
|
+
else
|
49
|
+
channel_id = target.room
|
50
|
+
end
|
51
|
+
payload = {'channel' => channel_id, 'username' => config.username}
|
52
|
+
payload['text'] = strings.join('\n')
|
53
|
+
if config.add_mention and defined?(target.user.id)
|
54
|
+
payload['text'] = payload['text'].prepend("<@#{target.user.id}> ")
|
55
|
+
end
|
56
|
+
return payload
|
57
|
+
end
|
58
|
+
|
59
|
+
def http_post(payload)
|
60
|
+
res = Faraday.post do |req|
|
61
|
+
log.debug "Slack::http_post sending payload to #{config.incoming_url}; length: #{payload.to_json.size}"
|
62
|
+
req.url config.incoming_url, :token => config.incoming_token
|
63
|
+
req.headers['Content-Type'] = 'application/json'
|
64
|
+
req.body = payload.to_json
|
65
|
+
end
|
66
|
+
log.info "Slack::http_post sent payload with response status #{res.status}"
|
67
|
+
log.debug "Slack::http_post response body: #{res.body}"
|
68
|
+
return res.status
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# Accessor shortcuts
|
73
|
+
#
|
74
|
+
def config
|
75
|
+
Lita.config.adapter
|
76
|
+
end
|
77
|
+
|
78
|
+
def log
|
79
|
+
Lita.logger
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Register Slack adapter to Lita
|
84
|
+
Lita.register_adapter(:slack, Slack)
|
85
|
+
end
|
86
|
+
end
|
data/lita-slack.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
Gem::Specification.new do |spec|
|
2
|
+
spec.name = "lita-slack"
|
3
|
+
spec.version = "0.1.0"
|
4
|
+
spec.authors = ["Ken J."]
|
5
|
+
spec.email = ["kenjij@gmail.com"]
|
6
|
+
spec.description = %q{Lita adapter for Slack}
|
7
|
+
spec.summary = %q{Lita adapter for Slack using Sinatra. Requires lita-slack-handler gem.}
|
8
|
+
spec.homepage = "https://github.com/kenjij/lita-slack"
|
9
|
+
spec.license = "MIT"
|
10
|
+
spec.metadata = { "lita_plugin_type" => "adapter" }
|
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", "~> 2.7"
|
18
|
+
spec.add_runtime_dependency "lita-slack-handler", "~> 0.2"
|
19
|
+
spec.add_runtime_dependency "faraday", ">= 0.8.7"
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
spec.add_development_dependency "rspec", ">= 2.14"
|
24
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Lita::Adapters::Slack do
|
4
|
+
before do
|
5
|
+
Lita.configure do |config|
|
6
|
+
config.adapter.incoming_token = 'aN1NvAlIdDuMmYt0k3n'
|
7
|
+
config.adapter.team_domain = 'example'
|
8
|
+
config.adapter.username = 'lita'
|
9
|
+
config.adapter.add_mention = true
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
subject { described_class.new(robot) }
|
14
|
+
let(:robot) { double("Lita::Robot") }
|
15
|
+
|
16
|
+
it "registers with Lita" do
|
17
|
+
expect(Lita.adapters[:slack]).to eql(described_class)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "fails without valid config: incoming_token and team_domain" do
|
21
|
+
Lita.clear_config
|
22
|
+
expect(Lita.logger).to receive(:fatal).with(/incoming_token, team_domain/)
|
23
|
+
expect { subject }.to raise_error(SystemExit)
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#send_messages" do
|
27
|
+
it "sends JSON payload via HTTP POST to Slack channel" do
|
28
|
+
target = double("Lita::Source", room: "CR00M1D")
|
29
|
+
payload = {'channel' => target.room, 'username' => Lita.config.adapter.username, 'text' => 'Hello!'}
|
30
|
+
expect(subject).to receive(:http_post).with(payload)
|
31
|
+
subject.send_messages(target, ["Hello!"])
|
32
|
+
end
|
33
|
+
|
34
|
+
it "sends message with mention if user info is provided" do
|
35
|
+
user = double("Lita::User", id: "UM3NT10N")
|
36
|
+
target = double("Lita::Source", room: "CR00M1D", user: user)
|
37
|
+
text = "<@#{user.id}> Hello!"
|
38
|
+
payload = {'channel' => target.room, 'username' => Lita.config.adapter.username, 'text' => text}
|
39
|
+
expect(subject).to receive(:http_post).with(payload)
|
40
|
+
subject.send_messages(target, ["Hello!"])
|
41
|
+
end
|
42
|
+
|
43
|
+
it "proceeds but logs WARN when directed to an user without channel(room) info" do
|
44
|
+
user = double("Lita::User", id: "UM3NT10N")
|
45
|
+
target = double("Lita::Source", user: user)
|
46
|
+
text = "<@#{user.id}> Hello!"
|
47
|
+
payload = {'channel' => nil, 'username' => Lita.config.adapter.username, 'text' => text}
|
48
|
+
expect(subject).to receive(:http_post).with(payload)
|
49
|
+
expect(Lita.logger).to receive(:warn).with(/without channel/)
|
50
|
+
subject.send_messages(target, ["Hello!"])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lita-slack
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ken J.
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-17 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: '2.7'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.7'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: lita-slack-handler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: faraday
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.8.7
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.8.7
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.3'
|
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: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '2.14'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.14'
|
97
|
+
description: Lita adapter for Slack
|
98
|
+
email:
|
99
|
+
- kenjij@gmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- Gemfile
|
105
|
+
- LICENSE
|
106
|
+
- README.md
|
107
|
+
- Rakefile
|
108
|
+
- lib/lita-slack.rb
|
109
|
+
- lib/lita/adapters/slack.rb
|
110
|
+
- lita-slack.gemspec
|
111
|
+
- spec/lita/adapters/slack_spec.rb
|
112
|
+
- spec/spec_helper.rb
|
113
|
+
homepage: https://github.com/kenjij/lita-slack
|
114
|
+
licenses:
|
115
|
+
- MIT
|
116
|
+
metadata:
|
117
|
+
lita_plugin_type: adapter
|
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.0.7
|
135
|
+
signing_key:
|
136
|
+
specification_version: 4
|
137
|
+
summary: Lita adapter for Slack using Sinatra. Requires lita-slack-handler gem.
|
138
|
+
test_files:
|
139
|
+
- spec/lita/adapters/slack_spec.rb
|
140
|
+
- spec/spec_helper.rb
|