slacky 0.1.4 → 0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- slacky (0.1.4)
4
+ slacky (0.2)
5
5
  dotenv
6
6
  em-cron
7
7
  eventmachine
@@ -138,6 +138,7 @@ module Slacky
138
138
 
139
139
  @client.on :message do |data|
140
140
  next unless ( user = User.find data.user )
141
+ next unless user.valid?
141
142
 
142
143
  channel = Channel.find data.channel
143
144
  channel = Channel.im data.channel, user if data.channel =~ /^D/ && ! channel
@@ -194,12 +195,17 @@ module Slacky
194
195
  print "Getting users from Slack..."
195
196
  resp = web_client.users_list presence: 1
196
197
  throw resp unless resp.ok
198
+ User.invalidate_all_users
199
+ whitelist = @config.whitelist_users || []
197
200
  resp.members.map do |member|
198
201
  next unless member.profile.email # no bots
199
202
  next if member.deleted # no ghosts
200
- next if member.is_ultra_restricted # no single channel guests
203
+ unless whitelist.include?(member.id) || whitelist.include?(member.name) || whitelist.include?("@#{member.name}")
204
+ next if member.is_ultra_restricted # no single channel guests
205
+ next if member.is_restricted # no multi channel guests either
206
+ end
201
207
  user = User.find(member.id) || User.new(slack_id: member.id)
202
- user.populate(member).save
208
+ user.populate(member).validate.save
203
209
  end
204
210
  puts " done!"
205
211
  end
@@ -44,6 +44,11 @@ module Slacky
44
44
  ENV['ACCEPT_CHANNELS'].split(',').map {|c| c.strip}
45
45
  end
46
46
 
47
+ def whitelist_users
48
+ return nil unless ENV['WHITELIST_USERS']
49
+ ENV['WHITELIST_USERS'].split(',').map {|u| u.strip}
50
+ end
51
+
47
52
  def log(msg, ex = nil)
48
53
  log = File.new(log_file, 'a')
49
54
  timestamp = Time.now.strftime('%Y-%m-%d %H:%M:%S')
@@ -20,6 +20,7 @@ module Slacky
20
20
  end
21
21
 
22
22
  begin
23
+ Thread.abort_on_exception = true
23
24
  @slackthread = Thread.new do
24
25
  bot = Bot.new @config
25
26
  @bot_class.new bot
@@ -39,6 +39,12 @@ module Slacky
39
39
  end
40
40
  end
41
41
 
42
+ def command_args
43
+ return nil unless command
44
+ index = @text.index(command) + command.length
45
+ @text[index..-1].strip
46
+ end
47
+
42
48
  def yes?
43
49
  [ 'y', 'yes', 'yep' ].include? @text.downcase
44
50
  end
@@ -3,8 +3,13 @@ require 'json'
3
3
  module Slacky
4
4
  class User
5
5
  attr_accessor :username, :slack_id, :slack_im_id, :first_name, :last_name, :email, :timezone, :presence, :data
6
+ attr_writer :valid
6
7
  attr_reader :tz
7
8
 
9
+ def valid?
10
+ @valid
11
+ end
12
+
8
13
  @@decorator = @@config = @@db = nil
9
14
 
10
15
  def self.decorator=(decorator)
@@ -33,31 +38,51 @@ create table if not exists users (
33
38
  email varchar(128) not null,
34
39
  timezone varchar(256),
35
40
  presence varchar(64),
41
+ valid boolean not null default false,
36
42
  data jsonb not null
37
43
  );
38
44
  SQL
39
45
  end
40
46
 
47
+ def self.invalidate_all_users
48
+ self.db.exec 'update users set valid = FALSE'
49
+ end
50
+
41
51
  def self.find(user)
52
+ return nil unless user
42
53
  return user.map { |u| User.find u }.compact if user.is_a? Array
43
- result = self.db.exec_params "select * from users where slack_id = $1", [ user ]
54
+ match = user.match(/^<@(.*)>$/)
55
+ id = ( match ? match[1] : user )
56
+ result = self.db.exec_params "select * from users where slack_id = $1", [ id ]
44
57
  if result.ntuples == 0
45
- result = self.db.exec_params "select * from users where username = $1", [ user ]
58
+ username = ( user =~ /^@/ ? user.sub(/^@/, '') : user )
59
+ result = self.db.exec_params "select * from users where username = $1", [ username ]
46
60
  end
47
61
  return nil if result.ntuples == 0
62
+ hydrate(result)[0]
63
+ end
48
64
 
49
- row = result[0]
50
- user = self.new username: row['username'],
51
- slack_id: row['slack_id'],
52
- slack_im_id: row['slack_im_id'],
53
- first_name: row['first_name'],
54
- last_name: row['last_name'],
55
- email: row['email'],
56
- timezone: row['timezone'],
57
- presence: row['presence'],
58
- data: JSON.parse(row['data'])
59
- user.extend @@decorator if @@decorator
60
- user
65
+ def self.find_by_data(query)
66
+ result = self.db.exec "select * from users where data #{query}"
67
+ hydrate result
68
+ end
69
+
70
+ def self.hydrate(result)
71
+ return [] if result.ntuples == 0
72
+ result.map do |row|
73
+ user = self.new username: row['username'],
74
+ slack_id: row['slack_id'],
75
+ slack_im_id: row['slack_im_id'],
76
+ first_name: row['first_name'],
77
+ last_name: row['last_name'],
78
+ email: row['email'],
79
+ timezone: row['timezone'],
80
+ presence: row['presence'],
81
+ valid: row['valid'],
82
+ data: JSON.parse(row['data'])
83
+ user.extend @@decorator if @@decorator
84
+ user
85
+ end
61
86
  end
62
87
 
63
88
  def initialize(attrs={})
@@ -69,6 +94,7 @@ SQL
69
94
  @email = attrs[:email]
70
95
  @timezone = attrs[:timezone] || "America/Los_Angeles"
71
96
  @presence = attrs[:presence]
97
+ @valid = attrs[:valid]
72
98
  @data = attrs[:data] || {}
73
99
  end
74
100
 
@@ -83,11 +109,16 @@ SQL
83
109
  self
84
110
  end
85
111
 
112
+ def validate
113
+ @valid = true
114
+ self
115
+ end
116
+
86
117
  def save
87
118
  User.db.exec_params "delete from users where slack_id = $1", [ @slack_id ]
88
- User.db.exec_params "insert into users (username, slack_id, slack_im_id, first_name, last_name, email, timezone, presence, data)
89
- values ($1, $2, $3, $4, $5, $6, $7, $8, $9)",
90
- [ @username, @slack_id, @slack_im_id, @first_name, @last_name, @email, @timezone, @presence, JSON.dump(@data) ]
119
+ User.db.exec_params "insert into users (username, slack_id, slack_im_id, first_name, last_name, email, timezone, presence, valid, data)
120
+ values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)",
121
+ [ @username, @slack_id, @slack_im_id, @first_name, @last_name, @email, @timezone, @presence, @valid, JSON.dump(@data) ]
91
122
  self
92
123
  end
93
124
 
@@ -1,3 +1,3 @@
1
1
  module Slacky
2
- VERSION = "0.1.4"
2
+ VERSION = "0.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slacky
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: '0.2'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-05-25 00:00:00.000000000 Z
12
+ date: 2016-05-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: slack-ruby-client
@@ -226,7 +226,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
226
226
  version: '0'
227
227
  segments:
228
228
  - 0
229
- hash: -862400809388430587
229
+ hash: 2539155529530202042
230
230
  required_rubygems_version: !ruby/object:Gem::Requirement
231
231
  none: false
232
232
  requirements:
@@ -235,7 +235,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
235
235
  version: '0'
236
236
  segments:
237
237
  - 0
238
- hash: -862400809388430587
238
+ hash: 2539155529530202042
239
239
  requirements: []
240
240
  rubyforge_project:
241
241
  rubygems_version: 1.8.23