driftwood 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
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.