robut 0.3.0 → 0.4.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.
Files changed (50) hide show
  1. data/.travis.yml +11 -0
  2. data/Gemfile +2 -3
  3. data/README.rdoc +38 -19
  4. data/examples/Chatfile +10 -4
  5. data/lib/robut.rb +3 -0
  6. data/lib/robut/connection.rb +10 -72
  7. data/lib/robut/plugin.rb +94 -13
  8. data/lib/robut/plugin/echo.rb +3 -13
  9. data/lib/robut/plugin/google_images.rb +17 -0
  10. data/lib/robut/plugin/help.rb +7 -15
  11. data/lib/robut/plugin/meme.rb +22 -53
  12. data/lib/robut/plugin/pick.rb +18 -0
  13. data/lib/robut/plugin/ping.rb +3 -9
  14. data/lib/robut/plugin/quips.rb +60 -0
  15. data/lib/robut/plugin/say.rb +6 -12
  16. data/lib/robut/plugin/stock.rb +45 -0
  17. data/lib/robut/pm.rb +40 -0
  18. data/lib/robut/presence.rb +35 -0
  19. data/lib/robut/room.rb +30 -0
  20. data/lib/robut/version.rb +1 -1
  21. data/test/mocks/connection_mock.rb +2 -18
  22. data/test/mocks/presence_mock.rb +25 -0
  23. data/test/test_helper.rb +3 -1
  24. data/test/unit/connection_test.rb +58 -25
  25. data/test/unit/plugin/alias_test.rb +5 -4
  26. data/test/unit/plugin/echo_test.rb +5 -4
  27. data/test/unit/plugin/help_test.rb +4 -3
  28. data/test/unit/plugin/later_test.rb +7 -6
  29. data/test/unit/plugin/lunch_test.rb +6 -5
  30. data/test/unit/plugin/pick_test.rb +35 -0
  31. data/test/unit/plugin/ping_test.rb +4 -3
  32. data/test/unit/plugin/quips_test.rb +58 -0
  33. data/test/unit/plugin/say_test.rb +4 -3
  34. data/test/unit/plugin/weather_test.rb +15 -14
  35. data/test/unit/plugin_test.rb +62 -1
  36. data/test/unit/room_test.rb +51 -0
  37. metadata +28 -20
  38. data/lib/robut/plugin/rdio.rb +0 -96
  39. data/lib/robut/plugin/rdio/public/css/rdio.css +0 -141
  40. data/lib/robut/plugin/rdio/public/css/style.css +0 -79
  41. data/lib/robut/plugin/rdio/public/css/style_after.css +0 -42
  42. data/lib/robut/plugin/rdio/public/images/background.png +0 -0
  43. data/lib/robut/plugin/rdio/public/images/no-album.png +0 -0
  44. data/lib/robut/plugin/rdio/public/index.html +0 -43
  45. data/lib/robut/plugin/rdio/public/js/libs/dd_belatedpng.js +0 -13
  46. data/lib/robut/plugin/rdio/public/js/libs/jquery-1.5.1.min.js +0 -16
  47. data/lib/robut/plugin/rdio/public/js/libs/modernizr-1.7.min.js +0 -2
  48. data/lib/robut/plugin/rdio/public/js/rdio.js +0 -129
  49. data/lib/robut/plugin/rdio/public/js/script.js +0 -3
  50. data/lib/robut/plugin/rdio/server.rb +0 -57
@@ -5,7 +5,8 @@ class Robut::Plugin::SayTest < Test::Unit::TestCase
5
5
 
6
6
  def setup
7
7
  @connection = Robut::ConnectionMock.new
8
- @plugin = Robut::Plugin::Say.new(@connection)
8
+ @presence = Robut::PresenceMock.new(@connection)
9
+ @plugin = Robut::Plugin::Say.new(@presence)
9
10
  @plugin.instance_eval do
10
11
  # Stub out system
11
12
  def system(c); system_calls << c; end
@@ -15,13 +16,13 @@ class Robut::Plugin::SayTest < Test::Unit::TestCase
15
16
 
16
17
  def test_says_stuff
17
18
  @plugin.handle(Time.now, "@john", "@robut say stuff")
18
- assert_equal [], @plugin.connection.replies # shouldn't reply to the chat room
19
+ assert_equal [], @plugin.reply_to.replies # shouldn't reply to the chat room
19
20
  assert_equal ["say stuff"], @plugin.system_calls
20
21
  end
21
22
 
22
23
  def test_doesnt_say_stuff
23
24
  @plugin.handle(Time.now, "@john", "@robut ok don't say stuff")
24
- assert_equal [], @plugin.connection.replies
25
+ assert_equal [], @plugin.reply_to.replies
25
26
  assert_equal [], @plugin.system_calls
26
27
  end
27
28
 
@@ -7,7 +7,8 @@ class Robut::Plugin::WeatherTest < Test::Unit::TestCase
7
7
 
8
8
  def setup
9
9
  @connection = Robut::ConnectionMock.new
10
- @plugin = Robut::Plugin::Weather.new(@connection)
10
+ @presence = Robut::PresenceMock.new(@connection)
11
+ @plugin = Robut::Plugin::Weather.new(@presence)
11
12
  end
12
13
 
13
14
  def teardown
@@ -16,15 +17,15 @@ class Robut::Plugin::WeatherTest < Test::Unit::TestCase
16
17
 
17
18
  def test_handle_no_weather
18
19
  @plugin.handle(Time.now, "John", "lunch?")
19
- assert_equal( [], @plugin.connection.replies )
20
+ assert_equal( [], @plugin.reply_to.replies )
20
21
 
21
22
  @plugin.handle(Time.now, "John", "?")
22
- assert_equal( [], @plugin.connection.replies )
23
+ assert_equal( [], @plugin.reply_to.replies )
23
24
  end
24
25
 
25
26
  def test_handle_no_location_no_default
26
27
  @plugin.handle(Time.now, "John", "weather?")
27
- assert_equal( ["I don't have a default location!"], @plugin.connection.replies )
28
+ assert_equal( ["I don't have a default location!"], @plugin.reply_to.replies )
28
29
  end
29
30
 
30
31
  def test_handle_no_location_default_set
@@ -32,19 +33,19 @@ class Robut::Plugin::WeatherTest < Test::Unit::TestCase
32
33
  stub_request(:any, "http://www.google.com/ig/api?weather=Seattle").to_return(:body => File.open(File.expand_path("../../../fixtures/seattle.xml", __FILE__), "r").read)
33
34
 
34
35
  @plugin.handle(Time.now, "John", "weather?")
35
- assert_equal( ["Weather for Seattle, WA: Mostly Cloudy, 58F"], @plugin.connection.replies )
36
+ assert_equal( ["Weather for Seattle, WA: Mostly Cloudy, 58F"], @plugin.reply_to.replies )
36
37
  end
37
38
 
38
39
  def test_handle_location
39
40
  stub_request(:any, "http://www.google.com/ig/api?weather=tacoma").to_return(:body => File.open(File.expand_path("../../../fixtures/tacoma.xml", __FILE__), "r").read)
40
41
 
41
42
  @plugin.handle(Time.now, "John", "tacoma weather?")
42
- assert_equal( ["Weather for Tacoma, WA: Cloudy, 60F"], @plugin.connection.replies )
43
+ assert_equal( ["Weather for Tacoma, WA: Cloudy, 60F"], @plugin.reply_to.replies )
43
44
  end
44
45
 
45
46
  def test_no_question_mark
46
47
  @plugin.handle(Time.now, "John", "seattle weather")
47
- assert_equal( [], @plugin.connection.replies )
48
+ assert_equal( [], @plugin.reply_to.replies )
48
49
  end
49
50
 
50
51
  def test_handle_day
@@ -52,7 +53,7 @@ class Robut::Plugin::WeatherTest < Test::Unit::TestCase
52
53
 
53
54
  pretend_now_is(2011,"may",23,17) do
54
55
  @plugin.handle(Time.now, "John", "Seattle weather tuesday?")
55
- assert_equal( ["Forecast for Seattle, WA on Tue: Partly Cloudy, High: 67F, Low: 51F"], @plugin.connection.replies )
56
+ assert_equal( ["Forecast for Seattle, WA on Tue: Partly Cloudy, High: 67F, Low: 51F"], @plugin.reply_to.replies )
56
57
  end
57
58
  end
58
59
 
@@ -61,7 +62,7 @@ class Robut::Plugin::WeatherTest < Test::Unit::TestCase
61
62
 
62
63
  pretend_now_is(2011,"may",23,17) do
63
64
  @plugin.handle(Time.now, "John", "Seattle weather tomorrow?")
64
- assert_equal( ["Forecast for Seattle, WA on Tue: Partly Cloudy, High: 67F, Low: 51F"], @plugin.connection.replies )
65
+ assert_equal( ["Forecast for Seattle, WA on Tue: Partly Cloudy, High: 67F, Low: 51F"], @plugin.reply_to.replies )
65
66
  end
66
67
  end
67
68
 
@@ -70,31 +71,31 @@ class Robut::Plugin::WeatherTest < Test::Unit::TestCase
70
71
 
71
72
  pretend_now_is(2011,"may",23,17) do
72
73
  @plugin.handle(Time.now, "John", "Seattle weather today?")
73
- assert_equal( ["Forecast for Seattle, WA on Mon: Partly Cloudy, High: 59F, Low: 48F"], @plugin.connection.replies )
74
+ assert_equal( ["Forecast for Seattle, WA on Mon: Partly Cloudy, High: 59F, Low: 48F"], @plugin.reply_to.replies )
74
75
  end
75
76
  end
76
77
 
77
78
  def test_handle_multi_word_location
78
79
  stub_request(:any, "http://www.google.com/ig/api?weather=Las%20Vegas").to_return(:body => File.open(File.expand_path("../../../fixtures/las_vegas.xml", __FILE__), "r").read)
79
80
  @plugin.handle(Time.now, "John", "Las Vegas weather?")
80
- assert_equal( ["Weather for Las Vegas, NV: Mostly Cloudy, 83F"], @plugin.connection.replies )
81
+ assert_equal( ["Weather for Las Vegas, NV: Mostly Cloudy, 83F"], @plugin.reply_to.replies )
81
82
  end
82
83
 
83
84
  def test_handle_location_with_comma
84
85
  stub_request(:any, "http://www.google.com/ig/api?weather=Las%20Vegas,%20NV").to_return(:body => File.open(File.expand_path("../../../fixtures/las_vegas.xml", __FILE__), "r").read)
85
86
  @plugin.handle(Time.now, "John", "Las Vegas, NV weather?")
86
- assert_equal( ["Weather for Las Vegas, NV: Mostly Cloudy, 83F"], @plugin.connection.replies )
87
+ assert_equal( ["Weather for Las Vegas, NV: Mostly Cloudy, 83F"], @plugin.reply_to.replies )
87
88
  end
88
89
 
89
90
  def test_handle_bad_location
90
91
  stub_request(:any, "http://www.google.com/ig/api?weather=asdf").to_return(:body => File.open(File.expand_path("../../../fixtures/bad_location.xml", __FILE__), "r").read)
91
92
  @plugin.handle(Time.now, "John", "asdf weather?")
92
- assert_equal( ["I don't recognize the location: \"asdf\""], @plugin.connection.replies )
93
+ assert_equal( ["I don't recognize the location: \"asdf\""], @plugin.reply_to.replies )
93
94
  end
94
95
 
95
96
  def test_handle_bad_date
96
97
  @plugin.handle(Time.now, "John", "Seattle weather asdf?")
97
- assert_equal( ["I don't recognize the date: \"asdf\""], @plugin.connection.replies )
98
+ assert_equal( ["I don't recognize the date: \"asdf\""], @plugin.reply_to.replies )
98
99
  end
99
100
 
100
101
  end
@@ -4,10 +4,55 @@ class Robut::PluginTest < Test::Unit::TestCase
4
4
 
5
5
  class HandrolledStubPlugin
6
6
  include Robut::Plugin
7
+
8
+ match /^message sent to robut with anchor (\w+)/, :sent_to_me => true do |word|
9
+ reply word
10
+ end
11
+
12
+ match /^another message sent to robut with anchor (\w+)/, :sent_to_me => true do |word|
13
+ reply word
14
+ end
15
+
16
+ desc "stop matcher - stop matching messages"
17
+ match /stop matcher/ do
18
+ true
19
+ end
20
+
21
+ match /stop matcher b/ do
22
+ reply "fail."
23
+ end
7
24
  end
8
25
 
9
26
  def setup
10
- @plugin = HandrolledStubPlugin.new(Robut::ConnectionMock.new)
27
+ @plugin = HandrolledStubPlugin.new(
28
+ Robut::PresenceMock.new(
29
+ Robut::ConnectionMock
30
+ )
31
+ )
32
+ end
33
+
34
+ def test_sent_to_me_match
35
+ @plugin.handle(Time.now, "@john", "@robut message sent to robut with anchor pass")
36
+ assert_equal ["pass"], @plugin.reply_to.replies
37
+ end
38
+
39
+ def test_match_other_message_sent_to_me
40
+ @plugin.handle(Time.now, "@john", "@robut another message sent to robut with anchor pass")
41
+ assert_equal ["pass"], @plugin.reply_to.replies
42
+ end
43
+
44
+ def test_no_match_if_not_sent_to_me
45
+ @plugin.handle(Time.now, "@john", "message sent to robut with anchor pass")
46
+ assert_equal [], @plugin.reply_to.replies
47
+ end
48
+
49
+ def test_returning_true_stops_matching
50
+ @plugin.handle(Time.now, "@john", "stop matcher b")
51
+ assert_equal [], @plugin.reply_to.replies
52
+ end
53
+
54
+ def test_set_description
55
+ assert_equal ["stop matcher - stop matching messages"], @plugin.usage
11
56
  end
12
57
 
13
58
  def test_sent_to_me?
@@ -27,4 +72,20 @@ class Robut::PluginTest < Test::Unit::TestCase
27
72
  assert_equal "do this @robut", @plugin.without_nick("do this @robut")
28
73
  end
29
74
 
75
+ def test_sent_to_me_without_mention_configuration_option
76
+ setup_connection_without_mention_name
77
+ assert @plugin.sent_to_me?("@RobutTRobot hello there"), "sent_to_me? should match the standard HipChat mention format"
78
+ assert !@plugin.sent_to_me?("@Robut hello there"), "sent_to_me? should not match @robut if we don't have a mention name set"
79
+ end
80
+
81
+ private
82
+
83
+ def setup_connection_without_mention_name
84
+ @plugin = HandrolledStubPlugin.new(
85
+ Robut::PresenceMock.new(
86
+ Robut::ConnectionMock.new(OpenStruct.new(:nick => 'Robut t. Robot'))
87
+ )
88
+ )
89
+ end
90
+
30
91
  end
@@ -0,0 +1,51 @@
1
+ require 'test_helper'
2
+ require 'robut/plugin/echo'
3
+
4
+ class MucMock
5
+ attr_accessor :messages, :room
6
+
7
+ def initialize
8
+ @messages = []
9
+ @room = ''
10
+ end
11
+
12
+ def join(room)
13
+ @room = room
14
+ end
15
+
16
+ def send(message)
17
+ @messages << message
18
+ end
19
+
20
+ def on_message(*args, &block)
21
+ if block_given?
22
+ @message_block = block
23
+ else
24
+ @message_block.call(args)
25
+ end
26
+ end
27
+ end
28
+
29
+ class RoomTest < Test::Unit::TestCase
30
+ def setup
31
+ Robut::Plugin.plugins = [Robut::Plugin::Echo]
32
+ connection = Robut::ConnectionMock.new(OpenStruct.new(:nick => 'Dodo'))
33
+ @room = Robut::Room.new(connection, 'fake_room')
34
+ end
35
+
36
+ def test_room_receives_correct_message
37
+ message = 'Huzzah!'
38
+ @room.muc = MucMock.new
39
+ @room.join
40
+
41
+ @room.muc.on_message(Time.now, "Art Vandelay", "@dodo echo #{message}")
42
+ assert_equal @room.muc.messages.first.body, message
43
+ end
44
+
45
+ def test_joining_the_right_room
46
+ @room.muc = MucMock.new
47
+ @room.join
48
+
49
+ assert_equal @room.muc.room, "#{@room.name}/#{@room.connection.config.nick}"
50
+ end
51
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: robut
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-09-23 00:00:00.000000000Z
12
+ date: 2012-09-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: xmpp4r
16
- requirement: &70105702412820 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,7 +21,12 @@ dependencies:
21
21
  version: 0.5.0
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70105702412820
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 0.5.0
25
30
  description: A simple plugin-enabled HipChat bot
26
31
  email:
27
32
  - justin@uberweiss.org
@@ -31,6 +36,7 @@ extensions: []
31
36
  extra_rdoc_files: []
32
37
  files:
33
38
  - .gitignore
39
+ - .travis.yml
34
40
  - Gemfile
35
41
  - README.rdoc
36
42
  - Rakefile
@@ -43,28 +49,22 @@ files:
43
49
  - lib/robut/plugin/alias.rb
44
50
  - lib/robut/plugin/calc.rb
45
51
  - lib/robut/plugin/echo.rb
52
+ - lib/robut/plugin/google_images.rb
46
53
  - lib/robut/plugin/help.rb
47
54
  - lib/robut/plugin/later.rb
48
55
  - lib/robut/plugin/lunch.rb
49
56
  - lib/robut/plugin/meme.rb
57
+ - lib/robut/plugin/pick.rb
50
58
  - lib/robut/plugin/ping.rb
51
- - lib/robut/plugin/rdio.rb
52
- - lib/robut/plugin/rdio/public/css/rdio.css
53
- - lib/robut/plugin/rdio/public/css/style.css
54
- - lib/robut/plugin/rdio/public/css/style_after.css
55
- - lib/robut/plugin/rdio/public/images/background.png
56
- - lib/robut/plugin/rdio/public/images/no-album.png
57
- - lib/robut/plugin/rdio/public/index.html
58
- - lib/robut/plugin/rdio/public/js/libs/dd_belatedpng.js
59
- - lib/robut/plugin/rdio/public/js/libs/jquery-1.5.1.min.js
60
- - lib/robut/plugin/rdio/public/js/libs/modernizr-1.7.min.js
61
- - lib/robut/plugin/rdio/public/js/rdio.js
62
- - lib/robut/plugin/rdio/public/js/script.js
63
- - lib/robut/plugin/rdio/server.rb
59
+ - lib/robut/plugin/quips.rb
64
60
  - lib/robut/plugin/say.rb
65
61
  - lib/robut/plugin/sayings.rb
62
+ - lib/robut/plugin/stock.rb
66
63
  - lib/robut/plugin/twss.rb
67
64
  - lib/robut/plugin/weather.rb
65
+ - lib/robut/pm.rb
66
+ - lib/robut/presence.rb
67
+ - lib/robut/room.rb
68
68
  - lib/robut/storage.rb
69
69
  - lib/robut/storage/base.rb
70
70
  - lib/robut/storage/hash_store.rb
@@ -76,6 +76,7 @@ files:
76
76
  - test/fixtures/seattle.xml
77
77
  - test/fixtures/tacoma.xml
78
78
  - test/mocks/connection_mock.rb
79
+ - test/mocks/presence_mock.rb
79
80
  - test/simplecov_helper.rb
80
81
  - test/test_helper.rb
81
82
  - test/unit/connection_test.rb
@@ -84,10 +85,13 @@ files:
84
85
  - test/unit/plugin/help_test.rb
85
86
  - test/unit/plugin/later_test.rb
86
87
  - test/unit/plugin/lunch_test.rb
88
+ - test/unit/plugin/pick_test.rb
87
89
  - test/unit/plugin/ping_test.rb
90
+ - test/unit/plugin/quips_test.rb
88
91
  - test/unit/plugin/say_test.rb
89
92
  - test/unit/plugin/weather_test.rb
90
93
  - test/unit/plugin_test.rb
94
+ - test/unit/room_test.rb
91
95
  - test/unit/storage/hash_store_test.rb
92
96
  - test/unit/storage/yaml_store_test.rb
93
97
  - test/unit/storage/yaml_test.yml
@@ -105,7 +109,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
105
109
  version: '0'
106
110
  segments:
107
111
  - 0
108
- hash: 1156497835208409562
112
+ hash: 2804599532514623618
109
113
  required_rubygems_version: !ruby/object:Gem::Requirement
110
114
  none: false
111
115
  requirements:
@@ -114,10 +118,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
118
  version: '0'
115
119
  segments:
116
120
  - 0
117
- hash: 1156497835208409562
121
+ hash: 2804599532514623618
118
122
  requirements: []
119
123
  rubyforge_project: robut
120
- rubygems_version: 1.8.10
124
+ rubygems_version: 1.8.24
121
125
  signing_key:
122
126
  specification_version: 3
123
127
  summary: A simple plugin-enabled HipChat bot
@@ -127,6 +131,7 @@ test_files:
127
131
  - test/fixtures/seattle.xml
128
132
  - test/fixtures/tacoma.xml
129
133
  - test/mocks/connection_mock.rb
134
+ - test/mocks/presence_mock.rb
130
135
  - test/simplecov_helper.rb
131
136
  - test/test_helper.rb
132
137
  - test/unit/connection_test.rb
@@ -135,10 +140,13 @@ test_files:
135
140
  - test/unit/plugin/help_test.rb
136
141
  - test/unit/plugin/later_test.rb
137
142
  - test/unit/plugin/lunch_test.rb
143
+ - test/unit/plugin/pick_test.rb
138
144
  - test/unit/plugin/ping_test.rb
145
+ - test/unit/plugin/quips_test.rb
139
146
  - test/unit/plugin/say_test.rb
140
147
  - test/unit/plugin/weather_test.rb
141
148
  - test/unit/plugin_test.rb
149
+ - test/unit/room_test.rb
142
150
  - test/unit/storage/hash_store_test.rb
143
151
  - test/unit/storage/yaml_store_test.rb
144
152
  - test/unit/storage/yaml_test.yml
@@ -1,96 +0,0 @@
1
- require 'rdio'
2
- require 'robut/plugin/rdio/server'
3
-
4
- # A plugin that hooks into Rdio, allowing you to queue songs from
5
- # HipChat. +key+ and +secret+ must be set before we can deal with any
6
- # Rdio commands. Additionally, you must call +start_server+ in your
7
- # Chatfile to start the Rdio web server.
8
- class Robut::Plugin::Rdio
9
- include Robut::Plugin
10
-
11
- class << self
12
- # Your Rdio API Key
13
- attr_accessor :key
14
-
15
- # Your Rdio API app secret
16
- attr_accessor :secret
17
-
18
- # The port the Rdio web player will run on. Defaults to 4567.
19
- attr_accessor :port
20
-
21
- # The host the Rdio web player will run on. Defaults to localhost.
22
- attr_accessor :host
23
-
24
- # The playback token for +domain+. If you're accessing Rdio on
25
- # localhost, you shouldn't need to change this. Otherwise,
26
- # download the rdio-python plugin:
27
- #
28
- # https://github.com/rdio/rdio-python
29
- #
30
- # and generate a new token for your domain:
31
- #
32
- # ./rdio-call --consumer-key=YOUR_CONSUMER_KEY --consumer-secret=YOUR_CONSUMER_SECRET getPlaybackToken domain=YOUR_DOMAIN
33
- attr_accessor :token
34
-
35
- # The domain associated with +token+. Defaults to localhost.
36
- attr_accessor :domain
37
- end
38
-
39
- # Starts a Robut::Plugin::Rdio::Server server for communicating with
40
- # the actual Rdio web player. You must call this in the Chatfile if
41
- # you plan on using this gem.
42
- def self.start_server
43
- @server = Thread.new { Server.run! :host => (host || "localhost"), :port => (port || 4567) }
44
- Server.token = self.token || "GAlNi78J_____zlyYWs5ZG02N2pkaHlhcWsyOWJtYjkyN2xvY2FsaG9zdEbwl7EHvbylWSWFWYMZwfc="
45
- Server.domain = self.domain || "localhost"
46
- end
47
-
48
- # Returns a description of how to use this plugin
49
- def usage
50
- [
51
- "#{at_nick} play <song> - queues <song> for playing",
52
- "#{at_nick} play album <album> - queues <album> for playing",
53
- "#{at_nick} play track <track> - queues <track> for playing"
54
- ]
55
- end
56
-
57
- # Queues songs into the Rdio web player. @nick play search query
58
- # will queue the first search result matching 'search query' into
59
- # the web player. It can be an artist, album, or song.
60
- def handle(time, sender_nick, message)
61
- words = words(message)
62
- if sent_to_me?(message) && words.first == 'play'
63
- results = search(words)
64
- result = results.first
65
- if result
66
- Server.queue << result.key
67
- name = result.name
68
- name = "#{result.artist_name} - #{name}" if result.respond_to?(:artist_name) && result.artist_name
69
- reply("Playing #{name}")
70
- else
71
- reply("I couldn't find #{query_string} on Rdio.")
72
- end
73
- end
74
- end
75
-
76
- private
77
-
78
- # Searches Rdio for sources matching +words+. If the first word is
79
- # 'track', it only searches tracks, same for 'album'. Otherwise,
80
- # matches both albums and tracks.
81
- def search(words)
82
- api = ::Rdio::Api.new(self.class.key, self.class.secret)
83
-
84
- if words[1] == "album"
85
- query_string = words[2..-1].join(' ')
86
- results = api.search(query_string, "Album")
87
- elsif words[1] == "track"
88
- query_string = words[2..-1].join(' ')
89
- results = api.search(query_string, "Track")
90
- else
91
- query_string = words[1..-1].join(' ')
92
- results = api.search(query_string, "Album,Track")
93
- end
94
- end
95
-
96
- end