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 +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +8 -29
- data/lib/driftwood.rb +34 -31
- data/lib/driftwood/bigquery.rb +11 -0
- data/lib/driftwood/monkeypatches.rb +20 -0
- data/lib/driftwood/plugin.rb +14 -0
- data/lib/driftwood/plugin/debug.rb +17 -0
- data/lib/driftwood/plugin/netserv.rb +27 -0
- data/lib/driftwood/plugin/onboard.rb +24 -0
- data/lib/driftwood/plugin/ping.rb +0 -0
- data/lib/driftwood/slack.rb +0 -21
- data/lib/driftwood/version.rb +1 -1
- data/views/index.erb +9 -5
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 57ac1f7190f47c6413f6fe8c53cb834fc62c4e2f
|
4
|
+
data.tar.gz: 6ca438be8979c39b7061c908ebca7b0c2296c76d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f9fec93e433aef6f3ff051da63abffba7293440d62d98c791fb7f356c259d188315a416ffc84a4d429274fca89ffc7961f455a46adf2c1e30909bfdf61ebd1e
|
7
|
+
data.tar.gz: 241f288468773cd7529988eec46eef53f7fa2703e01f4c3f45fe6f272d595e0d919a2c228b8d8c2bc4ba7d15c0da4786c9c8372ac183a4c631f7e313d558a8cb
|
data/CHANGELOG.md
CHANGED
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
|
-
|
66
|
-
|
67
|
-
|
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
|
|
data/lib/driftwood.rb
CHANGED
@@ -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
|
-
@
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
-
|
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 /^
|
38
|
-
@slack.send_response(team_id, user, "
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
when /^
|
44
|
-
|
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
|
data/lib/driftwood/bigquery.rb
CHANGED
@@ -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
|
data/lib/driftwood/slack.rb
CHANGED
@@ -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)
|
data/lib/driftwood/version.rb
CHANGED
data/views/index.erb
CHANGED
@@ -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
|
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.
|
66
|
-
|
67
|
-
|
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.
|
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-
|
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.
|
103
|
+
rubygems_version: 2.5.2.3
|
98
104
|
signing_key:
|
99
105
|
specification_version: 4
|
100
106
|
summary: Simple Sinatra based Slack logbot.
|