NeonRAW 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +5 -0
  5. data/.travis.yml +4 -0
  6. data/CHANGELOG.md +7 -0
  7. data/CONTRIBUTING.md +11 -0
  8. data/Gemfile +4 -0
  9. data/LICENSE.md +373 -0
  10. data/NeonRAW.gemspec +26 -0
  11. data/README.md +62 -0
  12. data/Rakefile +6 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +8 -0
  15. data/examples/crossposter.rb +78 -0
  16. data/examples/flairbot.rb +60 -0
  17. data/examples/publicmodlogger.rb +79 -0
  18. data/examples/settings.yaml +4 -0
  19. data/examples/userhistoryscraper.rb +108 -0
  20. data/examples/userhistorywiper.rb +10 -0
  21. data/lib/NeonRAW/clients/base/listing.rb +55 -0
  22. data/lib/NeonRAW/clients/base/objectbuilder.rb +173 -0
  23. data/lib/NeonRAW/clients/base/utilities.rb +46 -0
  24. data/lib/NeonRAW/clients/base.rb +109 -0
  25. data/lib/NeonRAW/clients/installed.rb +49 -0
  26. data/lib/NeonRAW/clients/script.rb +34 -0
  27. data/lib/NeonRAW/clients/web.rb +52 -0
  28. data/lib/NeonRAW/errors.rb +518 -0
  29. data/lib/NeonRAW/objects/access.rb +44 -0
  30. data/lib/NeonRAW/objects/all.rb +36 -0
  31. data/lib/NeonRAW/objects/comment.rb +128 -0
  32. data/lib/NeonRAW/objects/inboxcomment.rb +54 -0
  33. data/lib/NeonRAW/objects/listing.rb +12 -0
  34. data/lib/NeonRAW/objects/me.rb +268 -0
  35. data/lib/NeonRAW/objects/modlogaction.rb +59 -0
  36. data/lib/NeonRAW/objects/modloguser.rb +35 -0
  37. data/lib/NeonRAW/objects/morecomments.rb +33 -0
  38. data/lib/NeonRAW/objects/multireddit.rb +134 -0
  39. data/lib/NeonRAW/objects/privatemessage.rb +90 -0
  40. data/lib/NeonRAW/objects/rule.rb +41 -0
  41. data/lib/NeonRAW/objects/submission.rb +221 -0
  42. data/lib/NeonRAW/objects/subreddit/flair.rb +169 -0
  43. data/lib/NeonRAW/objects/subreddit/moderation.rb +200 -0
  44. data/lib/NeonRAW/objects/subreddit/utilities.rb +73 -0
  45. data/lib/NeonRAW/objects/subreddit/wiki.rb +31 -0
  46. data/lib/NeonRAW/objects/subreddit.rb +223 -0
  47. data/lib/NeonRAW/objects/thing/createable.rb +22 -0
  48. data/lib/NeonRAW/objects/thing/editable.rb +46 -0
  49. data/lib/NeonRAW/objects/thing/gildable.rb +29 -0
  50. data/lib/NeonRAW/objects/thing/inboxable.rb +26 -0
  51. data/lib/NeonRAW/objects/thing/moderateable.rb +98 -0
  52. data/lib/NeonRAW/objects/thing/refreshable.rb +21 -0
  53. data/lib/NeonRAW/objects/thing/repliable.rb +23 -0
  54. data/lib/NeonRAW/objects/thing/saveable.rb +26 -0
  55. data/lib/NeonRAW/objects/thing/votable.rb +69 -0
  56. data/lib/NeonRAW/objects/thing.rb +24 -0
  57. data/lib/NeonRAW/objects/trophy.rb +25 -0
  58. data/lib/NeonRAW/objects/user.rb +147 -0
  59. data/lib/NeonRAW/objects/wikipage.rb +176 -0
  60. data/lib/NeonRAW/objects/wikipagerevision.rb +45 -0
  61. data/lib/NeonRAW/version.rb +3 -0
  62. data/lib/NeonRAW.rb +43 -0
  63. metadata +161 -0
@@ -0,0 +1,200 @@
1
+ require_relative '../thing'
2
+ require_relative '../modloguser'
3
+ require_relative '../listing'
4
+
5
+ module NeonRAW
6
+ module Objects
7
+ class Subreddit < Thing
8
+ # Methods for moderators.
9
+ module Moderation
10
+ # @!group Listing
11
+ # Fetches the modlog for the subreddit.
12
+ # @!method modlog(params = { limit: 25 })
13
+ # @param params [Hash] The parameters.
14
+ # @option params :after [String] Fullname of the next data block.
15
+ # @option params :before [String] Fullname of the previous data block.
16
+ # @option params :count [Integer] The number of items already in the
17
+ # listing.
18
+ # @option params :limit [1..500] The number of listing items to fetch.
19
+ # @option params :mod [String] The moderator to filter actions by. Also
20
+ # 'a' can be given to filter by admin actions.
21
+ # @option params :show [String] Literally the string 'all'.
22
+ # @option params :type [String] The type of mod action to filter by
23
+ # [banuser, unbanuser, removelink, approvelink, removecomment,
24
+ # approvecomment, addmoderator, invitemoderator, uninvitemoderator,
25
+ # acceptmoderatorinvite, removemoderator, addcontributor,
26
+ # removecontributor, editsettings, editflair, distinguish, marknsfw,
27
+ # wikibanned, wikicontributor, wikiunbanned, wikipagelisted,
28
+ # removewikicontributor, wikirevise, wikipermlevel, ignorereports,
29
+ # unignorereports, setpermissions, setsuggestedsort, sticky, unsticky,
30
+ # setcontestmode, unsetcontestmode, lock, unlock, muteuser,
31
+ # unmuteuser, createrule, editrule, deleterule]
32
+ # @return [NeonRAW::Objects::Listing] Returns a listing of the modlog
33
+ # actions.
34
+ def modlog(params = { limit: 25 })
35
+ path = "/r/#{display_name}/about/log.json"
36
+ @client.send(:build_listing, path, params)
37
+ end
38
+
39
+ # Fetches the subreddit's modmail.
40
+ # @!method modmail(params = { limit: 25 })
41
+ # @param params [Hash] The parameters.
42
+ # @option params :after [String] Fullname of the next data block.
43
+ # @option params :before [String] Fullname of the previous data block.
44
+ # @option params :count [Integer] The number of things already in the
45
+ # listing.
46
+ # @option params :limit [1..1000] The number of listing items to fetch.
47
+ # @option params :only [Symbol] Only fetch either [links, comments].
48
+ # @option params :show [String] Literally the string 'all'.
49
+ # @return [NeonRAW::Objects::Listing] Returns a listing with all the
50
+ # things.
51
+ def modmail(params = { limit: 25 })
52
+ path = "/r/#{display_name}/about/message/inbox"
53
+ @client.send(:build_listing, path, params)
54
+ end
55
+
56
+ # Fetches things for review by moderators.
57
+ # @!method reported(params = { limit: 25 })
58
+ # @!method spam(params = { limit: 25 })
59
+ # @!method modqueue(params = { limit: 25 })
60
+ # @!method unmoderated(params = { limit: 25 })
61
+ # @!method edited(params = { limit: 25 })
62
+ # @param params [Hash] The parameters.
63
+ # @option params :after [String] Fullname of the next data block.
64
+ # @option params :before [String] Fullname of the previous data block.
65
+ # @option params :count [Integer] The number of things already in the
66
+ # listing.
67
+ # @option params :limit [1..1000] The number of listing items to fetch.
68
+ # @option params :only [Symbol] Only fetch either [links, comments].
69
+ # @option params :show [String] Literally the string 'all'.
70
+ # @return [NeonRAW::Objects::Listing] Returns a listing with all the
71
+ # things.
72
+ %w(reported spam modqueue unmoderated edited).each do |type|
73
+ define_method :"#{type}" do |params = { limit: 25 }|
74
+ type = 'reports' if type == 'reported'
75
+ path = "/r/#{display_name}/about/#{type}.json"
76
+ @client.send(:build_listing, path, params)
77
+ end
78
+ end
79
+
80
+ # Fetches users with altered privileges.
81
+ # @!method banned(params = { limit: 25 })
82
+ # @!method muted(params = { limit: 25 })
83
+ # @!method wikibanned(params = { limit: 25 })
84
+ # @!method contributors(params = { limit: 25 })
85
+ # @!method wikicontributors(params = { limit: 25 })
86
+ # @!method moderators(params = { limit: 25 })
87
+ # @param params [Hash] The parameters.
88
+ # @option params :after [String] Fullname of the next data block.
89
+ # @option params :before [String] Fullname of the previous data block.
90
+ # @option params :count [Integer] Number of items already in the
91
+ # listing.
92
+ # @option params :limit [1..1000] The number of listing items to fetch.
93
+ # @option params :show [String] Literally the string 'all'.
94
+ # @option params :user [String] The name of the user to fetch.
95
+ # @return [NeonRAW::Objects::Listing] Returns a listing of the users.
96
+ %w(banned muted wikibanned
97
+ contributors wikicontributors moderators).each do |type|
98
+ define_method :"#{type}" do |params = { limit: 25 }|
99
+ data_arr = []
100
+ path = "/r/#{display_name}/about/#{type}"
101
+ until data_arr.length == params[:limit]
102
+ data = @client.request_data(path, :get, params)
103
+ params[:after] = data[:data][:after]
104
+ params[:before] = data[:data][:before]
105
+ data[:data][:children].each do |item|
106
+ data_arr << ModLogUser.new(@client, item)
107
+ break if data_arr.length == params[:limit]
108
+ end
109
+ break if params[:after].nil?
110
+ end
111
+ listing = Listing.new(params[:after], params[:before])
112
+ data_arr.each { |user| listing << user }
113
+ listing
114
+ end
115
+ end
116
+ # @!endgroup
117
+
118
+ # Accept a pending mod invite to the subreddit.
119
+ # @!method accept_mod_invite!
120
+ def accept_mod_invite!
121
+ params = { api_type: 'json' }
122
+ path = "/r/#{display_name}/api/accept_moderator_invite"
123
+ @client.request_data(path, :post, params)
124
+ refresh!
125
+ end
126
+
127
+ # Ditch your privileged status in the subreddit.
128
+ # @!method leave_contributor!
129
+ # @!method leave_moderator!
130
+ %w(contributor moderator).each do |type|
131
+ define_method :"leave_#{type}!" do
132
+ params = { id: name }
133
+ @client.request_data("/api/leave#{type}", :post, params)
134
+ refresh!
135
+ end
136
+ end
137
+
138
+ # Upload a subreddit image.
139
+ # @!method upload_image!(file_path, file_type, image_name, upload_type)
140
+ # @param file_path [String] The path to the file (500 KiB maximum).
141
+ # @param file_type [String] The file extension [png, jpg].
142
+ # @param image_name [String] The name of the image.
143
+ # @param upload_type [String] The type of upload [img, header, icon,
144
+ # banner].
145
+ def upload_image!(file_path, file_type, image_name, upload_type)
146
+ params = { img_type: file_type, name: image_name,
147
+ upload_type: upload_type }
148
+ path = "/r/#{display_name}/api/upload_sr_img"
149
+ file = File.open(file_path, 'r')
150
+ @client.request_data(path, :post, params, file: file)
151
+ refresh!
152
+ end
153
+
154
+ # Remove a subreddit image.
155
+ # @!method remove_banner!
156
+ # @!method remove_header!
157
+ # @!method remove_icon!
158
+ %w(banner header icon).each do |type|
159
+ define_method :"remove_#{type}!" do
160
+ params = { api_type: 'json' }
161
+ path = "/r/#{display_name}/api/delete_sr_#{type}"
162
+ @client.request_data(path, :post, params)
163
+ refresh!
164
+ end
165
+ end
166
+
167
+ # Remove a subreddit image.
168
+ # @!method remove_image!(image)
169
+ # @param image [String] The name of the image.
170
+ def remove_image!(image)
171
+ params = { api_type: 'json', img_name: image }
172
+ path = "/r/#{display_name}/api/delete_sr_img"
173
+ @client.request_data(path, :post, params)
174
+ refresh!
175
+ end
176
+
177
+ # Edit the subreddit's stylesheet.
178
+ # @!method edit_stylesheet(data, opts = {})
179
+ # @param data [String] The CSS for the stylesheet.
180
+ # @param opts [Hash] Optional parameters.
181
+ # @option opts :reason [String] The reason for the edit (256 characters
182
+ # maximum).
183
+ def edit_stylesheet(data, opts = {})
184
+ params = { api_type: 'json', op: 'save',
185
+ reason: opts[:reason], stylesheet_contents: data }
186
+ path = "/r/#{display_name}/api/subreddit_stylesheet"
187
+ @client.request_data(path, :post, params)
188
+ end
189
+
190
+ # Fetches the settings for the subreddit.
191
+ # @!method settings
192
+ # @return [Hash] Returns the subreddit's settings.
193
+ def settings
194
+ path = "/r/#{display_name}/about/edit.json"
195
+ @client.request_data(path, :get)[:data]
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,73 @@
1
+ module NeonRAW
2
+ module Objects
3
+ class Subreddit
4
+ # Utilities for subreddits.
5
+ module Utilities
6
+ # Get info on a link/comment/subreddit.
7
+ # @!method info(params = {})
8
+ # @param params [Hash] The parameters.
9
+ # @option params :id [String] The fullname of the thing.
10
+ # @option params :url [String] The URL of the thing.
11
+ # @return [NeonRAW::Objects::Comment/Submission/Subreddit] Returns the
12
+ # object.
13
+ def info(params = {})
14
+ path = "/r/#{display_name}/api/info"
15
+ data = @client.request_data(path, :get, params)
16
+ case data[:data][:children][0][:kind]
17
+ when 't1'
18
+ Comment.new(@client, data[:data][:children][0][:data])
19
+ when 't3'
20
+ Submission.new(@client, data[:data][:children][0][:data])
21
+ when 't5'
22
+ Subreddit.new(@client, data[:data][:children][0][:data])
23
+ end
24
+ end
25
+
26
+ # Submit a thread to the subreddit.
27
+ # @!method submit(title, params = {})
28
+ # @param title [String] The title of the submission (300
29
+ # characters maximum).
30
+ # @param params [Hash] The parameters.
31
+ # @option params :text [String] The text of the submission (selfpost).
32
+ # @option params :url [String] The URL of the submission (link post).
33
+ # @return [NeonRAW::Objects::Submission] Returns the submission object.
34
+ def submit(title, params = {})
35
+ params[:kind] = 'self' if params[:text]
36
+ params[:kind] = 'link' if params[:url]
37
+ params[:sr] = display_name
38
+ params[:title] = title
39
+ response = @client.request_data('/api/submit', :post, params)
40
+ # Seriously though, fucking convoluted data structures.
41
+ submission_id = response[:jquery].last[3].first.split('/')[6]
42
+ info(id: 't3_' + submission_id)
43
+ end
44
+
45
+ # Gets recommended subreddits for the subreddit.
46
+ # @!method recommended_subreddits(opts = {})
47
+ # @param opts [Hash] Optional parameters.
48
+ # @option opts :omit [String] A comma-separated list of subreddits to
49
+ # omit from the results.
50
+ # @return [Array<String>] Returns a list of the recommended subreddits.
51
+ def recommended_subreddits(opts = {})
52
+ params = { omit: opts[:omit], srnames: display_name }
53
+ path = "/api/recommend/sr/#{display_name}"
54
+ data = @client.request_data(path, :get, params)
55
+ data.map { |subreddit| subreddit[:sr_name] }
56
+ end
57
+
58
+ # Toggle your subscription to the subreddit.
59
+ # @!method subscribe!
60
+ # @!method unsubscribe!
61
+ %w(subscribe unsubscribe).each do |type|
62
+ define_method :"#{type}!" do
63
+ params = { sr: name }
64
+ params[:action] = 'sub' if type == 'subscribe'
65
+ params[:action] = 'unsub' if type == 'unsubscribe'
66
+ @client.request_data('/api/subscribe', :post, params)
67
+ refresh!
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../thing'
2
+ require_relative '../wikipage'
3
+
4
+ module NeonRAW
5
+ module Objects
6
+ class Subreddit < Thing
7
+ # Methods for wiki pages.
8
+ module WikiPages
9
+ # Fetches the wiki page.
10
+ # @!method wikipage(page)
11
+ # @param page [String] The name of the page.
12
+ # @return [NeonRAW::Objects::WikiPage] Returns the wiki page object.
13
+ def wikipage(page)
14
+ params = { page: page }
15
+ path = "/r/#{display_name}/wiki/#{page}"
16
+ data = @client.request_data(path, :get, params)
17
+ data[:data][:name] = page
18
+ data[:data][:subreddit] = display_name
19
+ WikiPage.new(@client, data[:data])
20
+ end
21
+
22
+ # Fetches a list of wiki pages for the subreddit.
23
+ # @!method wikipages
24
+ # @return [Array<String>] Returns a list of wiki pages.
25
+ def wikipages
26
+ @client.request_data("/r/#{display_name}/wiki/pages", :get)[:data]
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,223 @@
1
+ require_relative '../objects/submission'
2
+ require_relative '../objects/listing'
3
+ require_relative '../objects/comment'
4
+ require_relative '../objects/thing'
5
+ require_relative '../objects/rule'
6
+ require_relative 'subreddit/flair'
7
+ require_relative 'subreddit/moderation'
8
+ require_relative 'subreddit/utilities'
9
+ require_relative 'subreddit/wiki'
10
+ # rubocop:disable Metrics/MethodLength
11
+
12
+ module NeonRAW
13
+ module Objects
14
+ # The subreddit object.
15
+ # @!attribute [r] subscribed?
16
+ # @return [Boolean] Returns whether or not you're subscribed
17
+ # to the subreddit.
18
+ # @!attribute [r] approved_submitter?
19
+ # @return [Boolean] Returns whether or not you're an approved
20
+ # submitter to the subreddit.
21
+ # @!attribute [r] moderator?
22
+ # @return [Boolean] Returns whether or not you're a moderator
23
+ # of the subreddit.
24
+ # @!attribute [r] im_banned?
25
+ # @return [Boolean] Returns whether or not you're banned from
26
+ # the subreddit.
27
+ # @!attribute [r] collapse_deleted_comments?
28
+ # @return [Boolean] Returns whether or not the subreddit
29
+ # collapses deleted comments.
30
+ # @!attribute [r] nsfw?
31
+ # @return [Boolean] Returns whether or not the subreddit is
32
+ # marked for adult content.
33
+ # @!attribute [r] muted?
34
+ # @return [Boolean] Returns whether or not you're muted from
35
+ # the subreddit's modmail.
36
+ # @!attribute [r] quarantined?
37
+ # @return [Boolean] Returns whether or not the subreddit is
38
+ # quarantined.
39
+ # @!attribute [r] public_traffic?
40
+ # @return [Boolean] Returns whether or not the subreddit made
41
+ # their traffic stats public.
42
+ # @!attribute [r] theme_enabled?
43
+ # @return [Boolean] Returns whether or not you have the
44
+ # subreddit theme enabled.
45
+ # @!attribute [r] wiki_enabled?
46
+ # @return [Boolean] Returns whether or not the subreddit has
47
+ # its wiki enabled.
48
+ # @!attribute [r] hide_ads?
49
+ # @return [Boolean] Returns whether or not the subreddit hides
50
+ # ads.
51
+ # @!attribute [r] banner_img
52
+ # @return [String, nil] Returns a string container a link to the
53
+ # banner image or nil if there is none.
54
+ # @!attribute [r] submit_text_html
55
+ # @return [String, nil] Returns the text with HTML included in the
56
+ # thread submission page or nil if there is none..
57
+ # @!attribute [r] submit_text
58
+ # @return [String, nil] Returns the text included in the thread
59
+ # submission page or nil if there is none.
60
+ # @!attribute [r] display_name
61
+ # @return [String] Returns the display name of the subreddit.
62
+ # @!attribute [r] header_img
63
+ # @return [String, nil] Returns the link to the header image
64
+ # or nil if there is none.
65
+ # @!attribute [r] sidebar_html
66
+ # @return [String, nil] Returns the subreddit's sidebar text
67
+ # with HTML or nil if there is none..
68
+ # @!attribute [r] title
69
+ # @return [String] Returns the subreddit's title.
70
+ # @!attribute [r] public_description
71
+ # @return [String, nil] Returns the subreddit's public description or nil
72
+ # if there is none..
73
+ # @!attribute [r] public_description_html
74
+ # @return [String, nil] Returns the subreddit's public description
75
+ # with HTML included or nil if there is none.
76
+ # @!attribute [r] suggested_comment_sort
77
+ # @return [String, nil] Returns the subreddit's suggested
78
+ # comment sort or nil if there isn't one [hot, top, new,
79
+ # old, controversial, random]
80
+ # @!attribute [r] submit_link_label
81
+ # @return [String, nil] Returns the subreddit's custom label
82
+ # for the submit link button or nil if there is none.
83
+ # @!attribute [r] submit_text_label
84
+ # @return [String, nil] Returns the subreddit's custom label
85
+ # for the submit text button or nil if there is none.
86
+ # @!attribute [r] header_title
87
+ # @return [String, nil] Returns the header title or nil if
88
+ # there is none.
89
+ # @!attribute [r] sidebar
90
+ # @return [String] Returns the subreddit's sidebar text.
91
+ # @!attribute [r] accounts_active
92
+ # @return [Integer] Returns the number of users online browsing
93
+ # the subreddit.
94
+ # @!attribute [r] header_size
95
+ # @return [Array<Integer, Integer>, nil] Returns an array containing the
96
+ # header's dimensions or nil if there isn't one.
97
+ # @!attribute [r] subscribers
98
+ # @return [Integer] Returns the number of subscribers the
99
+ # subreddit has.
100
+ # @!attribute [r] lang
101
+ # @return [String] Returns the subreddit's primary language.
102
+ # @!attribute [r] url
103
+ # @return [String] Returns the subreddit's URL.
104
+ # @!attribute [r] comment_score_hide_mins
105
+ # @return [Integer] Returns the number of minutes that comment
106
+ # scores are hidden.
107
+ # @!attribute [r] subreddit_type
108
+ # @return [String] Returns the type of subreddit [public,
109
+ # restricted, private, gold_restricted, archived].
110
+ # @!attribute [r] submission_type
111
+ # @return [String] Returns the type of submissions allowed
112
+ # to be posted [any, link, self].
113
+ class Subreddit < Thing
114
+ include Thing::Createable
115
+ include Thing::Refreshable
116
+ include Subreddit::Flair
117
+ include Subreddit::Moderation
118
+ include Subreddit::Utilities
119
+ include Subreddit::WikiPages
120
+
121
+ # @!method initialize(client, data)
122
+ # @param client [NeonRAW::Clients::Web/Installed/Script] The client.
123
+ # @param data [Hash] The object data.
124
+ def initialize(client, data)
125
+ @client = client
126
+ data.each do |key, value|
127
+ value = nil if ['', [], {}].include?(value)
128
+ instance_variable_set(:"@#{key}", value)
129
+ next if key == :created || key == :created_utc
130
+ self.class.send(:attr_reader, key)
131
+ end
132
+ class << self
133
+ alias_method :subscribed?, :user_is_subscriber
134
+ alias_method :approved_submitter?, :user_is_contributor
135
+ alias_method :moderator?, :user_is_moderator
136
+ alias_method :im_banned?, :user_is_banned
137
+ alias_method :collapses_deleted_comments?, :collapse_deleted_comments
138
+ alias_method :nsfw?, :over18
139
+ alias_method :muted?, :user_is_muted
140
+ alias_method :quarantined?, :quarantine
141
+ alias_method :public_traffic?, :public_traffic
142
+ alias_method :theme_enabled?, :user_sr_theme_enabled
143
+ alias_method :wiki_enabled?, :wiki_enabled
144
+ alias_method :hide_ads?, :hide_ads
145
+ alias_method :sidebar, :description
146
+ alias_method :sidebar_html, :description_html
147
+ end
148
+ end
149
+
150
+ # Fetches the subreddit's rules.
151
+ # @!method rules
152
+ # @return [Array<NeonRAW::Objects::Rule>] Returns a list of the rules.
153
+ def rules
154
+ data_arr = []
155
+ data = @client.request_data("/r/#{display_name}/about/rules.json", :get)
156
+ data[:rules].each do |rule|
157
+ data_arr << Rule.new(@client, rule)
158
+ end
159
+ data_arr
160
+ end
161
+
162
+ # Fetches the subreddit's stylesheet.
163
+ # @!method stylesheet
164
+ # @return [Hash<Array, String, String>] Returns the stylesheet data.
165
+ def stylesheet
166
+ path = "/r/#{display_name}/about/stylesheet.json"
167
+ @client.request_data(path, :get)[:data]
168
+ end
169
+
170
+ # @!group Listings
171
+ # Fetches a listing from the subreddit.
172
+ # @!method hot(params = { limit: 25 })
173
+ # @!method rising(params = { limit: 25 })
174
+ # @!method top(params = { limit: 25 })
175
+ # @!method old(params = { limit: 25 })
176
+ # @!method new(params = { limit: 25 })
177
+ # @!method controversial(params = { limit: 25 })
178
+ # @!method comments(param = { limit: 25 })
179
+ # @param params [Hash] The parameters for the request.
180
+ # @option params :t [String] Time for relevant sorting [hour, day, week,
181
+ # month, year, all]
182
+ # @option params :after [String] The name of the next data block.
183
+ # @option params :before [String] The name of the previous data block.
184
+ # @option params :count [Integer] The number of items already in the
185
+ # listing.
186
+ # @option params :limit [1..1000] The number of items to fetch.
187
+ # @option params :show [String] Literally the string 'all'.
188
+ # @return [NeonRAW::Objects::Listing] Returns the listing object.
189
+ %w(hot rising top old new controversial comments).each do |type|
190
+ define_method :"#{type}" do |params = { limit: 25 }|
191
+ path = "/r/#{display_name}/#{type}/.json"
192
+ @client.send(:build_listing, path, params)
193
+ end
194
+ end
195
+
196
+ # Search for links in the subreddit.
197
+ # @!method search(query, opts = { limit: 25 })
198
+ # @param query [String] The text to search for (512 characters maximum).
199
+ # @param opts [Hash] Optional parameters.
200
+ # @option opts :after [String] Fullname of the next data block.
201
+ # @option opts :before [String] Fullname of the previous data block.
202
+ # @option opts :count [Integer] Number of items already in the listing.
203
+ # @option opts :include_facets [Boolean] Whether or not to include facets.
204
+ # @option opts :limit [1..1000] The number of listing items to fetch.
205
+ # @option opts :show [String] Literally the string 'all'.
206
+ # @option opts :sort [String] The sort of the data [relevance, hot, top,
207
+ # new, comments].
208
+ # @option opts :syntax [String] The type of search you want [cloudsearch,
209
+ # lucene, plain]
210
+ # @option opts :t [String] Time for relevant sorting [hour, day, week,
211
+ # month, year, all]
212
+ def search(query, opts = { limit: 25 })
213
+ params = opts
214
+ params[:q] = query
215
+ params[:restrict_sr] = true
216
+ params[:sr_detail] = false
217
+ params[:type] = 'link'
218
+ @client.send(:build_listing, "/r/#{display_name}/search", params)
219
+ end
220
+ # @!endgroup
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,22 @@
1
+ module NeonRAW
2
+ module Objects
3
+ class Thing
4
+ # Methods for things that can be created.
5
+ module Createable
6
+ # Fetch when the thing was created.
7
+ # @!method created
8
+ # @return [Time] Returns a Time object containing the time/date.
9
+ def created
10
+ Time.at(@created)
11
+ end
12
+
13
+ # Fetch when the thing was created UTC.
14
+ # @!method created_utc
15
+ # @return [Time] Returns a Time object containing the time/date.
16
+ def created_utc
17
+ Time.at(@created_utc)
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,46 @@
1
+ module NeonRAW
2
+ module Objects
3
+ class Thing
4
+ # Methods for editing.
5
+ module Editable
6
+ # Checks whether or not the thing was edited.
7
+ # @!method edited?
8
+ # @return [Boolean] Returns whether or not the comment was edited.
9
+ def edited?
10
+ if @edited != false
11
+ true
12
+ else
13
+ false
14
+ end
15
+ end
16
+
17
+ # Gets the timestamp of the thing's lastest edit.
18
+ # @!method last_edit
19
+ # @return [Float, nil] Returns the UNIX timestamp of the edit or nil if
20
+ # the comment hasn't been edited.
21
+ # @note If you crawl some old comments on /r/reddit.com this may return
22
+ # true instead of the timestamp.
23
+ def last_edit
24
+ nil || @edited if @edited != false
25
+ end
26
+
27
+ # Edit a thing.
28
+ # @!method edit!(text)
29
+ # @param text [String] The text to replace the current text with.
30
+ def edit!(text)
31
+ params = { api_type: 'json', text: text, thing_id: name }
32
+ @client.request_data('/api/editusertext', :post, params)
33
+ refresh!
34
+ end
35
+
36
+ # Deletes the thing.
37
+ # @!method delete!
38
+ def delete!
39
+ params = { id: name }
40
+ @client.request_data('/api/del', :post, params)
41
+ refresh!
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,29 @@
1
+ module NeonRAW
2
+ module Objects
3
+ class Thing
4
+ # Methods for things that can be gilded.
5
+ module Gildable
6
+ # Checks whether a comment was gilded or not.
7
+ # @!method gilded?
8
+ # @return [Boolean] Returns whether or not the comment was gilded.
9
+ def gilded?
10
+ if @gilded > 0
11
+ true
12
+ else
13
+ false
14
+ end
15
+ end
16
+
17
+ # Give a thing gold.
18
+ # @!method gild(quantity)
19
+ # @param quantity [Integer] The amount of gold to give.
20
+ def gild(quantity)
21
+ quantity.times do
22
+ @client.request_data("/api/v1/gold/gild/#{name}", :post)
23
+ end
24
+ refresh!
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ module NeonRAW
2
+ module Objects
3
+ class Thing
4
+ # Methods for things that appear in your inbox.
5
+ module Inboxable
6
+ # Changes the read status of a PM.
7
+ # @!method mark_as_read
8
+ # @!method mark_as_unread
9
+ %w(read unread).each do |type|
10
+ define_method :"mark_as_#{type}" do
11
+ params = { id: name }
12
+ @client.request_data("/api/#{type}_message", :post, params)
13
+ end
14
+ end
15
+
16
+ # Add a text reply to a comment/private message.
17
+ # @!method reply(text)
18
+ # @param text [String] The text you want to reply with.
19
+ def reply(text)
20
+ params = { api_type: 'json', text: text, thing_id: name }
21
+ @client.request_data('/api/comment', :post, params)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end