realtime-slackbot 0.0.2 → 0.1.0

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: 2c3b6aa10e9b44ed0c22ac2783ac1f7efb3d9d80
4
- data.tar.gz: d84623a4d4f82b58c713e3aa8c471942c5958d42
3
+ metadata.gz: 7c13855c42c7a8a3ff7a09ff6069b60016891ebf
4
+ data.tar.gz: ec4ba39af1236d7568f6718ee12b975ebd859e04
5
5
  SHA512:
6
- metadata.gz: 43ecc63ee27b16e0a72648c9855a404f343bb797cbc6e3fa29b76431e574fcda626e9faf8522702ccef332b8945b72e35609a56f22fb54d516f01a23fff3703f
7
- data.tar.gz: 1370762e81ad0faa4b187147d675f156c9ef9b7eb2ca54b78ee7cc05a9527ba053a5742f9b3c5ea8abb87bd71bd2f714075da5d0a04ccca65b4ba3d3c578d829
6
+ metadata.gz: 6c57c00355b00b0b4d208152e7c6c2e8f846adf682158bc5ccda42d201c6f0883b21afd67a18bbfe0bbaab52524de4d0a2722d5c6ac44a981bf8d3c500e2c0e2
7
+ data.tar.gz: 887ab75eb513edddc1982698b2b366edabb73ee1e0e2830dece5ff39aac5c556042e34af3bde9ca53e1872cb2fdbcba780fed99dd4827fef280e3b4485358213
@@ -0,0 +1,70 @@
1
+ class SlackBot::Matcher
2
+ def initialize
3
+ @tests = []
4
+ @finally = nil
5
+ end
6
+
7
+ def run_on(msg)
8
+ @tests.each do |test|
9
+ unless test.call(msg)
10
+ return false
11
+ end
12
+ end
13
+ @finally.call(msg) if @finally
14
+ return true
15
+ end
16
+
17
+ def from?(user)
18
+ @tests << lambda do |msg|
19
+ user = user.to_s.downcase
20
+ msg_user = msg.user
21
+ return false unless msg_user
22
+ if msg_user.id == user || msg_user.name.downcase == user
23
+ return true
24
+ else
25
+ real = msg_user.real_name
26
+ return real == user || real.split(' ').map { |n| user == n }.any?
27
+ end
28
+ end
29
+ self
30
+ end
31
+
32
+ def in?(options={})
33
+ @tests << lambda do |msg|
34
+ if options[:id]
35
+ return msg.channel == options[:id]
36
+ elsif options[:name]
37
+ chan = msg.bot.channel(options[:name])
38
+ return chan['id'] == msg.channel
39
+ end
40
+ end
41
+ self
42
+ end
43
+
44
+ def include?(text)
45
+ @tests << Proc.new do |msg|
46
+ msg.text.downcase.include? text
47
+ end
48
+ self
49
+ end
50
+
51
+ def match?(reg)
52
+ @tests << Proc.new { |msg| msg.text.downcase.match reg }
53
+ self
54
+ end
55
+
56
+ def try?(&block)
57
+ @tests << block
58
+ self
59
+ end
60
+
61
+ def then(&block)
62
+ @finally = block
63
+ end
64
+
65
+ def then_reply(*args)
66
+ @finally = Proc.new do |msg|
67
+ msg.reply(*args)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,31 @@
1
+ require_relative 'matcher'
2
+
3
+ module SlackBot
4
+ class MatcherGroup
5
+ def initialize(action)
6
+ @action = action
7
+ @matchers = []
8
+ end
9
+
10
+ def respond_for(msg)
11
+ @before_match.call(msg) if @before_match
12
+ @matchers.each do |m|
13
+ break if m.run_on(msg)
14
+ end
15
+ end
16
+
17
+ def when
18
+ m = Matcher.new
19
+ @matchers.push m
20
+ return m
21
+ end
22
+
23
+ def before_match(&block)
24
+ @before_match = block
25
+ end
26
+
27
+ def to_s
28
+ "#{@action} #{@matchers.count}"
29
+ end
30
+ end
31
+ end
data/lib/slack/message.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  require 'json'
2
- require_relative 'matcher'
2
+ require_relative 'matchers/matcher'
3
3
 
4
4
  module SlackBot
5
5
  class Message
@@ -18,6 +18,10 @@ module SlackBot
18
18
  def to_s
19
19
  "#{@user.name}: #{@data['text']}"
20
20
  end
21
+
22
+ def user
23
+ @bot.user(@data['user'])
24
+ end
21
25
 
22
26
  def [](key)
23
27
  @data[key]
@@ -28,10 +32,11 @@ module SlackBot
28
32
  end
29
33
 
30
34
  def method_missing(name, *args)
31
- if Matcher.instance_methods.include? name.to_sym
32
- return Matcher.new(self).send(name, *args)
33
- else
35
+ # Access data if no args and is valid key, else throw exception
36
+ if args.count == 0 && @data.has_key?(name.to_s)
34
37
  @data[name.to_s]
38
+ else
39
+ super(name, args)
35
40
  end
36
41
  end
37
42
  end
data/lib/slack/slack.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require_relative 'user'
2
2
  require_relative 'message'
3
+ require_relative 'matchers/matcher_group'
3
4
  require 'net/http'
4
5
  require 'faye/websocket'
5
6
  require 'eventmachine'
@@ -14,6 +15,7 @@ module SlackBot
14
15
  def initialize(auth_key, options={})
15
16
  @debug = options[:log]
16
17
  @key = auth_key.strip
18
+ @matchers = Hash.new
17
19
  end
18
20
 
19
21
  def get_url
@@ -25,7 +27,7 @@ module SlackBot
25
27
 
26
28
  def run
27
29
  url = get_url()
28
- EM.run {
30
+ EM.run do
29
31
  @socket = ws = Faye::WebSocket::Client.new(url)
30
32
 
31
33
  ws.on :open do |event|
@@ -54,11 +56,18 @@ module SlackBot
54
56
  @socket = ws = nil
55
57
  hook(:closed)
56
58
  end
57
- }
59
+ end
58
60
  end
59
61
 
60
62
  def hook(action, *args)
61
- if self.respond_to? action
63
+ if self.respond_to? "#{action}_matcher"
64
+ unless @matchers.has_key? action
65
+ matcher_group = MatcherGroup.new(action)
66
+ self.send("#{action}_matcher", matcher_group)
67
+ @matchers[action] = matcher_group
68
+ end
69
+ @matchers[action].respond_for(args.first)
70
+ elsif self.respond_to? action
62
71
  begin
63
72
  send(action, *args)
64
73
  rescue Exception => e
@@ -71,7 +80,7 @@ module SlackBot
71
80
  def post(channel, message)
72
81
  data = {
73
82
  id: 1,
74
- type: "message",
83
+ type: 'message',
75
84
  channel: channel,
76
85
  text: message
77
86
  }
@@ -104,6 +113,10 @@ module SlackBot
104
113
  @users[id]
105
114
  end
106
115
 
116
+ def channel(name)
117
+ @team_info['channels'].select { |c| c['name'] == name }.first
118
+ end
119
+
107
120
  def log(type, message)
108
121
  if debug?
109
122
  puts "#{type}: #{message}"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: realtime-slackbot
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Will Richardson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-18 00:00:00.000000000 Z
11
+ date: 2016-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faye-websocket
@@ -46,7 +46,8 @@ extra_rdoc_files: []
46
46
  files:
47
47
  - lib/realtime-slackbot.rb
48
48
  - lib/slack/bot.rb
49
- - lib/slack/matcher.rb
49
+ - lib/slack/matchers/matcher.rb
50
+ - lib/slack/matchers/matcher_group.rb
50
51
  - lib/slack/message.rb
51
52
  - lib/slack/slack.rb
52
53
  - lib/slack/user.rb
data/lib/slack/matcher.rb DELETED
@@ -1,58 +0,0 @@
1
- class SlackBot::Matcher
2
- def initialize(msg)
3
- @message = msg
4
- @passing = true
5
- end
6
-
7
- def from?(user)
8
- return self unless @passing
9
- user = user.to_s.downcase
10
- if @user
11
- if @user.id == user || @user.name.downcase == user
12
- res = true
13
- else
14
- real = @user.real_name
15
- res = real == user || real.split(' ').map { |n| user == n }.any?
16
- end
17
- else
18
- res = false
19
- end
20
- @passing &&= res
21
- self
22
- end
23
-
24
- def in?(options={})
25
- return self unless @passing
26
- res = false
27
- if options[:id]
28
- res = @message['channel'] == options[:id]
29
- elsif options[:name]
30
- chans = @bot.team_info['channels'].select { |name| ch[id] == channel }
31
- res = chans.first == options[:name]
32
- end
33
- @passing &&= res
34
- self
35
- end
36
-
37
- def include?(text)
38
- return self unless @passing
39
- @passing &&= @message['text'].downcase.include? text
40
- self
41
- end
42
-
43
- def match?(reg)
44
- return self unless @passing
45
- @passing &&= @message['text'].downcase.match reg
46
- self
47
- end
48
-
49
- def then(&block)
50
- block.call if @passing
51
- end
52
-
53
- def then_reply(*args)
54
- if @passing
55
- @message.reply(*args)
56
- end
57
- end
58
- end