redd 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +24 -10
- data/TODO.md +1 -0
- data/bin/console +4 -3
- data/lib/redd/models/comment.rb +8 -4
- data/lib/redd/models/front_page.rb +5 -3
- data/lib/redd/models/lazy_model.rb +1 -0
- data/lib/redd/models/live_thread.rb +15 -0
- data/lib/redd/models/mod_mail.rb +104 -2
- data/lib/redd/models/more_comments.rb +31 -10
- data/lib/redd/models/multireddit.rb +36 -3
- data/lib/redd/models/session.rb +22 -4
- data/lib/redd/models/subreddit.rb +4 -2
- data/lib/redd/utilities/error_handler.rb +1 -0
- data/lib/redd/utilities/unmarshaller.rb +10 -10
- data/lib/redd/version.rb +1 -1
- metadata +2 -3
- data/lib/redd/models/conversation.rb +0 -82
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0f001106f53af036bc79b0d02fb744f9f8807ac
|
4
|
+
data.tar.gz: dea813c1bc65c8a42e7b533da29787e2f25d5786
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 67c4940373ced4e6513a03168e3e61e56353b5db665e53a5313987f7fd07d86b33f0e93d546428691ee077e9c7731da66a4f9d179858ddaca61b61bfbe6671f5
|
7
|
+
data.tar.gz: 700cbec73a627b874ee3fd254c7cc2d78f8c0455f6c6c17574fa0a5518dd11b2438ff7e36be9e15aa01d2944c4d88bf63bc5a0b9cd811dcc2da775e1d7c00c70
|
data/README.md
CHANGED
@@ -1,12 +1,27 @@
|
|
1
1
|
<div align="center">
|
2
|
-
|
3
|
-
|
2
|
+
<p>
|
3
|
+
<!-- Redd -->
|
4
|
+
<img src="logo.png" width="500"><br>
|
5
|
+
|
6
|
+
<!-- Badges -->
|
7
|
+
<a href="https://rubygems.org/gems/redd">
|
8
|
+
<img src="http://img.shields.io/gem/v/redd.svg?style=flat-square" alt="Gem Version">
|
9
|
+
</a>
|
10
|
+
<a href="https://travis-ci.org/avinashbot/redd">
|
11
|
+
<img src="http://img.shields.io/travis/avinashbot/redd.svg?style=flat-square" alt="Build Status">
|
12
|
+
</a>
|
13
|
+
<a href="https://rubygems.org/gems/redd">
|
14
|
+
<img src="http://img.shields.io/gem/dt/redd.svg?style=flat-square" alt="Gem Downloads">
|
15
|
+
</a>
|
16
|
+
</p>
|
4
17
|
|
5
18
|
<!-- Intro Text -->
|
6
|
-
<
|
7
|
-
|
8
|
-
|
9
|
-
|
19
|
+
<p>
|
20
|
+
<strong>Redd</strong> is an API wrapper
|
21
|
+
for <a href="https://www.reddit.com/dev/api">reddit</a>
|
22
|
+
that is all about being <strong>simple</strong>
|
23
|
+
and <strong>intuitive</strong>.
|
24
|
+
</p>
|
10
25
|
</div>
|
11
26
|
|
12
27
|
---
|
@@ -25,9 +40,8 @@ session = Redd.it(
|
|
25
40
|
session.subreddit('all').comment_stream do |comment|
|
26
41
|
if comment.body.include?('roll a dice')
|
27
42
|
comment.reply("I just rolled a dice! It's a #{rand(1..6)}!")
|
28
|
-
elsif comment.body.include?('flip a coin')
|
29
|
-
|
30
|
-
comment.reply("I just flipped a coin! It's #{coin_face}!")
|
43
|
+
elsif comment.body.include?('flip a coin')
|
44
|
+
comment.reply("I just flipped a coin! It's a #{%w(heads tails).sample}!")
|
31
45
|
end
|
32
46
|
end
|
33
47
|
```
|
@@ -42,7 +56,7 @@ or protect against issues on reddit's end (like 5xx errors).
|
|
42
56
|
|
43
57
|
#### Where can I find the documentation?
|
44
58
|
|
45
|
-
[**
|
59
|
+
[**Gem**](http://www.rubydoc.info/gems/redd/Redd/Models/Session) / [**GitHub**](http://www.rubydoc.info/github/avinashbot/redd/master/Redd/Models/Session)
|
46
60
|
|
47
61
|
#### How can I contact you?
|
48
62
|
[Reddit](https://www.reddit.com/message/compose/?to=Mustermind) /
|
data/TODO.md
CHANGED
data/bin/console
CHANGED
@@ -22,7 +22,7 @@ server.mount_proc '/' do |_, res|
|
|
22
22
|
</style>
|
23
23
|
<div class="wrapper">
|
24
24
|
<h1>redd // quickstart</h1>
|
25
|
-
<a
|
25
|
+
<a href="#" target="_blank" id="btn">Start</a>
|
26
26
|
<span>a new session in your terminal?</span>
|
27
27
|
</div>
|
28
28
|
EOS
|
@@ -36,8 +36,9 @@ server.mount_proc '/authenticate' do |_, res|
|
|
36
36
|
response_type: 'code',
|
37
37
|
state: '0',
|
38
38
|
redirect_uri: 'http://localhost:8000/redirect',
|
39
|
-
'scope': %w(
|
40
|
-
modflair
|
39
|
+
'scope': %w(account creddits edit flair history identity livemanage modconfig modcontributors
|
40
|
+
modflair modlog modmail modothers modposts modself modwiki mysubreddits
|
41
|
+
privatemessages read report save submit subscribe vote wikiedit wikiread)
|
41
42
|
)
|
42
43
|
)
|
43
44
|
end
|
data/lib/redd/models/comment.rb
CHANGED
@@ -19,7 +19,6 @@ module Redd
|
|
19
19
|
include Postable
|
20
20
|
include Replyable
|
21
21
|
|
22
|
-
coerce_attribute :replies
|
23
22
|
coerce_attribute :author, User
|
24
23
|
coerce_attribute :subreddit, Subreddit
|
25
24
|
|
@@ -31,11 +30,11 @@ module Redd
|
|
31
30
|
# FIXME: listings can be empty... (for some reason)
|
32
31
|
|
33
32
|
# Ensure we have the comment's id.
|
34
|
-
id = hash.fetch(:id) { hash.fetch(:name).
|
33
|
+
id = hash.fetch(:id) { hash.fetch(:name).sub('t1_', '') }
|
35
34
|
|
36
35
|
# If we have the link_id, we can load the listing with replies.
|
37
36
|
if hash.key?(:link_id)
|
38
|
-
link_id = hash[:link_id].
|
37
|
+
link_id = hash[:link_id].sub('t3_', '')
|
39
38
|
return new(client, hash) do |c|
|
40
39
|
# The second half contains a single-item listing containing the comment
|
41
40
|
c.get("/comments/#{link_id}/_/#{id}").body[1][:data][:children][0][:data]
|
@@ -52,7 +51,12 @@ module Redd
|
|
52
51
|
private
|
53
52
|
|
54
53
|
def after_initialize
|
55
|
-
@attributes[:replies] =
|
54
|
+
@attributes[:replies] =
|
55
|
+
if !@attributes.key?(:replies) || @attributes[:replies] == ''
|
56
|
+
Listing.new(@client, children: [])
|
57
|
+
else
|
58
|
+
@client.unmarshal(@attributes[:replies])
|
59
|
+
end
|
56
60
|
end
|
57
61
|
end
|
58
62
|
end
|
@@ -21,7 +21,8 @@ module Redd
|
|
21
21
|
end
|
22
22
|
|
23
23
|
# Get the appropriate listing.
|
24
|
-
# @param sort [:hot, :new, :top, :controversial, :comments, :rising] the type of
|
24
|
+
# @param sort [:hot, :new, :top, :controversial, :comments, :rising, :gilded] the type of
|
25
|
+
# listing
|
25
26
|
# @param params [Hash] a list of params to send with the request
|
26
27
|
# @option params [String] :after return results after the given fullname
|
27
28
|
# @option params [String] :before return results before the given fullname
|
@@ -34,7 +35,7 @@ module Redd
|
|
34
35
|
# @return [Listing<Submission>]
|
35
36
|
def listing(sort, **params)
|
36
37
|
params[:t] = params.delete(:time) if params.key?(:time)
|
37
|
-
@client.model(:get, "/#{sort}
|
38
|
+
@client.model(:get, "/#{sort}", params)
|
38
39
|
end
|
39
40
|
|
40
41
|
# @!method hot(**params)
|
@@ -43,9 +44,10 @@ module Redd
|
|
43
44
|
# @!method controversial(**params)
|
44
45
|
# @!method comments(**params)
|
45
46
|
# @!method rising(**params)
|
47
|
+
# @!method gilded(**params)
|
46
48
|
#
|
47
49
|
# @see #listing
|
48
|
-
%i(hot new top controversial comments rising).each do |sort|
|
50
|
+
%i(hot new top controversial comments rising gilded).each do |sort|
|
49
51
|
define_method(sort) { |**params| listing(sort, **params) }
|
50
52
|
end
|
51
53
|
|
@@ -1,11 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'basic_model'
|
3
4
|
require_relative 'lazy_model'
|
4
5
|
|
5
6
|
module Redd
|
6
7
|
module Models
|
7
8
|
# Represents a live thread.
|
8
9
|
class LiveThread < LazyModel
|
10
|
+
# An update in a live thread.
|
11
|
+
class LiveUpdate < BasicModel; end
|
12
|
+
|
9
13
|
# Get a Conversation from its id.
|
10
14
|
# @option hash [String] :id the base36 id (e.g. abc123)
|
11
15
|
# @return [Conversation]
|
@@ -21,6 +25,17 @@ module Redd
|
|
21
25
|
from_response(client, id: id)
|
22
26
|
end
|
23
27
|
|
28
|
+
# Get the updates from the thread.
|
29
|
+
# @param params [Hash] a list of params to send with the request
|
30
|
+
# @option params [String] :after return results after the given fullname
|
31
|
+
# @option params [String] :before return results before the given fullname
|
32
|
+
# @option params [Integer] :count the number of items already seen in the listing
|
33
|
+
# @option params [1..100] :limit the maximum number of things to return
|
34
|
+
# @return [Listing]
|
35
|
+
def updates(**params)
|
36
|
+
@client.model(:get, "/live/#{get_attribute(:id)}", params)
|
37
|
+
end
|
38
|
+
|
24
39
|
# Configure the settings of this live thread
|
25
40
|
# @param params [Hash] a list of params to send with the request
|
26
41
|
# @option params [String] :description the new description
|
data/lib/redd/models/mod_mail.rb
CHANGED
@@ -2,13 +2,99 @@
|
|
2
2
|
|
3
3
|
require_relative 'basic_model'
|
4
4
|
require_relative 'subreddit'
|
5
|
-
require_relative 'conversation'
|
6
5
|
|
7
6
|
module Redd
|
8
7
|
module Models
|
9
8
|
# A container for the new modmail.
|
10
9
|
# XXX: Instead of making ModMail a dumb container, could it be a lazy wrapper for #unread_count?
|
11
10
|
class ModMail < BasicModel
|
11
|
+
# Represents a conversation in the new modmail.
|
12
|
+
# TODO: add modmail-specific user type
|
13
|
+
class Conversation < LazyModel
|
14
|
+
# Get a Conversation from its id.
|
15
|
+
# @option hash [String] :id the base36 id (e.g. abc123)
|
16
|
+
# @return [Conversation]
|
17
|
+
def self.from_response(client, hash)
|
18
|
+
id = hash.fetch(:id)
|
19
|
+
new(client, hash) do |c|
|
20
|
+
response = c.get("/api/mod/conversations/#{id}").body
|
21
|
+
response[:conversation].merge(
|
22
|
+
messages: response[:messages].values.map { |m| Message.from_response(c, m) },
|
23
|
+
user: response[:user],
|
24
|
+
mod_actions: response[:modActions]
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Get a Conversation from its id.
|
30
|
+
# @param id [String] the base36 id (e.g. abc123)
|
31
|
+
# @return [Conversation]
|
32
|
+
def self.from_id(client, id)
|
33
|
+
from_response(client, id: id)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Add a reply to the ongoing conversation.
|
37
|
+
def reply(body, hidden: false, internal: false)
|
38
|
+
# TODO: merge response into the conversation
|
39
|
+
@client.post(
|
40
|
+
"/api/mod/conversations/#{get_attribute(:id)}",
|
41
|
+
body: body, isAuthorHidden: hidden, isInternal: internal
|
42
|
+
).body
|
43
|
+
end
|
44
|
+
|
45
|
+
# Mark this conversation as read.
|
46
|
+
def mark_as_read
|
47
|
+
@client.post('/api/mod/conversations/read', conversationIds: [get_attribute(:id)])
|
48
|
+
end
|
49
|
+
|
50
|
+
# Mark this conversation as unread.
|
51
|
+
def mark_as_unread
|
52
|
+
@client.post('/api/mod/conversations/unread', conversationIds: [get_attribute(:id)])
|
53
|
+
end
|
54
|
+
|
55
|
+
# Mark this conversation as archived.
|
56
|
+
def archive
|
57
|
+
perform_action(:post, 'archive')
|
58
|
+
end
|
59
|
+
|
60
|
+
# Removed this conversation from archived.
|
61
|
+
def unarchive
|
62
|
+
perform_action(:post, 'unarchive')
|
63
|
+
end
|
64
|
+
|
65
|
+
# Highlight this conversation.
|
66
|
+
def highlight
|
67
|
+
perform_action(:post, 'highlight')
|
68
|
+
end
|
69
|
+
|
70
|
+
# Remove the highlight on this conversation.
|
71
|
+
def unhighlight
|
72
|
+
perform_action(:delete, 'highlight')
|
73
|
+
end
|
74
|
+
|
75
|
+
# Mute this conversation.
|
76
|
+
def mute
|
77
|
+
perform_action(:post, 'mute')
|
78
|
+
end
|
79
|
+
|
80
|
+
# Unmute this conversation.
|
81
|
+
def unmute
|
82
|
+
perform_action(:post, 'unmute')
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
# Perform an action on a conversation.
|
88
|
+
# @param method [:post, :delete] the method to use
|
89
|
+
# @param action [String] the name of the action
|
90
|
+
def perform_action(method, action)
|
91
|
+
@client.send(method, "/api/mod/conversations/#{id}/#{action}")
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# A conversation message.
|
96
|
+
class Message < BasicModel; end
|
97
|
+
|
12
98
|
# @return [#highlighted, #notifications, #archived, #new, #inprogress, #mod] the number of
|
13
99
|
# unread messages in each category
|
14
100
|
def unread_count
|
@@ -31,7 +117,23 @@ module Redd
|
|
31
117
|
# state to limit the conversations by
|
32
118
|
def conversations(subreddits: nil, **params)
|
33
119
|
params[:entity] = Array(subreddits).map(&:display_name).join(',') if subreddits
|
34
|
-
@client.get('/api/mod/conversations', **params).body
|
120
|
+
@client.get('/api/mod/conversations', **params).body[:conversations].map do |_, conv|
|
121
|
+
Conversation.from_response(@client, conv)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# Create a new conversation.
|
126
|
+
# @param from [Subreddit] the subreddit to send the conversation from
|
127
|
+
# @param to [User] the person to send the message to
|
128
|
+
# @param subject [String] the message subject
|
129
|
+
# @param body [String] the message body
|
130
|
+
# @return [Conversation] the created conversation
|
131
|
+
def create(from:, to:, subject:, body:, hidden: false)
|
132
|
+
Conversation.from_response(@client, @client.post(
|
133
|
+
'/api/mod/conversations',
|
134
|
+
srName: from.display_name, to: to.name,
|
135
|
+
subject: subject, body: body, isAuthorHidden: hidden
|
136
|
+
).body[:conversation])
|
35
137
|
end
|
36
138
|
|
37
139
|
# Get a conversation from its base36 id.
|
@@ -7,30 +7,51 @@ module Redd
|
|
7
7
|
# An object that represents a bunch of comments that need to be expanded.
|
8
8
|
class MoreComments < BasicModel
|
9
9
|
# Expand the object's children into a listing of Comments and MoreComments.
|
10
|
-
# @param link [
|
10
|
+
# @param link [Submission] the submission the object belongs to
|
11
11
|
# @param sort [String] the sort order of the submission
|
12
12
|
# @return [Listing<Comment, MoreComments>] the expanded children
|
13
13
|
def expand(link:, sort: 'best')
|
14
14
|
@client.model(
|
15
15
|
:get, '/api/morechildren',
|
16
|
-
link_id: link,
|
16
|
+
link_id: link.name,
|
17
17
|
children: get_attribute(:children).join(','),
|
18
18
|
sort: sort
|
19
19
|
)
|
20
20
|
end
|
21
21
|
|
22
|
+
# Keep expanding until all top-level MoreComments are converted to comments.
|
23
|
+
# @param link [Submission] the object's submission
|
24
|
+
# @param sort [String] the sort order of the returned comments
|
25
|
+
# @param lookup [Hash] a hash of comments to add future replies to
|
26
|
+
# @param depth [Number] the maximum recursion depth
|
27
|
+
# @return [Array<Comment, MoreComments>] the expanded comments or {self} if past depth
|
28
|
+
def recursive_expand(link:, sort: 'best', lookup: {}, depth: 10)
|
29
|
+
return [self] if depth == 0
|
30
|
+
|
31
|
+
expand(link: link, sort: sort).flat_map do |thing|
|
32
|
+
if thing.is_a?(MoreComments) && thing.count > 0
|
33
|
+
# Get an array of expanded comments from the thing.
|
34
|
+
ary = thing.recursive_expand(link: link, sort: sort, lookup: lookup, depth: depth - 1)
|
35
|
+
# If we can't find its parent (or if the parent is the submission), add it to the root.
|
36
|
+
next ary unless lookup.key?(thing.parent_id)
|
37
|
+
# Since the thing has a parent that we're tracking, attach it to the parent.
|
38
|
+
lookup[thing.parent_id].replies.children.concat(ary)
|
39
|
+
elsif thing.is_a?(Comment)
|
40
|
+
# Add the comment to a lookup hash.
|
41
|
+
lookup[thing.name] = thing
|
42
|
+
# If the parent is not in the lookup hash, add it to the root listing.
|
43
|
+
next thing unless lookup.key?(thing.parent_id)
|
44
|
+
# If the parent was found, add the child to the parent's replies instead.
|
45
|
+
lookup[thing.parent_id].replies.children << thing
|
46
|
+
end
|
47
|
+
[]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
22
51
|
# @return [Array<String>] an array representation of self
|
23
52
|
def to_ary
|
24
53
|
get_attribute(:children)
|
25
54
|
end
|
26
|
-
|
27
|
-
# Keep expanding until all top-level MoreComments are converted to comments
|
28
|
-
def recursive_expand(link:, sort: 'best')
|
29
|
-
# FIXME: this returns a flattened listing of comments and doesn't preserve the structure
|
30
|
-
expand(link: link, sort: sort).flat_map do |o|
|
31
|
-
o.is_a?(MoreComments) && o.count > 0 ? o.recursive_expand(link: link, sort: sort) : [o]
|
32
|
-
end
|
33
|
-
end
|
34
55
|
end
|
35
56
|
end
|
36
57
|
end
|
@@ -22,10 +22,43 @@ module Redd
|
|
22
22
|
from_response(client, path: id)
|
23
23
|
end
|
24
24
|
|
25
|
+
# Get the appropriate listing.
|
26
|
+
# @param sort [:hot, :new, :top, :controversial, :comments, :rising, :gilded] the type of
|
27
|
+
# listing
|
28
|
+
# @param params [Hash] a list of params to send with the request
|
29
|
+
# @option params [String] :after return results after the given fullname
|
30
|
+
# @option params [String] :before return results before the given fullname
|
31
|
+
# @option params [Integer] :count the number of items already seen in the listing
|
32
|
+
# @option params [1..100] :limit the maximum number of things to return
|
33
|
+
# @option params [:hour, :day, :week, :month, :year, :all] :time the time period to consider
|
34
|
+
# when sorting.
|
35
|
+
#
|
36
|
+
# @note The option :time only applies to the top and controversial sorts.
|
37
|
+
# @return [Listing<Submission>]
|
38
|
+
def listing(sort, **params)
|
39
|
+
params[:t] = params.delete(:time) if params.key?(:time)
|
40
|
+
@client.model(:get, "#{get_attribute(:path)}#{sort}", params)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @!method hot(**params)
|
44
|
+
# @!method new(**params)
|
45
|
+
# @!method top(**params)
|
46
|
+
# @!method controversial(**params)
|
47
|
+
# @!method comments(**params)
|
48
|
+
# @!method rising(**params)
|
49
|
+
# @!method gilded(**params)
|
50
|
+
#
|
51
|
+
# @see #listing
|
52
|
+
%i(hot new top controversial comments rising gilded).each do |sort|
|
53
|
+
define_method(sort) { |**params| listing(sort, **params) }
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
25
58
|
def after_initialize
|
26
|
-
@attributes[:subreddits].map! do |subreddit|
|
27
|
-
|
28
|
-
end
|
59
|
+
# @attributes[:subreddits].map! do |subreddit|
|
60
|
+
# Subreddit.from_response(client, display_name: subreddit[:name])
|
61
|
+
# end
|
29
62
|
end
|
30
63
|
end
|
31
64
|
end
|
data/lib/redd/models/session.rb
CHANGED
@@ -10,7 +10,7 @@ module Redd
|
|
10
10
|
include Searchable
|
11
11
|
|
12
12
|
# @return [ModMail] the new modmail
|
13
|
-
def
|
13
|
+
def mod_mail
|
14
14
|
ModMail.new(@client)
|
15
15
|
end
|
16
16
|
|
@@ -24,6 +24,11 @@ module Redd
|
|
24
24
|
FrontPage.new(@client)
|
25
25
|
end
|
26
26
|
|
27
|
+
# @return [Hash] a breakdown of karma over subreddits
|
28
|
+
def karma_breakdown
|
29
|
+
@client.get('/api/v1/me/karma').body[:data]
|
30
|
+
end
|
31
|
+
|
27
32
|
# @return [User] the logged-in user
|
28
33
|
def me
|
29
34
|
User.new(@client) { |client| client.get('/api/v1/me').body }
|
@@ -49,7 +54,7 @@ module Redd
|
|
49
54
|
end
|
50
55
|
|
51
56
|
# Get a (lazily loaded) multi by its path.
|
52
|
-
# @param path [String] the multi's path,
|
57
|
+
# @param path [String] the multi's path, surrounded by a leading and trailing /
|
53
58
|
# @return [Multireddit]
|
54
59
|
def multi(path)
|
55
60
|
Multireddit.from_id(@client, path)
|
@@ -92,16 +97,29 @@ module Redd
|
|
92
97
|
# @return [Array<User>] the logged-in user's friends
|
93
98
|
def friends
|
94
99
|
@client.get('/api/v1/me/friends').body[:data][:children].map do |h|
|
95
|
-
User.from_response(@client, name: h[:name], id: h[:id].
|
100
|
+
User.from_response(@client, name: h[:name], id: h[:id].sub('t2_', ''), since: h[:date])
|
96
101
|
end
|
97
102
|
end
|
98
103
|
|
99
104
|
# @return [Array<User>] users blocked by the logged-in user
|
100
105
|
def blocked
|
101
106
|
@client.get('/prefs/blocked').body[:data][:children].map do |h|
|
102
|
-
User.from_response(@client, name: h[:name], id: h[:id].
|
107
|
+
User.from_response(@client, name: h[:name], id: h[:id].sub('t2_', ''), since: h[:date])
|
103
108
|
end
|
104
109
|
end
|
110
|
+
|
111
|
+
# Return a listing of the user's subreddits.
|
112
|
+
#
|
113
|
+
# @param type ['subscriber', 'contributor', 'moderator'] the type of subreddits
|
114
|
+
# @param params [Hash] a list of optional params to send with the request
|
115
|
+
# @option params [String] :after return results after the given fullname
|
116
|
+
# @option params [String] :before return results before the given fullname
|
117
|
+
# @option params [Integer] :count (0) the number of items already seen in the listing
|
118
|
+
# @option params [1..100] :limit (25) the maximum number of things to return
|
119
|
+
# @return [Listing<Subreddit>]
|
120
|
+
def my_subreddits(type, **params)
|
121
|
+
@client.model(:get, "/subreddits/mine/#{type}", params)
|
122
|
+
end
|
105
123
|
end
|
106
124
|
end
|
107
125
|
end
|
@@ -69,7 +69,8 @@ module Redd
|
|
69
69
|
# @!group Listings
|
70
70
|
|
71
71
|
# Get the appropriate listing.
|
72
|
-
# @param sort [:hot, :new, :top, :controversial, :comments, :rising] the type of
|
72
|
+
# @param sort [:hot, :new, :top, :controversial, :comments, :rising, :gilded] the type of
|
73
|
+
# listing
|
73
74
|
# @param params [Hash] a list of params to send with the request
|
74
75
|
# @option params [String] :after return results after the given fullname
|
75
76
|
# @option params [String] :before return results before the given fullname
|
@@ -91,9 +92,10 @@ module Redd
|
|
91
92
|
# @!method controversial(**params)
|
92
93
|
# @!method comments(**params)
|
93
94
|
# @!method rising(**params)
|
95
|
+
# @!method gilded(**params)
|
94
96
|
#
|
95
97
|
# @see #listing
|
96
|
-
%i(hot new top controversial comments rising).each do |sort|
|
98
|
+
%i(hot new top controversial comments rising gilded).each do |sort|
|
97
99
|
define_method(sort) { |**params| listing(sort, **params) }
|
98
100
|
end
|
99
101
|
|
@@ -7,16 +7,16 @@ module Redd
|
|
7
7
|
# Contains the mapping from 'kind' strings to classes.
|
8
8
|
# TODO: UserList type!
|
9
9
|
MAPPING = {
|
10
|
-
't1'
|
11
|
-
't2'
|
12
|
-
't3'
|
13
|
-
't4'
|
14
|
-
't5'
|
15
|
-
'more'
|
16
|
-
'wikipage'
|
17
|
-
'Listing'
|
18
|
-
'LabeledMulti'
|
19
|
-
'
|
10
|
+
't1' => Models::Comment,
|
11
|
+
't2' => Models::User,
|
12
|
+
't3' => Models::Submission,
|
13
|
+
't4' => Models::PrivateMessage,
|
14
|
+
't5' => Models::Subreddit,
|
15
|
+
'more' => Models::MoreComments,
|
16
|
+
'wikipage' => Models::WikiPage,
|
17
|
+
'Listing' => Models::Listing,
|
18
|
+
'LabeledMulti' => Models::Multireddit,
|
19
|
+
'LiveUpdate' => Models::LiveThread::LiveUpdate
|
20
20
|
}.freeze
|
21
21
|
|
22
22
|
def initialize(client)
|
data/lib/redd/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Avinash Dwarapu
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: http
|
@@ -152,7 +152,6 @@ files:
|
|
152
152
|
- lib/redd/models/access.rb
|
153
153
|
- lib/redd/models/basic_model.rb
|
154
154
|
- lib/redd/models/comment.rb
|
155
|
-
- lib/redd/models/conversation.rb
|
156
155
|
- lib/redd/models/front_page.rb
|
157
156
|
- lib/redd/models/inboxable.rb
|
158
157
|
- lib/redd/models/lazy_model.rb
|
@@ -1,82 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'lazy_model'
|
4
|
-
|
5
|
-
module Redd
|
6
|
-
module Models
|
7
|
-
# Represents a conversation in the new modmail.
|
8
|
-
# TODO: add message and modmail-specific user type
|
9
|
-
class Conversation < LazyModel
|
10
|
-
# Get a Conversation from its id.
|
11
|
-
# @option hash [String] :id the base36 id (e.g. abc123)
|
12
|
-
# @return [Conversation]
|
13
|
-
def self.from_response(client, hash)
|
14
|
-
id = hash.fetch(:id)
|
15
|
-
new(client) do |c|
|
16
|
-
response = c.get("/api/mod/conversations/#{id}").body
|
17
|
-
response[:conversation].merge(
|
18
|
-
messages: response[:messages],
|
19
|
-
user: response[:user],
|
20
|
-
mod_actions: response[:modActions]
|
21
|
-
)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# Get a Conversation from its id.
|
26
|
-
# @param id [String] the base36 id (e.g. abc123)
|
27
|
-
# @return [Conversation]
|
28
|
-
def self.from_id(client, id)
|
29
|
-
from_response(client, id: id)
|
30
|
-
end
|
31
|
-
|
32
|
-
# Mark this conversation as read.
|
33
|
-
def mark_as_read
|
34
|
-
@client.post('/api/mod/conversations/read', conversationIds: [get_attribute(:id)])
|
35
|
-
end
|
36
|
-
|
37
|
-
# Mark this conversation as unread.
|
38
|
-
def mark_as_unread
|
39
|
-
@client.post('/api/mod/conversations/unread', conversationIds: [get_attribute(:id)])
|
40
|
-
end
|
41
|
-
|
42
|
-
# Mark this conversation as archived.
|
43
|
-
def archive
|
44
|
-
perform_action(:post, 'archive')
|
45
|
-
end
|
46
|
-
|
47
|
-
# Removed this conversation from archived.
|
48
|
-
def unarchive
|
49
|
-
perform_action(:post, 'unarchive')
|
50
|
-
end
|
51
|
-
|
52
|
-
# Highlight this conversation.
|
53
|
-
def highlight
|
54
|
-
perform_action(:post, 'highlight')
|
55
|
-
end
|
56
|
-
|
57
|
-
# Remove the highlight on this conversation.
|
58
|
-
def unhighlight
|
59
|
-
perform_action(:delete, 'highlight')
|
60
|
-
end
|
61
|
-
|
62
|
-
# Mute this conversation.
|
63
|
-
def mute
|
64
|
-
perform_action(:post, 'mute')
|
65
|
-
end
|
66
|
-
|
67
|
-
# Unmute this conversation.
|
68
|
-
def unmute
|
69
|
-
perform_action(:post, 'unmute')
|
70
|
-
end
|
71
|
-
|
72
|
-
private
|
73
|
-
|
74
|
-
# Perform an action on a conversation.
|
75
|
-
# @param method [:post, :delete] the method to use
|
76
|
-
# @param action [String] the name of the action
|
77
|
-
def perform_action(method, action)
|
78
|
-
@client.send(method, "/api/mod/conversations/#{id}/#{action}")
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|