driftwood 0.0.6 → 0.0.7

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: b6d9afc2736c11ad603a81c059273a46cf84cb6d
4
- data.tar.gz: 10c2d1ac50afae9265add7f56b2ce8f106d4a065
3
+ metadata.gz: 57ac1f7190f47c6413f6fe8c53cb834fc62c4e2f
4
+ data.tar.gz: 6ca438be8979c39b7061c908ebca7b0c2296c76d
5
5
  SHA512:
6
- metadata.gz: 5ba142f4f634e0b62f6e7f0c60d2eba6c778d1955e447696a7f6d9179bd525809d33aef8a99d2de1f30df89af9056cbf3730fc76d4e18505639fe2d4d903d2d5
7
- data.tar.gz: c253e2d1f63fc8a0b01fefb5bb8ea08cebcc448dcd7bc28a1da9db7efe8b1b5001b156005a3fa7ab544ac2c9d450afda22f561cf173fb53be856063a54e60a13
6
+ metadata.gz: 6f9fec93e433aef6f3ff051da63abffba7293440d62d98c791fb7f356c259d188315a416ffc84a4d429274fca89ffc7961f455a46adf2c1e30909bfdf61ebd1e
7
+ data.tar.gz: 241f288468773cd7529988eec46eef53f7fa2703e01f4c3f45fe6f272d595e0d919a2c228b8d8c2bc4ba7d15c0da4786c9c8372ac183a4c631f7e313d558a8cb
@@ -1,3 +1,7 @@
1
+ # v0.0.7
2
+
3
+ Add barebones plugin system
4
+
1
5
  # v0.0.6
2
6
 
3
7
  Add version output
data/README.md CHANGED
@@ -48,6 +48,11 @@ Example configuration:
48
48
  :dataset: <dataset>
49
49
  :project: <project>
50
50
  :keyfile: ~/.driftwood/credentials.json
51
+ :plugins:
52
+ :Debug:
53
+ :Netserv:
54
+ :Onboard:
55
+ :template: ~/.driftwood/templates/onboard.erb
51
56
  ```
52
57
 
53
58
  ### Setting up integration
@@ -62,36 +67,10 @@ to add it to your workspace.
62
67
 
63
68
  ## Extending
64
69
 
65
- Eventually this will have a real plugin system that makes this more obvious. For
66
- the time being, you'll have to invoke the server yourself and register any
67
- handlers you need.
70
+ See the `lib/driftwood/plugin` directory for some examples. Simply create some
71
+ classes like that, drop them in a gem and install on your system. Enable and
72
+ configure them in the `config.yaml` file.
68
73
 
69
- A simple echo bot:
70
-
71
- ```
72
- require 'driftwood'
73
-
74
- options = {...}
75
- server = Driftwood.new(options)
76
- server.slack.register_handler do |team_id, event_data|
77
- next unless event_data['channel_type'] == 'im'
78
-
79
- user = event_data['user']
80
- text = event_data['text']
81
- name = server.slack.real_name(team_id, user)
82
-
83
- case text
84
- when /^hello/i
85
- server.slack.send_response(team_id, user, "Hi there, #{name}!")
86
- when /^ping/i
87
- server.slack.send_response(team_id, user, "Pong")
88
- when /^echo/i
89
- server.slack.send_response(team_id, user, "Echo response: #{text.sub(/^echo /, '')}")
90
- end
91
- end
92
-
93
- server.run!
94
- ```
95
74
 
96
75
  ## Roadmap & Todo
97
76
 
@@ -6,6 +6,8 @@ class Driftwood < Sinatra::Base
6
6
  require 'driftwood/version'
7
7
  require 'driftwood/slack'
8
8
  require 'driftwood/bigquery'
9
+ require 'driftwood/monkeypatches'
10
+ require 'driftwood/plugin'
9
11
 
10
12
  set :logging, true
11
13
  set :strict, true
@@ -22,51 +24,52 @@ class Driftwood < Sinatra::Base
22
24
  @slack = Driftwood::Slack.new(settings.slack)
23
25
  @slack.authorize(cached_auth)
24
26
 
25
- @slack.register_handler('message') do |team_id, event_data|
26
- $logger.debug 'message handler'
27
- $logger.debug "Team ID: #{team_id}"
28
- $logger.debug "Channel Name: #{@slack.channel_name(team_id, event_data['channel'])}"
29
- $logger.debug JSON.pretty_generate(event_data)
27
+ @plugins = settings.plugins.map do |plugin, config|
28
+ filename = plugin.snake_case
29
+
30
+ begin
31
+ require "driftwood/plugin/#{filename}"
32
+ rescue LoadError
33
+ require filename
34
+ end
30
35
 
31
- next unless event_data['channel_type'] == 'im'
36
+ Driftwood::Plugin::const_get(plugin).new(config, @slack, @bigquery)
37
+ end
32
38
 
39
+ # help handler
40
+ @slack.register_handler('message') do |team_id, event_data|
33
41
  user = event_data['user']
34
42
  text = event_data['text']
35
43
 
36
44
  case text
37
- when /^hello/i
38
- @slack.send_response(team_id, user, "Hi there, #{@slack.real_name(team_id, user)}!")
39
- when /^ping/i
40
- @slack.send_response(team_id, user, "Pong")
41
- when /^echo/i
42
- @slack.send_response(team_id, user, "Echo response: #{text.sub(/^echo /, '')}")
43
- when /^version/i
44
- @slack.send_response(team_id, user, "Driftwood v#{Driftwood::VERSION}")
45
+ when /^help$/i
46
+ @slack.send_response(team_id, user, "Usage for all plugins:")
47
+ @plugins.each do |plugin|
48
+ next unless plugin.usage
49
+ @slack.send_response(team_id, user, plugin.usage)
50
+ end
51
+ when /^help (\w*)$/i
52
+ name = $1
53
+ @slack.send_response(team_id, user, "Usage for #{name}:")
54
+ @plugins.each do |plugin|
55
+ next unless plugin.name = name.downcase
56
+ @slack.send_response(team_id, user, plugin.usage)
57
+ end
45
58
  end
59
+ end
46
60
 
61
+ # logging handler
62
+ @slack.register_handler('message') do |team_id, event_data|
63
+ next unless event_data['channel_type'] == 'channel'
64
+ $logger.debug "Logged message for #{team_id}: #{event_data['text']}"
65
+ @bigquery.insert_message(@slack.normalize_message(team_id, event_data))
47
66
  end
48
67
 
68
+ # register new users
49
69
  @slack.register_handler('team_join') do |team_id, event_data|
50
70
  user = @slack.normalize_user(event_data['user'])
51
71
  $logger.info "Registered new user: #{user['name']} (#{user['real_name']})"
52
72
  @bigquery.insert_user(user)
53
- # send them welcome infos
54
-
55
- end
56
-
57
- @slack.register_handler('member_joined_channel') do |team_id, event_data|
58
- user = @slack.user_info(event_data['team'], event_data['user'])
59
- user = @slack.normalize_user(user)
60
- channel = @slack.channel_name(event_data['team'], event_data['channel'])
61
- $logger.info "User #{user['name']} (#{user['real_name']}) joined ##{channel}"
62
- # send them welcome infos
63
-
64
- end
65
-
66
- @slack.register_handler('message') do |team_id, event_data|
67
- next unless event_data['channel_type'] == 'channel'
68
- $logger.debug "Logged message for #{team_id}: #{event_data['text']}"
69
- @bigquery.insert_message(@slack.normalize_message(team_id, event_data))
70
73
  end
71
74
 
72
75
  # Do this in a thread so it doesn't block initialization
@@ -13,6 +13,17 @@ class Driftwood::Bigquery
13
13
  @dataset = @bigquery.dataset(config[:dataset])
14
14
  raise "\nThere is a problem with the gCloud configuration: \n #{JSON.pretty_generate(config)}" if @dataset.nil?
15
15
 
16
+ if config[:noinit]
17
+ $logger.warn "Skipping reinitialization as instructed"
18
+ @teams = @dataset.table('slack_teams')
19
+ @active = @dataset.table('slack_billing_active')
20
+ @creation = @dataset.table('slack_user_creation')
21
+ @messages = @dataset.table('slack_messages')
22
+ @channels = @dataset.table('slack_channels')
23
+ @users = @dataset.table('slack_users')
24
+ return
25
+ end
26
+
16
27
  @teams = @dataset.table('slack_teams') || @dataset.create_table('slack_teams') do |table|
17
28
  table.name = 'Slack Teams'
18
29
  table.description = 'A list of all team names & ID, plus some metadata'
@@ -0,0 +1,20 @@
1
+ class String
2
+ if not String.method_defined? :snake_case
3
+ def snake_case!
4
+ gsub!(/(.)([A-Z])/,'\1_\2')
5
+ downcase!
6
+ end
7
+
8
+ def snake_case
9
+ dup.tap { |s| s.snake_case! }
10
+ end
11
+ end
12
+ end
13
+
14
+ class Symbol
15
+ if not Symbol.method_defined? :snake_case
16
+ def snake_case
17
+ to_s.snake_case.to_sym
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,14 @@
1
+ class Driftwood
2
+ class Plugin
3
+ attr_reader :about, :name, :usage
4
+ # just sets up the namespace for now
5
+
6
+ def initialize(config=nil, slack=nil, bigquery=nil)
7
+ @about = 'The default base plugin'
8
+ @name = self.class.name.split('::').last.downcase
9
+ @config = config
10
+ @slack = slack
11
+ @bigquery = bigquery
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,17 @@
1
+ class Driftwood::Plugin::Debug < Driftwood::Plugin
2
+
3
+ def initialize(config=nil, slack=nil, bigquery=nil)
4
+ super(config, slack, bigquery)
5
+ @about = 'The debug plugin. It just dumps out event data as events are processed.'
6
+
7
+ ['team_join', 'member_joined_channel', 'message'].each do |handler|
8
+ # Example event handler. See https://api.slack.com/events
9
+ @slack.register_handler(handler) do |team_id, event_data|
10
+ $logger.info "DEBUG: [#{handler}] handler fired"
11
+ $logger.debug "Team ID: #{team_id}"
12
+ $logger.debug JSON.pretty_generate(event_data)
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,27 @@
1
+ class Driftwood::Plugin::Netserv < Driftwood::Plugin
2
+
3
+ def initialize(config=nil, slack=nil, bigquery=nil)
4
+ super(config, slack, bigquery)
5
+ @about = 'Provides basic network services, like ping, echo, version.'
6
+ @usage = 'Available commands: hello, ping, echo <message>, version.'
7
+
8
+ @slack.register_handler('message') do |team_id, event_data|
9
+ next unless event_data['channel_type'] == 'im'
10
+
11
+ user = event_data['user']
12
+ text = event_data['text']
13
+
14
+ case text
15
+ when /^hello/i
16
+ @slack.send_response(team_id, user, "Hi there, #{@slack.real_name(team_id, user)}!")
17
+ when /^ping$/i
18
+ @slack.send_response(team_id, user, "Pong")
19
+ when /^echo$/i
20
+ @slack.send_response(team_id, user, "Echo response: #{text.sub(/^echo /, '')}")
21
+ when /^version$/i
22
+ @slack.send_response(team_id, user, "Driftwood v#{Driftwood::VERSION}")
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,24 @@
1
+ class Driftwood::Plugin::Onboard < Driftwood::Plugin
2
+
3
+ def initialize(config=nil, slack=nil, bigquery=nil)
4
+ super(config, slack, bigquery)
5
+ @about = 'Provides onboarding services for new users.'
6
+
7
+ @slack.register_handler('team_join') do |team_id, event_data|
8
+ user = @slack.normalize_user(event_data['user'])
9
+ $logger.info "User #{user['name']} (#{user['real_name']}) joined the workspace"
10
+ @slack.send_response(team_id, event_data['user'], "--- a handy welcome message ---")
11
+ # send them welcome infos
12
+ end
13
+
14
+ @slack.register_handler('member_joined_channel') do |team_id, event_data|
15
+ user = @slack.user_info(event_data['team'], event_data['user'])
16
+ user = @slack.normalize_user(user)
17
+ channel = @slack.channel_name(event_data['team'], event_data['channel'])
18
+ $logger.info "User #{user['name']} (#{user['real_name']}) joined ##{channel}"
19
+ @slack.send_response(team_id, event_data['channel'], "--- a handy welcome message ---")
20
+ # send them welcome infos
21
+ end
22
+
23
+ end
24
+ end
File without changes
@@ -7,27 +7,6 @@ class Driftwood::Slack
7
7
  @handlers = {}
8
8
 
9
9
  $logger.info "Started Slack bot"
10
-
11
- # # Example event handler. See https://api.slack.com/events
12
- # register_handler('message') do |team_id, event_data|
13
- # $logger.debug 'message handler'
14
- # $logger.debug "Team ID: #{team_id}"
15
- # $logger.debug JSON.pretty_generate(event_data)
16
- #
17
- # next unless event_data['channel_type'] == 'im'
18
- #
19
- # user = event_data['user']
20
- # text = event_data['text']
21
- #
22
- # case text
23
- # when /^hello/i
24
- # send_response(team_id, user, "Hi there, #{real_name(team_id, user)}!")
25
- # when /^ping/i
26
- # send_response(team_id, user, "Pong")
27
- # when /^echo/i
28
- # send_response(team_id, user, "Echo response: #{text.sub(/^echo /, '')}")
29
- # end
30
- # end
31
10
  end
32
11
 
33
12
  def authorize(auth)
@@ -1,4 +1,4 @@
1
1
  class Driftwood
2
- VERSION = '0.0.6'
2
+ VERSION = '0.0.7'
3
3
  end
4
4
 
@@ -20,10 +20,10 @@
20
20
  text-align: center;
21
21
  text-shadow: #ffe896 1px 0 10px;
22
22
  }
23
- p {
23
+ p, ul {
24
24
  width: 80%;
25
25
  margin: 1em auto;
26
- text-shadow: #7f7d7e 1px 0 10px;
26
+ text-shadow: #7f7d7e 1px 0 5;
27
27
  }
28
28
  p.message {
29
29
  width: 50%;
@@ -62,9 +62,13 @@
62
62
  </p>
63
63
  <p>
64
64
  Driftwood is extensible and allows you to easily hook into any Slack event
65
- notifications. It's currently a relatively manual process to do so, but we'll
66
- soon have a real plugin architecture and will then be able to list out each
67
- integration installed below.
65
+ notifications. Message your Slack app user with <em>help</em> for more information.
66
+ The following plugins are enabled:
67
+ <ul>
68
+ <% @plugins.each do |plugin| %>
69
+ <li><strong><%= plugin.name %></strong>: <%= plugin.about %></li>
70
+ <% end %>
71
+ </ul>
68
72
  </p>
69
73
  <hr />
70
74
  <% if @message %>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: driftwood
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Ford
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-02 00:00:00.000000000 Z
11
+ date: 2018-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -69,6 +69,12 @@ files:
69
69
  - bin/driftwood
70
70
  - lib/driftwood.rb
71
71
  - lib/driftwood/bigquery.rb
72
+ - lib/driftwood/monkeypatches.rb
73
+ - lib/driftwood/plugin.rb
74
+ - lib/driftwood/plugin/debug.rb
75
+ - lib/driftwood/plugin/netserv.rb
76
+ - lib/driftwood/plugin/onboard.rb
77
+ - lib/driftwood/plugin/ping.rb
72
78
  - lib/driftwood/slack.rb
73
79
  - lib/driftwood/version.rb
74
80
  - public/driftwood.jpg
@@ -94,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
100
  version: '0'
95
101
  requirements: []
96
102
  rubyforge_project:
97
- rubygems_version: 2.6.10
103
+ rubygems_version: 2.5.2.3
98
104
  signing_key:
99
105
  specification_version: 4
100
106
  summary: Simple Sinatra based Slack logbot.