mobb 0.1.1 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2047c6ffa8e1ad5878d243eadea897391f90059aa77d4a9d1cb5a45941b64550
4
- data.tar.gz: b4ba4916d0397c8b2f7545b0d42da3054e660bcb178c8083a88e36a6640ccaf9
3
+ metadata.gz: f1786f31311eda789fd50527e7a5cbdbce91c63388668ba248db37f32f5c2578
4
+ data.tar.gz: c89c89b84d4e6298152dd78113d941bc397dfa2c65ea352bafa084caa5a5d009
5
5
  SHA512:
6
- metadata.gz: 9570920bc64af22401fc063d04dc710d8ea4f68114c98f210f03cc67734234c9fa9e8bbe1a5f7f4fcb55edf9cba07b39321cc0e1d1289062990ffec71715e063
7
- data.tar.gz: 7636deef2a178bd6753118f2446dc8d4692c3ed343028616339fde990ab3369109f82f4e8f345d98e320fe195c610e7c85ae2f475c601411980f3e1c2012d111
6
+ metadata.gz: 74778071b90f9656e2cd2e29b8b88e98ccf6168c05f33c0af44c82036f1214eac7ac8bc6742cd6658a2039849fa35bc117cf55e515cb409e0945cc80b859b03c
7
+ data.tar.gz: a0c47902564e323ccb4be959451ec21d433ceedb66f656efa1d56762e1705e0fea316f92ce1c03444bc1100f5ebe45e3381a9bb75e59c9b4ed3bd14db77f4600
data/README.md CHANGED
@@ -32,7 +32,7 @@ Write your logic in `app.rb` like...
32
32
  require 'mobb'
33
33
 
34
34
  set :name, "example bot"
35
- '
35
+
36
36
  on "hello" do
37
37
  "hi! i'm #{settings.name}!"
38
38
  end
@@ -50,6 +50,60 @@ then the shell will start to wait for your input, so you can type 'hello' and hi
50
50
  hi! i'm example bot!"
51
51
  ```
52
52
 
53
+ ## Helpers
54
+
55
+ You can define helper methods like this.
56
+
57
+ ```ruby
58
+ require 'mobb'
59
+
60
+ helpers do
61
+ def greet(name)
62
+ "Hi #{name}, what't up"
63
+ end
64
+ end
65
+
66
+ on "hello" do
67
+ greet(@env.user.name)
68
+ end
69
+
70
+ ```
71
+
72
+ ## Conditions
73
+
74
+ You can use conditions `ignore_bot` and `reply_to_me`.
75
+
76
+ ```ruby
77
+ require 'mobb'
78
+ set :service, 'slack'
79
+
80
+ # You must set `ignore_bot` true when response same message
81
+ on 'Yo', ignore_bot: true do
82
+ 'Yo'
83
+ end
84
+
85
+ on /Hi/, reply_to_me: true do
86
+ "Hi #{@env.user.name}"
87
+ end
88
+ ```
89
+
90
+ And you can define conditions yourself.
91
+
92
+ ```ruby
93
+ require 'mobb'
94
+ set :service, 'slack'
95
+
96
+ set(:probability) { |value| condition { rand <= value } }
97
+
98
+ on /Yo/, reply_to_me: true, probability: 0.1 do
99
+ "Yo"
100
+ end
101
+
102
+ on /Yo/, reply_to_me: true do
103
+ "Ha?"
104
+ end
105
+ ```
106
+
53
107
  # Service handlers
54
108
 
55
109
  Mobb is implemented based on [Repp](https://github.com/kinoppyd/repp) Interface.
@@ -92,8 +92,8 @@ module Mobb
92
92
 
93
93
  def handle_event(base = settings, passed_block = nil)
94
94
  if responds = base.events[@env.event_type]
95
- responds.each do |pattern, block|
96
- process_event(pattern) do |*args|
95
+ responds.each do |pattern, block, conditions|
96
+ process_event(pattern, conditions) do |*args|
97
97
  event_eval { block[*args] }
98
98
  end
99
99
  end
@@ -103,15 +103,19 @@ module Mobb
103
103
  nil
104
104
  end
105
105
 
106
- def process_event(pattern, block = nil, values = [])
106
+ def process_event(pattern, conditions, block = nil, values = [])
107
107
  res = pattern.match?(@env.body)
108
- case res
109
- when ::Mobb::Matcher::Matched
110
- yield(self, *(res.matched))
111
- when TrueClass
112
- yield self
113
- else
114
- nil
108
+ catch(:pass) do
109
+ conditions.each { |c| throw :pass unless c.bind(self).call }
110
+
111
+ case res
112
+ when ::Mobb::Matcher::Matched
113
+ yield(self, *(res.matched))
114
+ when TrueClass
115
+ yield self
116
+ else
117
+ nil
118
+ end
115
119
  end
116
120
  end
117
121
 
@@ -136,6 +140,7 @@ module Mobb
136
140
 
137
141
  def reset!
138
142
  @events = {}
143
+ @conditions = []
139
144
  end
140
145
 
141
146
  def settings
@@ -151,13 +156,17 @@ module Mobb
151
156
  (@events[type] ||= []) << compile!(type, pattern, options, &block)
152
157
  end
153
158
 
154
- def compile!(type, pattern, option, &block)
155
- matcher = compile(pattern, option)
159
+ def compile!(type, pattern, options, &block)
160
+ options.each_pair { |option, args| send(option, *args) }
161
+
162
+ matcher = compile(pattern, options)
156
163
  unbound_method = generate_method("#{type}", &block)
164
+ conditions, @conditions = @conditions, []
157
165
  wrapper = block.arity != 0 ?
158
166
  proc { |instance, args| unbound_method.bind(instance).call(*args) } :
159
167
  proc { |instance, args| unbound_method.bind(instance).call }
160
- [matcher, wrapper]
168
+
169
+ [ matcher, wrapper, conditions ]
161
170
  end
162
171
 
163
172
  def compile(pattern, options) Matcher.new(pattern, options); end
@@ -169,6 +178,11 @@ module Mobb
169
178
  method
170
179
  end
171
180
 
181
+ def helpers(*extensions, &block)
182
+ class_eval(&block) if block_given?
183
+ include(*extensions) if extensions.any?
184
+ end
185
+
172
186
  def development?; environment == :development; end
173
187
  def production?; environment == :production; end
174
188
  def test?; environment == :test; end
@@ -209,6 +223,22 @@ module Mobb
209
223
  self
210
224
  end
211
225
 
226
+ def condition(name = "#{caller.first[/`.*'/]} condition", &block)
227
+ @conditions << generate_method(name, &block)
228
+ end
229
+
230
+ def ignore_bot(cond)
231
+ condition do
232
+ @env.bot? != cond
233
+ end
234
+ end
235
+
236
+ def reply_to_me(cond)
237
+ condition do
238
+ @env.reply_to.include?(settings.name) == cond
239
+ end
240
+ end
241
+
212
242
  def enable(*options) options.each { |option| set(option, true) }; end
213
243
  def disable(*options) options.each { |option| set(option, false) }; end
214
244
  def clear(*options) options.each { |option| set(option, nil) }; end
@@ -343,7 +373,8 @@ module Mobb
343
373
  end
344
374
 
345
375
  delegate :receive, :on, #:every,
346
- :set, :enable, :disable, :clear
376
+ :set, :enable, :disable, :clear,
377
+ :helpers
347
378
 
348
379
  class << self
349
380
  attr_accessor :target
@@ -1,3 +1,3 @@
1
1
  module Mobb
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  end
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_dependency "repp", "~> 0.1"
22
+ spec.add_dependency "repp", "~> 0.2"
23
23
 
24
24
  spec.add_development_dependency "bundler", "~> 1.16"
25
25
  spec.add_development_dependency "rake", "~> 10.0"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mobb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kinoppyd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-29 00:00:00.000000000 Z
11
+ date: 2018-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: repp
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.1'
19
+ version: '0.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.1'
26
+ version: '0.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement