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,36 @@
1
+ module NeonRAW
2
+ module Objects
3
+ # The object for /r/all.
4
+ class All
5
+ def initialize(client)
6
+ @client = client
7
+ end
8
+
9
+ # @!group Listings
10
+ # Fetches a listing from /r/all.
11
+ # @!method hot(params = { limit: 25 })
12
+ # @!method rising(params = { limit: 25 })
13
+ # @!method top(params = { limit: 25 })
14
+ # @!method old(params = { limit: 25 })
15
+ # @!method new(params = { limit: 25 })
16
+ # @!method controversial(params = { limit: 25 })
17
+ # @!method comments(param = { limit: 25 })
18
+ # @param params [Hash] The parameters for the request.
19
+ # @option params :t [String] Time for relevant sorting [hour, day, week,
20
+ # month, year, all]
21
+ # @option params :after [String] The name of the next data block.
22
+ # @option params :before [String] The name of the previous data block.
23
+ # @option params :count [Integer] The number of items already in the
24
+ # listing.
25
+ # @option params :limit [1..1000] The number of items to fetch.
26
+ # @option params :show [String] Literally the string 'all'.
27
+ # @return [NeonRAW::Objects::Listing] Returns the listing object.
28
+ %w(hot rising top old new controversial comments).each do |type|
29
+ define_method :"#{type}" do |params = { limit: 25 }|
30
+ path = "/r/all/#{type}/.json"
31
+ @client.send(:build_listing, path, params)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,128 @@
1
+ require_relative 'thing'
2
+
3
+ module NeonRAW
4
+ module Objects
5
+ # The comment object.
6
+ # @!attribute [r] approved_by
7
+ # @return [String, nil] Returns which mod approved the comment or nil if
8
+ # none did or you aren't a moderator of that subreddit.
9
+ # @!attribute [r] archived?
10
+ # @return [Boolean] Returns whether or not the comment is archived.
11
+ # @!attribute [r] author
12
+ # @return [String] Returns the author of the comment.
13
+ # @!attribute [r] author_flair_css_class
14
+ # @return [String, nil] Returns the author's flair CSS class or nil if
15
+ # there is none.
16
+ # @!attribute [r] author_flair_text
17
+ # @return [String, nil] Returns the author's flair text or nil if there
18
+ # is none.
19
+ # @!attribute [r] removed_by
20
+ # @return [String, nil] Returns which mod removed the comment or nil if
21
+ # none did or you aren't a moderator of that subreddit.
22
+ # @!attribute [r] body
23
+ # @return [String, nil] Returns the text body of the comment or nil if
24
+ # there isn't one.
25
+ # @!attribute [r] body_html
26
+ # @return [String, nil] Returns the text body of the comment with HTML or
27
+ # nil if there isn't one.
28
+ # @!attribute [r] gold_count
29
+ # @return [Integer] Returns the amount of gold a comment has been given.
30
+ # @!attribute [r] link_author
31
+ # @return [String] Returns the author of the submission link that the
32
+ # comment was made in response to.
33
+ # @note This attribute only exists if the comment is fetched from outside
34
+ # the thread it was posted in (so like user pages,
35
+ # /r/subreddit/comments, that type of stuff).
36
+ # @!attribute [r] link_id
37
+ # @return [String] Returns the id of the link that this comment is in.
38
+ # @!attribute [r] link_title
39
+ # @return [String] Returns the title of the parent link.
40
+ # @note This attribute only exists if the comment is fetched from outside
41
+ # the thread it was posted in (so like user pages,
42
+ # /r/subreddit/comments, that type of stuff).
43
+ # @!attribute [r] link_url
44
+ # @return [String] Returns the URL of the parent link.
45
+ # @note This attribute only exists if the comment is fetched from outside
46
+ # the thread it was posted in (so like user pages,
47
+ # /r/subreddit/comments, that type of stuff).
48
+ # @!attribute [r] num_reports
49
+ # @return [Integer, nil] Returns the number of times the comment has been
50
+ # reported or nil if it hasn't or you aren't a moderator.
51
+ # @!attribute [r] parent_id
52
+ # @return [String] Returns the ID of either the link or the comment that
53
+ # this comment is a reply to.
54
+ # @!attribute [r] saved?
55
+ # @return [Boolean] Returns whether or not you saved the comment.
56
+ # @!attribute [r] score
57
+ # @return [Integer] Returns the karma score of the comment.
58
+ # @!attribute [r] score_hidden?
59
+ # @return [Boolean] Returns whether or not the karma score of the comment
60
+ # is hidden.
61
+ # @!attribute [r] subreddit
62
+ # @return [String] Returns the subreddit the comment was posted to.
63
+ # @!attribute [r] subreddit_id
64
+ # @return [String] Returns the ID of the subreddit where the comment was
65
+ # posted to.
66
+ class Comment < Thing
67
+ include Thing::Createable
68
+ include Thing::Editable
69
+ include Thing::Gildable
70
+ include Thing::Inboxable
71
+ include Thing::Moderateable
72
+ include Thing::Refreshable
73
+ include Thing::Repliable
74
+ include Thing::Saveable
75
+ include Thing::Votable
76
+
77
+ # @!method initialize(client, data)
78
+ # @param client [NeonRAW::Clients::Web/Installed/Script] The client
79
+ # object.
80
+ # @param data [Hash] The comment data.
81
+ def initialize(client, data)
82
+ @client = client
83
+ data.each do |key, value|
84
+ value = nil if ['', [], {}].include?(value)
85
+ instance_variable_set(:"@#{key}", value)
86
+ next if key == :created || key == :created_utc || key == :replies
87
+ self.class.send(:attr_reader, key)
88
+ end
89
+ class << self
90
+ alias_method :removed_by, :banned_by
91
+ alias_method :gold_count, :gilded
92
+ alias_method :saved?, :saved
93
+ alias_method :score_hidden?, :score_hidden
94
+ alias_method :archived?, :archived
95
+ end
96
+ end
97
+
98
+ # Checks whether or not the comment has replies to it.
99
+ # @!method replies?
100
+ # @return [Boolean] Returns whether or not the comment has replies to it.
101
+ def replies?
102
+ if @replies.nil?
103
+ false
104
+ else
105
+ true
106
+ end
107
+ end
108
+
109
+ # Gets the replies made to the comment.
110
+ # @!method replies
111
+ # @return [Array<NeonRAW::Objects::Comment,
112
+ # NeonRAW::Objects::MoreComments>, nil] Returns either a list of the
113
+ # Comments/MoreComments or nil if there were no replies.
114
+ def replies
115
+ return nil if @replies.nil?
116
+ comments = []
117
+ @replies[:data][:children].each do |reply|
118
+ if reply[:kind] == 't1'
119
+ comments << Comment.new(@client, reply[:data])
120
+ elsif reply[:kind] == 'more'
121
+ comments << MoreComments.new(@client, reply[:data])
122
+ end
123
+ end
124
+ comments
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,54 @@
1
+ require_relative 'thing'
2
+
3
+ module NeonRAW
4
+ module Objects
5
+ # The inboxed comment object.
6
+ # @!attribute [r] body
7
+ # @return [String, nil] Returns the text body of the comment or nil if
8
+ # there is none.
9
+ # @!attribute [r] link_title
10
+ # @return [String] Returns the title of the submission where the comment
11
+ # was posted.
12
+ # @!attribute [r] dest
13
+ # @return [String] Returns whom the InboxComment was sent to.
14
+ # @!attribute [r] author
15
+ # @return [String] Returns the author of the comment.
16
+ # @!attribute [r] body_html
17
+ # @return [String, nil] Returns the text body of the comment with HTML or
18
+ # nil if there is none.
19
+ # @!attribute [r] subreddit
20
+ # @return [String] Returns the subreddit where the comment was posted.
21
+ # @!attribute [r] parent_id
22
+ # @return [String] Returns the fullname of the comment's parent object.
23
+ # @!attribute [r] context
24
+ # @return [String] Returns a link to the comment with context provided.
25
+ # @!attribute [r] new?
26
+ # @return [Boolean] Returns whether the comment is new or not.
27
+ # @!attribute [r] subject
28
+ # @return [String] Returns the subject of the comment (post/comment
29
+ # reply).
30
+ class InboxComment < Thing
31
+ include Thing::Createable
32
+ include Thing::Inboxable
33
+ include Thing::Moderateable
34
+ include Thing::Repliable
35
+ include Thing::Votable
36
+
37
+ # @!method initialize(client, data)
38
+ # @param client [NeonRAW::Clients::Web/Installed/Script] The client.
39
+ # @param data [Hash] The object data.
40
+ def initialize(client, data)
41
+ @client = client
42
+ data.each do |key, value|
43
+ value = nil if ['', [], {}].include?(value)
44
+ instance_variable_set(:"@#{key}", value)
45
+ next if key == :created || key == :created_utc
46
+ self.class.send(:attr_reader, key)
47
+ end
48
+ class << self
49
+ alias_method :new?, :new
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,12 @@
1
+ module NeonRAW
2
+ module Objects
3
+ # The listing object.
4
+ class Listing < Array
5
+ attr_reader :after, :before
6
+ def initialize(after, before)
7
+ @after = after
8
+ @before = before
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,268 @@
1
+ require_relative 'user'
2
+ require_relative 'trophy'
3
+ require_relative 'multireddit'
4
+ # rubocop:disable Metrics/AbcSize, Metrics/ClassLength
5
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
6
+
7
+ module NeonRAW
8
+ # Objects module.
9
+ module Objects
10
+ # The me object.
11
+ # @!attribute [r] employee?
12
+ # @return [Boolean] Returns whether or not you're a Reddit
13
+ # employee.
14
+ # @!attribute [r] mail?
15
+ # @return [Boolean] Returns whether or not you've got mail.
16
+ # @!attribute [r] suspended?
17
+ # @return [Boolean] Returns whether or not your account is
18
+ # suspended.
19
+ # @!attribute [r] modmail?
20
+ # @return [Boolean] Returns whether or not you've got modmail.
21
+ # @!attribute [r] beta?
22
+ # @return [Boolean] Returns whether or not you're opted into
23
+ # beta testing.
24
+ # @!attribute [r] over_18?
25
+ # @return [Boolean] Returns whether or not you can view adult
26
+ # content.
27
+ # @!attribute [r] inbox_count
28
+ # @return [Integer] Returns the number of unread messages
29
+ # in your inbox.
30
+ class Me < User
31
+ # @!method initialize(client, data)
32
+ # @param client [NeonRAW::Clients::Web/Installed/Script] The client
33
+ # object.
34
+ # @param data [Hash] The object data.
35
+ def initialize(client, data)
36
+ @client = client
37
+ data.each do |key, value|
38
+ value = nil if ['', [], {}].include?(value)
39
+ instance_variable_set(:"@#{key}", value)
40
+ next if key == :created || key == :created_utc
41
+ self.class.send(:attr_reader, key)
42
+ end
43
+ class << self
44
+ alias_method :employee?, :is_employee
45
+ alias_method :mail?, :has_mail
46
+ alias_method :hide_from_robots?, :hide_from_robots
47
+ alias_method :suspended?, :is_suspended
48
+ alias_method :modmail?, :has_mod_mail
49
+ alias_method :beta?, :in_beta
50
+ alias_method :over_18?, :over_18
51
+ alias_method :gold?, :is_gold
52
+ alias_method :moderator?, :is_mod
53
+ alias_method :verified_email?, :has_verified_email
54
+ end
55
+ end
56
+
57
+ # @!group Listings
58
+ # Fetches your private messages.
59
+ # @!method messages(params = { limit: 25 })
60
+ # @!method inbox(params = { limit: 25 })
61
+ # @!method unread(params = { limit: 25 })
62
+ # @!method sent(params = { limit: 25 })
63
+ # @param params [Hash] Optional parameters.
64
+ # @option params :mark [Boolean] Whether or not to remove the orangered
65
+ # from your inbox.
66
+ # @option params :after [String] Fullname of the next data block.
67
+ # @option params :before [String] Fullname of the previous data block
68
+ # @option params :count [Integer] The number of items already in the
69
+ # listing.
70
+ # @option params :limit [1..1000] The number of listing items to fetch.
71
+ # @option params :show [String] Literally the string 'all'.
72
+ # @return [NeonRAW::Objects::Listing] Returns a listing with all your PMs.
73
+ %w(messages inbox unread sent).each do |type|
74
+ define_method :"#{type}" do |params = { limit: 25 }|
75
+ @client.send(:build_listing, "/message/#{type}", params)
76
+ end
77
+ end
78
+
79
+ # Fetches your modmail.
80
+ # @!method modmail(params = { limit: 25 })
81
+ # @param params [Hash] The parameters.
82
+ # @option params :after [String] Fullname of the next data block.
83
+ # @option params :before [String] Fullname of the previous data block.
84
+ # @option params :count [Integer] The number of items already in the
85
+ # listing.
86
+ # @option params :limit [1..1000] The number of listing items to fetch.
87
+ # @option params :show [String] Literally the string 'all'.
88
+ # @return [NeonRAW::Objects::Listing] Returns a listing with all your
89
+ # modmails.
90
+ def modmail(params = { limit: 25 })
91
+ @client.send(:build_listing, '/message/moderator.json', params)
92
+ end
93
+
94
+ # Fetches your subreddits.
95
+ # @!method subscribed(params = { limit: 25 })
96
+ # @!method contributed(params = { limit: 25 })
97
+ # @!method moderated(params = { limit: 25 })
98
+ # @param params [Hash] The parameters.
99
+ # @option params :after [String] Fullname of the next data block.
100
+ # @option params :before [String] Fullname of the previous data block.
101
+ # @option params :count [Integer] The number of items already in the
102
+ # listing.
103
+ # @option params :limit [1..1000] The number of listing items to fetch.
104
+ # @option params :show [String] Literally the string 'all'.
105
+ # @return [NeonRAW::Objects::Listing] Returns a listing with all your
106
+ # subreddits.
107
+ %w(subscribed contributed moderated).each do |type|
108
+ define_method :"#{type}" do |params = { limit: 25 }|
109
+ type = 'subscriber' if type == 'subscribed'
110
+ type = 'contributor' if type == 'contributed'
111
+ type = 'moderator' if type == 'moderated'
112
+ @client.send(:build_listing, "/subreddits/mine/#{type}", params)
113
+ end
114
+ end
115
+ # @!endgroup
116
+
117
+ # Fetches your karma breakdown.
118
+ # @!method karma_breakdown
119
+ # @return [Array<Hash<String, Integer, Integer>>] Returns a list with your
120
+ # karma distribution in it.
121
+ def karma_breakdown
122
+ @client.request_data('/api/v1/me/karma', :get)[:data]
123
+ end
124
+
125
+ # Fetches your preferences.
126
+ # @!method prefs
127
+ # @return [Hash] Returns your account preferences.
128
+ def prefs
129
+ @client.request_data('/api/v1/me/prefs', :get)
130
+ end
131
+
132
+ # Edits your preferences.
133
+ # @!method edit_prefs(data)
134
+ # @param data [JSON] Your preferences data. Read Reddit's API docs for
135
+ # how to format the data.
136
+ # @see https://www.reddit.com/dev/api#PATCH_api_v1_me_prefs
137
+ # @todo Figure out why this is raising BadRequest exceptions when I try
138
+ # to use it.
139
+ def edit_prefs(data)
140
+ @client.request_data('/api/v1/me/prefs', :patch, {}, content: data)
141
+ end
142
+
143
+ # Fetches your trophies.
144
+ # @!method trophies
145
+ # @return [Array<NeonRAW::Objects::Trophy>] Returns a list of trophies.
146
+ def trophies
147
+ data_arr = []
148
+ data = @client.request_data('/api/v1/me/trophies', :get)[:data]
149
+ data[:trophies].each do |trophy|
150
+ data_arr << Trophy.new(trophy[:data])
151
+ end
152
+ data_arr
153
+ end
154
+
155
+ # Fetches your friends.
156
+ # @!method friends(params = { limit: 25 })
157
+ # @param params [Hash] The parameters for the request.
158
+ # @option params :after [String] The fullname of a thing.
159
+ # @option params :before [String] The fullname of a thing.
160
+ # @option params :count [Integer] The number of items fetch already.
161
+ # @option params :limit [1..100] The number of items to fetch.
162
+ # @option params :show [String] Literally the string 'all'.
163
+ # @return [Array<Hash<Float, String, String>>] Returns the list of your
164
+ # friends.
165
+ def friends(params = { limit: 25 })
166
+ data_arr = []
167
+ data = @client.request_data('/prefs/friends', :get, params)
168
+ data[0][:data][:children].each do |friend|
169
+ data_arr << friend
170
+ end
171
+ data_arr
172
+ end
173
+
174
+ # Fetches your blocked users.
175
+ # @!method blocked(params = { limit: 25 })
176
+ # @param params [Hash] The parameters for the request.
177
+ # @option params :after [String] The fullname of a thing.
178
+ # @option params :before [String] The fullname of a thing.
179
+ # @option params :count [Integer] The number of items fetch already.
180
+ # @option params :limit [1..100] The number of items to fetch.
181
+ # @option params :show [String] Literally the string 'all'.
182
+ # @return [Array<Hash<Float, String, String>>] Returns the list of your
183
+ # blocked users.
184
+ def blocked(params = { limit: 25 })
185
+ data_arr = []
186
+ data = @client.request_data('/prefs/blocked', :get, params)
187
+ data[:data][:children].each do |blocked|
188
+ data_arr << blocked
189
+ end
190
+ data_arr
191
+ end
192
+
193
+ # Mark all your messages as "read."
194
+ # @!method read_all_messages!
195
+ def read_all_messages!
196
+ @client.request_nonjson('/api/read_all_messages', :post)
197
+ end
198
+
199
+ # Fetches your multireddits.
200
+ # @!method multireddits
201
+ # @return [Array<NeonRAW::Objects::MultiReddit>] Returns a list of
202
+ # multireddits.
203
+ def multireddits
204
+ data_arr = []
205
+ params = { expand_srs: false }
206
+ data = @client.request_data('/api/multi/mine', :get, params)
207
+ data.each do |multireddit|
208
+ data_arr << MultiReddit.new(@client, multireddit[:data])
209
+ end
210
+ data_arr
211
+ end
212
+
213
+ # Goes through and edits then deletes your post history. Defaults to
214
+ # 2 weeks.
215
+ # @!method purge(queue, params = {})
216
+ # @param queue [String] The queue you want to get your posts from
217
+ # [overview, submitted, comments, upvoted, downvoted, hidden, saved,
218
+ # giled]
219
+ # @param params [Hash] The additional parameters.
220
+ # @option params :edit [String] The text to edit your posts with.
221
+ # @option params :blacklist [Array<String>] Subreddits to avoid purging
222
+ # from.
223
+ # @option params :whitelist [Array<String>] Subreddits to purge.
224
+ # @option params :sort [String] The sort of the data (defaults to new)
225
+ # [new, hot, top, controversial].
226
+ # @option params :hours [Integer] The number of hours to go back from.
227
+ # @option params :days [Integer] The number of days to go back from.
228
+ # @option params :weeks [Integer] The number of weeks to go back from.
229
+ # @option params :months [Integer] The number of months to go back from.
230
+ # @option params :years [Integer] The number of years to go back from.
231
+ def purge(queue, params = {})
232
+ params[:edit] = '.' if params[:edit].nil?
233
+ params[:blacklist] = [] if params[:blacklist].nil?
234
+ params[:whitelist] = ['*'] if params[:whitelist].nil?
235
+ whitelist = params[:whitelist]
236
+ params[:age] = max_age(params)
237
+ items = send(:"#{queue}", sort: params[:sort] || 'new', limit: 1000)
238
+ items.each do |item|
239
+ next if params[:blacklist].include?(item.subreddit)
240
+ next if item.created < params[:age]
241
+ next unless whitelist.include?(item.subreddit) || whitelist[0] == '*'
242
+ if item.is_a?(Submission)
243
+ item.edit! params[:edit] if item.selfpost? && !item.archived?
244
+ else
245
+ item.edit! params[:edit] unless item.archived?
246
+ end
247
+ item.delete!
248
+ end
249
+ end
250
+
251
+ # Fetches the max age of things to be purged.
252
+ # @!method max_age(params)
253
+ # @param params [Hash] The hours/days/weeks/months/years to go back from.
254
+ def max_age(params)
255
+ start = Time.now
256
+ age = start
257
+ age -= 3600 * params[:hours] unless params[:hours].nil?
258
+ age -= 86_400 * params[:days] unless params[:days].nil?
259
+ age -= 604_800 * params[:weeks] unless params[:weeks].nil?
260
+ age -= 2_419_200 * params[:months] unless params[:months].nil?
261
+ age -= 29_030_400 * params[:years] unless params[:years].nil?
262
+ age -= (604_800 * 2) if age == start # defaults to 2 weeks
263
+ age
264
+ end
265
+ private :max_age
266
+ end
267
+ end
268
+ end
@@ -0,0 +1,59 @@
1
+ require_relative 'thing'
2
+
3
+ module NeonRAW
4
+ module Objects
5
+ # The modlogaction object.
6
+ # @!attribute [r] description
7
+ # @return [String, nil] Returns the description or nil if there is none.
8
+ # @!attribute [r] target_body
9
+ # @return [String, nil] Returns the text body of the target object or nil
10
+ # if there is none.
11
+ # @!attribute [r] mod_id36
12
+ # @return [String] Returns the ID of the mod who did the action.
13
+ # @!attribute [r] subreddit
14
+ # @return [String] Returns the subreddit where the action occured.
15
+ # @!attribute [r] target_title
16
+ # @return [String, nil] Returns the title of the target object or nil if
17
+ # there is none.
18
+ # @!attribute [r] target_permalink
19
+ # @return [String, nil] Returns the permalink of the target object or nil
20
+ # if there is none.
21
+ # @!attribute [r] details
22
+ # @return [String] Returns the details of the action.
23
+ # @!attribute [r] action
24
+ # @return [String] Returns the type of action.
25
+ # @!attribute [r] target_author
26
+ # @return [String, nil] Returns the author of the target object or nil if
27
+ # there is none.
28
+ # @!attribute [r] target_fullname
29
+ # @return [String, nil] Returns the fullname of the target object or nil
30
+ # if there is none.
31
+ # @!attribute [r] sr_id36
32
+ # @return [String] Returns the ID of the subreddit where the action
33
+ # occured.
34
+ # @!attribute [r] mod
35
+ # @return [String] Returns the mod who did the action.
36
+ # @!attribute [r] id
37
+ # @return [String] Returns the ID of the modlog action.
38
+ class ModLogAction
39
+ include Thing::Createable
40
+
41
+ def initialize(client, data)
42
+ @client = client
43
+ data.each do |key, value|
44
+ value = nil if ['', [], {}].include?(value)
45
+ instance_variable_set(:"@#{key}", value)
46
+ next if key == :created_utc
47
+ self.class.send(:attr_reader, key)
48
+ end
49
+ end
50
+
51
+ # Gets when the mod log action was done.
52
+ # @!method created
53
+ # @return [Time] Returns the date/time when the mod log action was done.
54
+ def created
55
+ Time.at(@created_utc).localtime
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'thing'
2
+
3
+ module NeonRAW
4
+ module Objects
5
+ # The modloguser object.
6
+ # @!attribute [r] note
7
+ # @return [String, nil] Returns the reason for the banning or nil if there
8
+ # is none. This attribute is only available for the banned and
9
+ # wikibanned methods.
10
+ # @!attribute [r] mod_permissions
11
+ # @return [Array<String>] Returns the mod permissions for the user. This
12
+ # attribute is only available for the moderators method.
13
+ class ModLogUser < Thing
14
+ # @!method initialize(client, data)
15
+ # @param client [NeonRAW::Clients::Web/Installed/Script] The client.
16
+ # @param data [Hash] The object data.
17
+ def initialize(client, data)
18
+ @client = client
19
+ data.each do |key, value|
20
+ value = nil if ['', [], {}].include?(value)
21
+ instance_variable_set(:"@#{key}", value)
22
+ next if key == :date
23
+ self.class.send(:attr_reader, key)
24
+ end
25
+ end
26
+
27
+ # Gets the date of when the user was added to the list.
28
+ # @!method date
29
+ # @return [Time] Returns when the user was added to the list.
30
+ def date
31
+ Time.at(@date)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,33 @@
1
+ require_relative 'comment'
2
+
3
+ module NeonRAW
4
+ module Objects
5
+ # The MoreComments object.
6
+ class MoreComments
7
+ def initialize(client, data)
8
+ @client = client
9
+ data.each do |key, value|
10
+ value = nil if ['', [], {}].include?(value)
11
+ instance_variable_set(:"@#{key}", value)
12
+ self.class.send(:attr_reader, key)
13
+ end
14
+ end
15
+
16
+ # Expands the MoreComments object.
17
+ # @!method expand(subreddit)
18
+ # @param subreddit [String] The name of the subreddit where the
19
+ # MoreComments object resides.
20
+ # @return [Array] Returns a list of the comments that were expanded.
21
+ def expand(subreddit)
22
+ comments = []
23
+ params = { id: children.map { |the_id| 't1_' + the_id }.join(',') }
24
+ # /api/morechildren is buggy shit. This is better.
25
+ data = @client.request_data("/r/#{subreddit}/api/info", :get, params)
26
+ data[:data][:children].each do |comment|
27
+ comments << Comment.new(@client, comment[:data])
28
+ end
29
+ comments
30
+ end
31
+ end
32
+ end
33
+ end