redd 0.8.8 → 0.9.0.pre.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -1
- data/CONTRIBUTING.md +63 -0
- data/Guardfile +7 -0
- data/README.md +6 -5
- data/Rakefile +1 -1
- data/TODO.md +423 -0
- data/bin/console +91 -77
- data/bin/guard +2 -0
- data/lib/redd.rb +7 -5
- data/lib/redd/api_client.rb +2 -3
- data/lib/redd/auth_strategies/auth_strategy.rb +7 -2
- data/lib/redd/auth_strategies/script.rb +7 -0
- data/lib/redd/auth_strategies/userless.rb +7 -0
- data/lib/redd/auth_strategies/web.rb +6 -1
- data/lib/redd/client.rb +0 -3
- data/lib/redd/errors.rb +56 -0
- data/lib/redd/middleware.rb +10 -8
- data/lib/redd/models/access.rb +30 -18
- data/lib/redd/models/comment.rb +185 -27
- data/lib/redd/models/front_page.rb +16 -36
- data/lib/redd/models/gildable.rb +1 -1
- data/lib/redd/models/inboxable.rb +13 -3
- data/lib/redd/models/listing.rb +27 -6
- data/lib/redd/models/live_thread.rb +76 -23
- data/lib/redd/models/live_update.rb +46 -0
- data/lib/redd/models/messageable.rb +1 -1
- data/lib/redd/models/mod_action.rb +59 -0
- data/lib/redd/models/model.rb +23 -0
- data/lib/redd/models/moderatable.rb +6 -6
- data/lib/redd/models/modmail.rb +61 -0
- data/lib/redd/models/modmail_conversation.rb +154 -0
- data/lib/redd/models/modmail_message.rb +35 -0
- data/lib/redd/models/more_comments.rb +29 -5
- data/lib/redd/models/multireddit.rb +63 -20
- data/lib/redd/models/paginated_listing.rb +113 -0
- data/lib/redd/models/postable.rb +11 -13
- data/lib/redd/models/private_message.rb +78 -11
- data/lib/redd/models/replyable.rb +2 -2
- data/lib/redd/models/reportable.rb +14 -0
- data/lib/redd/models/searchable.rb +2 -2
- data/lib/redd/models/self.rb +17 -0
- data/lib/redd/models/session.rb +75 -31
- data/lib/redd/models/submission.rb +309 -56
- data/lib/redd/models/subreddit.rb +330 -103
- data/lib/redd/models/trophy.rb +34 -0
- data/lib/redd/models/user.rb +185 -46
- data/lib/redd/models/wiki_page.rb +37 -16
- data/lib/redd/utilities/error_handler.rb +13 -13
- data/lib/redd/utilities/unmarshaller.rb +7 -5
- data/lib/redd/version.rb +1 -1
- data/redd.gemspec +18 -15
- metadata +82 -16
- data/lib/redd/error.rb +0 -53
- data/lib/redd/models/basic_model.rb +0 -80
- data/lib/redd/models/lazy_model.rb +0 -75
- data/lib/redd/models/mod_mail.rb +0 -142
- data/lib/redd/utilities/stream.rb +0 -61
@@ -1,15 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative 'lazy_model'
|
3
|
+
require_relative 'model'
|
5
4
|
require_relative 'messageable'
|
6
5
|
require_relative 'searchable'
|
7
|
-
require_relative '../utilities/stream'
|
8
6
|
|
9
7
|
module Redd
|
10
8
|
module Models
|
11
9
|
# A subreddit.
|
12
|
-
class Subreddit <
|
10
|
+
class Subreddit < Model
|
13
11
|
include Messageable
|
14
12
|
include Searchable
|
15
13
|
|
@@ -20,72 +18,42 @@ module Redd
|
|
20
18
|
content_options: :link_type,
|
21
19
|
default_set: :allow_top,
|
22
20
|
header_hover_text: :'header-title'
|
23
|
-
}
|
24
|
-
|
25
|
-
# Represents a moderator action, part of a moderation log.
|
26
|
-
# @see Subreddit#log
|
27
|
-
class ModAction < BasicModel; end
|
28
|
-
|
29
|
-
# Create a Subreddit from its name.
|
30
|
-
# @param client [APIClient] the api client to initialize the object with
|
31
|
-
# @param id [String] the subreddit name
|
32
|
-
# @return [Subreddit]
|
33
|
-
def self.from_id(client, id)
|
34
|
-
new(client, display_name: id)
|
35
|
-
end
|
36
|
-
|
37
|
-
# @return [Array<String>] the subreddit's wiki pages
|
38
|
-
def wiki_pages
|
39
|
-
@client.get("/r/#{get_attribute(:display_name)}/wiki/pages").body[:data]
|
40
|
-
end
|
41
|
-
|
42
|
-
# Get a wiki page by its title.
|
43
|
-
# @param title [String] the page's title
|
44
|
-
# @return [WikiPage]
|
45
|
-
def wiki_page(title)
|
46
|
-
WikiPage.new(@client, title: title, subreddit: self)
|
47
|
-
end
|
48
|
-
|
49
|
-
# Search a subreddit.
|
50
|
-
# @param query [String] the search query
|
51
|
-
# @param params [Hash] refer to {Searchable} to see search parameters
|
52
|
-
# @see Searchable#search
|
53
|
-
def search(query, **params)
|
54
|
-
restricted_params = { restrict_to: get_attribute(:display_name) }.merge(params)
|
55
|
-
super(query, restricted_params)
|
56
|
-
end
|
21
|
+
}
|
57
22
|
|
58
23
|
# @!group Listings
|
59
24
|
|
60
25
|
# Get the appropriate listing.
|
61
26
|
# @param sort [:hot, :new, :top, :controversial, :comments, :rising, :gilded] the type of
|
62
27
|
# listing
|
63
|
-
# @param
|
64
|
-
# @option
|
65
|
-
# @option
|
66
|
-
# @option
|
67
|
-
# @option
|
68
|
-
# @option params [:hour, :day, :week, :month, :year, :all] :time the time period to consider
|
28
|
+
# @param options [Hash] a list of options to send with the request
|
29
|
+
# @option options [String] :after return results after the given fullname
|
30
|
+
# @option options [String] :before return results before the given fullname
|
31
|
+
# @option options [Integer, nil] :limit maximum number of items to return (nil for no limit)
|
32
|
+
# @option options [:hour, :day, :week, :month, :year, :all] :time the time period to consider
|
69
33
|
# when sorting
|
70
34
|
#
|
71
35
|
# @note The option :time only applies to the top and controversial sorts.
|
72
36
|
# @return [Listing<Submission, Comment>]
|
73
|
-
def listing(sort, **
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
# @!method
|
83
|
-
# @!method
|
84
|
-
# @!method
|
37
|
+
def listing(sort, **options)
|
38
|
+
options[:t] = options.delete(:time) if options.key?(:time)
|
39
|
+
PaginatedListing.new(client, options) do |**req_options|
|
40
|
+
client.model(
|
41
|
+
:get, "/r/#{read_attribute(:display_name)}/#{sort}", options.merge(req_options)
|
42
|
+
)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# @!method hot(**options)
|
47
|
+
# @!method new(**options)
|
48
|
+
# @!method top(**options)
|
49
|
+
# @!method controversial(**options)
|
50
|
+
# @!method comments(**options)
|
51
|
+
# @!method rising(**options)
|
52
|
+
# @!method gilded(**options)
|
85
53
|
#
|
86
54
|
# @see #listing
|
87
|
-
%i
|
88
|
-
define_method(sort) { |**
|
55
|
+
%i[hot new top controversial comments rising gilded].each do |sort|
|
56
|
+
define_method(sort) { |**options| listing(sort, **options) }
|
89
57
|
end
|
90
58
|
|
91
59
|
# @!endgroup
|
@@ -102,7 +70,7 @@ module Redd
|
|
102
70
|
#
|
103
71
|
# @return [Listing<Submission, Comment>]
|
104
72
|
def moderator_listing(type, **params)
|
105
|
-
|
73
|
+
client.model(:get, "/r/#{read_attribute(:display_name)}/about/#{type}", params)
|
106
74
|
end
|
107
75
|
|
108
76
|
# @!method reports(**params)
|
@@ -112,7 +80,7 @@ module Redd
|
|
112
80
|
# @!method edited(**params)
|
113
81
|
#
|
114
82
|
# @see #moderator_listing
|
115
|
-
%i
|
83
|
+
%i[reports spam modqueue unmoderated edited].each do |type|
|
116
84
|
define_method(type) { |**params| moderator_listing(type, **params) }
|
117
85
|
end
|
118
86
|
|
@@ -133,7 +101,7 @@ module Redd
|
|
133
101
|
def relationship_listing(type, **params)
|
134
102
|
# TODO: add methods to determine if a certain user was banned/muted/etc
|
135
103
|
# TODO: return User types?
|
136
|
-
user_list =
|
104
|
+
user_list = client.get("/r/#{read_attribute(:display_name)}/about/#{type}", params).body
|
137
105
|
user_list[:data][:children]
|
138
106
|
end
|
139
107
|
|
@@ -145,30 +113,31 @@ module Redd
|
|
145
113
|
# @!method moderators(**params)
|
146
114
|
#
|
147
115
|
# @see #relationship_listing
|
148
|
-
%i
|
116
|
+
%i[banned muted wikibanned contributors wikicontributors moderators].each do |type|
|
149
117
|
define_method(type) { |**params| relationship_listing(type, **params) }
|
150
118
|
end
|
151
119
|
|
152
120
|
# @!endgroup
|
153
121
|
|
154
|
-
#
|
155
|
-
def
|
156
|
-
|
157
|
-
stream = Utilities::Stream.new do |previous|
|
158
|
-
before = previous ? previous.first.name : nil
|
159
|
-
listing(:new, params.merge(before: before))
|
160
|
-
end
|
161
|
-
block_given? ? stream.stream(&block) : stream.enum_for(:stream)
|
122
|
+
# @return [Array<String>] the subreddit's wiki pages
|
123
|
+
def wiki_pages
|
124
|
+
client.get("/r/#{read_attribute(:display_name)}/wiki/pages").body[:data]
|
162
125
|
end
|
163
126
|
|
164
|
-
#
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
127
|
+
# Get a wiki page by its title.
|
128
|
+
# @param title [String] the page's title
|
129
|
+
# @return [WikiPage]
|
130
|
+
def wiki_page(title)
|
131
|
+
WikiPage.new(client, title: title, subreddit: self)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Search a subreddit.
|
135
|
+
# @param query [String] the search query
|
136
|
+
# @param params [Hash] refer to {Searchable} to see search parameters
|
137
|
+
# @see Searchable#search
|
138
|
+
def search(query, **params)
|
139
|
+
restricted_params = { restrict_to: read_attribute(:display_name) }.merge(params)
|
140
|
+
super(query, restricted_params)
|
172
141
|
end
|
173
142
|
|
174
143
|
# Submit a link or a text post to the subreddit.
|
@@ -183,13 +152,13 @@ module Redd
|
|
183
152
|
# @return [Submission] The returned object (url, id and name)
|
184
153
|
def submit(title, text: nil, url: nil, resubmit: false, sendreplies: true)
|
185
154
|
params = {
|
186
|
-
title: title, sr:
|
155
|
+
title: title, sr: read_attribute(:display_name),
|
187
156
|
resubmit: resubmit, sendreplies: sendreplies
|
188
157
|
}
|
189
158
|
params[:kind] = url ? 'link' : 'self'
|
190
159
|
params[:url] = url if url
|
191
160
|
params[:text] = text if text
|
192
|
-
Submission.new(
|
161
|
+
Submission.new(client, client.post('/api/submit', params).body[:json][:data])
|
193
162
|
end
|
194
163
|
|
195
164
|
# Compose a message to the moderators of a subreddit.
|
@@ -198,7 +167,7 @@ module Redd
|
|
198
167
|
# @param text [String] the message text
|
199
168
|
# @param from [Subreddit, nil] the subreddit to send the message on behalf of
|
200
169
|
def send_message(subject:, text:, from: nil)
|
201
|
-
super(to: "/r/#{
|
170
|
+
super(to: "/r/#{read_attribute(:display_name)}", subject: subject, text: text, from: from)
|
202
171
|
end
|
203
172
|
|
204
173
|
# Set the flair for a link or a user for this subreddit.
|
@@ -209,7 +178,7 @@ module Redd
|
|
209
178
|
key = thing.is_a?(User) ? :name : :link
|
210
179
|
params = { :text => text, key => thing.name }
|
211
180
|
params[:css_class] = css_class if css_class
|
212
|
-
|
181
|
+
client.post("/r/#{read_attribute(:display_name)}/api/flair", params)
|
213
182
|
end
|
214
183
|
|
215
184
|
# Get a listing of all user flairs.
|
@@ -222,8 +191,8 @@ module Redd
|
|
222
191
|
#
|
223
192
|
# @return [Listing<Hash<Symbol, String>>]
|
224
193
|
def flair_listing(**params)
|
225
|
-
res =
|
226
|
-
Listing.new(
|
194
|
+
res = client.get("/r/#{read_attribute(:display_name)}/api/flairlist", params).body
|
195
|
+
Listing.new(client, children: res[:users], before: res[:prev], after: res[:next])
|
227
196
|
end
|
228
197
|
|
229
198
|
# Get the user's flair data.
|
@@ -240,7 +209,7 @@ module Redd
|
|
240
209
|
# @param thing [User, String] a User from which to remove flair
|
241
210
|
def delete_flair(user)
|
242
211
|
name = user.is_a?(User) ? user.name : user
|
243
|
-
|
212
|
+
client.post("/r/#{read_attribute(:display_name)}/api/deleteflair", name: name)
|
244
213
|
end
|
245
214
|
|
246
215
|
# Set a Submission's or User's flair based on a flair template id.
|
@@ -250,14 +219,14 @@ module Redd
|
|
250
219
|
def set_flair_template(thing, template_id, text: nil)
|
251
220
|
key = thing.is_a?(User) ? :name : :link
|
252
221
|
params = { key => thing.name, flair_template_id: template_id, text: text }
|
253
|
-
|
222
|
+
client.post("/r/#{read_attribute(:display_name)}/api/selectflair", params)
|
254
223
|
end
|
255
224
|
|
256
225
|
# Add the subreddit to the user's subscribed subreddits.
|
257
226
|
def subscribe(action: :sub, skip_initial_defaults: false)
|
258
|
-
|
227
|
+
client.post(
|
259
228
|
'/api/subscribe',
|
260
|
-
sr_name:
|
229
|
+
sr_name: read_attribute(:display_name),
|
261
230
|
action: action,
|
262
231
|
skip_initial_defaults: skip_initial_defaults
|
263
232
|
)
|
@@ -271,9 +240,9 @@ module Redd
|
|
271
240
|
# Get the subreddit's CSS.
|
272
241
|
# @return [String, nil] the stylesheet or nil if no stylesheet exists
|
273
242
|
def stylesheet
|
274
|
-
url =
|
243
|
+
url = client.get("/r/#{read_attribute(:display_name)}/stylesheet").headers['location']
|
275
244
|
HTTP.get(url).body.to_s
|
276
|
-
rescue
|
245
|
+
rescue Errors::NotFound
|
277
246
|
nil
|
278
247
|
end
|
279
248
|
|
@@ -283,12 +252,12 @@ module Redd
|
|
283
252
|
def update_stylesheet(text, reason: nil)
|
284
253
|
params = { op: 'save', stylesheet_contents: text }
|
285
254
|
params[:reason] = reason if reason
|
286
|
-
|
255
|
+
client.post("/r/#{read_attribute(:display_name)}/api/subreddit_stylesheet", params)
|
287
256
|
end
|
288
257
|
|
289
258
|
# @return [Hash] the subreddit's settings
|
290
259
|
def settings
|
291
|
-
|
260
|
+
client.get("/r/#{read_attribute(:display_name)}/about/edit").body[:data]
|
292
261
|
end
|
293
262
|
|
294
263
|
# Modify the subreddit's settings.
|
@@ -296,9 +265,9 @@ module Redd
|
|
296
265
|
# @see https://www.reddit.com/dev/api#POST_api_site_admin
|
297
266
|
def modify_settings(**params)
|
298
267
|
full_params = settings.merge(params)
|
299
|
-
full_params[:sr] =
|
268
|
+
full_params[:sr] = read_attribute(:name)
|
300
269
|
SETTINGS_MAP.each { |src, dest| full_params[dest] = full_params.delete(src) }
|
301
|
-
|
270
|
+
client.post('/api/site_admin', full_params)
|
302
271
|
end
|
303
272
|
|
304
273
|
# Get the moderation log.
|
@@ -311,7 +280,7 @@ module Redd
|
|
311
280
|
#
|
312
281
|
# @return [Listing<ModAction>]
|
313
282
|
def mod_log(**params)
|
314
|
-
|
283
|
+
client.model(:get, "/r/#{read_attribute(:display_name)}/about/log", params)
|
315
284
|
end
|
316
285
|
|
317
286
|
# Invite a user to moderate this subreddit.
|
@@ -329,7 +298,7 @@ module Redd
|
|
329
298
|
|
330
299
|
# Accept an invite to become a moderator of this subreddit.
|
331
300
|
def accept_moderator_invite
|
332
|
-
|
301
|
+
client.post("/r/#{read_attribute(:display_name)}/api/accept_moderator_invite")
|
333
302
|
end
|
334
303
|
|
335
304
|
# Dethrone a moderator.
|
@@ -340,7 +309,7 @@ module Redd
|
|
340
309
|
|
341
310
|
# Leave from being a moderator on a subreddit.
|
342
311
|
def leave_moderator
|
343
|
-
|
312
|
+
client.post('/api/leavemoderator', id: read_attribute(:name))
|
344
313
|
end
|
345
314
|
|
346
315
|
# Add a contributor to the subreddit.
|
@@ -357,7 +326,7 @@ module Redd
|
|
357
326
|
|
358
327
|
# Leave from being a contributor on a subreddit.
|
359
328
|
def leave_contributor
|
360
|
-
|
329
|
+
client.post('/api/leavecontributor', id: read_attribute(:name))
|
361
330
|
end
|
362
331
|
|
363
332
|
# Ban a user from a subreddit.
|
@@ -415,21 +384,279 @@ module Redd
|
|
415
384
|
file_data = HTTP::FormData::File.new(file)
|
416
385
|
params = { img_type: image_type, upload_type: upload_type, file: file_data }
|
417
386
|
params[:name] = image_name if upload_type.to_s == 'img'
|
418
|
-
|
387
|
+
client.post("/r/#{read_attribute(:display_name)}/api/upload_sr_img", params).body[:img_src]
|
388
|
+
end
|
389
|
+
|
390
|
+
# Delete a subreddit-specific image.
|
391
|
+
# @param upload_type ['img', 'header', 'icon', 'banner'] the image to delete
|
392
|
+
# @param image_name [String] the image name (if upload_type is 'img')
|
393
|
+
def delete_image(upload_type:, image_name: nil)
|
394
|
+
unless %w[img header icon banner].include?(upload_type)
|
395
|
+
raise ArgumentError, 'unknown upload_type'
|
396
|
+
end
|
397
|
+
params = {}
|
398
|
+
params[:name] = image_name if upload_type.to_s == 'img'
|
399
|
+
client.post("/r/#{read_attribute(:display_name)}/api/delete_sr_#{upload_type}", params)
|
419
400
|
end
|
420
401
|
|
402
|
+
# @!attribute [r] display_name
|
403
|
+
# @return [String] the subreddit's name
|
404
|
+
property :display_name, :required
|
405
|
+
|
406
|
+
# @!attribute [r] id
|
407
|
+
# @return [String] the subreddit's t5_ id.
|
408
|
+
property :id
|
409
|
+
|
410
|
+
# @!attribute [r] title
|
411
|
+
# @return [String] the subreddit's page title text.
|
412
|
+
property :title
|
413
|
+
|
414
|
+
# @!attribute [r] user_is_contributor?
|
415
|
+
# @return [Boolean] whether the logged-in user is the subreddit's contributor
|
416
|
+
property :user_is_contributor?, from: :user_is_contributor
|
417
|
+
|
418
|
+
# @!attribute [r] banner_image
|
419
|
+
# @return [String] the url to the subreddit's banner image
|
420
|
+
property :banner_image, from: :banner_img
|
421
|
+
|
422
|
+
# @!attribute [r] banner_size
|
423
|
+
# @return [Array<Integer>] the banner dimensions
|
424
|
+
property :banner_size
|
425
|
+
|
426
|
+
# @!attribute [r] user_flair_text
|
427
|
+
# @return [String] the logged-in user's flair text
|
428
|
+
property :user_flair_text
|
429
|
+
|
430
|
+
# @!attribute [r] user_flair_css_class
|
431
|
+
# @return [String] the css class for the user's flair
|
432
|
+
property :user_flair_css_class
|
433
|
+
|
434
|
+
# @!attribute [r] user_is_banned
|
435
|
+
# @return [Boolean] whether the logged-in user is banned from this subreddit
|
436
|
+
property :user_is_banned?, from: :user_is_banned
|
437
|
+
|
438
|
+
# @!attribute [r] user_is_moderator?
|
439
|
+
# @return [Boolean] whether the logged-in user is a moderator of the subreddit
|
440
|
+
property :user_is_moderator?, from: :user_is_moderator
|
441
|
+
|
442
|
+
# @!attribute [r] user_is_muted?
|
443
|
+
# @return [Boolean] whether the logged-in user is muted from the subreddit
|
444
|
+
property :user_is_muted?, from: :user_is_muted
|
445
|
+
|
446
|
+
# @!attribute [r] user_is_subscriber
|
447
|
+
# @return [Boolean] whether the logged-in user is a subscriber to the subreddit
|
448
|
+
property :user_is_subscriber?, from: :user_is_subscriber
|
449
|
+
|
450
|
+
# @!attribute [r] wiki_enabled?
|
451
|
+
# @return [Boolean] whether the wiki is enabled for this subreddit
|
452
|
+
property :wiki_enabled?, from: :wiki_enabled
|
453
|
+
|
454
|
+
# @!attribute [r] show_media?
|
455
|
+
# @return [Boolean] whether media is shown
|
456
|
+
property :show_media?, from: :show_media
|
457
|
+
|
458
|
+
# @!attribute [r] description
|
459
|
+
# @return [String] the subreddit description
|
460
|
+
property :description
|
461
|
+
|
462
|
+
# @!attribute [r] description_html
|
463
|
+
# @return [String] the html-rendered version of the subreddit description
|
464
|
+
property :description_html
|
465
|
+
|
466
|
+
# @!attribute [r] submit_text
|
467
|
+
# @return [String] the submit text
|
468
|
+
property :submit_text
|
469
|
+
|
470
|
+
# @!attribute [r] submit_text_html
|
471
|
+
# @return [String] the submit text html
|
472
|
+
property :submit_text_html
|
473
|
+
|
474
|
+
# @!attribute [r] can_set_flair?
|
475
|
+
# @return [Boolean] whether the user can set the flair in the subreddit
|
476
|
+
property :can_set_flair?, from: :user_can_flair_in_sr
|
477
|
+
|
478
|
+
# @!attribute [r] header_img
|
479
|
+
# @return [String] the url to the header image
|
480
|
+
property :header_image, from: :header_img
|
481
|
+
|
482
|
+
# @!attribute [r] header_size
|
483
|
+
# @return [Array<Integer>] the dimensions of the header image
|
484
|
+
property :header_size
|
485
|
+
|
486
|
+
# @!attribute [r] collapse_deleted_comments?
|
487
|
+
# @return [Boolean] whether deleted comments are collapsed
|
488
|
+
property :collapse_deleted_comments?, from: :collapse_deleted_comments
|
489
|
+
|
490
|
+
# @!attribute [r] user_has_favorited?
|
491
|
+
# @return [Boolean] whether the user has favourited the subreddit
|
492
|
+
property :user_has_favorited?, from: :user_has_favorited
|
493
|
+
|
494
|
+
# @!attribute [r] public_description
|
495
|
+
# @return [String] the public description
|
496
|
+
property :public_description
|
497
|
+
|
498
|
+
# @!attribute [r] public_description_html
|
499
|
+
# @return [String] the html-rendered version of the public description
|
500
|
+
property :public_description_html
|
501
|
+
|
502
|
+
# @!attribute [r] over_18?
|
503
|
+
# @return [Boolean] whether the user is marked as over 18
|
504
|
+
property :over_18?, from: :over18
|
505
|
+
|
506
|
+
# @!attribute [r] spoilers_enabled?
|
507
|
+
# @return [Boolean] whether the subreddit has spoilers enabled
|
508
|
+
property :spoilers_enabled?, from: :spoilers_enabled
|
509
|
+
|
510
|
+
# @!attribute [r] icon_size
|
511
|
+
# @return [Array<Integer>] the subreddit icon size
|
512
|
+
property :icon_size
|
513
|
+
|
514
|
+
# @!attribute [r] audience_target
|
515
|
+
# @return [String] no clue what this means
|
516
|
+
property :audience_target
|
517
|
+
|
518
|
+
# @!attribute [r] suggested_comment_sort
|
519
|
+
# @return [String] the suggested comment sort
|
520
|
+
property :suggested_comment_sort
|
521
|
+
|
522
|
+
# @!attribute [r] active_user_count
|
523
|
+
# @return [Integer] the number of active users
|
524
|
+
property :active_user_count
|
525
|
+
|
526
|
+
# @!attribute [r] accounts_active
|
527
|
+
# @return [Integer] the number of active accounts
|
528
|
+
property :accounts_active
|
529
|
+
|
530
|
+
# @!attribute [r] subscribers
|
531
|
+
# @return [Integer] the subreddit's subscriber count
|
532
|
+
property :subscribers
|
533
|
+
|
534
|
+
# @!attribute [r] icon_image
|
535
|
+
# @return [String] the url to the icon image
|
536
|
+
property :icon_image, from: :icon_img
|
537
|
+
|
538
|
+
# @!attribute [r] header_title
|
539
|
+
# @return [String] the header's "title" attribute (i.e. mouseover text)
|
540
|
+
property :header_title
|
541
|
+
|
542
|
+
# @!attribute [r] display_name_prefixed
|
543
|
+
# @return [String] the display name, prefixed with a "r/".
|
544
|
+
# @deprecated not really deprecated, but prefer just using the display_name directly
|
545
|
+
property :display_name_prefixed, default: ->() { "r/#{read_attribute(:display_name)}" }
|
546
|
+
|
547
|
+
# @!attribute [r] submit_link_label
|
548
|
+
# @return [String] the label text on the submit link button
|
549
|
+
property :submit_link_label
|
550
|
+
|
551
|
+
# @!attribute [r] submit_text_label
|
552
|
+
# @return [String] the label text on the submit text button
|
553
|
+
property :submit_text_label
|
554
|
+
|
555
|
+
# @!attribute [r] public_traffic
|
556
|
+
# @return [Boolean] whether the traffic page is public
|
557
|
+
property :public_traffic?, from: :public_traffic
|
558
|
+
|
559
|
+
# @!attribute [r] key_color
|
560
|
+
# @return [String] a hex color code, not sure what this does
|
561
|
+
property :key_color
|
562
|
+
|
563
|
+
# @!attribute [r] user_flair_visible?
|
564
|
+
# @return [Boolean] whether the user's flair is shown to others
|
565
|
+
property :user_flair_visible?, from: :user_sr_flair_enabled
|
566
|
+
|
567
|
+
# @!attribute [r] user_flair_enabled?
|
568
|
+
# @return [Boolean] whether the subreddit allows setting user flairs
|
569
|
+
property :user_flair_enabled?, from: :user_flair_enabled_in_sr
|
570
|
+
|
571
|
+
# @!attribute [r] language
|
572
|
+
# @return [String] the subreddit's language code
|
573
|
+
property :language, from: :lang
|
574
|
+
|
575
|
+
# @!attribute [r] enrolled_in_new_modmail?
|
576
|
+
# @return [Boolean] whether the subreddit is enrolled in the new modmail
|
577
|
+
property :enrolled_in_new_modmail?, from: :is_enrolled_in_new_modmail
|
578
|
+
|
579
|
+
# @!attribute [r] whitelist_status
|
580
|
+
# @return [String] not sure what this does, something to do with ads?
|
581
|
+
property :whitelist_status
|
582
|
+
|
583
|
+
# @!attribute [r] url
|
584
|
+
# @return [String] the subreddit's **relative** url (e.g. /r/Redd/)
|
585
|
+
property :url, default: ->() { "/r/#{read_attribute(:display_name)}/" }
|
586
|
+
|
587
|
+
# @!attribute [r] quarantined?
|
588
|
+
# @return [Boolean] whether the subreddit is quarantined
|
589
|
+
property :quarantined?, from: :quarantine
|
590
|
+
|
591
|
+
# @!attribute [r] hide_ads?
|
592
|
+
# @return [Boolean] whether ads are hidden?
|
593
|
+
property :hide_ads?, from: :hide_ads
|
594
|
+
|
595
|
+
# @!attribute [r] created_at
|
596
|
+
# @return [Time] the time the subreddit was created
|
597
|
+
property :created_at, from: :created_utc, with: ->(t) { Time.at(t) }
|
598
|
+
|
599
|
+
# @!attribute [r] accounts_active_is_fuzzed
|
600
|
+
# @return [Boolean] whether active accounts is fuzzed
|
601
|
+
property :accounts_active_is_fuzzed?, from: :accounts_active_is_fuzzed
|
602
|
+
|
603
|
+
# @!attribute [r] advertiser_category
|
604
|
+
# @return [String] the advertiser category
|
605
|
+
property :advertiser_category
|
606
|
+
|
607
|
+
# @!attribute [r] subreddit_theme_enabled?
|
608
|
+
# @return [Boolean] whether the subreddit theme is enabled
|
609
|
+
property :subreddit_theme_enabled?, from: :user_sr_theme_enabled
|
610
|
+
|
611
|
+
# @!attribute [r] link_flair_enabled
|
612
|
+
# @return [Boolean] whether link flairs are enabled
|
613
|
+
property :link_flair_enabled?, from: :link_flair_enabled
|
614
|
+
|
615
|
+
# @!attribute [r] allow_images?
|
616
|
+
# @return [Boolean] whether images are allowed
|
617
|
+
property :allow_images?, from: :allow_images
|
618
|
+
|
619
|
+
# @!attribute [r] show_media_preview
|
620
|
+
# @return [Boolean] whether media previews are shown
|
621
|
+
property :show_media_preview?, from: :show_media_preview
|
622
|
+
|
623
|
+
# @!attribute [r] comment_score_hide_mins
|
624
|
+
# @return [Integer] the number of minutes the comment score is hidden
|
625
|
+
property :comment_score_hide_mins
|
626
|
+
|
627
|
+
# @!attribute [r] subreddit_type
|
628
|
+
# @return [String] whether it's a public, private, or gold-restricted subreddit
|
629
|
+
property :subreddit_type
|
630
|
+
|
631
|
+
# @!attribute [r] submission_type
|
632
|
+
# @return [String] the allowed submission type (?)
|
633
|
+
property :submission_type
|
634
|
+
|
421
635
|
private
|
422
636
|
|
423
|
-
def
|
424
|
-
|
637
|
+
def lazer_reload
|
638
|
+
fully_loaded!
|
639
|
+
self[:name] ? load_from_fullname : load_from_display_name
|
640
|
+
end
|
641
|
+
|
642
|
+
# Return the attributes using the display_name (best option).
|
643
|
+
def load_from_display_name
|
644
|
+
client.get("/r/#{read_attribute(:display_name)}/about").body[:data]
|
645
|
+
end
|
646
|
+
|
647
|
+
# Load the attributes using the subreddit fullname (not so best option).
|
648
|
+
def load_from_fullname
|
649
|
+
response = client.get('/api/info', id: read_attribute(:name))
|
650
|
+
raise Errors::NotFound.new(response) if response.body[:data][:children].empty?
|
651
|
+
response.body[:data][:children][0][:data]
|
425
652
|
end
|
426
653
|
|
427
654
|
def add_relationship(**params)
|
428
|
-
|
655
|
+
client.post("/r/#{read_attribute(:display_name)}/api/friend", params)
|
429
656
|
end
|
430
657
|
|
431
658
|
def remove_relationship(**params)
|
432
|
-
|
659
|
+
client.post("/r/#{read_attribute(:display_name)}/api/unfriend", params)
|
433
660
|
end
|
434
661
|
end
|
435
662
|
end
|