NeonRAW 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.rubocop.yml +5 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.md +7 -0
- data/CONTRIBUTING.md +11 -0
- data/Gemfile +4 -0
- data/LICENSE.md +373 -0
- data/NeonRAW.gemspec +26 -0
- data/README.md +62 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/examples/crossposter.rb +78 -0
- data/examples/flairbot.rb +60 -0
- data/examples/publicmodlogger.rb +79 -0
- data/examples/settings.yaml +4 -0
- data/examples/userhistoryscraper.rb +108 -0
- data/examples/userhistorywiper.rb +10 -0
- data/lib/NeonRAW/clients/base/listing.rb +55 -0
- data/lib/NeonRAW/clients/base/objectbuilder.rb +173 -0
- data/lib/NeonRAW/clients/base/utilities.rb +46 -0
- data/lib/NeonRAW/clients/base.rb +109 -0
- data/lib/NeonRAW/clients/installed.rb +49 -0
- data/lib/NeonRAW/clients/script.rb +34 -0
- data/lib/NeonRAW/clients/web.rb +52 -0
- data/lib/NeonRAW/errors.rb +518 -0
- data/lib/NeonRAW/objects/access.rb +44 -0
- data/lib/NeonRAW/objects/all.rb +36 -0
- data/lib/NeonRAW/objects/comment.rb +128 -0
- data/lib/NeonRAW/objects/inboxcomment.rb +54 -0
- data/lib/NeonRAW/objects/listing.rb +12 -0
- data/lib/NeonRAW/objects/me.rb +268 -0
- data/lib/NeonRAW/objects/modlogaction.rb +59 -0
- data/lib/NeonRAW/objects/modloguser.rb +35 -0
- data/lib/NeonRAW/objects/morecomments.rb +33 -0
- data/lib/NeonRAW/objects/multireddit.rb +134 -0
- data/lib/NeonRAW/objects/privatemessage.rb +90 -0
- data/lib/NeonRAW/objects/rule.rb +41 -0
- data/lib/NeonRAW/objects/submission.rb +221 -0
- data/lib/NeonRAW/objects/subreddit/flair.rb +169 -0
- data/lib/NeonRAW/objects/subreddit/moderation.rb +200 -0
- data/lib/NeonRAW/objects/subreddit/utilities.rb +73 -0
- data/lib/NeonRAW/objects/subreddit/wiki.rb +31 -0
- data/lib/NeonRAW/objects/subreddit.rb +223 -0
- data/lib/NeonRAW/objects/thing/createable.rb +22 -0
- data/lib/NeonRAW/objects/thing/editable.rb +46 -0
- data/lib/NeonRAW/objects/thing/gildable.rb +29 -0
- data/lib/NeonRAW/objects/thing/inboxable.rb +26 -0
- data/lib/NeonRAW/objects/thing/moderateable.rb +98 -0
- data/lib/NeonRAW/objects/thing/refreshable.rb +21 -0
- data/lib/NeonRAW/objects/thing/repliable.rb +23 -0
- data/lib/NeonRAW/objects/thing/saveable.rb +26 -0
- data/lib/NeonRAW/objects/thing/votable.rb +69 -0
- data/lib/NeonRAW/objects/thing.rb +24 -0
- data/lib/NeonRAW/objects/trophy.rb +25 -0
- data/lib/NeonRAW/objects/user.rb +147 -0
- data/lib/NeonRAW/objects/wikipage.rb +176 -0
- data/lib/NeonRAW/objects/wikipagerevision.rb +45 -0
- data/lib/NeonRAW/version.rb +3 -0
- data/lib/NeonRAW.rb +43 -0
- metadata +161 -0
@@ -0,0 +1,98 @@
|
|
1
|
+
module NeonRAW
|
2
|
+
module Objects
|
3
|
+
class Thing
|
4
|
+
# Methods for moderators.
|
5
|
+
# @!attribute [r] mod_reports
|
6
|
+
# @return [Array<String>, nil] Returns the mod reports or nil if there
|
7
|
+
# are none.
|
8
|
+
# @!attribute [r] user_reports
|
9
|
+
# @return [Array<String>, nil] Returns the user reports or nil if there
|
10
|
+
# are none.
|
11
|
+
module Moderateable
|
12
|
+
# Approve a comment or submission.
|
13
|
+
# @!method approve!
|
14
|
+
def approve!
|
15
|
+
params = { id: name }
|
16
|
+
@client.request_data('/api/approve', :post, params)
|
17
|
+
refresh!
|
18
|
+
end
|
19
|
+
|
20
|
+
# Checks whether or not the thing was distinguished by a privileged
|
21
|
+
# user.
|
22
|
+
# @!method distinguished?
|
23
|
+
# @return [Boolean] Returns whether or not the comment was
|
24
|
+
# distinguished.
|
25
|
+
def distinguished?
|
26
|
+
if @distinguished.nil?
|
27
|
+
false
|
28
|
+
else
|
29
|
+
true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Distinguish a submission/comment.
|
34
|
+
# @!method distinguish(type)
|
35
|
+
# @param type [String] The type of distinguish you want to do [yes, no,
|
36
|
+
# admin, special].
|
37
|
+
# @!group Moderators
|
38
|
+
def distinguish(type)
|
39
|
+
params = { api_type: 'json', how: type, id: name }
|
40
|
+
@client.request_data('/api/distinguish', :post, params)
|
41
|
+
refresh!
|
42
|
+
end
|
43
|
+
|
44
|
+
# Checks who distinguished the thing.
|
45
|
+
# @!method distinguished_by
|
46
|
+
# @return [String, nil] Returns who distinguished the comment or nil if
|
47
|
+
# the comment isn't distinguished [moderator, admin, special].
|
48
|
+
def distinguished_by
|
49
|
+
@distinguished
|
50
|
+
end
|
51
|
+
|
52
|
+
# Checks whether or not the thing is stickied.
|
53
|
+
# @!method stickied?
|
54
|
+
# @return [Boolean] Returns whether or not the thing is stickied.
|
55
|
+
def stickied?
|
56
|
+
@stickied
|
57
|
+
end
|
58
|
+
|
59
|
+
# Report a thing to the subreddit's moderators or admins if the thing
|
60
|
+
# is a private message.
|
61
|
+
# @!method report(reason)
|
62
|
+
# @param reason [String] The reason for the report (100 characters
|
63
|
+
# maximum).
|
64
|
+
def report(reason)
|
65
|
+
params = { api_type: 'json', reason: reason, thing_id: name }
|
66
|
+
@client.request_data('/api/report', :post, params)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Set whether to ignore reports on the thing or not.
|
70
|
+
# @!method ignore_reports!
|
71
|
+
# @!method unignore_reports!
|
72
|
+
%w(ignore unignore).each do |type|
|
73
|
+
define_method :"#{type}_reports!" do
|
74
|
+
params = { id: name }
|
75
|
+
@client.request_data("/api/#{type}_reports", :post, params)
|
76
|
+
refresh!
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# Remove a comment/link/modmail message.
|
81
|
+
# @!method remove!
|
82
|
+
def remove!
|
83
|
+
params = { id: name, spam: false }
|
84
|
+
@client.request_data('/api/remove', :post, params)
|
85
|
+
refresh!
|
86
|
+
end
|
87
|
+
|
88
|
+
# Spamfilter a comment/link/modmail message.
|
89
|
+
# @!method spam!
|
90
|
+
def spam!
|
91
|
+
params = { id: name, spam: true }
|
92
|
+
@client.request_data('/api/remove', :post, params)
|
93
|
+
refresh!
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module NeonRAW
|
2
|
+
module Objects
|
3
|
+
class Thing
|
4
|
+
# Methods for things that can be refreshed.
|
5
|
+
module Refreshable
|
6
|
+
# Refreshes the data of a comment/submission/subreddit object.
|
7
|
+
# @!method refresh!
|
8
|
+
def refresh!
|
9
|
+
params = { id: name }
|
10
|
+
path = "/r/#{display_name}/api/info" if /t5_/ =~ name
|
11
|
+
path = "/r/#{subreddit}/api/info" unless /t5_/ =~ name
|
12
|
+
data = @client.request_data(path, :get, params)
|
13
|
+
data[:data][:children][0][:data].each do |key, value|
|
14
|
+
value = nil if ['', [], {}].include?(value)
|
15
|
+
instance_variable_set(:"@#{key}", value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module NeonRAW
|
2
|
+
module Objects
|
3
|
+
class Thing
|
4
|
+
# Methods for things that can be replied to.
|
5
|
+
module Repliable
|
6
|
+
# Leaves a comment/PM reply to the thing.
|
7
|
+
# @!method reply(text)
|
8
|
+
# @param text [String] The text body of the comment.
|
9
|
+
# @return [NeonRAW::Objects::Comment/PrivateMessage] Returns the object.
|
10
|
+
def reply(text)
|
11
|
+
params = { api_type: 'json', text: text, thing_id: name }
|
12
|
+
data = @client.request_data('/api/comment', :post, params)
|
13
|
+
object_data = data[:json][:data][:things][0][:data]
|
14
|
+
if data[:kind] == 't1'
|
15
|
+
Comment.new(@client, object_data)
|
16
|
+
elsif data[:kind] == 't4'
|
17
|
+
PrivateMessage.new(@client, object_data)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module NeonRAW
|
2
|
+
module Objects
|
3
|
+
class Thing
|
4
|
+
# Methods for things that can be saved.
|
5
|
+
module Saveable
|
6
|
+
# Saves the thing.
|
7
|
+
# @!method save(opts = {})
|
8
|
+
# @param opts [Hash] Stores optional parameters.
|
9
|
+
# @option opts :category [String] The category you want to save to
|
10
|
+
# (Reddit Gold Feature).
|
11
|
+
def save(opts = {})
|
12
|
+
params = { id: name }
|
13
|
+
params[:category] = opts[:category] if opts[:category]
|
14
|
+
@client.request_data('/api/save', :post, params)
|
15
|
+
end
|
16
|
+
|
17
|
+
# Unsaves the thing.
|
18
|
+
# @!method unsave
|
19
|
+
def unsave
|
20
|
+
params = { id: name }
|
21
|
+
@client.request_data('/api/unsave', :post, params)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module NeonRAW
|
2
|
+
module Objects
|
3
|
+
class Thing
|
4
|
+
# Methods for objects that you can cast votes on.
|
5
|
+
# @!attribute [r] ups
|
6
|
+
# @return [Integer] Returns the number of upvotes the thing has.
|
7
|
+
# @!attribute [r] downs
|
8
|
+
# @return [Integer] Returns the number of downvotes the thing has.
|
9
|
+
module Votable
|
10
|
+
# Checks whether you voted on the thing.
|
11
|
+
# @!method voted?
|
12
|
+
# @return [Boolean] Returns whether or not you voted on the thing.
|
13
|
+
def voted?
|
14
|
+
if @likes.nil?
|
15
|
+
false
|
16
|
+
else
|
17
|
+
true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Checks whether or not you upvoted the thing.
|
22
|
+
# @!method upvoted?
|
23
|
+
# @return [Boolean] Returns whether or not you upvoted the thing.
|
24
|
+
def upvoted?
|
25
|
+
if @likes == true
|
26
|
+
true
|
27
|
+
else
|
28
|
+
false
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Checks whether or not you downvoted the thing.
|
33
|
+
# @!method downvoted?
|
34
|
+
# @return [Boolean] Returns whether or not you downvoted the thing.
|
35
|
+
def downvoted?
|
36
|
+
if @likes == false
|
37
|
+
true
|
38
|
+
else
|
39
|
+
false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Contains the values for each type of vote.
|
44
|
+
# @!method votes
|
45
|
+
# @return [Hash] Returns a hash containing the vote values.
|
46
|
+
def votes
|
47
|
+
{
|
48
|
+
upvote: 1,
|
49
|
+
clear_vote: 0,
|
50
|
+
downvote: -1
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
# Cast a vote on an object.
|
55
|
+
# @!method upvote
|
56
|
+
# @!method clear_vote
|
57
|
+
# @!method downvote
|
58
|
+
%i(upvote clear_vote downvote).each do |type|
|
59
|
+
define_method type do
|
60
|
+
params = { dir: votes[type], id: name }
|
61
|
+
@client.request_data('/api/vote', :post, params)
|
62
|
+
refresh!
|
63
|
+
end
|
64
|
+
end
|
65
|
+
private :votes
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'thing/votable'
|
2
|
+
require_relative 'thing/editable'
|
3
|
+
require_relative 'thing/moderateable'
|
4
|
+
require_relative 'thing/gildable'
|
5
|
+
require_relative 'thing/createable'
|
6
|
+
require_relative 'thing/saveable'
|
7
|
+
require_relative 'thing/refreshable'
|
8
|
+
require_relative 'thing/inboxable'
|
9
|
+
require_relative 'thing/repliable'
|
10
|
+
|
11
|
+
module NeonRAW
|
12
|
+
module Objects
|
13
|
+
# Exists to hold methods that work in all objects.
|
14
|
+
# @!attribute [r] id
|
15
|
+
# @return [String] The id of the thing.
|
16
|
+
# @!attribute [r] name
|
17
|
+
# @return [String] The fullname of the thing.
|
18
|
+
class Thing
|
19
|
+
class << self
|
20
|
+
public :define_method
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'thing'
|
2
|
+
|
3
|
+
module NeonRAW
|
4
|
+
module Objects
|
5
|
+
# The trophy object.
|
6
|
+
# @!attribute [r] icon_70
|
7
|
+
# @return [String] Returns a link to the icon file.
|
8
|
+
# @!attribute [r] description
|
9
|
+
# @return [String, nil] Returns the description or nil if there is none.
|
10
|
+
# @!attribute [r] url
|
11
|
+
# @return [String, nil] Returns the URL or nil if there is none.
|
12
|
+
# @!attribute [r] icon_40
|
13
|
+
# @return [String] Returns a link to the icon file.
|
14
|
+
# @!attribute [r] award_id
|
15
|
+
# @return [String] Returns the award ID.
|
16
|
+
class Trophy < Thing
|
17
|
+
def initialize(data)
|
18
|
+
data.each do |key, value|
|
19
|
+
instance_variable_set(:"@#{key}", value)
|
20
|
+
self.class.send(:attr_reader, key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require_relative 'thing'
|
2
|
+
require_relative 'trophy'
|
3
|
+
|
4
|
+
module NeonRAW
|
5
|
+
module Objects
|
6
|
+
# The user object.
|
7
|
+
# @!attribute [r] friend?
|
8
|
+
# @return [Boolean] Returns whether or not the user is a friend.
|
9
|
+
# @!attribute [r] gold?
|
10
|
+
# @return [Boolean] Returns whether or not the user has gold.
|
11
|
+
# @!attribute [r] moderator?
|
12
|
+
# @return [Boolean] Returns whether or not the user is a
|
13
|
+
# moderator.
|
14
|
+
# @!attribute [r] verified_email?
|
15
|
+
# @return [Boolean] Returns whether or not the user has a
|
16
|
+
# verified email.
|
17
|
+
# @!attribute [r] hide_from_robots?
|
18
|
+
# @return [Boolean] Returns whether or not the user doesn't
|
19
|
+
# want web crawlers indexing their profile page.
|
20
|
+
# @!attribute [r] link_karma
|
21
|
+
# @return [Integer] Returns the link karma of the user.
|
22
|
+
# @!attribute [r] comment_karma
|
23
|
+
# @return [Integer] Returns the comment karma of the user.
|
24
|
+
class User < Thing
|
25
|
+
include Thing::Createable
|
26
|
+
include Thing::Refreshable
|
27
|
+
|
28
|
+
# @!method initialize(client, data)
|
29
|
+
# @param client [NeonRAW::Clients::Web/Installed/Script] The client
|
30
|
+
# object.
|
31
|
+
# @param data [Hash] The object data.
|
32
|
+
def initialize(client, data)
|
33
|
+
@client = client
|
34
|
+
data.each do |key, value|
|
35
|
+
value = nil if ['', [], {}].include?(value)
|
36
|
+
instance_variable_set(:"@#{key}", value)
|
37
|
+
next if key == :created || key == :created_utc
|
38
|
+
self.class.send(:attr_reader, key)
|
39
|
+
end
|
40
|
+
class << self
|
41
|
+
alias_method :friend?, :is_friend
|
42
|
+
alias_method :gold?, :is_gold
|
43
|
+
alias_method :moderator?, :is_mod
|
44
|
+
alias_method :verified_email?, :has_verified_email
|
45
|
+
alias_method :hide_from_robots?, :hide_from_robots
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# @!group Listings
|
50
|
+
# Fetches a listing from a user.
|
51
|
+
# @!method overview(params = { limit: 25 })
|
52
|
+
# @!method comments(params = { limit: 25 })
|
53
|
+
# @!method submitted(params = { limit: 25 })
|
54
|
+
# @!method gilded(params = { limit: 25 })
|
55
|
+
# @!method upvoted(params = { limit: 25 })
|
56
|
+
# @!method downvoted(params = { limit: 25 })
|
57
|
+
# @!method hidden(params = { limit: 25 })
|
58
|
+
# @!method saved(params = { limit: 25 })
|
59
|
+
# @param params [Hash] The parameters for the request.
|
60
|
+
# @option params :show [String] Show a listing type [overview, comments,
|
61
|
+
# submitted, gilded, upvoted, downvoted, hidden, saved]
|
62
|
+
# @option params :sort [String] The sorting algorithm [hot, new, top,
|
63
|
+
# controversial]
|
64
|
+
# @option params :t [String] The time for the relevance sort [hour, day,
|
65
|
+
# week, month, year, all]
|
66
|
+
# @option params :username [String] The username of an existing user.
|
67
|
+
# @option params :after [String] The name of the next data block.
|
68
|
+
# @option params :before [String] The name of the previous data block.
|
69
|
+
# @option params :count [Integer] The number of items already in the
|
70
|
+
# listing.
|
71
|
+
# @option params :limit [1..1000] The number of listing items to fetch.
|
72
|
+
# @return [NeonRAW::Objects::Listing] Returns the listing object.
|
73
|
+
%w(overview comments submitted gilded upvoted downvoted
|
74
|
+
hidden saved).each do |type|
|
75
|
+
define_method :"#{type}" do |params = { limit: 25 }|
|
76
|
+
path = "/user/#{name}/#{type}/.json"
|
77
|
+
@client.send(:build_listing, path, params)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
# @!endgroup
|
81
|
+
|
82
|
+
# Give gold to a user.
|
83
|
+
# @!method give_gold(months)
|
84
|
+
# @param months [1..36] The number of months worth of gold to give.
|
85
|
+
def give_gold(months)
|
86
|
+
params = { months: months }
|
87
|
+
@client.request_data("/api/v1/gold/give/#{name}", :post, params)
|
88
|
+
refresh!
|
89
|
+
end
|
90
|
+
|
91
|
+
# Send a PM to a user.
|
92
|
+
# @!method message(subject, text, opts = {})
|
93
|
+
# @param subject [String] The subject of the message (100 characters
|
94
|
+
# maximum).
|
95
|
+
# @param text [String] The text body of the message.
|
96
|
+
# @param opts [Hash] Optional parameters.
|
97
|
+
# @option opts :from_subreddit [String] The subreddit to send the message
|
98
|
+
# from.
|
99
|
+
def message(subject, text, opts = {})
|
100
|
+
params = { api_type: 'json', from_sr: opts[:from_subreddit], text: text,
|
101
|
+
subject: subject, to: name }
|
102
|
+
@client.request_data('/api/compose', :post, params)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Fetches the user's multireddits.
|
106
|
+
# @!method multireddits
|
107
|
+
# @return [Array<NeonRAW::Objects::MultiReddit>] Returns a list of
|
108
|
+
# multireddits.
|
109
|
+
def multireddits
|
110
|
+
data_arr = []
|
111
|
+
params = { expand_srs: false }
|
112
|
+
data = @client.request_data("/api/multi/user/#{name}", :get, params)
|
113
|
+
data.each do |multireddit|
|
114
|
+
data_arr << MultiReddit.new(@client, multireddit[:data])
|
115
|
+
end
|
116
|
+
data_arr
|
117
|
+
end
|
118
|
+
|
119
|
+
# Add the user to your friends list.
|
120
|
+
# @!method friend
|
121
|
+
def friend
|
122
|
+
body = { 'name' => name }.to_json
|
123
|
+
@client.request_data("/api/v1/me/friends/#{name}", :put, {}, body)
|
124
|
+
end
|
125
|
+
|
126
|
+
# Remove the user from your friends list.
|
127
|
+
# @!method unfriend
|
128
|
+
def unfriend
|
129
|
+
params = { id: name }
|
130
|
+
@client.request_nonjson("/api/v1/me/friends/#{name}", :delete, params)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Fetches the user's trophies.
|
134
|
+
# @!method trophies
|
135
|
+
# @return [Array<NeonRAW::Objects::Trophy>] Returns a list of trophies.
|
136
|
+
def trophies
|
137
|
+
data_arr = []
|
138
|
+
path = "/api/v1/user/#{name}/trophies"
|
139
|
+
data = @client.request_data(path, :get)[:data]
|
140
|
+
data[:trophies].each do |trophy|
|
141
|
+
data_arr << Trophy.new(trophy[:data])
|
142
|
+
end
|
143
|
+
data_arr
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
require_relative 'wikipagerevision'
|
2
|
+
require_relative 'listing'
|
3
|
+
|
4
|
+
module NeonRAW
|
5
|
+
module Objects
|
6
|
+
# The wikipage object.
|
7
|
+
# @!attribute [r] revisable?
|
8
|
+
# @return [Boolean] Returns whether or not you can revise the wiki page.
|
9
|
+
# @!attribute [r] content_html
|
10
|
+
# @return [String, nil] Returns the content of the wiki page with HTML or
|
11
|
+
# nil if there is none.
|
12
|
+
# @!attribute [r] content
|
13
|
+
# @return [String, nil] Returns the content of the wiki page or nil if
|
14
|
+
# there is none.
|
15
|
+
# @!attribute [r] name
|
16
|
+
# @return [String] Returns the name of the wiki page.
|
17
|
+
# @!attribute [r] subreddit
|
18
|
+
# @return [String] Returns the subreddit of the wiki page.
|
19
|
+
class WikiPage
|
20
|
+
class << self
|
21
|
+
public :define_method
|
22
|
+
end
|
23
|
+
|
24
|
+
# @!method initialize(client, data)
|
25
|
+
# @param client [NeonRAW::Clients::Web/Installed/Script] The client.
|
26
|
+
# @param data [Hash] The object data.
|
27
|
+
def initialize(client, data)
|
28
|
+
@client = client
|
29
|
+
data.each do |key, value|
|
30
|
+
value = nil if ['', [], {}].include?(value)
|
31
|
+
instance_variable_set(:"@#{key}", value)
|
32
|
+
next if key == :revision_date || key == :revision_by
|
33
|
+
self.class.send(:attr_reader, key)
|
34
|
+
end
|
35
|
+
class << self
|
36
|
+
alias_method :revisable?, :may_revise
|
37
|
+
alias_method :content, :content_md
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# The user who made the last revision to the wiki page.
|
42
|
+
# @!method revised_by
|
43
|
+
# @return [String] Returns the username of the user.
|
44
|
+
def revised_by
|
45
|
+
@revision_by[:data][:name]
|
46
|
+
end
|
47
|
+
|
48
|
+
# The date of the last revision to the wiki page.
|
49
|
+
# @!method revision_date
|
50
|
+
# @return [Time] Returns the date.
|
51
|
+
def revision_date
|
52
|
+
Time.at(@revision_date)
|
53
|
+
end
|
54
|
+
|
55
|
+
# @!group Listings
|
56
|
+
# Gets the revisions made to the wiki page.
|
57
|
+
# @!method revisions(params = { limit: 25 })
|
58
|
+
# @param params [Hash] The parameters.
|
59
|
+
# @option params :after [String] Fullname of the next data block.
|
60
|
+
# @option params :before [String] Fullname of the previous data block.
|
61
|
+
# @option params :count [Integer] The number of items already in the
|
62
|
+
# listing.
|
63
|
+
# @option params :limit [1..1000] The number of listing items to fetch.
|
64
|
+
# @option params :show [String] Literally the string 'all'.
|
65
|
+
# @return [NeonRAW::Objects::Listing] Returns the list of revisions.
|
66
|
+
def revisions(params = { limit: 25 })
|
67
|
+
data_arr = []
|
68
|
+
path = "/r/#{subreddit}/wiki/revisions/#{name}"
|
69
|
+
until data_arr.length == params[:limit]
|
70
|
+
data = @client.request_data(path, :get, params)
|
71
|
+
params[:after] = data[:data][:after]
|
72
|
+
params[:before] = data[:data][:before]
|
73
|
+
data[:data][:children].each do |item|
|
74
|
+
item[:subreddit] = subreddit
|
75
|
+
data_arr << WikiPageRevision.new(@client, item)
|
76
|
+
break if data_arr.length == params[:limit]
|
77
|
+
end
|
78
|
+
break if params[:after].nil?
|
79
|
+
end
|
80
|
+
listing = Objects::Listing.new(params[:after], params[:before])
|
81
|
+
data_arr.each { |revision| listing << revision }
|
82
|
+
listing
|
83
|
+
end
|
84
|
+
|
85
|
+
# Fetches submissions about the wiki page.
|
86
|
+
# @!method discussions(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] The 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
|
+
# @return [NeonRAW::Objects::Listing] Returns a listing with all the
|
95
|
+
# submissions.
|
96
|
+
def discussions(params = { limit: 25 })
|
97
|
+
params[:page] = name
|
98
|
+
path = "/r/#{subreddit}/wiki/discussions/#{name}"
|
99
|
+
@client.send(:build_listing, path, params)
|
100
|
+
end
|
101
|
+
# @!endgroup
|
102
|
+
|
103
|
+
# Change the wiki contributors.
|
104
|
+
# @!method add_editor(username)
|
105
|
+
# @!method remove_editor(username)
|
106
|
+
# @param username [String] The username of the user.
|
107
|
+
%w(add remove).each do |type|
|
108
|
+
define_method :"#{type}_editor" do |username|
|
109
|
+
params = { page: name, username: username }
|
110
|
+
type = 'del' if type == 'remove'
|
111
|
+
params[:act] = type
|
112
|
+
path = "/r/#{subreddit}/api/wiki/alloweditor/#{type}"
|
113
|
+
@client.request_data(path, :post, params)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# Edit the wiki page.
|
118
|
+
# @!method edit!(text, opts = {})
|
119
|
+
# @param text [String] The content for the page.
|
120
|
+
# @param opts [Hash] Optional parameters.
|
121
|
+
# @option opts :reason [String] The reason for the edit (256 characters
|
122
|
+
# maximum).
|
123
|
+
def edit!(text, opts = {})
|
124
|
+
params = { reason: opts[:reason], content: text, page: name }
|
125
|
+
path = "/r/#{subreddit}/api/wiki/edit"
|
126
|
+
@client.request_data(path, :post, params)
|
127
|
+
data = @client.request_data("/r/#{subreddit}/wiki/#{name}", :get)
|
128
|
+
data[:data].each do |key, value|
|
129
|
+
value = nil if ['', [], {}].include?(value)
|
130
|
+
instance_variable_set(:"@#{key}", value)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# Reverts the wiki page to this revision.
|
135
|
+
# @!method revert!(revision)
|
136
|
+
# @param revision [NeonRAW::Objects::WikiPageRevision] The revision you
|
137
|
+
# want to revert back to.
|
138
|
+
def revert!(revision)
|
139
|
+
params = { page: name, revision: revision.id }
|
140
|
+
path = "/r/#{subreddit}/api/wiki/revert"
|
141
|
+
@client.request_data(path, :post, params)
|
142
|
+
path = "/r/#{subreddit}/wiki/#{name}"
|
143
|
+
data = @client.request_data(path, :get, page: name)
|
144
|
+
data[:data].each do |key, value|
|
145
|
+
instance_variable_set(:"@#{key}", value)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# Fetches the settings for the wiki.
|
150
|
+
# @!method settings
|
151
|
+
# @return [Hash<Integer, Array<String>, Boolean>] Returns the wiki
|
152
|
+
# page's settings.
|
153
|
+
def settings
|
154
|
+
path = "/r/#{subreddit}/wiki/settings/#{name}"
|
155
|
+
@client.request_data(path, :get, page: name)[:data]
|
156
|
+
end
|
157
|
+
|
158
|
+
# Edits the settings of the wiki.
|
159
|
+
# @!method edit_settings(data)
|
160
|
+
# @param data [Hash] The parameters.
|
161
|
+
# @option data :listed [Boolean] Whether or not the wiki page will be
|
162
|
+
# listed on the list of wiki pages.
|
163
|
+
# @option data :permlevel [String] Set the permission level needed to
|
164
|
+
# edit the wiki [use_subreddit_settings, approved_only, mods_only].
|
165
|
+
def edit_settings(data)
|
166
|
+
permlevel = { 'use_subreddit_settings' => 0, 'approved_only' => 1,
|
167
|
+
'mods_only' => 2 }
|
168
|
+
params = { page: name, permlevel: permlevel[data[:permlevel]],
|
169
|
+
listed: data[:listed] }
|
170
|
+
params[:page] = name
|
171
|
+
path = "/r/#{subreddit}/wiki/settings/#{name}"
|
172
|
+
@client.request_data(path, :post, params)[:data]
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module NeonRAW
|
2
|
+
module Objects
|
3
|
+
# The wiki page revision object.
|
4
|
+
# @!attribute [r] reason
|
5
|
+
# @return [String, nil] Returns the reason for the revision.
|
6
|
+
# @!attribute [r] page
|
7
|
+
# @return [String] Returns the name of the wiki page.
|
8
|
+
# @!attribute [r] id
|
9
|
+
# @return [String] Returns the ID of the revision.
|
10
|
+
class WikiPageRevision
|
11
|
+
# @!method initialize(client, data)
|
12
|
+
# @param client [NeonRAW::Clients::Web/Installed/Script] The client.
|
13
|
+
# @param data [Hash] The object data.
|
14
|
+
def initialize(client, data)
|
15
|
+
@client = client
|
16
|
+
data.each do |key, value|
|
17
|
+
value = nil if ['', [], {}].include?(value)
|
18
|
+
instance_variable_set(:"@#{key}", value)
|
19
|
+
next if key == :timestamp || key == :author
|
20
|
+
self.class.send(:attr_reader, key)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# @!attribute [r] author
|
25
|
+
# @return [String] Returns the user who made the revision.
|
26
|
+
def author
|
27
|
+
@author[:data][:name]
|
28
|
+
end
|
29
|
+
|
30
|
+
# The time and date when the revision was created.
|
31
|
+
# @!method created
|
32
|
+
# @return [Time] Returns when the revision was made.
|
33
|
+
def created
|
34
|
+
Time.at(@timestamp)
|
35
|
+
end
|
36
|
+
|
37
|
+
# The time and date when the revision was created in UTC.
|
38
|
+
# @!method created_utc
|
39
|
+
# @return [Time] Returns when the revision was made in UTC.
|
40
|
+
def created_utc
|
41
|
+
Time.at(@timestamp).utc
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|