roflbot 0.0.1 → 0.0.3
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.
- data/README +1 -1
- data/Rakefile +3 -2
- data/VERSION +1 -1
- data/lib/roflbot.rb +1 -0
- data/lib/roflbot/base.rb +51 -8
- data/lib/roflbot/runner.rb +11 -10
- data/lib/roflbot/sentence_bot.rb +1 -1
- data/roflbot.gemspec +6 -3
- data/test/helper.rb +19 -0
- data/test/roflbot/test_base.rb +63 -12
- data/test/roflbot/test_runner.rb +22 -3
- data/test/roflbot/test_sentence_bot.rb +14 -5
- metadata +16 -4
data/README
CHANGED
@@ -1 +1 @@
|
|
1
|
-
roflbot is an AIM
|
1
|
+
roflbot is an bot that says stuff on AIM and Twitter.
|
data/Rakefile
CHANGED
@@ -5,13 +5,14 @@ begin
|
|
5
5
|
require 'jeweler'
|
6
6
|
Jeweler::Tasks.new do |gem|
|
7
7
|
gem.name = "roflbot"
|
8
|
-
gem.summary = %Q{roflbot is a
|
9
|
-
gem.description = %Q{roflbot
|
8
|
+
gem.summary = %Q{roflbot is a bot that says stuff on AIM and Twitter}
|
9
|
+
gem.description = %Q{roflbot will make you a rofl waffle}
|
10
10
|
gem.email = "viking415@gmail.com"
|
11
11
|
gem.homepage = "http://github.com/viking/roflbot"
|
12
12
|
gem.authors = ["Jeremy Stephens"]
|
13
13
|
gem.add_dependency "net-toc"
|
14
14
|
gem.add_dependency "treetop"
|
15
|
+
gem.add_dependency "twitter"
|
15
16
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
17
|
end
|
17
18
|
Jeweler::GemcutterTasks.new
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/lib/roflbot.rb
CHANGED
data/lib/roflbot/base.rb
CHANGED
@@ -21,19 +21,38 @@ module Roflbot
|
|
21
21
|
end
|
22
22
|
|
23
23
|
extend Forwardable
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
TWITTER = { :token => "7rfuoIhSGN7OQVvDLzJrcg", :secret => "I2o4SmRWVV4Yo7XhGgLrKGJq1KgpC8VrluyA9LLuH0" }
|
25
|
+
|
26
|
+
attr_reader :options
|
27
|
+
def initialize(options = {})
|
27
28
|
@options = options
|
28
29
|
@expectations = []
|
30
|
+
accounts = @options["accounts"]
|
31
|
+
|
32
|
+
@aim = Net::TOC.new(*accounts["AIM"].values_at("username", "password"))
|
33
|
+
@aim.on_im { |m, b, a| on_im(m, b, a) }
|
34
|
+
|
35
|
+
oauth = Twitter::OAuth.new(TWITTER[:token], TWITTER[:secret])
|
36
|
+
oauth.authorize_from_access(*accounts["Twitter"].values_at("token", "secret"))
|
37
|
+
@twitter = Twitter::Base.new(oauth)
|
38
|
+
@since_id = accounts['Twitter']['since_id']
|
39
|
+
end
|
29
40
|
|
30
|
-
|
31
|
-
|
41
|
+
def_delegator :@aim, :disconnect
|
42
|
+
|
43
|
+
def start
|
44
|
+
@aim.connect
|
45
|
+
@thread = Thread.new { loop { respond_via_twitter; sleep 60 } }
|
46
|
+
end
|
47
|
+
|
48
|
+
def wait
|
49
|
+
@aim.wait
|
32
50
|
end
|
33
51
|
|
34
|
-
|
35
|
-
|
36
|
-
|
52
|
+
def stop
|
53
|
+
@aim.disconnect
|
54
|
+
@thread.kill if @thread
|
55
|
+
end
|
37
56
|
|
38
57
|
def expects(regexp)
|
39
58
|
exp = Expectation.new(regexp)
|
@@ -53,5 +72,29 @@ module Roflbot
|
|
53
72
|
break
|
54
73
|
end
|
55
74
|
end
|
75
|
+
|
76
|
+
def respond_via_twitter
|
77
|
+
mentions = @twitter.mentions(@since_id ? {:since_id => @since_id} : {})
|
78
|
+
if !mentions.empty?
|
79
|
+
@since_id = mentions[-1].id
|
80
|
+
@options['accounts']['Twitter']['since_id'] = @since_id
|
81
|
+
end
|
82
|
+
|
83
|
+
mentions.each do |tweet|
|
84
|
+
@expectations.each do |expectation|
|
85
|
+
# throw away beginning mention
|
86
|
+
message = tweet.text.sub(/^@[^\s]+\s+/, "")
|
87
|
+
|
88
|
+
next if !expectation.matches?(message)
|
89
|
+
case expectation.response
|
90
|
+
when Proc
|
91
|
+
@twitter.update("@#{tweet.user.screen_name} #{expectation.response.call}")
|
92
|
+
when String
|
93
|
+
@twitter.update("@#{tweet.user.screen_name} #{expectation.response}")
|
94
|
+
end
|
95
|
+
break
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
56
99
|
end
|
57
100
|
end
|
data/lib/roflbot/runner.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
module Roflbot
|
2
2
|
class Runner
|
3
3
|
def initialize(argv = ARGV)
|
4
|
-
|
5
|
-
password = nil
|
6
|
-
options = {}
|
4
|
+
@config = nil
|
7
5
|
OptionParser.new do |opts|
|
8
|
-
opts.on("-
|
9
|
-
opts.on("-p", "--password PASSWORD") { |p| password = p }
|
10
|
-
opts.on("-c", "--config FILENAME") { |c| options = YAML.load_file(c) }
|
6
|
+
opts.on("-c", "--config FILENAME") { |c| @config = c }
|
11
7
|
end.parse!(argv)
|
12
8
|
|
13
|
-
bot = SentenceBot.new(
|
14
|
-
|
15
|
-
|
16
|
-
bot.wait
|
9
|
+
@bot = SentenceBot.new(YAML.load_file(@config))
|
10
|
+
Signal.trap("INT") { stop }
|
11
|
+
@bot.start
|
12
|
+
@bot.wait
|
13
|
+
end
|
14
|
+
|
15
|
+
def stop
|
16
|
+
@bot.stop
|
17
|
+
File.open(@config, "w") { |f| f.write(@bot.options.to_yaml) }
|
17
18
|
end
|
18
19
|
end
|
19
20
|
end
|
data/lib/roflbot/sentence_bot.rb
CHANGED
data/roflbot.gemspec
CHANGED
@@ -5,13 +5,13 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{roflbot}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jeremy Stephens"]
|
12
12
|
s.date = %q{2010-06-30}
|
13
13
|
s.default_executable = %q{roflbot}
|
14
|
-
s.description = %q{roflbot
|
14
|
+
s.description = %q{roflbot will make you a rofl waffle}
|
15
15
|
s.email = %q{viking415@gmail.com}
|
16
16
|
s.executables = ["roflbot"]
|
17
17
|
s.extra_rdoc_files = [
|
@@ -41,7 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
s.rdoc_options = ["--charset=UTF-8"]
|
42
42
|
s.require_paths = ["lib"]
|
43
43
|
s.rubygems_version = %q{1.3.6}
|
44
|
-
s.summary = %q{roflbot is a
|
44
|
+
s.summary = %q{roflbot is a bot that says stuff on AIM and Twitter}
|
45
45
|
s.test_files = [
|
46
46
|
"test/helper.rb",
|
47
47
|
"test/roflbot/test_sentence_bot.rb",
|
@@ -56,13 +56,16 @@ Gem::Specification.new do |s|
|
|
56
56
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
57
57
|
s.add_runtime_dependency(%q<net-toc>, [">= 0"])
|
58
58
|
s.add_runtime_dependency(%q<treetop>, [">= 0"])
|
59
|
+
s.add_runtime_dependency(%q<twitter>, [">= 0"])
|
59
60
|
else
|
60
61
|
s.add_dependency(%q<net-toc>, [">= 0"])
|
61
62
|
s.add_dependency(%q<treetop>, [">= 0"])
|
63
|
+
s.add_dependency(%q<twitter>, [">= 0"])
|
62
64
|
end
|
63
65
|
else
|
64
66
|
s.add_dependency(%q<net-toc>, [">= 0"])
|
65
67
|
s.add_dependency(%q<treetop>, [">= 0"])
|
68
|
+
s.add_dependency(%q<twitter>, [">= 0"])
|
66
69
|
end
|
67
70
|
end
|
68
71
|
|
data/test/helper.rb
CHANGED
@@ -3,6 +3,7 @@ require 'rubygems'
|
|
3
3
|
require 'mocha'
|
4
4
|
require 'delegate'
|
5
5
|
require 'ruby-debug'
|
6
|
+
require 'tempfile'
|
6
7
|
require File.dirname(__FILE__) + "/../lib/roflbot"
|
7
8
|
|
8
9
|
class FakeClient < Mocha::Mock
|
@@ -17,13 +18,31 @@ class Test::Unit::TestCase
|
|
17
18
|
@client = FakeClient.new
|
18
19
|
@buddy = stub("Buddy")
|
19
20
|
Net::TOC.stubs(:new).returns(@client)
|
21
|
+
|
22
|
+
@oauth = stub("OAuth", :authorize_from_access => [])
|
23
|
+
@twitter = stub("Twitter", :mentions => [])
|
24
|
+
Twitter::OAuth.stubs(:new).returns(@oauth)
|
25
|
+
Twitter::Base.stubs(:new).returns(@twitter)
|
20
26
|
end
|
21
27
|
|
22
28
|
def receive_im(message, auto = false)
|
23
29
|
@client.on_im_block.call(message, @buddy, auto)
|
24
30
|
end
|
25
31
|
|
32
|
+
def fake_tweet(message, id)
|
33
|
+
Hashie::Mash.new("user" => { "screen_name" => "dudeguy" }, "text" => "@roflbot #{message}", "id" => id)
|
34
|
+
end
|
35
|
+
|
26
36
|
def fixture_filename(name)
|
27
37
|
File.dirname(__FILE__) + "/fixtures/#{name}"
|
28
38
|
end
|
39
|
+
|
40
|
+
def create_config(name)
|
41
|
+
tmp = Tempfile.open("roflbot_config")
|
42
|
+
file = File.open(fixture_filename(name), "r")
|
43
|
+
tmp.write(file.read)
|
44
|
+
file.close
|
45
|
+
tmp.close
|
46
|
+
tmp.path
|
47
|
+
end
|
29
48
|
end
|
data/test/roflbot/test_base.rb
CHANGED
@@ -2,39 +2,90 @@ require File.dirname(__FILE__) + "/../helper"
|
|
2
2
|
|
3
3
|
module Roflbot
|
4
4
|
class TestBase < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@options = {
|
8
|
+
"accounts" => {
|
9
|
+
"AIM" => { "username" => "roflbot", "password" => "password" },
|
10
|
+
"Twitter" => { "token" => "abcdef", "secret" => "123456" }
|
11
|
+
}
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
5
15
|
def test_new
|
6
16
|
Net::TOC.expects(:new).with("roflbot", "password").returns(@client)
|
7
|
-
|
17
|
+
Twitter::OAuth.expects(:new).with(Base::TWITTER[:token], Base::TWITTER[:secret]).returns(@oauth)
|
18
|
+
@oauth.expects(:authorize_from_access).with("abcdef", "123456")
|
19
|
+
Twitter::Base.expects(:new).with(@oauth).returns(@twitter)
|
20
|
+
roflbot = Base.new(@options)
|
8
21
|
end
|
9
22
|
|
10
|
-
def
|
11
|
-
roflbot = Base.new(
|
23
|
+
def test_start
|
24
|
+
roflbot = Base.new(@options)
|
12
25
|
@client.expects(:connect)
|
13
|
-
roflbot.
|
26
|
+
roflbot.start
|
14
27
|
end
|
15
28
|
|
16
29
|
def test_wait
|
17
|
-
roflbot = Base.new(
|
30
|
+
roflbot = Base.new(@options)
|
18
31
|
@client.expects(:wait)
|
19
32
|
roflbot.wait
|
20
33
|
end
|
21
34
|
|
22
|
-
def
|
23
|
-
roflbot = Base.new(
|
35
|
+
def test_stop
|
36
|
+
roflbot = Base.new(@options)
|
24
37
|
@client.expects(:disconnect)
|
25
|
-
roflbot.
|
38
|
+
roflbot.stop
|
26
39
|
end
|
27
40
|
|
28
|
-
def
|
29
|
-
roflbot = Base.new(
|
41
|
+
def test_responds_to_aim_with_string
|
42
|
+
roflbot = Base.new(@options)
|
30
43
|
roflbot.expects(/^hey$/).responds("oh hai")
|
31
44
|
|
32
45
|
@buddy.expects(:send_im).with("oh hai")
|
33
46
|
receive_im("hey")
|
34
47
|
end
|
35
48
|
|
36
|
-
def
|
37
|
-
roflbot = Base.new(
|
49
|
+
def test_responds_to_twitter_with_string
|
50
|
+
roflbot = Base.new(@options)
|
51
|
+
roflbot.expects(/^hey$/).responds("oh hai")
|
52
|
+
|
53
|
+
seq = sequence("foo")
|
54
|
+
@twitter.expects(:mentions).returns([fake_tweet("hey", 12345)]).in_sequence(seq)
|
55
|
+
@twitter.expects(:update).with("@dudeguy oh hai").in_sequence(seq)
|
56
|
+
roflbot.respond_via_twitter
|
57
|
+
|
58
|
+
seq = sequence("bar")
|
59
|
+
@twitter.expects(:mentions).with(:since_id => 12345).returns([fake_tweet("hey", 23456)]).in_sequence(seq)
|
60
|
+
@twitter.expects(:update).with("@dudeguy oh hai").in_sequence(seq)
|
61
|
+
roflbot.respond_via_twitter
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_saves_since_id
|
65
|
+
roflbot = Base.new(@options)
|
66
|
+
roflbot.expects(/^hey$/).responds("oh hai")
|
67
|
+
|
68
|
+
seq = sequence("foo")
|
69
|
+
@twitter.expects(:mentions).returns([fake_tweet("hey", 12345)]).in_sequence(seq)
|
70
|
+
@twitter.expects(:update).with("@dudeguy oh hai").in_sequence(seq)
|
71
|
+
roflbot.respond_via_twitter
|
72
|
+
|
73
|
+
assert_equal 12345, roflbot.options['accounts']['Twitter']['since_id']
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_uses_saved_since_id
|
77
|
+
@options['accounts']['Twitter']['since_id'] = 1337
|
78
|
+
roflbot = Base.new(@options)
|
79
|
+
roflbot.expects(/^hey$/).responds("oh hai")
|
80
|
+
|
81
|
+
seq = sequence("foo")
|
82
|
+
@twitter.expects(:mentions).with(:since_id => 1337).returns([fake_tweet("hey", 12345)]).in_sequence(seq)
|
83
|
+
@twitter.expects(:update).with("@dudeguy oh hai").in_sequence(seq)
|
84
|
+
roflbot.respond_via_twitter
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_responds_to_aim_with_block
|
88
|
+
roflbot = Base.new(@options)
|
38
89
|
roflbot.expects(/^hey$/).responds { "omg wtf" }
|
39
90
|
|
40
91
|
@buddy.expects(:send_im).with("omg wtf")
|
data/test/roflbot/test_runner.rb
CHANGED
@@ -2,10 +2,29 @@ require File.dirname(__FILE__) + "/../helper"
|
|
2
2
|
|
3
3
|
module Roflbot
|
4
4
|
class TestRunner < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@bot = stub("SentenceBot", :start => nil, :wait => nil, :options => {})
|
8
|
+
SentenceBot.stubs(:new).returns(@bot)
|
9
|
+
end
|
10
|
+
|
5
11
|
def test_runs_sentence_bot
|
6
|
-
bot
|
7
|
-
|
8
|
-
|
12
|
+
@bot.expects(:start)
|
13
|
+
@bot.expects(:wait)
|
14
|
+
SentenceBot.expects(:new).with({ "foo" => "bar" }).returns(@bot)
|
15
|
+
Runner.new(%W{-c #{create_config("bogus.yml")}})
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_stop
|
19
|
+
config = create_config("bogus.yml")
|
20
|
+
runner = Runner.new(%W{-c #{config}})
|
21
|
+
@bot.stubs(:options).returns({ "omg" => "whoa" })
|
22
|
+
|
23
|
+
@bot.expects(:stop)
|
24
|
+
runner.stop
|
25
|
+
|
26
|
+
hash = YAML.load_file(config)
|
27
|
+
assert_equal({ "omg" => "whoa" }, hash)
|
9
28
|
end
|
10
29
|
end
|
11
30
|
end
|
@@ -2,16 +2,25 @@ require File.dirname(__FILE__) + "/../helper"
|
|
2
2
|
|
3
3
|
module Roflbot
|
4
4
|
class TestSentenceBot < Test::Unit::TestCase
|
5
|
+
def setup
|
6
|
+
super
|
7
|
+
@options = {
|
8
|
+
"accounts" => {
|
9
|
+
"AIM" => {"username" => 'dudeguy', "password" => 'password'},
|
10
|
+
"Twitter" => { "token" => "abcdef", "secret" => "123456" }
|
11
|
+
},
|
12
|
+
"sentences" => ["Hey (noun), (ending)"],
|
13
|
+
"noun" => %w{dude guy},
|
14
|
+
"ending" => ["sup?", "I love you."]
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
5
18
|
def test_base_superclass
|
6
19
|
assert_equal Base, SentenceBot.superclass
|
7
20
|
end
|
8
21
|
|
9
22
|
def test_responses
|
10
|
-
bot = SentenceBot.new(
|
11
|
-
"sentences" => ["Hey (noun), (ending)"],
|
12
|
-
"noun" => %w{dude guy},
|
13
|
-
"ending" => ["sup?", "I love you."]
|
14
|
-
})
|
23
|
+
bot = SentenceBot.new(@options)
|
15
24
|
|
16
25
|
@buddy.expects(:send_im).times(100).with do |message|
|
17
26
|
message =~ /^Hey (dude|guy), (sup\?|I love you.)$/
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jeremy Stephens
|
@@ -41,7 +41,19 @@ dependencies:
|
|
41
41
|
version: "0"
|
42
42
|
type: :runtime
|
43
43
|
version_requirements: *id002
|
44
|
-
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: twitter
|
46
|
+
prerelease: false
|
47
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
48
|
+
requirements:
|
49
|
+
- - ">="
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
segments:
|
52
|
+
- 0
|
53
|
+
version: "0"
|
54
|
+
type: :runtime
|
55
|
+
version_requirements: *id003
|
56
|
+
description: roflbot will make you a rofl waffle
|
45
57
|
email: viking415@gmail.com
|
46
58
|
executables:
|
47
59
|
- roflbot
|
@@ -97,7 +109,7 @@ rubyforge_project:
|
|
97
109
|
rubygems_version: 1.3.6
|
98
110
|
signing_key:
|
99
111
|
specification_version: 3
|
100
|
-
summary: roflbot is a
|
112
|
+
summary: roflbot is a bot that says stuff on AIM and Twitter
|
101
113
|
test_files:
|
102
114
|
- test/helper.rb
|
103
115
|
- test/roflbot/test_sentence_bot.rb
|