driftwood 0.0.7 → 0.0.8
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 +7 -0
- data/README.md +1 -1
- data/lib/driftwood.rb +3 -65
- data/lib/driftwood/bigquery.rb +7 -4
- data/lib/driftwood/plugin/logger.rb +70 -0
- data/lib/driftwood/plugin/netserv.rb +3 -3
- data/lib/driftwood/plugin/onboard.rb +26 -4
- data/lib/driftwood/slack.rb +10 -0
- data/lib/driftwood/version.rb +1 -1
- metadata +3 -3
- data/lib/driftwood/plugin/ping.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 77ea40594b8549245f238cc8fb69313ee1038994
|
4
|
+
data.tar.gz: 39f9ca21844888e5363bb25fe0fcb175881f4197
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c9ff226d67968a50609f4f90e18e2764b8ebc05ce840cf2c8d2b5b0ab2dd6bad347401a0ea623ab447167addc724c4619d9ea35872b1f0176d067d916463b50
|
7
|
+
data.tar.gz: 07a27a94fe63a26e15f1d4921850fb13059fc510c82a2cd43426754c58bde9172ee458007e9e9815362297ede658ba48d8bfd7b8a606633c4b1b416f7aeb50c9
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
# v0.0.8
|
2
|
+
|
3
|
+
* b296fcc Ben Ford 89 seconds ago BUGFIX: only respond to own messages (HEAD -> master)
|
4
|
+
* d0ff98b Ben Ford 2 minutes ago add simple templatable onboarding messages
|
5
|
+
* dcae81e Ben Ford 3 minutes ago add ability to run multiple instances for dev purposes
|
6
|
+
* 0c90fcf Ben Ford 4 minutes ago move logger into its own plugin
|
7
|
+
|
1
8
|
# v0.0.7
|
2
9
|
|
3
10
|
Add barebones plugin system
|
data/README.md
CHANGED
@@ -58,7 +58,7 @@ Example configuration:
|
|
58
58
|
### Setting up integration
|
59
59
|
|
60
60
|
The installation steps from https://github.com/slackapi/Slack-Ruby-Onboarding-Tutorial
|
61
|
-
can be followed with a few obvious modifications. Configure
|
61
|
+
can be followed with a few obvious modifications. Configure an application for
|
62
62
|
your team, and configure the service before starting it up.
|
63
63
|
|
64
64
|
Once it's running, load up the webpage and press the **Add to Slack** button
|
data/lib/driftwood.rb
CHANGED
@@ -22,6 +22,7 @@ class Driftwood < Sinatra::Base
|
|
22
22
|
$logger.info "Starting Driftwood v#{Driftwood::VERSION}"
|
23
23
|
@bigquery = Driftwood::Bigquery.new(settings.gcloud)
|
24
24
|
@slack = Driftwood::Slack.new(settings.slack)
|
25
|
+
@app_id = settings.slack[:client_id]
|
25
26
|
@slack.authorize(cached_auth)
|
26
27
|
|
27
28
|
@plugins = settings.plugins.map do |plugin, config|
|
@@ -58,45 +59,6 @@ class Driftwood < Sinatra::Base
|
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
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))
|
66
|
-
end
|
67
|
-
|
68
|
-
# register new users
|
69
|
-
@slack.register_handler('team_join') do |team_id, event_data|
|
70
|
-
user = @slack.normalize_user(event_data['user'])
|
71
|
-
$logger.info "Registered new user: #{user['name']} (#{user['real_name']})"
|
72
|
-
@bigquery.insert_user(user)
|
73
|
-
end
|
74
|
-
|
75
|
-
# Do this in a thread so it doesn't block initialization
|
76
|
-
# These methods may take a long time to complete
|
77
|
-
Thread.new do
|
78
|
-
begin
|
79
|
-
$logger.info "Starting data synchronization..."
|
80
|
-
sync_messages
|
81
|
-
sync_channels
|
82
|
-
sync_users
|
83
|
-
rescue => e
|
84
|
-
$logger.error e.message
|
85
|
-
$logger.debug e.backtrace.join("\n")
|
86
|
-
end
|
87
|
-
|
88
|
-
loop do
|
89
|
-
sleep 86400 # Once a day; 60 * 60 * 24
|
90
|
-
begin
|
91
|
-
$logger.info "Purging deleted users..."
|
92
|
-
@bigquery.purge_deleted_users
|
93
|
-
rescue => e
|
94
|
-
$logger.error e.message
|
95
|
-
$logger.debug e.backtrace.join("\n")
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
62
|
end
|
101
63
|
|
102
64
|
get '/' do
|
@@ -138,36 +100,12 @@ class Driftwood < Sinatra::Base
|
|
138
100
|
|
139
101
|
helpers do
|
140
102
|
def cached_auth
|
141
|
-
@bigquery.get_auth_tokens()
|
103
|
+
@bigquery.get_auth_tokens(@app_id)
|
142
104
|
end
|
143
105
|
|
144
106
|
def save_auth_cache(auth)
|
145
|
-
@bigquery.insert_team(auth)
|
146
|
-
end
|
147
|
-
|
148
|
-
def sync_channels
|
149
|
-
@slack.all_channels.each do |channel|
|
150
|
-
@bigquery.insert_channel(channel)
|
151
|
-
end
|
152
|
-
$logger.info "All channels synced."
|
153
|
-
end
|
154
|
-
|
155
|
-
def sync_users
|
156
|
-
@slack.all_users.each do |user|
|
157
|
-
@bigquery.insert_user(user)
|
158
|
-
end
|
159
|
-
@bigquery.reconcile_user_creations
|
160
|
-
$logger.info "All users synced."
|
161
|
-
end
|
162
|
-
|
163
|
-
def sync_messages
|
164
|
-
starting_from = @bigquery.newest_message_timestamp
|
165
|
-
@slack.all_messages(starting_from).each do |message|
|
166
|
-
@bigquery.insert_message(message)
|
167
|
-
end
|
168
|
-
$logger.info "All messages synced."
|
107
|
+
@bigquery.insert_team(auth, @app_id)
|
169
108
|
end
|
170
|
-
|
171
109
|
end
|
172
110
|
|
173
111
|
end
|
data/lib/driftwood/bigquery.rb
CHANGED
@@ -33,6 +33,7 @@ class Driftwood::Bigquery
|
|
33
33
|
s.string "user_access_token", mode: :required
|
34
34
|
s.string "bot_user_id", mode: :required
|
35
35
|
s.string "bot_access_token", mode: :required
|
36
|
+
s.string "application_id", mode: :required
|
36
37
|
end
|
37
38
|
end
|
38
39
|
|
@@ -116,14 +117,16 @@ class Driftwood::Bigquery
|
|
116
117
|
$logger.info "Bigquery initialization complete"
|
117
118
|
end
|
118
119
|
|
119
|
-
def get_auth_tokens()
|
120
|
-
@dataset.query("SELECT * FROM slack_teams").to_a rescue []
|
120
|
+
def get_auth_tokens(application_id)
|
121
|
+
@dataset.query("SELECT * FROM slack_teams WHERE application_id = '#{application_id}'").to_a rescue []
|
121
122
|
end
|
122
123
|
|
123
|
-
def insert_team(auth_token)
|
124
|
+
def insert_team(auth_token, application_id)
|
125
|
+
auth_token[:application_id] = application_id
|
126
|
+
|
124
127
|
# We can take the 2.5s delete-before-insert here because it only happens when
|
125
128
|
# authorizing a new team integration.
|
126
|
-
@dataset.query("DELETE FROM slack_teams WHERE team_id = '#{auth_token[:team_id]}'")
|
129
|
+
@dataset.query("DELETE FROM slack_teams WHERE team_id = '#{auth_token[:team_id]}' AND application_id = '#{application_id}'")
|
127
130
|
@teams.insert(auth_token).success?
|
128
131
|
end
|
129
132
|
|
@@ -0,0 +1,70 @@
|
|
1
|
+
class Driftwood::Plugin::Logger < Driftwood::Plugin
|
2
|
+
|
3
|
+
def initialize(config=nil, slack=nil, bigquery=nil)
|
4
|
+
super(config, slack, bigquery)
|
5
|
+
@about = 'Logs all public messages to BigQuery.'
|
6
|
+
|
7
|
+
# logging handler
|
8
|
+
@slack.register_handler('message') do |team_id, event_data|
|
9
|
+
next unless event_data['channel_type'] == 'channel'
|
10
|
+
$logger.debug "Logged message for #{team_id}: #{event_data['text']}"
|
11
|
+
@bigquery.insert_message(@slack.normalize_message(team_id, event_data))
|
12
|
+
end
|
13
|
+
|
14
|
+
# register new users
|
15
|
+
@slack.register_handler('team_join') do |team_id, event_data|
|
16
|
+
user = @slack.normalize_user(event_data['user'])
|
17
|
+
$logger.info "Registered new user: #{user['name']} (#{user['real_name']})"
|
18
|
+
@bigquery.insert_user(user)
|
19
|
+
end
|
20
|
+
|
21
|
+
# Do this in a thread so it doesn't block initialization
|
22
|
+
# These methods may take a long time to complete
|
23
|
+
Thread.new do
|
24
|
+
begin
|
25
|
+
$logger.info "Starting data synchronization..."
|
26
|
+
sync_messages
|
27
|
+
sync_channels
|
28
|
+
sync_users
|
29
|
+
rescue => e
|
30
|
+
$logger.error e.message
|
31
|
+
$logger.debug e.backtrace.join("\n")
|
32
|
+
end
|
33
|
+
|
34
|
+
loop do
|
35
|
+
sleep 86400 # Once a day; 60 * 60 * 24
|
36
|
+
begin
|
37
|
+
$logger.info "Purging deleted users..."
|
38
|
+
@bigquery.purge_deleted_users
|
39
|
+
rescue => e
|
40
|
+
$logger.error e.message
|
41
|
+
$logger.debug e.backtrace.join("\n")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def sync_channels
|
48
|
+
@slack.all_channels.each do |channel|
|
49
|
+
@bigquery.insert_channel(channel)
|
50
|
+
end
|
51
|
+
$logger.info "All channels synced."
|
52
|
+
end
|
53
|
+
|
54
|
+
def sync_users
|
55
|
+
@slack.all_users.each do |user|
|
56
|
+
@bigquery.insert_user(user)
|
57
|
+
end
|
58
|
+
@bigquery.reconcile_user_creations
|
59
|
+
$logger.info "All users synced."
|
60
|
+
end
|
61
|
+
|
62
|
+
def sync_messages
|
63
|
+
starting_from = @bigquery.newest_message_timestamp
|
64
|
+
@slack.all_messages(starting_from).each do |message|
|
65
|
+
@bigquery.insert_message(message)
|
66
|
+
end
|
67
|
+
$logger.info "All messages synced."
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -6,7 +6,7 @@ class Driftwood::Plugin::Netserv < Driftwood::Plugin
|
|
6
6
|
@usage = 'Available commands: hello, ping, echo <message>, version.'
|
7
7
|
|
8
8
|
@slack.register_handler('message') do |team_id, event_data|
|
9
|
-
next unless event_data
|
9
|
+
next unless @slack.to_me?(event_data)
|
10
10
|
|
11
11
|
user = event_data['user']
|
12
12
|
text = event_data['text']
|
@@ -16,8 +16,8 @@ class Driftwood::Plugin::Netserv < Driftwood::Plugin
|
|
16
16
|
@slack.send_response(team_id, user, "Hi there, #{@slack.real_name(team_id, user)}!")
|
17
17
|
when /^ping$/i
|
18
18
|
@slack.send_response(team_id, user, "Pong")
|
19
|
-
when /^echo
|
20
|
-
@slack.send_response(team_id, user, "Echo response: #{
|
19
|
+
when /^echo (.*)/i
|
20
|
+
@slack.send_response(team_id, user, "Echo response: #{$1}")
|
21
21
|
when /^version$/i
|
22
22
|
@slack.send_response(team_id, user, "Driftwood v#{Driftwood::VERSION}")
|
23
23
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
1
3
|
class Driftwood::Plugin::Onboard < Driftwood::Plugin
|
2
4
|
|
3
5
|
def initialize(config=nil, slack=nil, bigquery=nil)
|
@@ -7,8 +9,18 @@ class Driftwood::Plugin::Onboard < Driftwood::Plugin
|
|
7
9
|
@slack.register_handler('team_join') do |team_id, event_data|
|
8
10
|
user = @slack.normalize_user(event_data['user'])
|
9
11
|
$logger.info "User #{user['name']} (#{user['real_name']}) joined the workspace"
|
10
|
-
|
11
|
-
|
12
|
+
|
13
|
+
filename = File.expand_path(config[:workspace]) rescue nil
|
14
|
+
if filename
|
15
|
+
begin
|
16
|
+
$logger.debug "Sending team welcome from #{filename}"
|
17
|
+
template = ERB.new(File.read(filename))
|
18
|
+
@slack.send_response(team_id, event_data['user'], template.result(binding))
|
19
|
+
rescue => e
|
20
|
+
$logger.info "Sending onboarding welcome failed: #{e.message}"
|
21
|
+
$logger.debug e.backtrace.join("\n")
|
22
|
+
end
|
23
|
+
end
|
12
24
|
end
|
13
25
|
|
14
26
|
@slack.register_handler('member_joined_channel') do |team_id, event_data|
|
@@ -16,8 +28,18 @@ class Driftwood::Plugin::Onboard < Driftwood::Plugin
|
|
16
28
|
user = @slack.normalize_user(user)
|
17
29
|
channel = @slack.channel_name(event_data['team'], event_data['channel'])
|
18
30
|
$logger.info "User #{user['name']} (#{user['real_name']}) joined ##{channel}"
|
19
|
-
|
20
|
-
|
31
|
+
|
32
|
+
filename = File.expand_path(config[:channels][channel]) rescue nil
|
33
|
+
if filename
|
34
|
+
begin
|
35
|
+
$logger.debug "Sending channel welcome from #{filename}"
|
36
|
+
template = ERB.new(File.read(filename))
|
37
|
+
@slack.send_response(team_id, event_data['user'], template.result(binding))
|
38
|
+
rescue => e
|
39
|
+
$logger.info "Sending channel welcome failed: #{e.message}"
|
40
|
+
$logger.debug e.backtrace.join("\n")
|
41
|
+
end
|
42
|
+
end
|
21
43
|
end
|
22
44
|
|
23
45
|
end
|
data/lib/driftwood/slack.rb
CHANGED
@@ -304,6 +304,16 @@ class Driftwood::Slack
|
|
304
304
|
end
|
305
305
|
end
|
306
306
|
|
307
|
+
def my_ims
|
308
|
+
@teams.map do |team_id, team|
|
309
|
+
team[:client].im_list['ims'].map { |im| im['id'] }
|
310
|
+
end.flatten
|
311
|
+
end
|
312
|
+
|
313
|
+
def to_me?(event_data)
|
314
|
+
return false unless event_data['channel_type'] == 'im'
|
315
|
+
my_ims.include? event_data['channel']
|
316
|
+
end
|
307
317
|
|
308
318
|
def shell
|
309
319
|
require 'pry'
|
data/lib/driftwood/version.rb
CHANGED
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.8
|
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-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -72,9 +72,9 @@ files:
|
|
72
72
|
- lib/driftwood/monkeypatches.rb
|
73
73
|
- lib/driftwood/plugin.rb
|
74
74
|
- lib/driftwood/plugin/debug.rb
|
75
|
+
- lib/driftwood/plugin/logger.rb
|
75
76
|
- lib/driftwood/plugin/netserv.rb
|
76
77
|
- lib/driftwood/plugin/onboard.rb
|
77
|
-
- lib/driftwood/plugin/ping.rb
|
78
78
|
- lib/driftwood/slack.rb
|
79
79
|
- lib/driftwood/version.rb
|
80
80
|
- public/driftwood.jpg
|
File without changes
|