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 +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.
|