lita-slack 0.1.2 → 1.0.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 +4 -4
- data/.travis.yml +9 -0
- data/README.md +11 -24
- data/lib/lita/adapters/slack/api.rb +69 -0
- data/lib/lita/adapters/slack/im_mapping.rb +34 -0
- data/lib/lita/adapters/slack/message_handler.rb +118 -0
- data/lib/lita/adapters/slack/rtm_connection.rb +103 -0
- data/lib/lita/adapters/slack/slack_im.rb +26 -0
- data/lib/lita/adapters/slack/slack_user.rb +31 -0
- data/lib/lita/adapters/slack/team_data.rb +7 -0
- data/lib/lita/adapters/slack/user_creator.rb +34 -0
- data/lib/lita/adapters/slack.rb +32 -77
- data/lib/lita-slack.rb +6 -0
- data/lita-slack.gemspec +11 -5
- data/locales/en.yml +5 -0
- data/spec/lita/adapters/slack/api_spec.rb +110 -0
- data/spec/lita/adapters/slack/im_mapping_spec.rb +34 -0
- data/spec/lita/adapters/slack/message_handler_spec.rb +178 -0
- data/spec/lita/adapters/slack/rtm_connection_spec.rb +102 -0
- data/spec/lita/adapters/slack/slack_im_spec.rb +36 -0
- data/spec/lita/adapters/slack/slack_user_spec.rb +35 -0
- data/spec/lita/adapters/slack/user_creator_spec.rb +49 -0
- data/spec/lita/adapters/slack_spec.rb +82 -49
- data/spec/spec_helper.rb +16 -0
- metadata +117 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8487603a85d7972122eb6826b21534e31484a63
|
4
|
+
data.tar.gz: ec5c0068bdf7b935299f099eff9b1cecefad4b2b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1b9000c60ee73995c0cfce1f36499d3b6756a0e4558bf0c96eff7bc2ceaa24e11fbe57952232291c89439850b5039739d1f93960d796081009cbeb76471a714
|
7
|
+
data.tar.gz: 3c8b5d80b99919f23eb2f0fce811b8f8f551cfc316e8f2ed51c73c9834e33bb904d8a75f4e5a00540cd664e5d41c9e15ec91fb6e23a3eb4e83d9afbb9e9b4a44
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,50 +1,37 @@
|
|
1
1
|
# lita-slack
|
2
2
|
|
3
|
-
**lita-slack** is an adapter for [Lita](https://
|
3
|
+
**lita-slack** is an adapter for [Lita](https://www.lita.io/) that allows you to use the robot with [Slack](https://slack.com/). The current adapter is not compatible with pre-1.0.0 versions, as it now uses Slack's [Real Time Messaging API](https://api.slack.com/rtm).
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
Add **lita-slack**
|
7
|
+
Add **lita-slack** to your Lita instance's Gemfile:
|
8
8
|
|
9
9
|
``` ruby
|
10
10
|
gem "lita-slack"
|
11
|
-
gem "lita-slack-handler"
|
12
11
|
```
|
13
12
|
|
14
13
|
## Configuration
|
15
14
|
|
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
15
|
### Required attributes
|
21
16
|
|
22
|
-
* `
|
23
|
-
* `team_domain` (String) – Slack team domain; subdomain of slack.com.
|
24
|
-
|
25
|
-
### Optional attributes
|
17
|
+
* `token` (String) – The bot's Slack API token. Create a bot and get its token at https://my.slack.com/services/new/bot.
|
26
18
|
|
27
|
-
|
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.
|
19
|
+
**Note**: When using lita-slack, the adapter will overwrite the bot's name and mention name with the values set on the server, so `config.robot.name` and `config.robot.mention_name` will have no effect.
|
30
20
|
|
31
|
-
### Example
|
21
|
+
### Example
|
32
22
|
|
33
23
|
``` ruby
|
34
24
|
Lita.configure do |config|
|
35
|
-
config.robot.name = "Lita"
|
36
|
-
config.robot.mention_name = "@lita"
|
37
|
-
# Select the Slack adapter
|
38
25
|
config.robot.adapter = :slack
|
39
|
-
|
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
|
-
# .....
|
26
|
+
config.adapters.slack.token = "abcd-1234567890-hWYd21AmMH2UHAkx29vb5c1Y"
|
45
27
|
end
|
46
28
|
```
|
47
29
|
|
30
|
+
## Events
|
31
|
+
|
32
|
+
* `:connected` - When the robot has connected to Slack. No payload.
|
33
|
+
* `:disconnected` - When the robot has disconnected from Slack. No payload.
|
34
|
+
|
48
35
|
## License
|
49
36
|
|
50
37
|
[MIT](http://opensource.org/licenses/MIT)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
require 'lita/adapters/slack/team_data'
|
4
|
+
require 'lita/adapters/slack/slack_im'
|
5
|
+
require 'lita/adapters/slack/slack_user'
|
6
|
+
|
7
|
+
module Lita
|
8
|
+
module Adapters
|
9
|
+
class Slack < Adapter
|
10
|
+
class API
|
11
|
+
def initialize(token, stubs = nil)
|
12
|
+
@token = token
|
13
|
+
@stubs = stubs
|
14
|
+
end
|
15
|
+
|
16
|
+
def im_open(user_id)
|
17
|
+
response_data = call_api("im.open", user: user_id)
|
18
|
+
|
19
|
+
SlackIM.new(response_data["channel"]["id"], user_id)
|
20
|
+
end
|
21
|
+
|
22
|
+
def rtm_start
|
23
|
+
response_data = call_api("rtm.start")
|
24
|
+
|
25
|
+
TeamData.new(
|
26
|
+
SlackIM.from_data_array(response_data["ims"]),
|
27
|
+
SlackUser.from_data(response_data["self"]),
|
28
|
+
SlackUser.from_data_array(response_data["users"]),
|
29
|
+
response_data["url"]
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
attr_reader :stubs
|
36
|
+
attr_reader :token
|
37
|
+
|
38
|
+
def call_api(method, post_data = {})
|
39
|
+
response = connection.post(
|
40
|
+
"https://slack.com/api/#{method}",
|
41
|
+
{ token: token }.merge(post_data)
|
42
|
+
)
|
43
|
+
|
44
|
+
data = parse_response(response, method)
|
45
|
+
|
46
|
+
raise "Slack API call to #{method} returned an error: #{data["error"]}." if data["error"]
|
47
|
+
|
48
|
+
data
|
49
|
+
end
|
50
|
+
|
51
|
+
def connection
|
52
|
+
if stubs
|
53
|
+
Faraday.new { |faraday| faraday.adapter(:test, stubs) }
|
54
|
+
else
|
55
|
+
Faraday.new
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def parse_response(response, method)
|
60
|
+
unless response.success?
|
61
|
+
raise "Slack API call to #{method} failed with status code #{response.status}."
|
62
|
+
end
|
63
|
+
|
64
|
+
MultiJson.load(response.body)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Lita
|
2
|
+
module Adapters
|
3
|
+
class Slack < Adapter
|
4
|
+
class IMMapping
|
5
|
+
def initialize(api, ims)
|
6
|
+
@api = api
|
7
|
+
@mapping = {}
|
8
|
+
|
9
|
+
add_mappings(ims)
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_mapping(im)
|
13
|
+
mapping[im.user_id] = im.id
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_mappings(ims)
|
17
|
+
ims.each { |im| add_mapping(im) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def im_for(user_id)
|
21
|
+
mapping.fetch(user_id) do
|
22
|
+
im = api.im_open(user_id)
|
23
|
+
mapping[user_id] = im.id
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :api
|
30
|
+
attr_reader :mapping
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module Lita
|
2
|
+
module Adapters
|
3
|
+
class Slack < Adapter
|
4
|
+
class MessageHandler
|
5
|
+
def initialize(robot, robot_id, data)
|
6
|
+
@robot = robot
|
7
|
+
@robot_id = robot_id
|
8
|
+
@data = data
|
9
|
+
@type = data["type"]
|
10
|
+
end
|
11
|
+
|
12
|
+
def handle
|
13
|
+
case type
|
14
|
+
when "hello"
|
15
|
+
handle_hello
|
16
|
+
when "message"
|
17
|
+
handle_message
|
18
|
+
when "user_change", "team_join"
|
19
|
+
handle_user_change
|
20
|
+
when "bot_added", "bot_changed"
|
21
|
+
handle_bot_change
|
22
|
+
when "error"
|
23
|
+
handle_error
|
24
|
+
else
|
25
|
+
handle_unknown
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
attr_reader :data
|
32
|
+
attr_reader :robot
|
33
|
+
attr_reader :robot_id
|
34
|
+
attr_reader :type
|
35
|
+
|
36
|
+
def body
|
37
|
+
data["text"].sub(/^\s*<@#{robot_id}>/, "@#{robot.mention_name}")
|
38
|
+
end
|
39
|
+
|
40
|
+
def channel
|
41
|
+
data["channel"]
|
42
|
+
end
|
43
|
+
|
44
|
+
def dispatch_message(user)
|
45
|
+
source = Source.new(user: user, room: channel)
|
46
|
+
message = Message.new(robot, body, source)
|
47
|
+
log.debug("Dispatching message to Lita from #{user.id}.")
|
48
|
+
robot.receive(message)
|
49
|
+
end
|
50
|
+
|
51
|
+
def from_self?(user)
|
52
|
+
if data["subtype"] == "bot_message"
|
53
|
+
robot_user = User.find_by_name(robot.name)
|
54
|
+
|
55
|
+
robot_user && robot_user.id == user.id
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def handle_bot_change
|
60
|
+
log.debug("Updating user data for bot.")
|
61
|
+
UserCreator.create_user(data["bot"], robot, robot_id)
|
62
|
+
end
|
63
|
+
|
64
|
+
def handle_error
|
65
|
+
error = data["error"]
|
66
|
+
code = error["code"]
|
67
|
+
message = error["msg"]
|
68
|
+
log.error("Error with code #{code} received from Slack: #{message}")
|
69
|
+
end
|
70
|
+
|
71
|
+
def handle_hello
|
72
|
+
log.info("Connected to Slack.")
|
73
|
+
robot.trigger(:connected)
|
74
|
+
end
|
75
|
+
|
76
|
+
def handle_message
|
77
|
+
return unless supported_subtype?
|
78
|
+
|
79
|
+
user = User.find_by_id(data["user"]) || User.create(data["user"])
|
80
|
+
|
81
|
+
return if from_self?(user)
|
82
|
+
|
83
|
+
dispatch_message(user)
|
84
|
+
end
|
85
|
+
|
86
|
+
def handle_unknown
|
87
|
+
unless data["reply_to"]
|
88
|
+
log.debug("#{type} event received from Slack and will be ignored.")
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def handle_user_change
|
93
|
+
log.debug("Updating user data.")
|
94
|
+
UserCreator.create_user(data["user"], robot, robot_id)
|
95
|
+
end
|
96
|
+
|
97
|
+
def log
|
98
|
+
Lita.logger
|
99
|
+
end
|
100
|
+
|
101
|
+
# Types of messages Lita should dispatch to handlers.
|
102
|
+
def supported_message_subtypes
|
103
|
+
%w(bot_message me_message)
|
104
|
+
end
|
105
|
+
|
106
|
+
def supported_subtype?
|
107
|
+
subtype = data["subtype"]
|
108
|
+
|
109
|
+
if subtype
|
110
|
+
supported_message_subtypes.include?(subtype)
|
111
|
+
else
|
112
|
+
true
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'eventmachine'
|
2
|
+
require 'faye/websocket'
|
3
|
+
require 'multi_json'
|
4
|
+
|
5
|
+
require 'lita/adapters/slack/api'
|
6
|
+
require 'lita/adapters/slack/im_mapping'
|
7
|
+
require 'lita/adapters/slack/message_handler'
|
8
|
+
require 'lita/adapters/slack/user_creator'
|
9
|
+
|
10
|
+
module Lita
|
11
|
+
module Adapters
|
12
|
+
class Slack < Adapter
|
13
|
+
class RTMConnection
|
14
|
+
MAX_MESSAGE_BYTES = 16_000
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def build(robot, token)
|
18
|
+
new(robot, token, API.new(token).rtm_start)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(robot, token, team_data)
|
23
|
+
@robot = robot
|
24
|
+
@im_mapping = IMMapping.new(token, team_data.ims)
|
25
|
+
@websocket_url = team_data.websocket_url
|
26
|
+
@robot_id = team_data.self.id
|
27
|
+
|
28
|
+
UserCreator.create_users(team_data.users, robot, robot_id)
|
29
|
+
end
|
30
|
+
|
31
|
+
def im_for(user_id)
|
32
|
+
im_mapping.im_for(user_id)
|
33
|
+
end
|
34
|
+
|
35
|
+
def run(queue = nil)
|
36
|
+
EM.run do
|
37
|
+
log.debug("Connecting to the Slack Real Time Messaging API.")
|
38
|
+
@websocket = Faye::WebSocket::Client.new(websocket_url, nil, ping: 10)
|
39
|
+
|
40
|
+
websocket.on(:open) { log.debug("Connected to the Slack Real Time Messaging API.") }
|
41
|
+
websocket.on(:message) { |event| receive_message(event) }
|
42
|
+
websocket.on(:close) { log.info("Disconnected from Slack.") }
|
43
|
+
websocket.on(:error) { |event| log.debug("WebSocket error: #{event.message}") }
|
44
|
+
|
45
|
+
queue << websocket if queue
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def send_messages(channel, strings)
|
50
|
+
strings.each do |string|
|
51
|
+
websocket.send(safe_payload_for(channel, string))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def shut_down
|
56
|
+
if websocket
|
57
|
+
log.debug("Closing connection to the Slack Real Time Messaging API.")
|
58
|
+
websocket.close
|
59
|
+
end
|
60
|
+
|
61
|
+
EM.stop if EM.reactor_running?
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
attr_reader :im_mapping
|
67
|
+
attr_reader :robot
|
68
|
+
attr_reader :robot_id
|
69
|
+
attr_reader :websocket
|
70
|
+
attr_reader :websocket_url
|
71
|
+
|
72
|
+
def log
|
73
|
+
Lita.logger
|
74
|
+
end
|
75
|
+
|
76
|
+
def payload_for(channel, string)
|
77
|
+
MultiJson.dump({
|
78
|
+
id: 1,
|
79
|
+
type: 'message',
|
80
|
+
text: string,
|
81
|
+
channel: channel
|
82
|
+
})
|
83
|
+
end
|
84
|
+
|
85
|
+
def receive_message(event)
|
86
|
+
data = MultiJson.load(event.data)
|
87
|
+
|
88
|
+
MessageHandler.new(robot, robot_id, data).handle
|
89
|
+
end
|
90
|
+
|
91
|
+
def safe_payload_for(channel, string)
|
92
|
+
payload = payload_for(channel, string)
|
93
|
+
|
94
|
+
if payload.size > MAX_MESSAGE_BYTES
|
95
|
+
raise ArgumentError, "Cannot send payload greater than #{MAX_MESSAGE_BYTES} bytes."
|
96
|
+
end
|
97
|
+
|
98
|
+
payload
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Lita
|
2
|
+
module Adapters
|
3
|
+
class Slack < Adapter
|
4
|
+
class SlackIM
|
5
|
+
class << self
|
6
|
+
def from_data_array(ims_data)
|
7
|
+
ims_data.map { |im_data| from_data(im_data) }
|
8
|
+
end
|
9
|
+
|
10
|
+
def from_data(im_data)
|
11
|
+
new(im_data['id'], im_data['user'])
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :id
|
16
|
+
attr_reader :user_id
|
17
|
+
|
18
|
+
def initialize(id, user_id)
|
19
|
+
@id = id
|
20
|
+
@user_id = user_id
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Lita
|
2
|
+
module Adapters
|
3
|
+
class Slack < Adapter
|
4
|
+
class SlackUser
|
5
|
+
class << self
|
6
|
+
def from_data(user_data)
|
7
|
+
new(
|
8
|
+
user_data['id'],
|
9
|
+
user_data['name'],
|
10
|
+
user_data['real_name']
|
11
|
+
)
|
12
|
+
end
|
13
|
+
|
14
|
+
def from_data_array(users_data)
|
15
|
+
users_data.map { |user_data| from_data(user_data) }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
attr_reader :id
|
20
|
+
attr_reader :name
|
21
|
+
attr_reader :real_name
|
22
|
+
|
23
|
+
def initialize(id, name, real_name)
|
24
|
+
@id = id
|
25
|
+
@name = name
|
26
|
+
@real_name = real_name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Lita
|
2
|
+
module Adapters
|
3
|
+
class Slack < Adapter
|
4
|
+
class UserCreator
|
5
|
+
class << self
|
6
|
+
def create_user(slack_user, robot, robot_id)
|
7
|
+
User.create(
|
8
|
+
slack_user.id,
|
9
|
+
name: real_name(slack_user),
|
10
|
+
mention_name: slack_user.name
|
11
|
+
)
|
12
|
+
|
13
|
+
update_robot(robot, slack_user) if slack_user.id == robot_id
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_users(slack_users, robot, robot_id)
|
17
|
+
slack_users.each { |slack_user| create_user(slack_user, robot, robot_id) }
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def real_name(slack_user)
|
23
|
+
slack_user.real_name.size > 0 ? slack_user.real_name : slack_user.name
|
24
|
+
end
|
25
|
+
|
26
|
+
def update_robot(robot, slack_user)
|
27
|
+
robot.name = slack_user.real_name
|
28
|
+
robot.mention_name = slack_user.name
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/lita/adapters/slack.rb
CHANGED
@@ -1,91 +1,46 @@
|
|
1
|
-
require 'lita'
|
2
|
-
require 'faraday'
|
3
|
-
require 'json'
|
1
|
+
require 'lita/adapters/slack/rtm_connection'
|
4
2
|
|
5
3
|
module Lita
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
module Adapters
|
5
|
+
class Slack < Adapter
|
6
|
+
# Required configuration attributes.
|
7
|
+
config :token, type: String, required: true
|
10
8
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
sleep
|
15
|
-
rescue Interrupt
|
16
|
-
shut_down
|
17
|
-
end
|
9
|
+
# Starts the connection.
|
10
|
+
def run
|
11
|
+
return if rtm_connection
|
18
12
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
log.error "Slack::send_messages failed to send (#{status})" if status != 200
|
23
|
-
log.debug 'Slack::send_messages ending'
|
24
|
-
end
|
25
|
-
|
26
|
-
def set_topic(target, topic)
|
27
|
-
# Slack currently provides no method
|
28
|
-
log.info 'Slack::set_topic no implementation'
|
29
|
-
end
|
30
|
-
|
31
|
-
def shut_down
|
32
|
-
end
|
33
|
-
|
34
|
-
private
|
35
|
-
|
36
|
-
def prepare_payload(target, strings)
|
37
|
-
if not defined?(target.room)
|
38
|
-
channel_id = nil
|
39
|
-
log.warn "Slack::prepare_payload proceeding without channel designation"
|
40
|
-
else
|
41
|
-
channel_id = target.room
|
42
|
-
end
|
43
|
-
payload = {'channel' => channel_id, 'username' => username}
|
44
|
-
payload['text'] = strings.join('\n')
|
45
|
-
if add_mention? and defined?(target.user.id)
|
46
|
-
payload['text'] = payload['text'].prepend("<@#{target.user.id}> ")
|
47
|
-
end
|
48
|
-
return payload
|
49
|
-
end
|
13
|
+
@rtm_connection = RTMConnection.build(robot, config.token)
|
14
|
+
rtm_connection.run
|
15
|
+
end
|
50
16
|
|
51
|
-
|
52
|
-
|
53
|
-
log.debug "Slack::http_post sending payload to #{incoming_url}; length: #{payload.to_json.size}"
|
54
|
-
req.url incoming_url, :token => config.incoming_token
|
55
|
-
req.headers['Content-Type'] = 'application/json'
|
56
|
-
req.body = payload.to_json
|
57
|
-
end
|
58
|
-
log.info "Slack::http_post sent payload with response status #{res.status}"
|
59
|
-
log.debug "Slack::http_post response body: #{res.body}"
|
60
|
-
return res.status
|
61
|
-
end
|
17
|
+
def send_messages(target, strings)
|
18
|
+
return unless rtm_connection
|
62
19
|
|
63
|
-
|
64
|
-
|
65
|
-
#
|
66
|
-
def config
|
67
|
-
Lita.config.adapter
|
68
|
-
end
|
20
|
+
rtm_connection.send_messages(channel_for(target), strings)
|
21
|
+
end
|
69
22
|
|
70
|
-
|
71
|
-
|
72
|
-
end
|
23
|
+
def shut_down
|
24
|
+
return unless rtm_connection
|
73
25
|
|
74
|
-
|
75
|
-
|
76
|
-
"https://#{config.team_domain}.slack.com/services/hooks/incoming-webhook"
|
26
|
+
rtm_connection.shut_down
|
27
|
+
robot.trigger(:disconnected)
|
77
28
|
end
|
78
29
|
|
79
|
-
|
80
|
-
|
81
|
-
|
30
|
+
private
|
31
|
+
|
32
|
+
attr_reader :rtm_connection
|
82
33
|
|
83
|
-
def
|
84
|
-
|
34
|
+
def channel_for(target)
|
35
|
+
if target.room
|
36
|
+
target.room
|
37
|
+
else
|
38
|
+
rtm_connection.im_for(target.user.id)
|
39
|
+
end
|
85
40
|
end
|
86
|
-
|
41
|
+
end
|
87
42
|
|
88
|
-
|
89
|
-
|
90
|
-
|
43
|
+
# Register Slack adapter to Lita
|
44
|
+
Lita.register_adapter(:slack, Slack)
|
45
|
+
end
|
91
46
|
end
|
data/lib/lita-slack.rb
CHANGED
data/lita-slack.gemspec
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "lita-slack"
|
3
|
-
spec.version = "0.
|
4
|
-
spec.authors = ["Ken J."]
|
5
|
-
spec.email = ["kenjij@gmail.com"]
|
3
|
+
spec.version = "1.0.0"
|
4
|
+
spec.authors = ["Ken J.", "Jimmy Cuadra"]
|
5
|
+
spec.email = ["kenjij@gmail.com", "jimmy@jimmycuadra.com"]
|
6
6
|
spec.description = %q{Lita adapter for Slack.}
|
7
7
|
spec.summary = %q{Lita adapter for Slack.}
|
8
8
|
spec.homepage = "https://github.com/kenjij/lita-slack"
|
@@ -14,10 +14,16 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
15
|
spec.require_paths = ["lib"]
|
16
16
|
|
17
|
-
spec.add_runtime_dependency "
|
18
|
-
spec.add_runtime_dependency "
|
17
|
+
spec.add_runtime_dependency "eventmachine"
|
18
|
+
spec.add_runtime_dependency "faraday"
|
19
|
+
spec.add_runtime_dependency "faye-websocket", ">= 0.8.0"
|
20
|
+
spec.add_runtime_dependency "lita", ">= 4.0.4"
|
21
|
+
spec.add_runtime_dependency "multi_json"
|
19
22
|
|
20
23
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rack-test"
|
21
25
|
spec.add_development_dependency "rake"
|
22
26
|
spec.add_development_dependency "rspec", ">= 3.0.0"
|
27
|
+
spec.add_development_dependency "simplecov"
|
28
|
+
spec.add_development_dependency "coveralls"
|
23
29
|
end
|