chatterbot 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/chatterbot.rb +1 -0
- data/lib/chatterbot/bot.rb +1 -0
- data/lib/chatterbot/config.rb +1 -2
- data/lib/chatterbot/dsl.rb +23 -0
- data/lib/chatterbot/reply.rb +3 -1
- data/lib/chatterbot/search.rb +16 -7
- data/lib/chatterbot/streaming.rb +2 -2
- data/lib/chatterbot/version.rb +1 -1
- data/lib/chatterbot/whitelist.rb +32 -0
- data/spec/blacklist_spec.rb +2 -2
- data/spec/dsl_spec.rb +27 -0
- data/spec/search_spec.rb +5 -23
- data/spec/whitelist_spec.rb +31 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb0d7e5550a5496c33802ec97967e13ece9adc70
|
4
|
+
data.tar.gz: be65c23352fb603a2ff7694cdfeb5221f9ccfc9c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29c0d716108c6e654aab1aaf6f06daa46f5f934c0b090d2322ae0f5a12fa895067ff269b31e372b0b0f9c80d17510a76be50749590198613716ae6878a4937c9
|
7
|
+
data.tar.gz: d4377d0133715d08adf1a93f28b4f8e0453e06e27ca5b78f56eb5fc2311be711a42b77e6123b28005b110d7fbd462d5cdf01ab4066da6a3e3739d860bf342e21
|
data/lib/chatterbot.rb
CHANGED
data/lib/chatterbot/bot.rb
CHANGED
data/lib/chatterbot/config.rb
CHANGED
@@ -214,14 +214,13 @@ module Chatterbot
|
|
214
214
|
# figure out what config file to load based on the name of the bot
|
215
215
|
def config_file
|
216
216
|
dest = working_dir
|
217
|
-
|
217
|
+
File.join(File.expand_path(dest), "#{botname}.yml")
|
218
218
|
end
|
219
219
|
|
220
220
|
#
|
221
221
|
# load in a config file
|
222
222
|
def slurp_file(f)
|
223
223
|
f = File.expand_path(f)
|
224
|
-
|
225
224
|
tmp = {}
|
226
225
|
|
227
226
|
if File.exist?(f)
|
data/lib/chatterbot/dsl.rb
CHANGED
@@ -225,6 +225,29 @@ module Chatterbot
|
|
225
225
|
end
|
226
226
|
end
|
227
227
|
|
228
|
+
#
|
229
|
+
# specify a bot-specific whitelist of users. accepts an array, or a
|
230
|
+
# comma-delimited string. when called, any subsequent calls to
|
231
|
+
# search or replies will only act upon these users.
|
232
|
+
#
|
233
|
+
# @param [Array, String] args list of usernames or Twitter::User objects
|
234
|
+
# @example
|
235
|
+
# whitelist "mean_user, private_user"
|
236
|
+
#
|
237
|
+
def whitelist(*args)
|
238
|
+
list = flatten_list_of_strings(args)
|
239
|
+
|
240
|
+
if list.nil? || list.empty?
|
241
|
+
bot.whitelist = []
|
242
|
+
else
|
243
|
+
bot.whitelist += list
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def only_interact_with_followers
|
248
|
+
whitelist followers
|
249
|
+
end
|
250
|
+
|
228
251
|
#
|
229
252
|
# return a list of users following the bot. This passes directly
|
230
253
|
# to the underlying Twitter API call
|
data/lib/chatterbot/reply.rb
CHANGED
@@ -22,7 +22,9 @@ module Chatterbot
|
|
22
22
|
@current_tweet = nil
|
23
23
|
results.each { |s|
|
24
24
|
update_since_id_reply(s)
|
25
|
-
|
25
|
+
if has_whitelist? && !on_whitelist?(s)
|
26
|
+
debug "skipping because user not on whitelist"
|
27
|
+
elsif block_given? && !on_blacklist?(s) && !skip_me?(s)
|
26
28
|
@current_tweet = s
|
27
29
|
yield s
|
28
30
|
end
|
data/lib/chatterbot/search.rb
CHANGED
@@ -4,11 +4,21 @@ module Chatterbot
|
|
4
4
|
# handle Twitter searches
|
5
5
|
module Search
|
6
6
|
|
7
|
+
@skip_retweets = true
|
8
|
+
|
7
9
|
#
|
8
10
|
# modify a query string to exclude retweets from searches
|
9
11
|
#
|
10
|
-
def exclude_retweets
|
11
|
-
|
12
|
+
def exclude_retweets
|
13
|
+
@skip_retweets = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def include_retweets
|
17
|
+
@skip_retweets = false
|
18
|
+
end
|
19
|
+
|
20
|
+
def skippable_retweet?(t)
|
21
|
+
@skip_retweets && t.retweeted_status?
|
12
22
|
end
|
13
23
|
|
14
24
|
# internal search code
|
@@ -25,16 +35,15 @@ module Chatterbot
|
|
25
35
|
#
|
26
36
|
queries.each { |query|
|
27
37
|
debug "search: #{query} #{default_opts.merge(opts)}"
|
28
|
-
result = client.search(
|
29
|
-
exclude_retweets(query),
|
30
|
-
default_opts.merge(opts)
|
31
|
-
)
|
38
|
+
result = client.search( query, default_opts.merge(opts) )
|
32
39
|
update_since_id(result)
|
33
40
|
|
34
41
|
@current_tweet = nil
|
35
42
|
result.each { |s|
|
36
43
|
debug s.text
|
37
|
-
if
|
44
|
+
if has_whitelist? && !on_whitelist?(s)
|
45
|
+
debug "skipping because user not on whitelist"
|
46
|
+
elsif block_given? && !on_blacklist?(s) && !skip_me?(s) && !skippable_retweet?(s)
|
38
47
|
@current_tweet = s
|
39
48
|
yield s
|
40
49
|
end
|
data/lib/chatterbot/streaming.rb
CHANGED
@@ -31,7 +31,7 @@ module Chatterbot
|
|
31
31
|
case object
|
32
32
|
when Twitter::Tweet
|
33
33
|
if object.user == authenticated_user
|
34
|
-
|
34
|
+
debug "skipping #{object} because it's from me"
|
35
35
|
elsif streamer.tweet_handler && !on_blacklist?(object) && !skip_me?(object)
|
36
36
|
@current_tweet = object
|
37
37
|
streamer.tweet_handler.call object
|
@@ -49,7 +49,7 @@ module Chatterbot
|
|
49
49
|
end
|
50
50
|
when Twitter::Streaming::Event
|
51
51
|
if object.respond_to?(:source) && object.source == authenticated_user
|
52
|
-
|
52
|
+
debug "skipping #{object} because it's from me"
|
53
53
|
elsif object.name == :follow && streamer.follow_handler
|
54
54
|
streamer.follow_handler.call(object.source)
|
55
55
|
elsif object.name == :favorite && streamer.favorite_handler
|
data/lib/chatterbot/version.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
module Chatterbot
|
2
|
+
|
3
|
+
#
|
4
|
+
# methods for only tweeting to users on a specific list
|
5
|
+
module Whitelist
|
6
|
+
attr_accessor :whitelist
|
7
|
+
|
8
|
+
# A list of Twitter users that we can communicate with
|
9
|
+
def whitelist
|
10
|
+
@whitelist || []
|
11
|
+
end
|
12
|
+
|
13
|
+
def whitelist=(b)
|
14
|
+
@whitelist = b
|
15
|
+
@whitelist = @whitelist.flatten.collect { |e|
|
16
|
+
(e.is_a?(Twitter::User) ? from_user(e) : e).downcase
|
17
|
+
}
|
18
|
+
@whitelist
|
19
|
+
end
|
20
|
+
|
21
|
+
def has_whitelist?
|
22
|
+
!whitelist.empty?
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
# Is this tweet from a user on our whitelist?
|
27
|
+
def on_whitelist?(s)
|
28
|
+
search = (s.respond_to?(:user) ? from_user(s) : s).downcase
|
29
|
+
whitelist.any? { |b| search.include?(b.downcase) }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/spec/blacklist_spec.rb
CHANGED
@@ -10,7 +10,7 @@ describe "Chatterbot::Blacklist" do
|
|
10
10
|
describe "skip_me?" do
|
11
11
|
before(:each) do
|
12
12
|
@bot = test_bot
|
13
|
-
|
13
|
+
@bot.exclude = ["junk", "i hate bots", "foobar", "spam"]
|
14
14
|
end
|
15
15
|
|
16
16
|
it "blocks tweets with phrases we don't want" do
|
@@ -34,7 +34,7 @@ describe "Chatterbot::Blacklist" do
|
|
34
34
|
describe "on_blacklist?" do
|
35
35
|
before(:each) do
|
36
36
|
@bot = test_bot
|
37
|
-
|
37
|
+
@bot.blacklist = ["skippy", "blippy", "dippy"]
|
38
38
|
end
|
39
39
|
|
40
40
|
it "blocks users we don't want" do
|
data/spec/dsl_spec.rb
CHANGED
@@ -32,6 +32,33 @@ describe "Chatterbot::DSL" do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
describe "whitelist" do
|
36
|
+
it "#whitelist passes along to bot object" do
|
37
|
+
expect(@bot).to receive(:whitelist=).with(["foo"])
|
38
|
+
whitelist ["foo"]
|
39
|
+
end
|
40
|
+
|
41
|
+
it "#whitelist turns single-string arg into an array" do
|
42
|
+
expect(@bot).to receive(:whitelist=).with(["foo"])
|
43
|
+
whitelist "foo"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "#whitelist turns comma-delimited string arg into an array" do
|
47
|
+
expect(@bot).to receive(:whitelist=).with(["foo", "bar"])
|
48
|
+
whitelist "foo, bar"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "only_interact_with_followers" do
|
53
|
+
it "sets whitelist to be the bot's followers" do
|
54
|
+
f = fake_follower
|
55
|
+
allow(@bot).to receive(:followers).and_return([f])
|
56
|
+
expect(@bot).to receive(:whitelist=).with([f])
|
57
|
+
only_interact_with_followers
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
|
35
62
|
[:no_update, :debug_mode, :verbose].each do |method|
|
36
63
|
describe method.to_s do
|
37
64
|
it "#{method.to_s} with nil passes along true to bot object" do
|
data/spec/search_spec.rb
CHANGED
@@ -1,24 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "Chatterbot::Search" do
|
4
|
-
describe "exclude_retweets" do
|
5
|
-
before(:each) do
|
6
|
-
@bot = Chatterbot::Bot.new
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should tack onto query" do
|
10
|
-
expect(@bot.exclude_retweets("foo")).to eq("foo -include:retweets")
|
11
|
-
end
|
12
|
-
|
13
|
-
it "shouldn't tack onto query" do
|
14
|
-
expect(@bot.exclude_retweets("foo -include:retweets")).to eq("foo -include:retweets")
|
15
|
-
end
|
16
|
-
|
17
|
-
it "shouldn't tack onto query" do
|
18
|
-
expect(@bot.exclude_retweets("foo include:retweets")).to eq("foo include:retweets")
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
4
|
it "calls search" do
|
23
5
|
bot = Chatterbot::Bot.new
|
24
6
|
expect(bot).to receive(:search)
|
@@ -40,8 +22,8 @@ describe "Chatterbot::Search" do
|
|
40
22
|
bot = test_bot
|
41
23
|
|
42
24
|
allow(bot).to receive(:client).and_return(fake_search(100, 1))
|
43
|
-
expect(bot.client).to receive(:search).once.ordered.with("foo
|
44
|
-
expect(bot.client).to receive(:search).once.ordered.with("bar
|
25
|
+
expect(bot.client).to receive(:search).once.ordered.with("foo", {:result_type=>"recent"})
|
26
|
+
expect(bot.client).to receive(:search).once.ordered.with("bar", {:result_type=>"recent"})
|
45
27
|
|
46
28
|
bot.search(["foo", "bar"])
|
47
29
|
end
|
@@ -50,7 +32,7 @@ describe "Chatterbot::Search" do
|
|
50
32
|
bot = test_bot
|
51
33
|
|
52
34
|
allow(bot).to receive(:client).and_return(fake_search(100, 1))
|
53
|
-
expect(bot.client).to receive(:search).with("foo
|
35
|
+
expect(bot.client).to receive(:search).with("foo", {:lang => "en", :result_type=>"recent"})
|
54
36
|
|
55
37
|
bot.search("foo", :lang => "en")
|
56
38
|
end
|
@@ -59,7 +41,7 @@ describe "Chatterbot::Search" do
|
|
59
41
|
bot = test_bot
|
60
42
|
|
61
43
|
allow(bot).to receive(:client).and_return(fake_search(100, 1))
|
62
|
-
expect(bot.client).to receive(:search).with("foo
|
44
|
+
expect(bot.client).to receive(:search).with("foo", {:result_type=>"recent"})
|
63
45
|
|
64
46
|
bot.search("foo")
|
65
47
|
end
|
@@ -70,7 +52,7 @@ describe "Chatterbot::Search" do
|
|
70
52
|
allow(bot).to receive(:since_id_reply).and_return(456)
|
71
53
|
|
72
54
|
allow(bot).to receive(:client).and_return(fake_search(100, 1))
|
73
|
-
expect(bot.client).to receive(:search).with("foo
|
55
|
+
expect(bot.client).to receive(:search).with("foo", {:since_id => 123, :result_type => "recent", :since_id_reply => 456})
|
74
56
|
|
75
57
|
bot.search("foo")
|
76
58
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
|
+
|
3
|
+
describe "Chatterbot::Whitelist" do
|
4
|
+
describe "on_whitelist?" do
|
5
|
+
before(:each) do
|
6
|
+
@bot = test_bot
|
7
|
+
@bot.whitelist = [fake_user('user', 100), "skippy", "blippy", "dippy"]
|
8
|
+
end
|
9
|
+
|
10
|
+
it "includes users we want" do
|
11
|
+
expect(@bot.on_whitelist?("user")).to eq(true)
|
12
|
+
expect(@bot.on_whitelist?("skippy")).to eq(true)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "excludes users we don't want" do
|
16
|
+
expect(@bot.on_whitelist?("flippy")).to eq(false)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "isn't case-specific" do
|
20
|
+
expect(@bot.on_whitelist?("FLIPPY")).to eq(false)
|
21
|
+
expect(@bot.on_whitelist?("SKIPPY")).to eq(true)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "works with result hashes" do
|
25
|
+
expect(@bot.on_whitelist?(Twitter::Tweet.new(:id => 1,
|
26
|
+
:user => {:id => 1, :screen_name => "skippy"}))).to eq(true)
|
27
|
+
expect(@bot.on_whitelist?(Twitter::Tweet.new(:id => 1,
|
28
|
+
:user => {:id => 1, :screen_name => "flippy"}))).to eq(false)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chatterbot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Colin Mitchell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redcarpet
|
@@ -229,6 +229,7 @@ files:
|
|
229
229
|
- lib/chatterbot/ui.rb
|
230
230
|
- lib/chatterbot/utils.rb
|
231
231
|
- lib/chatterbot/version.rb
|
232
|
+
- lib/chatterbot/whitelist.rb
|
232
233
|
- spec/blacklist_spec.rb
|
233
234
|
- spec/bot_spec.rb
|
234
235
|
- spec/client_spec.rb
|
@@ -249,6 +250,7 @@ files:
|
|
249
250
|
- spec/streaming_spec.rb
|
250
251
|
- spec/tweet_spec.rb
|
251
252
|
- spec/utils_spec.rb
|
253
|
+
- spec/whitelist_spec.rb
|
252
254
|
- specs.watchr
|
253
255
|
- templates/skeleton.txt
|
254
256
|
homepage: http://github.com/muffinista/chatterbot
|