turntabler 0.0.1
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/.gitignore +7 -0
- data/.rspec +2 -0
- data/.yardopts +7 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +383 -0
- data/Rakefile +11 -0
- data/examples/Gemfile +3 -0
- data/examples/Gemfile.lock +29 -0
- data/examples/autobop.rb +13 -0
- data/examples/autofan.rb +13 -0
- data/examples/blacklist.rb +16 -0
- data/examples/bop.rb +15 -0
- data/examples/bopcount.rb +20 -0
- data/examples/chat_bot.rb +16 -0
- data/examples/modlist.rb +19 -0
- data/examples/switch.rb +40 -0
- data/examples/time_afk_list.rb +46 -0
- data/lib/turntabler/assertions.rb +36 -0
- data/lib/turntabler/authorized_user.rb +217 -0
- data/lib/turntabler/avatar.rb +34 -0
- data/lib/turntabler/boot.rb +22 -0
- data/lib/turntabler/client.rb +457 -0
- data/lib/turntabler/connection.rb +176 -0
- data/lib/turntabler/digest_helpers.rb +13 -0
- data/lib/turntabler/error.rb +5 -0
- data/lib/turntabler/event.rb +239 -0
- data/lib/turntabler/handler.rb +67 -0
- data/lib/turntabler/loggable.rb +11 -0
- data/lib/turntabler/message.rb +24 -0
- data/lib/turntabler/playlist.rb +50 -0
- data/lib/turntabler/preferences.rb +70 -0
- data/lib/turntabler/resource.rb +194 -0
- data/lib/turntabler/room.rb +377 -0
- data/lib/turntabler/room_directory.rb +133 -0
- data/lib/turntabler/snag.rb +16 -0
- data/lib/turntabler/song.rb +247 -0
- data/lib/turntabler/sticker.rb +48 -0
- data/lib/turntabler/sticker_placement.rb +25 -0
- data/lib/turntabler/user.rb +274 -0
- data/lib/turntabler/version.rb +9 -0
- data/lib/turntabler/vote.rb +19 -0
- data/lib/turntabler.rb +102 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/turntabler_spec.rb +4 -0
- data/turntable.gemspec +24 -0
- metadata +173 -0
@@ -0,0 +1,247 @@
|
|
1
|
+
require 'turntabler/error'
|
2
|
+
require 'turntabler/resource'
|
3
|
+
require 'turntabler/user'
|
4
|
+
require 'turntabler/vote'
|
5
|
+
|
6
|
+
module Turntabler
|
7
|
+
# Represents a song that can be played on Turntable
|
8
|
+
class Song < Resource
|
9
|
+
# The title of the song
|
10
|
+
# @return [String]
|
11
|
+
attribute :title, :song
|
12
|
+
|
13
|
+
# The standard code id for this song
|
14
|
+
# @return [String]
|
15
|
+
attribute :isrc
|
16
|
+
|
17
|
+
# The name of the artist
|
18
|
+
# @return [String]
|
19
|
+
attribute :artist
|
20
|
+
|
21
|
+
# The name of the album this song is on
|
22
|
+
# @return [String]
|
23
|
+
attribute :album
|
24
|
+
|
25
|
+
# The type of music
|
26
|
+
# @return [String]
|
27
|
+
attribute :genre
|
28
|
+
|
29
|
+
# The label that produced the music
|
30
|
+
# @return [String]
|
31
|
+
attribute :label
|
32
|
+
|
33
|
+
# The URL for the cover art image
|
34
|
+
# @return [String]
|
35
|
+
attribute :cover_art_url, :coverart
|
36
|
+
|
37
|
+
# Number of seconds the song lasts
|
38
|
+
# @return [Fixnum]
|
39
|
+
attribute :length
|
40
|
+
|
41
|
+
# Whether this song can be snagged
|
42
|
+
# @return [Boolean]
|
43
|
+
attribute :snaggable
|
44
|
+
|
45
|
+
# The source from which the song was uploaded
|
46
|
+
# @return [String]
|
47
|
+
attribute :source
|
48
|
+
|
49
|
+
# The id of the song on the original source service
|
50
|
+
# @return [String]
|
51
|
+
attribute :source_id, :sourceid
|
52
|
+
|
53
|
+
# The number of up votes this song has received.
|
54
|
+
# @note This is only available for the current song playing in a room
|
55
|
+
# @return [Fixnum]
|
56
|
+
attribute :up_votes_count, :upvotes, :load => false
|
57
|
+
|
58
|
+
# The number of down votes this song has received.
|
59
|
+
# @note This is only available for the current song playing in a room
|
60
|
+
# @return [Fixnum]
|
61
|
+
attribute :down_votes_count, :downvotes, :load => false
|
62
|
+
|
63
|
+
# The log of votes this song has received. This will only include up votes
|
64
|
+
# or down votes that were previously up votes.
|
65
|
+
# @note This is only available for the current song playing in a room
|
66
|
+
# @return [Array<Vote>]
|
67
|
+
attribute :votes, :votelog, :load => false do |votes|
|
68
|
+
votes.each do |(user_id, direction)|
|
69
|
+
self.votes.delete_if {|vote| vote.user.id == user_id}
|
70
|
+
self.votes << Vote.new(client, :userid => user_id, :direction => direction)
|
71
|
+
end
|
72
|
+
self.votes
|
73
|
+
end
|
74
|
+
|
75
|
+
# The percentage score for this song based on the number of votes
|
76
|
+
# @note This is only available for the current song playing in a room
|
77
|
+
# @return [Float]
|
78
|
+
attribute :score, :load => false
|
79
|
+
|
80
|
+
# The DJ that played this song
|
81
|
+
# @note This is only available for the current song playing in a room
|
82
|
+
# @return [Turntabler::User]
|
83
|
+
attribute :played_by, :djid, :load => false do |value|
|
84
|
+
room? ? room.build_user(:_id => value) : User.new(client, :_id => value)
|
85
|
+
end
|
86
|
+
|
87
|
+
# @api private
|
88
|
+
def initialize(*)
|
89
|
+
@up_votes_count = 0
|
90
|
+
@down_votes_count = 0
|
91
|
+
@votes = []
|
92
|
+
@score = 0
|
93
|
+
super
|
94
|
+
end
|
95
|
+
|
96
|
+
# Loads the attributes for this song. Attributes will automatically load
|
97
|
+
# when accessed, but this allows data to be forcefully loaded upfront.
|
98
|
+
#
|
99
|
+
# @return [true]
|
100
|
+
# @raise [Turntabler::Error] if the command fails
|
101
|
+
# @example
|
102
|
+
# song.load # => true
|
103
|
+
# song.title # => "..."
|
104
|
+
def load
|
105
|
+
data = api('playlist.get_metadata', :playlist_name => 'default', :files => [id])
|
106
|
+
self.attributes = data['files'][id]
|
107
|
+
super
|
108
|
+
end
|
109
|
+
|
110
|
+
# Skips the song.
|
111
|
+
#
|
112
|
+
# @return [true]
|
113
|
+
# @raise [Turntabler::Error] if the command fails
|
114
|
+
# @raise [Turntabler::Error] if the song is not playing in the current song
|
115
|
+
# @example
|
116
|
+
# song.skip # => true
|
117
|
+
def skip
|
118
|
+
assert_current_song
|
119
|
+
api('room.stop_song', :roomid => room.id, :section => room.section)
|
120
|
+
true
|
121
|
+
end
|
122
|
+
|
123
|
+
# Vote for the song.
|
124
|
+
#
|
125
|
+
# @param [Symbol] direction The direction to vote the song (:up or :down)
|
126
|
+
# @return [true]
|
127
|
+
# @raise [Turntabler::Error] if the command fails
|
128
|
+
# @raise [Turntabler::Error] if the song is not playing in the current song
|
129
|
+
# @example
|
130
|
+
# song.vote # => true
|
131
|
+
# song.vote(:down) # => true
|
132
|
+
def vote(direction = :up)
|
133
|
+
assert_current_song
|
134
|
+
api('room.vote',
|
135
|
+
:roomid => room.id,
|
136
|
+
:section => room.section,
|
137
|
+
:val => direction,
|
138
|
+
:songid => id,
|
139
|
+
:vh => digest("#{room.id}#{direction}#{id}"),
|
140
|
+
:th => digest(rand),
|
141
|
+
:ph => digest(rand)
|
142
|
+
)
|
143
|
+
true
|
144
|
+
end
|
145
|
+
|
146
|
+
# Triggers the heart animation for the song.
|
147
|
+
#
|
148
|
+
# @note This will not add the song to the user's playlist
|
149
|
+
# @return [true]
|
150
|
+
# @raise [Turntabler::Error] if the command fails
|
151
|
+
# @raise [Turntabler::Error] if the song is not playing in the current song
|
152
|
+
# @example
|
153
|
+
# song.snag # => true
|
154
|
+
def snag
|
155
|
+
assert_current_song
|
156
|
+
sh = digest(rand)
|
157
|
+
api('snag.add',
|
158
|
+
:djid => room.current_dj.id,
|
159
|
+
:songid => id,
|
160
|
+
:roomid => room.id,
|
161
|
+
:section => room.section,
|
162
|
+
:site => 'queue',
|
163
|
+
:location => 'board',
|
164
|
+
:in_queue => 'false',
|
165
|
+
:blocked => 'false',
|
166
|
+
:vh => digest([client.user.id, room.current_dj.id, id, room.id, 'queue', 'board', 'false', 'false', sh] * '/'),
|
167
|
+
:sh => sh,
|
168
|
+
:fh => digest(rand)
|
169
|
+
)
|
170
|
+
true
|
171
|
+
end
|
172
|
+
|
173
|
+
# Adds the song to one of the user's playlists.
|
174
|
+
#
|
175
|
+
# @param [Hash] options The options for where to add the song
|
176
|
+
# @option options [String] :playlist ("default") The playlist to enqueue the song in
|
177
|
+
# @option options [Fixnum] :index (0) The location in the playlist to insert the song
|
178
|
+
# @return [true]
|
179
|
+
# @raise [ArgumentError] if an invalid option is specified
|
180
|
+
# @raise [Turntabler::Error] if the command fails
|
181
|
+
# @example
|
182
|
+
# song.enqueue(:index => 1) # => true
|
183
|
+
def enqueue(options = {})
|
184
|
+
assert_valid_keys(options, :playlist, :index)
|
185
|
+
options = {:playlist => 'default', :index => 0}.merge(options)
|
186
|
+
playlist, index = client.user.playlist(options[:playlist]), options[:index]
|
187
|
+
|
188
|
+
api('playlist.add', :playlist_name => playlist.id, :song_dict => {:fileid => id}, :index => index)
|
189
|
+
playlist.songs.insert(index, self) if playlist.loaded?
|
190
|
+
true
|
191
|
+
end
|
192
|
+
|
193
|
+
# Removes the song from the playlist at the given index.
|
194
|
+
#
|
195
|
+
# @param [Hash] options The options for where to remove the song
|
196
|
+
# @option options [String] :playlist ("default") The playlist to dequeue the song from
|
197
|
+
# @return [true]
|
198
|
+
# @raise [ArgumentError] if an invalid option is specified
|
199
|
+
# @raise [Turntabler::Error] if the command fails
|
200
|
+
# @example
|
201
|
+
# song.dequeue # => true
|
202
|
+
def dequeue(options = {})
|
203
|
+
assert_valid_keys(options, :playlist)
|
204
|
+
options = {:playlist => 'default'}.merge(options)
|
205
|
+
playlist, index = index(options[:playlist])
|
206
|
+
|
207
|
+
api('playlist.remove', :playlist_name => playlist.id, :index => index)
|
208
|
+
playlist.songs.delete(self)
|
209
|
+
true
|
210
|
+
end
|
211
|
+
|
212
|
+
# Move a song from one location in the playlist to another.
|
213
|
+
#
|
214
|
+
# @param [Fixnum] to_index The index to move the song to
|
215
|
+
# @param [Hash] options The options for where to remove the song
|
216
|
+
# @option options [String] :playlist ("default") The playlist to move the song within
|
217
|
+
# @return [true]
|
218
|
+
# @raise [ArgumentError] if an invalid option is specified
|
219
|
+
# @raise [Turntabler::Error] if the command fails
|
220
|
+
# song.move(5) # => true
|
221
|
+
def move(to_index, options = {})
|
222
|
+
assert_valid_keys(options, :playlist)
|
223
|
+
options = {:playlist => 'default'}.merge(options)
|
224
|
+
playlist, index = index(options[:playlist])
|
225
|
+
|
226
|
+
api('playlist.reorder', :playlist_name => playlist.id, :index_from => index, :index_to => to_index)
|
227
|
+
playlist.songs.insert(to_index, playlist.songs.delete(self))
|
228
|
+
true
|
229
|
+
end
|
230
|
+
|
231
|
+
private
|
232
|
+
# Asserts that this is the song currently being played in the room the user
|
233
|
+
# is in. Raises Turntabler::Error if this is not the case.
|
234
|
+
def assert_current_song
|
235
|
+
raise(Turntabler::Error, "Song \"#{id}\" is not currently playing") unless room.current_song == self
|
236
|
+
end
|
237
|
+
|
238
|
+
# Gets the index of this song within the given playlist. Raises Turntabler::Error
|
239
|
+
# if the song cannot be found in the playlist.
|
240
|
+
def index(playlist_id)
|
241
|
+
playlist = client.user.playlist(playlist_id)
|
242
|
+
index = playlist.songs.index(self)
|
243
|
+
raise(Turntabler::Error, "Song \"#{id}\" is not in playlist \"#{playlist.id}\"") unless index
|
244
|
+
return playlist, index
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'turntabler/resource'
|
2
|
+
|
3
|
+
module Turntabler
|
4
|
+
# Represents a virtual sticker that can be placed on a user
|
5
|
+
class Sticker < Resource
|
6
|
+
# Allow the id to be set via the "sticker_id" attribute
|
7
|
+
# @return [String]
|
8
|
+
attribute :id, :sticker_id
|
9
|
+
|
10
|
+
# The human-readable name for the sticker
|
11
|
+
# @return [String]
|
12
|
+
attribute :name
|
13
|
+
|
14
|
+
# A longer explanation for the sticker
|
15
|
+
# @return [String]
|
16
|
+
attribute :description
|
17
|
+
|
18
|
+
# The type of sticker (such as "laptop_sticker")
|
19
|
+
# @return [String]
|
20
|
+
attribute :category
|
21
|
+
|
22
|
+
# How much it costs to purchase this sticker for use
|
23
|
+
# @return [Fixnum]
|
24
|
+
attribute :price
|
25
|
+
|
26
|
+
# Whether this sticker can be used ("active")
|
27
|
+
# @return [String]
|
28
|
+
attribute :state
|
29
|
+
|
30
|
+
# The uri for the sticker
|
31
|
+
# @return [String]
|
32
|
+
attribute :path
|
33
|
+
|
34
|
+
# Sets the current user's stickers.
|
35
|
+
#
|
36
|
+
# @param [Fixnum] top The y-coordinate of the sticker
|
37
|
+
# @param [Fixnum] left The x-coordinate of the sticker
|
38
|
+
# @param [Fixnum] angle The degree at which the sticker is angled
|
39
|
+
# @return [true]
|
40
|
+
# @raise [Turntabler::Error] if the command fails
|
41
|
+
# @example
|
42
|
+
# sticker.place(126, 78, -23) # => true
|
43
|
+
def place(top, left, angle)
|
44
|
+
api('sticker.place', :placement => [:sticker_id => id, :top => top, :left => left, :angle => angle], :is_dj => client.user.dj?, :roomid => room.id, :section => room.section)
|
45
|
+
true
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'turntabler/resource'
|
2
|
+
require 'turntabler/sticker'
|
3
|
+
|
4
|
+
module Turntabler
|
5
|
+
# Represents a sticker that's been placed on a user's laptop
|
6
|
+
class StickerPlacement < Resource
|
7
|
+
# The sticker that's been placed
|
8
|
+
# @return [Turntabler::Sticker]
|
9
|
+
attribute :sticker, :sticker_id do |value|
|
10
|
+
Sticker.new(client, :_id => value)
|
11
|
+
end
|
12
|
+
|
13
|
+
# The y-coordinate for the sticker
|
14
|
+
# @return [Fixnum]
|
15
|
+
attribute :top
|
16
|
+
|
17
|
+
# The x-coordinate for the sticker
|
18
|
+
# @return [Fixnum]
|
19
|
+
attribute :left
|
20
|
+
|
21
|
+
# The degree at which the sticker is tilted
|
22
|
+
# @return [Fixnum]
|
23
|
+
attribute :angle
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,274 @@
|
|
1
|
+
require 'turntabler/resource'
|
2
|
+
require 'turntabler/avatar'
|
3
|
+
require 'turntabler/message'
|
4
|
+
require 'turntabler/sticker_placement'
|
5
|
+
|
6
|
+
module Turntabler
|
7
|
+
# Represents an unauthorized user on Turntable
|
8
|
+
class User < Resource
|
9
|
+
# Allow the id to be set via the "userid" attribute
|
10
|
+
# @return [String]
|
11
|
+
attribute :id, :userid, :load => false
|
12
|
+
|
13
|
+
# The DJ name for this user
|
14
|
+
# @return [String]
|
15
|
+
attribute :name, :name, :username
|
16
|
+
|
17
|
+
# The name of the laptop the DJ uses
|
18
|
+
# @return [String]
|
19
|
+
attribute :laptop_name, :laptop
|
20
|
+
|
21
|
+
# The version # for the laptop
|
22
|
+
# @return [String]
|
23
|
+
attribute :laptop_version
|
24
|
+
|
25
|
+
# The total number of points accumulated all-time
|
26
|
+
# @return [Fixnum]
|
27
|
+
attribute :points
|
28
|
+
|
29
|
+
# The access control determining what is authorized
|
30
|
+
# @return [Fixnum]
|
31
|
+
attribute :acl
|
32
|
+
|
33
|
+
# The number of fans this user has
|
34
|
+
# @return [Fixnum]
|
35
|
+
attribute :fans_count, :fans
|
36
|
+
|
37
|
+
# The user's unique identifier on Facebook (only available if the user is
|
38
|
+
# connected to the authorized user through Facebook)
|
39
|
+
# @return [String]
|
40
|
+
attribute :facebook_url, :facebook
|
41
|
+
|
42
|
+
# The user's unique identifier on Twitter (only available if the user is
|
43
|
+
# connected to the authorized user through Twitter)
|
44
|
+
# @return [String]
|
45
|
+
attribute :twitter_id, :twitter, :twitterid_lower
|
46
|
+
|
47
|
+
# The user's personal website
|
48
|
+
# @return [String]
|
49
|
+
attribute :website
|
50
|
+
|
51
|
+
# A brief description about the user
|
52
|
+
# @return [String]
|
53
|
+
attribute :about
|
54
|
+
|
55
|
+
# The user's favorite artists
|
56
|
+
# @return [String]
|
57
|
+
attribute :top_artists, :topartists
|
58
|
+
|
59
|
+
# Whether on Turntable the user likes to hang out
|
60
|
+
# @return [String]
|
61
|
+
attribute :hangout
|
62
|
+
|
63
|
+
# The user's currently active avatar
|
64
|
+
# @return [Turntabler::Avatar]
|
65
|
+
attribute :avatar, :avatarid do |value|
|
66
|
+
Avatar.new(client, :_id => value)
|
67
|
+
end
|
68
|
+
|
69
|
+
# The placements of stickers on the user's laptop
|
70
|
+
# @return [Array<Turntabler::StickerPlacement>]
|
71
|
+
attribute :sticker_placements, :placements do |placements|
|
72
|
+
placements.map {|attrs| StickerPlacement.new(client, attrs)}
|
73
|
+
end
|
74
|
+
|
75
|
+
# Loads the attributes for this user. Attributes will automatically load
|
76
|
+
# when accessed, but this allows data to be forcefully loaded upfront.
|
77
|
+
#
|
78
|
+
# @return [true]
|
79
|
+
# @raise [Turntabler::Error] if the command fails
|
80
|
+
# @example
|
81
|
+
# user.load # => true
|
82
|
+
# user.laptop_name # => "chrome"
|
83
|
+
def load
|
84
|
+
data = api('user.get_profile', :userid => id)
|
85
|
+
self.attributes = data
|
86
|
+
super
|
87
|
+
end
|
88
|
+
|
89
|
+
# Gets the availability status for this user.
|
90
|
+
#
|
91
|
+
# @return [String] "available" / "unavailable"
|
92
|
+
# @raise [Turntabler::Error] if the command fails
|
93
|
+
# @example
|
94
|
+
# user.presence # => "available"
|
95
|
+
def presence
|
96
|
+
data = api('presence.get', :uid => id)
|
97
|
+
data['presence']['status']
|
98
|
+
end
|
99
|
+
|
100
|
+
# Gets the stickers that are currently placed on the user.
|
101
|
+
#
|
102
|
+
# @param [Boolean] reload Whether to forcefully reload the user's list of sticker placements
|
103
|
+
# @return [Array<Turntabler::StickerPlacement>]
|
104
|
+
# @raise [Turntabler::Error] if the command fails
|
105
|
+
# @example
|
106
|
+
# user.sticker_placements # => [#<Turntabler::StickerPlacement ...>, ...]
|
107
|
+
def sticker_placements(reload = false)
|
108
|
+
self.attributes = api('sticker.get_placements', :userid => id) if reload || !@sticker_placements
|
109
|
+
@sticker_placements
|
110
|
+
end
|
111
|
+
|
112
|
+
# Marks the current user as a fan of this user.
|
113
|
+
#
|
114
|
+
# @return [true]
|
115
|
+
# @raise [Turntabler::Error] if the command fails
|
116
|
+
# @example
|
117
|
+
# user.become_fan # => true
|
118
|
+
def become_fan
|
119
|
+
api('user.become_fan', :djid => id)
|
120
|
+
true
|
121
|
+
end
|
122
|
+
|
123
|
+
# Marks the current user no longer as a fan of this user.
|
124
|
+
#
|
125
|
+
# @return [true]
|
126
|
+
# @raise [Turntabler::Error] if the command fails
|
127
|
+
# @example
|
128
|
+
# user.unfan # => true
|
129
|
+
def unfan
|
130
|
+
api('user.remove_fan', :djid => id)
|
131
|
+
true
|
132
|
+
end
|
133
|
+
|
134
|
+
# Sends a private message to this user.
|
135
|
+
#
|
136
|
+
# @return [true]
|
137
|
+
# @raise [Turntabler::Error] if the command fails
|
138
|
+
# @example
|
139
|
+
# user.say("Hey what's up?") # => true
|
140
|
+
def say(content)
|
141
|
+
api('pm.send', :receiverid => id, :text => content)
|
142
|
+
true
|
143
|
+
end
|
144
|
+
|
145
|
+
# Gets the private conversation history with this user.
|
146
|
+
#
|
147
|
+
# @return [Array<Turntabler::Message>]
|
148
|
+
# @raise [Turntabler::Error] if the command fails
|
149
|
+
# @example
|
150
|
+
# user.messages # => [#<Turntabler::Message ...>, ...]
|
151
|
+
def messages
|
152
|
+
data = api('pm.history', :receiverid => id)
|
153
|
+
data['history'].map {|attrs| Message.new(client, attrs)}
|
154
|
+
end
|
155
|
+
|
156
|
+
# Is the user currently a listener in the room?
|
157
|
+
#
|
158
|
+
# @return [Boolean] +true+ if the user is a listener, otherwise +false+
|
159
|
+
# @example
|
160
|
+
# user.listener? # => false
|
161
|
+
def listener?
|
162
|
+
!room.listener(id).nil?
|
163
|
+
end
|
164
|
+
|
165
|
+
# Is the user currently DJing in the room?
|
166
|
+
#
|
167
|
+
# @return [Boolean] +true+ if the user is a dj, otherwise +false+
|
168
|
+
# @example
|
169
|
+
# user.dj? # => false
|
170
|
+
def dj?
|
171
|
+
!room.dj(id).nil?
|
172
|
+
end
|
173
|
+
|
174
|
+
# Stops the user from DJing.
|
175
|
+
#
|
176
|
+
# @return [true]
|
177
|
+
# @raise [Turntabler::Error] if the command fails
|
178
|
+
# @example
|
179
|
+
# user.remove_as_dj # => true
|
180
|
+
def remove_as_dj
|
181
|
+
api('room.rem_dj', :roomid => room.id, :section => room.section, :djid => id)
|
182
|
+
true
|
183
|
+
end
|
184
|
+
|
185
|
+
# Is the user currently a moderator for the room?
|
186
|
+
#
|
187
|
+
# @return [Boolean] +true+ if the user is a moderator, otherwise +false+
|
188
|
+
# @example
|
189
|
+
# user.moderator? # => false
|
190
|
+
def moderator?
|
191
|
+
!room.moderator(id).nil?
|
192
|
+
end
|
193
|
+
|
194
|
+
# Adds the user as a moderator in the current room.
|
195
|
+
#
|
196
|
+
# user.add_as_moderator # => true
|
197
|
+
def add_as_moderator
|
198
|
+
api('room.add_moderator', :roomid => room.id, :section => room.section, :target_userid => id)
|
199
|
+
true
|
200
|
+
end
|
201
|
+
|
202
|
+
# Removes the user from being a moderator in the current room.
|
203
|
+
#
|
204
|
+
# @return [true]
|
205
|
+
# @raise [Turntabler::Error] if the command fails
|
206
|
+
# @example
|
207
|
+
# user.remove_as_moderator # => true
|
208
|
+
def remove_as_moderator
|
209
|
+
api('room.rem_moderator', :roomid => room.id, :section => room.section, :target_userid => id)
|
210
|
+
true
|
211
|
+
end
|
212
|
+
|
213
|
+
# Gets the location of the user.
|
214
|
+
#
|
215
|
+
# @note This will make the current user a fan of this user
|
216
|
+
# @param [Boolean] all_info Whether full detailed information should be provided about the room and user
|
217
|
+
# @return [Array<Turntabler::Room>]
|
218
|
+
# @raise [Turntabler::Error] if the command fails
|
219
|
+
# @example
|
220
|
+
# user.stalk # => #<Turntabler::User ...>
|
221
|
+
def stalk(all_info = false)
|
222
|
+
become_fan unless client.user.fan_of.include?(self)
|
223
|
+
client.rooms.with_friends.detect do |room|
|
224
|
+
room.listener(id)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
# Blocks this user from being able to send private messages.
|
229
|
+
#
|
230
|
+
# @return [true]
|
231
|
+
# @raise [Turntabler::Error] if the command fails
|
232
|
+
# @example
|
233
|
+
# user.block # => true
|
234
|
+
def block
|
235
|
+
api('block.add', :blockedid => id)
|
236
|
+
true
|
237
|
+
end
|
238
|
+
|
239
|
+
# Unblocks this user from being able to send private messages.
|
240
|
+
#
|
241
|
+
# @return [true]
|
242
|
+
# @raise [Turntabler::Error] if the command fails
|
243
|
+
# @example
|
244
|
+
# user.unblock # => true
|
245
|
+
def unblock
|
246
|
+
api('block.remove', :blockedid => id)
|
247
|
+
true
|
248
|
+
end
|
249
|
+
|
250
|
+
# Boots the user for the specified reason.
|
251
|
+
#
|
252
|
+
# @param [String] reason The reason why the user is being booted
|
253
|
+
# @return [true]
|
254
|
+
# @raise [Turntabler::Error] if the command fails
|
255
|
+
# @example
|
256
|
+
# user.boot('Broke rules') # => true
|
257
|
+
def boot(reason = '')
|
258
|
+
api('room.boot_user', :roomid => room.id, :section => room.section, :target_userid => id, :reason => reason)
|
259
|
+
true
|
260
|
+
end
|
261
|
+
|
262
|
+
# Reports abuse by a user.
|
263
|
+
#
|
264
|
+
# @param [String] reason The reason the user is being reported
|
265
|
+
# @return [true]
|
266
|
+
# @raise [Turntabler::Error] if the command fails
|
267
|
+
# @example
|
268
|
+
# user.report('Verbal abuse ...') # => true
|
269
|
+
def report(reason = '')
|
270
|
+
api('room.report_user', :roomid => room.id, :section => room.section, :reported => id, :reason => reason)
|
271
|
+
true
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'turntabler/resource'
|
2
|
+
require 'turntabler/user'
|
3
|
+
|
4
|
+
module Turntabler
|
5
|
+
# Represents a vote that was made within a room
|
6
|
+
class Vote < Resource
|
7
|
+
# The user who cast the vote
|
8
|
+
# @return [Turntabler::User]
|
9
|
+
attribute :user, :userid do |value|
|
10
|
+
room? ? room.build_user(:_id => value) : User.new(client, :_id => value)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Whether the user voted +:up+ or +:down+
|
14
|
+
# @return [Symbol]
|
15
|
+
attribute :direction do |value|
|
16
|
+
value.to_sym
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|