slackbotsy 0.2.3 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c40530baa2cbf344531ba32950fe1c2b1f3c1ed6
4
- data.tar.gz: acc61a5f661831bb501d9fd33f303d9ae25b8ef8
3
+ metadata.gz: ce0da4a7d0888d5db3de53e15e4735fa5c4964bf
4
+ data.tar.gz: de9207d9d5a94e91d4efdb28c66a1d9164161dbd
5
5
  SHA512:
6
- metadata.gz: 97e455f623816eb93d5cdb6435aea9817d07210ac9559b1f9ed8ea24d8275cb6556acd682f0de75d0d9338abe43ae03e558fd3c487282ef311a5f00d2b07ed04
7
- data.tar.gz: 72ebca4cee87da780f60ac9d6389502824bab6e9692fb0561f0b7dbfed4c702aa6a411cbbf527b574dbd6c80bb63e54719e3412988f3877e2dfc4be72b769e86
6
+ metadata.gz: f6bd18dec8b80138b81ac4bab5386cead3eaf6df8c81b971777a68ab6fc7c4a607a3ac14351afa22d37ed8008c5b842dfcb7f87677443a976b05db4710ea8450
7
+ data.tar.gz: dcec448b9a05d8006071ba52656d75665fb24807ef093854c9f38e63fc294315bbabbcf724775915914a6117d2e84dcafcf5dd755b4278e92c27ef5b97950abb
data/README.md CHANGED
@@ -1,6 +1,18 @@
1
1
  # Slackbotsy
2
2
 
3
- Ruby bot for Slack chat, inspired by http://github.com/seejohnrun/botsy.
3
+ Ruby bot library for Slack chat, inspired by
4
+ the Campfire bot http://github.com/seejohnrun/botsy.
5
+
6
+ ## Working example
7
+
8
+ This repo and gem provide a library for implementing slack botsy using
9
+ the web framework of your choice. For example, botsy could be embedded
10
+ into an existing Rails app to provide access to a database from slack.
11
+
12
+ For a fully-implemented and ready-to-deploy standalone bot, using
13
+ slackbotsy and sinatra, please proceed over to
14
+ https://github.com/rlister/slackbotsy_example. You will find full
15
+ instructions to configure and deploy your own bot.
4
16
 
5
17
  ## Installation
6
18
 
@@ -64,3 +76,35 @@ post '/' do
64
76
  bot.handle_item(params)
65
77
  end
66
78
  ```
79
+
80
+ ## Web API
81
+
82
+ slackbotsy can now post to Slack using the
83
+ [Slack Web API](https://api.slack.com/web). It may be used alongside
84
+ the incoming webhooks to post.
85
+
86
+ Create a Slack user in your team for your bot, then create an api
87
+ token for that user at https://api.slack.com/web, and set the config
88
+ variable `api_token` when you configure botsy. Then you may use the
89
+ `post_message` or `upload` convenience methods to post simple messages
90
+ or upload files/text-snippets.
91
+
92
+ ```ruby
93
+ config = {
94
+ 'channel' => '#default',
95
+ 'name' => 'botsy',
96
+ 'api_token' => 'xoxp-0123456789-0123456789-0123456789-d34db33f'
97
+ }
98
+
99
+ bot = Slackbotsy::Bot.new(config) do
100
+
101
+ hear /ping/ do
102
+ post_message 'this is a simple posted message', channel: '#general'
103
+ end
104
+
105
+ hear /upload/ do
106
+ upload(file: File.new('/tmp/kitten.jpg'), channel: '#general')
107
+ end
108
+
109
+ end
110
+ ```
@@ -0,0 +1,59 @@
1
+ require 'httmultiparty'
2
+
3
+ module Slackbotsy
4
+
5
+ class Api
6
+ include HTTMultiParty
7
+ base_uri 'https://slack.com/api'
8
+
9
+ def initialize(token)
10
+ @token = token
11
+ end
12
+
13
+ ## get a channel, group, im or user list
14
+ def get_objects(method, key)
15
+ self.class.get("/#{method}", query: { token: @token }).tap do |response|
16
+ raise "error retrieving #{key} from #{method}: #{response.fetch('error', 'unknown error')}" unless response['ok']
17
+ end.fetch(key)
18
+ end
19
+
20
+ def channels
21
+ @channels ||= get_objects('channels.list', 'channels')
22
+ end
23
+
24
+ def groups
25
+ @groups ||= get_objects('groups.list', 'groups')
26
+ end
27
+
28
+ def ims
29
+ @ims ||= get_objects('im.list', 'ims')
30
+ end
31
+
32
+ def users
33
+ @users ||= get_objects('users.list', 'members')
34
+ end
35
+
36
+ ## join a channel, needed to post to channel
37
+ def join(channel)
38
+ self.class.post('/channels.join', body: {name: channel, token: @token}).tap do |response|
39
+ raise "error posting message: #{response.fetch('error', 'unknown error')}" unless response['ok']
40
+ end
41
+ end
42
+
43
+ ## send message to one channel as a single post with params text, channel, as_user
44
+ def post_message(params)
45
+ self.class.post('/chat.postMessage', body: params.merge({token: @token})).tap do |response|
46
+ raise "error posting message: #{response.fetch('error', 'unknown error')}" unless response['ok']
47
+ end
48
+ end
49
+
50
+ ## upload a file or text snippet, with params file, filename, filetype, title, initial_comment, channels
51
+ def upload(params)
52
+ self.class.post('/files.upload', body: params.merge({token: @token})).tap do |response|
53
+ raise "error uploading file: #{response.fetch('error', 'unknown error')}" unless response['ok']
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -7,14 +7,14 @@ require 'set'
7
7
  module Slackbotsy
8
8
 
9
9
  class Bot
10
-
11
- attr_accessor :listeners, :last_description
10
+ attr_accessor :listeners, :last_description, :api
12
11
 
13
12
  def initialize(options, &block)
14
13
  @options = options
15
14
  @listeners = []
16
15
  @options['outgoing_token'] = parse_outgoing_tokens(@options['outgoing_token'])
17
16
  setup_incoming_webhook # http connection for async replies
17
+ setup_web_api # setup slack Web API
18
18
  instance_eval(&block) if block_given? # run any hear statements in block
19
19
  end
20
20
 
@@ -33,7 +33,14 @@ module Slackbotsy
33
33
  @http.verify_mode = OpenSSL::SSL::VERIFY_PEER
34
34
  end
35
35
 
36
- ## raw post of hash to slack
36
+ ## use api_token to setup Web API authentication
37
+ def setup_web_api
38
+ if @options['api_token']
39
+ @api = Api.new(@options['api_token'])
40
+ end
41
+ end
42
+
43
+ ## raw post of hash to slack webhook
37
44
  def post(options)
38
45
  payload = {
39
46
  username: @options['name'],
@@ -57,6 +64,30 @@ module Slackbotsy
57
64
  post({ attachments: attachments }.merge(options))
58
65
  end
59
66
 
67
+ ## simple wrapper on api.post_message (which calls chat.postMessage)
68
+ def post_message(text, options = {})
69
+ payload = {
70
+ username: @options['name'],
71
+ channel: @options['channel'],
72
+ text: text,
73
+ as_user: true
74
+ }.merge(options)
75
+ payload[:channel] = payload[:channel].gsub(/^#?/, '#') # chat.postMessage needs leading # on channel
76
+ @api.join(payload[:channel])
77
+ @api.post_message(payload)
78
+ end
79
+
80
+ ## simple wrapper on api.upload (which calls files.upload)
81
+ ## pass 'channel' as a csv list of channel names, otherwise same args as files.upload
82
+ def upload(options)
83
+ payload = options
84
+ channels = @api.channels # list of channel objects
85
+ payload[:channels] ||= (options.fetch(:channel, @options['channel'])).split(/[\s,]+/).map do |name|
86
+ channels.find { |c| name.match(/^#?#{c['name']}$/) }.fetch('id') # convert channel id to name
87
+ end.join(',')
88
+ @api.upload(payload)
89
+ end
90
+
60
91
  ## record a description of the next hear block, for use in help
61
92
  def desc(command, description = nil)
62
93
  @last_desc = [ command, description ]
@@ -1,3 +1,3 @@
1
1
  module Slackbotsy
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/slackbotsy.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require "slackbotsy/version"
2
2
  require "slackbotsy/bot"
3
+ require "slackbotsy/api"
3
4
  require "slackbotsy/helper"
4
5
  require "slackbotsy/message"
5
6
 
data/slackbotsy.gemspec CHANGED
@@ -23,4 +23,5 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_dependency 'json'
25
25
  spec.add_dependency 'sinatra'
26
+ spec.add_dependency 'httmultiparty'
26
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slackbotsy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Lister
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-08 00:00:00.000000000 Z
11
+ date: 2015-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: httmultiparty
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: Ruby bot for Slack chat.
70
84
  email:
71
85
  - rlister@gmail.com
@@ -79,6 +93,7 @@ files:
79
93
  - README.md
80
94
  - Rakefile
81
95
  - lib/slackbotsy.rb
96
+ - lib/slackbotsy/api.rb
82
97
  - lib/slackbotsy/bot.rb
83
98
  - lib/slackbotsy/helper.rb
84
99
  - lib/slackbotsy/message.rb
@@ -104,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
119
  version: '0'
105
120
  requirements: []
106
121
  rubyforge_project:
107
- rubygems_version: 2.4.5
122
+ rubygems_version: 2.2.3
108
123
  signing_key:
109
124
  specification_version: 4
110
125
  summary: Ruby bot for Slack chat.