slack-bot-server 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 61c3888618c930da32157133af1fd57ac3a40123
4
- data.tar.gz: 4f7c8adff1540e9162cef41f0ade4a2ee06aeb39
3
+ metadata.gz: d1a580f416814eef8f1582047b3f748022b2f094
4
+ data.tar.gz: e307931094203fe4590049d3d4eb966ad4a96fed
5
5
  SHA512:
6
- metadata.gz: 051cc3a2f27714cf76559aab701dbdb2194eaba113376eb832d886b61116b3c5240c8bcf9beb3cac01c23ee7bc247c61838f234774f8ff9a64ac0c98fe76568f
7
- data.tar.gz: 76c4c6ee283a948aa13330b0e237bbbbc1562013b0077903cb0d45fb44d5cb5c3c6219d1188361ef0104adc31a1613dfa9951b570cf2e3e52071fd6840e0e506
6
+ metadata.gz: 88d60ed5fc1b11d4df51d4ebfe9f92042e660a61bed513130d22a200fb4bee70001655320f5683b0c0418336ec50ede9facfbc36961105bbfa90199b1962a0d2
7
+ data.tar.gz: 48eae3c8528df390699a124782b558d64d36685d4f83b014b11dc3b4d89857c654c6c27efdfb02ae47e200b112e8c5773af0ed0b1eaebd9c0c4a992f8b8ac721
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,19 @@
1
+ # Contributing
2
+
3
+ Thanks for helping make this software better! Contributing is super easy, with just a few guidelines.
4
+
5
+ ## Bugs
6
+
7
+ If you've found a bug in the software, please report it using [GitHub Issues](https://github.com/exciting-io/slack_bot_server/issues). Please include the version (or SHA) of this project that you're using, along with which version of Ruby and any other dependencies that you think might be relevant.
8
+
9
+ ## Features
10
+
11
+ If you'd got an idea for an improvement or a new feature, that's fantastic! We only ask that you also include specs to cover that behaviour, and that you implement it in a branch to easy merging.
12
+
13
+ 1. Create a new branch for your feature
14
+ 2. Implement it, along with new/modified specs
15
+ 3. Submit a pull request describing the motivation for your new feature, and how to use it.
16
+
17
+ Please don't bump the gem version -- we'll take care of that.
18
+
19
+ Thanks again, and have a great day!
data/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # SlackBotServer
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/slack_bot_server`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ [![Build Status](https://travis-ci.org/exciting-io/slack-bot-server.svg)](https://travis-ci.org/exciting-io/slack-bot-server)
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ If you're building an integration just for yourself, running a single bot isn't too hard and there are plenty of examples available. However, if you're building an integration for your *product* to connect with multiple teams, running multiple instances of that bot is a bit trickier.
6
+
7
+ This server is designed to hopefully make it easier to manage running bots for multiple teams at the same time, including managing their connections and adding and removing them dynamically.
6
8
 
7
9
  ## Installation
8
10
 
@@ -22,17 +24,146 @@ Or install it yourself as:
22
24
 
23
25
  ## Usage
24
26
 
25
- TODO: Write usage instructions here
27
+ To use the server in your application, you'll need to create a short script that sets up your integration and then runs the server process. Here's a simple example:
28
+
29
+ ```ruby
30
+ #!/usr/bin/env ruby
31
+
32
+ require 'slack_bot_server'
33
+ require 'slack_bot_server/redis_queue'
34
+ require 'slack_bot_server/simple_bot'
35
+
36
+ # Use a Redis-based queue to add/remove bots and to trigger
37
+ # bot messages to be sent
38
+ queue = SlackBotServer::RedisQueue.new(Redis.new)
39
+
40
+ # Create a new server using that queue
41
+ server = SlackBotServer::Server.new(queue: queue)
42
+
43
+ # How your application-specific should be created when the server
44
+ # is told about a new slack api token to connect with
45
+ server.on_new_token do |token|
46
+ # Return a new bot instance to the server. `SimpleBot` is a provided
47
+ # example bot with some very simple behaviour.
48
+ SlackBotServer::SimpleBot.new(token: token)
49
+ end
50
+
51
+ # Actually start the server. This line is blocking; code after
52
+ # it won't be executed.
53
+ server.start
54
+ ```
55
+
56
+ Running this script will start a server and keep it running; you may wish to use a tool like [Foreman](http://ddollar.github.io/foreman/) to actually start it and manage it in production.
57
+
58
+ ### Writing a bot
59
+
60
+ The provided example `SimpleBot` illustrates the main ways to build a bot:
61
+
62
+ ```ruby
63
+ require 'slack_bot_server/bot'
64
+
65
+ class SlackBotServer::SimpleBot < SlackBotServer::Bot
66
+ # Set the username displayed in Slack
67
+ username 'SimpleBot'
68
+
69
+ # Respond to mentions in the connected chat room (defaults to #general).
70
+ # As well as the normal data provided by Slack's API, we add the `message`,
71
+ # which is the `text` parameter with the username stripped out. For example,
72
+ # When a user sends 'simple_bot: how are you?', the `message` data contains
73
+ # only 'how are you'.
74
+ on_mention do |data|
75
+ reply text: "You said '#{data['message']}', and I'm frankly fascinated."
76
+ end
77
+
78
+ # Respond to messages sent via IM communication directly with the bot.
79
+ on_im do
80
+ reply text: "Hmm, OK, let me get back to you about that."
81
+ end
82
+ end
83
+ ```
84
+
85
+ ### Advanced example
86
+
87
+ This is a more advanced example of a server script, based on the that used by [Harmonia](https://harmonia.io), the product from which this was extracted.
88
+
89
+ ```ruby
90
+ #!/usr/bin/env ruby
91
+
92
+ require 'slack_bot_server'
93
+ require 'slack_bot_server/redis_queue'
94
+ require 'harmonia/slack_bot'
95
+
96
+ # Use a Redis-based queue to add/remove bots and to trigger
97
+ # bot messages to be sent. In this case we connect to the same
98
+ # redis instance as Resque, just for convenience.
99
+ queue = SlackBotServer::RedisQueue.new(Resque.redis)
100
+
101
+ server = SlackBotServer::Server.new(queue: queue)
102
+
103
+ server.on_new_token do |token|
104
+ # Our bots need to know some data about the team they are connecting
105
+ # to, like specifics of their account and their tasks
106
+ team_data = Harmonia.find_team_data_by_slack_api_token(token)
107
+
108
+ # Our bot instance stores that data in an instance variable internally
109
+ # and then refers to it when it receives messages
110
+ Harmonia::SlackBot.new(token: token, data: team_data)
111
+ end
112
+
113
+ # When the server starts we need to find all the teams which have already
114
+ # set up integrations and ensure their bots are launched immediately
115
+ Harmonia.all_existing_slack_api_tokens.each do |token|
116
+ server.add_token(token)
117
+ end
118
+
119
+ # Actually start the server. The pre-loaded bots will connect immediately,
120
+ # and we can add new bots by sending messages using the queue.
121
+ server.start
122
+ ```
123
+
124
+ ### Managing bots
125
+
126
+ When someone in your application wspants to connect their account with Slack, they'll need to provide a bot API token, which your application should store.
127
+
128
+ In order to actually create and connect their bot, you can use the remote
129
+ control to add the token to the server.
130
+
131
+ ```ruby
132
+ # Somewhere within your application
133
+ queue = SlackBotServer::RedisQueue.new(Redis.new)
134
+ slack_remote = SlackBotServer::RemoteControl.new(queue: queue)
135
+ slack_remote.add_token('user-accounts-slack-api-token')
136
+ ```
137
+
138
+ This will queue the token to be added by the server, using the `on_new_token` block provided in the server script.
139
+
140
+ When a bot is created and added within the server, it is stored using a key, which the bot class itself can define, but defaults to the slack api token used to instantiate the bot.
141
+
142
+ Similarly, if a user disables their Slack integration, we should remove the bot. To remove a bot, call the `remove_bot` method on the remote using the key for the appropriate bot:
143
+
144
+ ```ruby
145
+ slack_remote.remove_bot('bot-key-which-is-normally-the-slack-api-token')
146
+ ```
147
+
148
+ ### Getting bots to talk
149
+
150
+ Up to this point, your bots could only respond to mentions and IM messages, but it's often useful to be able to externally trigger a bot into making an announcement.
151
+
152
+ We can tell a bot to send a message into its default room fairly simply using the remote:
153
+
154
+ ```ruby
155
+ slack_remote.say('bot-key', text: 'I have an important announcement to make!')
156
+ ```
26
157
 
27
158
  ## Development
28
159
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. Run `bundle exec slack_bot_server` to use the gem in this directory, ignoring other installed copies of this gem.
160
+ After checking out the repo, run `bundle` to install dependencies. Then, run `rake rspec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. Run `bundle exec slack_bot_server` to use the gem in this directory, ignoring other installed copies of this gem.
30
161
 
31
162
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
163
 
33
164
  ## Contributing
34
165
 
35
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/slack_bot_server.
166
+ Bug reports and pull requests are welcome on GitHub at https://github.com/exciting-io/slack_bot_server.
36
167
 
37
168
 
38
169
  ## License
@@ -1,14 +1,13 @@
1
1
  require 'slack'
2
- require 'securerandom'
3
2
 
4
3
  class SlackBotServer::Bot
5
4
  attr_reader :key
6
5
 
7
6
  class InvalidToken < RuntimeError; end
8
7
 
9
- def initialize(token:, key: SecureRandom.uuid)
8
+ def initialize(token:, key: nil)
10
9
  @token = token
11
- @key = key
10
+ @key = key || @token
12
11
  @api = ::Slack::Client.new(token: @token)
13
12
  @im_channel_ids = []
14
13
 
@@ -5,7 +5,7 @@
5
5
  # redis queue instance that points at the same redis server).
6
6
 
7
7
  class SlackBotServer::RemoteControl
8
- def initialize(queue)
8
+ def initialize(queue: queue)
9
9
  @queue = queue
10
10
  end
11
11
 
@@ -17,6 +17,10 @@ class SlackBotServer::RemoteControl
17
17
  @queue.push([:remove_bot, key])
18
18
  end
19
19
 
20
+ def say(key, message_data)
21
+ @queue.push([:say, key, message_data])
22
+ end
23
+
20
24
  def call(key, method, args)
21
25
  @queue.push([:call, [key, method, args]])
22
26
  end
@@ -77,6 +77,10 @@ class SlackBotServer::Server
77
77
  when :remove_bot
78
78
  key = args.first
79
79
  remove_bot(key)
80
+ when :say
81
+ key, message_data = args
82
+ bot = bot(key)
83
+ bot.say(message_data)
80
84
  when :call
81
85
  key, method, method_args = args
82
86
  bot = bot(key)
@@ -1,12 +1,19 @@
1
1
  require 'slack_bot_server/bot'
2
2
 
3
3
  class SlackBotServer::SimpleBot < SlackBotServer::Bot
4
+ # Set the username displayed in Slack
4
5
  username 'SimpleBot'
5
6
 
7
+ # Respond to mentions in the connected chat room (defaults to #general).
8
+ # As well as the normal data provided by Slack's API, we add the `message`,
9
+ # which is the `text` parameter with the username stripped out. For example,
10
+ # When a user sends 'simple_bot: how are you?', the `message` data contains
11
+ # only 'how are you'.
6
12
  on_mention do |data|
7
13
  reply text: "You said '#{data['message']}', and I'm frankly fascinated."
8
14
  end
9
15
 
16
+ # Respond to messages sent via IM communication directly with the bot.
10
17
  on_im do
11
18
  reply text: "Hmm, OK, let me get back to you about that."
12
19
  end
@@ -1,3 +1,3 @@
1
1
  module SlackBotServer
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slack-bot-server
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Adam
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-06-24 00:00:00.000000000 Z
11
+ date: 2015-06-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: slack-api
@@ -105,6 +105,7 @@ files:
105
105
  - ".gitignore"
106
106
  - ".rspec"
107
107
  - ".travis.yml"
108
+ - CONTRIBUTING.md
108
109
  - Gemfile
109
110
  - LICENSE.txt
110
111
  - README.md