@devvit/reddit 0.11.17-next-2025-05-28-417d95f5a.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +26 -0
- package/README.md +5 -0
- package/RedditClient.d.ts +1155 -0
- package/RedditClient.d.ts.map +1 -0
- package/RedditClient.js +1417 -0
- package/common.d.ts +10 -0
- package/common.d.ts.map +1 -0
- package/common.js +5 -0
- package/getReddit.d.ts +3 -0
- package/getReddit.d.ts.map +1 -0
- package/getReddit.js +8 -0
- package/getRedditApiPlugins.d.ts +23 -0
- package/getRedditApiPlugins.d.ts.map +1 -0
- package/getRedditApiPlugins.js +25 -0
- package/getUserActionsPlugin.d.ts +6 -0
- package/getUserActionsPlugin.d.ts.map +1 -0
- package/getUserActionsPlugin.js +12 -0
- package/graphql/GraphQL.d.ts +10 -0
- package/graphql/GraphQL.d.ts.map +1 -0
- package/graphql/GraphQL.js +27 -0
- package/helpers/makeGettersEnumerable.d.ts +2 -0
- package/helpers/makeGettersEnumerable.d.ts.map +1 -0
- package/helpers/makeGettersEnumerable.js +19 -0
- package/helpers/permissions.d.ts +6 -0
- package/helpers/permissions.d.ts.map +1 -0
- package/helpers/permissions.js +24 -0
- package/helpers/richtextToString.d.ts +3 -0
- package/helpers/richtextToString.d.ts.map +1 -0
- package/helpers/richtextToString.js +14 -0
- package/helpers/textFallbackToRichtext.d.ts +4 -0
- package/helpers/textFallbackToRichtext.d.ts.map +1 -0
- package/helpers/textFallbackToRichtext.js +14 -0
- package/index.d.ts +3 -0
- package/index.d.ts.map +1 -0
- package/index.js +1 -0
- package/models/Comment.d.ts +138 -0
- package/models/Comment.d.ts.map +1 -0
- package/models/Comment.js +597 -0
- package/models/Flair.d.ts +171 -0
- package/models/Flair.d.ts.map +1 -0
- package/models/Flair.js +293 -0
- package/models/Listing.d.ts +53 -0
- package/models/Listing.d.ts.map +1 -0
- package/models/Listing.js +101 -0
- package/models/ModAction.d.ts +32 -0
- package/models/ModAction.d.ts.map +1 -0
- package/models/ModAction.js +70 -0
- package/models/ModMail.d.ts +655 -0
- package/models/ModMail.d.ts.map +1 -0
- package/models/ModMail.js +723 -0
- package/models/ModNote.d.ts +57 -0
- package/models/ModNote.d.ts.map +1 -0
- package/models/ModNote.js +103 -0
- package/models/Post.d.ts +491 -0
- package/models/Post.d.ts.map +1 -0
- package/models/Post.js +1022 -0
- package/models/PrivateMessage.d.ts +52 -0
- package/models/PrivateMessage.d.ts.map +1 -0
- package/models/PrivateMessage.js +126 -0
- package/models/Subreddit.d.ts +606 -0
- package/models/Subreddit.d.ts.map +1 -0
- package/models/Subreddit.js +750 -0
- package/models/User.d.ts +238 -0
- package/models/User.d.ts.map +1 -0
- package/models/User.js +458 -0
- package/models/Vault.d.ts +32 -0
- package/models/Vault.d.ts.map +1 -0
- package/models/Vault.js +25 -0
- package/models/Widget.d.ts +133 -0
- package/models/Widget.d.ts.map +1 -0
- package/models/Widget.js +467 -0
- package/models/WikiPage.d.ts +137 -0
- package/models/WikiPage.d.ts.map +1 -0
- package/models/WikiPage.js +329 -0
- package/models/index.d.ts +14 -0
- package/models/index.d.ts.map +1 -0
- package/models/index.js +13 -0
- package/package.json +46 -0
- package/tests/comment.api.test.d.ts.map +1 -0
- package/tests/flair.api.test.d.ts.map +1 -0
- package/tests/modmail.api.test.d.ts.map +1 -0
- package/tests/modnote.api.test.d.ts.map +1 -0
- package/tests/post.api.test.d.ts.map +1 -0
- package/tests/subreddit.api.test.d.ts.map +1 -0
- package/tests/user.api.test.d.ts.map +1 -0
- package/tests/utils/createTestPreview.d.ts +2 -0
- package/tests/utils/createTestPreview.d.ts.map +1 -0
- package/tests/utils/createTestPreview.js +5 -0
- package/tests/utils/redditApiPluginsMock.d.ts +203 -0
- package/tests/utils/redditApiPluginsMock.d.ts.map +1 -0
- package/tests/utils/redditApiPluginsMock.js +202 -0
- package/tests/utils/runWithTestContext.d.ts +4 -0
- package/tests/utils/runWithTestContext.d.ts.map +1 -0
- package/tests/utils/runWithTestContext.js +12 -0
- package/tests/utils/userActionsPluginMock.d.ts +6 -0
- package/tests/utils/userActionsPluginMock.d.ts.map +1 -0
- package/tests/utils/userActionsPluginMock.js +5 -0
|
@@ -0,0 +1,597 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _a, _Comment_id, _Comment_authorId, _Comment_authorName, _Comment_body, _Comment_createdAt, _Comment_parentId, _Comment_postId, _Comment_subredditId, _Comment_subredditName, _Comment_replies, _Comment_approved, _Comment_approvedAtUtc, _Comment_bannedAtUtc, _Comment_edited, _Comment_locked, _Comment_removed, _Comment_stickied, _Comment_spam, _Comment_distinguishedBy, _Comment_numReports, _Comment_collapsedBecauseCrowdControl, _Comment_score, _Comment_permalink, _Comment_modReportReasons, _Comment_userReportReasons, _Comment_url, _Comment_ignoringReports, _Comment_getCommentsListing, _Comment_buildCommentsTree, _Comment_metadata_get;
|
|
13
|
+
import { getContext } from '@devvit/server';
|
|
14
|
+
import { assertNonNull } from '@devvit/shared-types/NonNull.js';
|
|
15
|
+
import { asT1ID, asT2ID, asT3ID, asT5ID, isCommentId, isT1ID } from '@devvit/shared-types/tid.js';
|
|
16
|
+
import { RunAs } from '../common.js';
|
|
17
|
+
import { getRedditApiPlugins } from '../getRedditApiPlugins.js';
|
|
18
|
+
import { getUserActionsPlugin } from '../getUserActionsPlugin.js';
|
|
19
|
+
import { makeGettersEnumerable } from '../helpers/makeGettersEnumerable.js';
|
|
20
|
+
import { richtextToString } from '../helpers/richtextToString.js';
|
|
21
|
+
import { Listing } from './Listing.js';
|
|
22
|
+
import { ModNote } from './ModNote.js';
|
|
23
|
+
import { User } from './User.js';
|
|
24
|
+
export class Comment {
|
|
25
|
+
/**
|
|
26
|
+
* @internal
|
|
27
|
+
*/
|
|
28
|
+
constructor(data) {
|
|
29
|
+
_Comment_id.set(this, void 0);
|
|
30
|
+
_Comment_authorId.set(this, void 0);
|
|
31
|
+
_Comment_authorName.set(this, void 0);
|
|
32
|
+
_Comment_body.set(this, void 0);
|
|
33
|
+
_Comment_createdAt.set(this, void 0);
|
|
34
|
+
_Comment_parentId.set(this, void 0);
|
|
35
|
+
_Comment_postId.set(this, void 0);
|
|
36
|
+
_Comment_subredditId.set(this, void 0);
|
|
37
|
+
_Comment_subredditName.set(this, void 0);
|
|
38
|
+
_Comment_replies.set(this, void 0);
|
|
39
|
+
_Comment_approved.set(this, void 0);
|
|
40
|
+
_Comment_approvedAtUtc.set(this, void 0);
|
|
41
|
+
_Comment_bannedAtUtc.set(this, void 0);
|
|
42
|
+
_Comment_edited.set(this, void 0);
|
|
43
|
+
_Comment_locked.set(this, void 0);
|
|
44
|
+
_Comment_removed.set(this, void 0);
|
|
45
|
+
_Comment_stickied.set(this, void 0);
|
|
46
|
+
_Comment_spam.set(this, void 0);
|
|
47
|
+
_Comment_distinguishedBy.set(this, void 0);
|
|
48
|
+
_Comment_numReports.set(this, void 0);
|
|
49
|
+
_Comment_collapsedBecauseCrowdControl.set(this, void 0);
|
|
50
|
+
_Comment_score.set(this, void 0);
|
|
51
|
+
_Comment_permalink.set(this, void 0);
|
|
52
|
+
_Comment_modReportReasons.set(this, void 0);
|
|
53
|
+
_Comment_userReportReasons.set(this, void 0);
|
|
54
|
+
_Comment_url.set(this, void 0);
|
|
55
|
+
_Comment_ignoringReports.set(this, void 0);
|
|
56
|
+
makeGettersEnumerable(this);
|
|
57
|
+
assertNonNull(data.id, 'Comment id is null or undefined');
|
|
58
|
+
assertNonNull(data.body, 'Comment body is null or undefined');
|
|
59
|
+
assertNonNull(data.createdUtc, 'Comment is missing created date');
|
|
60
|
+
assertNonNull(data.author, 'Comment author is null or undefined');
|
|
61
|
+
assertNonNull(data.parentId, 'Comment parentId is null or undefined');
|
|
62
|
+
assertNonNull(data.linkId, 'Comment linkId is null or undefined');
|
|
63
|
+
assertNonNull(data.permalink, 'Comment permalink is null or undefined');
|
|
64
|
+
assertNonNull(data.subreddit, 'Comment is missing subreddit name');
|
|
65
|
+
assertNonNull(data.subredditId, 'Comment is missing subreddit id');
|
|
66
|
+
__classPrivateFieldSet(this, _Comment_id, asT1ID(`t1_${data.id}`), "f");
|
|
67
|
+
__classPrivateFieldSet(this, _Comment_authorId, data.authorFullname ? asT2ID(data.authorFullname) : undefined, "f");
|
|
68
|
+
__classPrivateFieldSet(this, _Comment_authorName, data.author, "f");
|
|
69
|
+
__classPrivateFieldSet(this, _Comment_body, data.body, "f");
|
|
70
|
+
__classPrivateFieldSet(this, _Comment_subredditId, asT5ID(data.subredditId), "f");
|
|
71
|
+
__classPrivateFieldSet(this, _Comment_subredditName, data.subreddit, "f");
|
|
72
|
+
__classPrivateFieldSet(this, _Comment_parentId, isCommentId(data.parentId) ? asT1ID(data.parentId) : asT3ID(data.parentId), "f");
|
|
73
|
+
__classPrivateFieldSet(this, _Comment_postId, asT3ID(data.linkId), "f");
|
|
74
|
+
__classPrivateFieldSet(this, _Comment_edited, data.edited ?? false, "f");
|
|
75
|
+
__classPrivateFieldSet(this, _Comment_locked, data.locked ?? false, "f");
|
|
76
|
+
__classPrivateFieldSet(this, _Comment_removed, data.removed ?? false, "f");
|
|
77
|
+
__classPrivateFieldSet(this, _Comment_stickied, data.stickied ?? false, "f");
|
|
78
|
+
__classPrivateFieldSet(this, _Comment_approved, data.approved ?? false, "f");
|
|
79
|
+
__classPrivateFieldSet(this, _Comment_approvedAtUtc, data.approvedAtUtc ?? 0, "f");
|
|
80
|
+
__classPrivateFieldSet(this, _Comment_bannedAtUtc, data.bannedAtUtc ?? 0, "f");
|
|
81
|
+
__classPrivateFieldSet(this, _Comment_spam, data.spam ?? false, "f");
|
|
82
|
+
__classPrivateFieldSet(this, _Comment_distinguishedBy, data.distinguished, "f");
|
|
83
|
+
__classPrivateFieldSet(this, _Comment_numReports, data.numReports ?? 0, "f");
|
|
84
|
+
__classPrivateFieldSet(this, _Comment_collapsedBecauseCrowdControl, data.collapsedBecauseCrowdControl ?? false, "f");
|
|
85
|
+
__classPrivateFieldSet(this, _Comment_score, data.score ?? 0, "f");
|
|
86
|
+
__classPrivateFieldSet(this, _Comment_permalink, data.permalink, "f");
|
|
87
|
+
// R2 API does not include a URL for a comment, just a permalink
|
|
88
|
+
__classPrivateFieldSet(this, _Comment_url, new URL(data.permalink ?? '', 'https://www.reddit.com/').toString(), "f");
|
|
89
|
+
__classPrivateFieldSet(this, _Comment_ignoringReports, data.ignoreReports ?? false, "f");
|
|
90
|
+
__classPrivateFieldSet(this, _Comment_modReportReasons, (data.modReports ?? []).map(([reason]) => reason), "f");
|
|
91
|
+
__classPrivateFieldSet(this, _Comment_userReportReasons, (data.userReports ?? []).map(([reason]) => reason), "f");
|
|
92
|
+
const createdAt = new Date(0);
|
|
93
|
+
createdAt.setUTCSeconds(data.createdUtc);
|
|
94
|
+
__classPrivateFieldSet(this, _Comment_createdAt, createdAt, "f");
|
|
95
|
+
__classPrivateFieldSet(this, _Comment_replies, __classPrivateFieldGet(_a, _a, "m", _Comment_getCommentsListing).call(_a, {
|
|
96
|
+
postId: __classPrivateFieldGet(this, _Comment_postId, "f"),
|
|
97
|
+
commentId: __classPrivateFieldGet(this, _Comment_id, "f"),
|
|
98
|
+
}), "f");
|
|
99
|
+
}
|
|
100
|
+
get id() {
|
|
101
|
+
return __classPrivateFieldGet(this, _Comment_id, "f");
|
|
102
|
+
}
|
|
103
|
+
get authorId() {
|
|
104
|
+
return __classPrivateFieldGet(this, _Comment_authorId, "f");
|
|
105
|
+
}
|
|
106
|
+
get authorName() {
|
|
107
|
+
return __classPrivateFieldGet(this, _Comment_authorName, "f");
|
|
108
|
+
}
|
|
109
|
+
get subredditId() {
|
|
110
|
+
return __classPrivateFieldGet(this, _Comment_subredditId, "f");
|
|
111
|
+
}
|
|
112
|
+
get subredditName() {
|
|
113
|
+
return __classPrivateFieldGet(this, _Comment_subredditName, "f");
|
|
114
|
+
}
|
|
115
|
+
get body() {
|
|
116
|
+
return __classPrivateFieldGet(this, _Comment_body, "f");
|
|
117
|
+
}
|
|
118
|
+
get createdAt() {
|
|
119
|
+
return __classPrivateFieldGet(this, _Comment_createdAt, "f");
|
|
120
|
+
}
|
|
121
|
+
get parentId() {
|
|
122
|
+
return __classPrivateFieldGet(this, _Comment_parentId, "f");
|
|
123
|
+
}
|
|
124
|
+
get postId() {
|
|
125
|
+
return __classPrivateFieldGet(this, _Comment_postId, "f");
|
|
126
|
+
}
|
|
127
|
+
get replies() {
|
|
128
|
+
return __classPrivateFieldGet(this, _Comment_replies, "f");
|
|
129
|
+
}
|
|
130
|
+
get distinguishedBy() {
|
|
131
|
+
return __classPrivateFieldGet(this, _Comment_distinguishedBy, "f");
|
|
132
|
+
}
|
|
133
|
+
get locked() {
|
|
134
|
+
return __classPrivateFieldGet(this, _Comment_locked, "f");
|
|
135
|
+
}
|
|
136
|
+
get stickied() {
|
|
137
|
+
return __classPrivateFieldGet(this, _Comment_stickied, "f");
|
|
138
|
+
}
|
|
139
|
+
get removed() {
|
|
140
|
+
return __classPrivateFieldGet(this, _Comment_removed, "f");
|
|
141
|
+
}
|
|
142
|
+
get approved() {
|
|
143
|
+
return __classPrivateFieldGet(this, _Comment_approved, "f");
|
|
144
|
+
}
|
|
145
|
+
get approvedAtUtc() {
|
|
146
|
+
return __classPrivateFieldGet(this, _Comment_approvedAtUtc, "f");
|
|
147
|
+
}
|
|
148
|
+
get bannedAtUtc() {
|
|
149
|
+
return __classPrivateFieldGet(this, _Comment_bannedAtUtc, "f");
|
|
150
|
+
}
|
|
151
|
+
get spam() {
|
|
152
|
+
return __classPrivateFieldGet(this, _Comment_spam, "f");
|
|
153
|
+
}
|
|
154
|
+
get edited() {
|
|
155
|
+
return __classPrivateFieldGet(this, _Comment_edited, "f");
|
|
156
|
+
}
|
|
157
|
+
get numReports() {
|
|
158
|
+
return __classPrivateFieldGet(this, _Comment_numReports, "f");
|
|
159
|
+
}
|
|
160
|
+
get collapsedBecauseCrowdControl() {
|
|
161
|
+
return __classPrivateFieldGet(this, _Comment_collapsedBecauseCrowdControl, "f");
|
|
162
|
+
}
|
|
163
|
+
get score() {
|
|
164
|
+
return __classPrivateFieldGet(this, _Comment_score, "f");
|
|
165
|
+
}
|
|
166
|
+
get permalink() {
|
|
167
|
+
return __classPrivateFieldGet(this, _Comment_permalink, "f");
|
|
168
|
+
}
|
|
169
|
+
get userReportReasons() {
|
|
170
|
+
return __classPrivateFieldGet(this, _Comment_userReportReasons, "f");
|
|
171
|
+
}
|
|
172
|
+
get modReportReasons() {
|
|
173
|
+
return __classPrivateFieldGet(this, _Comment_modReportReasons, "f");
|
|
174
|
+
}
|
|
175
|
+
get url() {
|
|
176
|
+
return __classPrivateFieldGet(this, _Comment_url, "f");
|
|
177
|
+
}
|
|
178
|
+
get ignoringReports() {
|
|
179
|
+
return __classPrivateFieldGet(this, _Comment_ignoringReports, "f");
|
|
180
|
+
}
|
|
181
|
+
toJSON() {
|
|
182
|
+
return {
|
|
183
|
+
id: this.id,
|
|
184
|
+
authorName: this.authorName,
|
|
185
|
+
subredditId: this.subredditId,
|
|
186
|
+
subredditName: this.subredditName,
|
|
187
|
+
body: this.body,
|
|
188
|
+
createdAt: this.createdAt,
|
|
189
|
+
parentId: this.parentId,
|
|
190
|
+
postId: this.postId,
|
|
191
|
+
replies: this.replies,
|
|
192
|
+
approved: this.approved,
|
|
193
|
+
locked: this.locked,
|
|
194
|
+
removed: this.removed,
|
|
195
|
+
stickied: this.stickied,
|
|
196
|
+
spam: this.spam,
|
|
197
|
+
edited: this.edited,
|
|
198
|
+
distinguishedBy: this.distinguishedBy,
|
|
199
|
+
numReports: this.numReports,
|
|
200
|
+
collapsedBecauseCrowdControl: this.collapsedBecauseCrowdControl,
|
|
201
|
+
score: this.score,
|
|
202
|
+
permalink: this.permalink,
|
|
203
|
+
modReportReasons: this.modReportReasons,
|
|
204
|
+
userReportReasons: this.userReportReasons,
|
|
205
|
+
url: this.url,
|
|
206
|
+
ignoringReports: this.ignoringReports,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
isLocked() {
|
|
210
|
+
return __classPrivateFieldGet(this, _Comment_locked, "f");
|
|
211
|
+
}
|
|
212
|
+
isApproved() {
|
|
213
|
+
return __classPrivateFieldGet(this, _Comment_approved, "f");
|
|
214
|
+
}
|
|
215
|
+
isRemoved() {
|
|
216
|
+
return __classPrivateFieldGet(this, _Comment_removed, "f");
|
|
217
|
+
}
|
|
218
|
+
isSpam() {
|
|
219
|
+
return __classPrivateFieldGet(this, _Comment_spam, "f");
|
|
220
|
+
}
|
|
221
|
+
isStickied() {
|
|
222
|
+
return __classPrivateFieldGet(this, _Comment_stickied, "f");
|
|
223
|
+
}
|
|
224
|
+
isDistinguished() {
|
|
225
|
+
return Boolean(__classPrivateFieldGet(this, _Comment_distinguishedBy, "f"));
|
|
226
|
+
}
|
|
227
|
+
isEdited() {
|
|
228
|
+
return __classPrivateFieldGet(this, _Comment_edited, "f");
|
|
229
|
+
}
|
|
230
|
+
isIgnoringReports() {
|
|
231
|
+
return __classPrivateFieldGet(this, _Comment_ignoringReports, "f");
|
|
232
|
+
}
|
|
233
|
+
async delete() {
|
|
234
|
+
return _a.delete(this.id);
|
|
235
|
+
}
|
|
236
|
+
async edit(options) {
|
|
237
|
+
const newComment = await _a.edit({
|
|
238
|
+
id: this.id,
|
|
239
|
+
...options,
|
|
240
|
+
});
|
|
241
|
+
__classPrivateFieldSet(this, _Comment_body, newComment.body, "f");
|
|
242
|
+
__classPrivateFieldSet(this, _Comment_edited, newComment.edited, "f");
|
|
243
|
+
return this;
|
|
244
|
+
}
|
|
245
|
+
async approve() {
|
|
246
|
+
await _a.approve(this.id);
|
|
247
|
+
__classPrivateFieldSet(this, _Comment_approved, true, "f");
|
|
248
|
+
__classPrivateFieldSet(this, _Comment_removed, false, "f");
|
|
249
|
+
}
|
|
250
|
+
async remove(isSpam = false) {
|
|
251
|
+
await _a.remove(this.id, isSpam);
|
|
252
|
+
__classPrivateFieldSet(this, _Comment_removed, true, "f");
|
|
253
|
+
__classPrivateFieldSet(this, _Comment_spam, isSpam, "f");
|
|
254
|
+
__classPrivateFieldSet(this, _Comment_approved, false, "f");
|
|
255
|
+
}
|
|
256
|
+
async lock() {
|
|
257
|
+
await _a.lock(this.id);
|
|
258
|
+
__classPrivateFieldSet(this, _Comment_locked, true, "f");
|
|
259
|
+
}
|
|
260
|
+
async unlock() {
|
|
261
|
+
await _a.unlock(this.id);
|
|
262
|
+
__classPrivateFieldSet(this, _Comment_locked, false, "f");
|
|
263
|
+
}
|
|
264
|
+
async reply(options) {
|
|
265
|
+
return _a.submit({
|
|
266
|
+
id: this.id,
|
|
267
|
+
...options,
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
async getAuthor() {
|
|
271
|
+
return User.getByUsername(__classPrivateFieldGet(this, _Comment_authorName, "f"));
|
|
272
|
+
}
|
|
273
|
+
async distinguish(makeSticky = false) {
|
|
274
|
+
const { distinguishedBy, stickied } = await _a.distinguish(this.id, makeSticky, false);
|
|
275
|
+
__classPrivateFieldSet(this, _Comment_distinguishedBy, distinguishedBy, "f");
|
|
276
|
+
__classPrivateFieldSet(this, _Comment_stickied, stickied, "f");
|
|
277
|
+
}
|
|
278
|
+
async distinguishAsAdmin(makeSticky = false) {
|
|
279
|
+
const { distinguishedBy, stickied } = await _a.distinguish(this.id, makeSticky, true);
|
|
280
|
+
__classPrivateFieldSet(this, _Comment_distinguishedBy, distinguishedBy, "f");
|
|
281
|
+
__classPrivateFieldSet(this, _Comment_stickied, stickied, "f");
|
|
282
|
+
}
|
|
283
|
+
async undistinguish() {
|
|
284
|
+
const { distinguishedBy, stickied } = await _a.undistinguish(this.id);
|
|
285
|
+
__classPrivateFieldSet(this, _Comment_distinguishedBy, distinguishedBy, "f");
|
|
286
|
+
__classPrivateFieldSet(this, _Comment_stickied, stickied, "f");
|
|
287
|
+
}
|
|
288
|
+
async ignoreReports() {
|
|
289
|
+
await _a.ignoreReports(this.id);
|
|
290
|
+
__classPrivateFieldSet(this, _Comment_ignoringReports, true, "f");
|
|
291
|
+
}
|
|
292
|
+
async unignoreReports() {
|
|
293
|
+
await _a.unignoreReports(this.id);
|
|
294
|
+
__classPrivateFieldSet(this, _Comment_ignoringReports, false, "f");
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Add a mod note for why the comment was removed
|
|
298
|
+
*
|
|
299
|
+
* @param options.reasonId id of a Removal Reason - you can leave this as an empty string if you don't have one
|
|
300
|
+
* @param options.modNote the reason for removal (maximum 100 characters) (optional)
|
|
301
|
+
* @returns
|
|
302
|
+
*/
|
|
303
|
+
addRemovalNote(options) {
|
|
304
|
+
return ModNote.addRemovalNote({ itemIds: [__classPrivateFieldGet(this, _Comment_id, "f")], ...options });
|
|
305
|
+
}
|
|
306
|
+
/** @internal */
|
|
307
|
+
static async getById(id) {
|
|
308
|
+
const client = getRedditApiPlugins().LinksAndComments;
|
|
309
|
+
const commentId = isT1ID(id) ? id : `t1_${id}`;
|
|
310
|
+
const response = await client.Info({
|
|
311
|
+
subreddits: [],
|
|
312
|
+
thingIds: [commentId],
|
|
313
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
314
|
+
if (!response.data?.children?.[0]?.data) {
|
|
315
|
+
throw new Error('not found');
|
|
316
|
+
}
|
|
317
|
+
return new _a(response.data.children[0].data);
|
|
318
|
+
}
|
|
319
|
+
/** @internal */
|
|
320
|
+
static getComments(options) {
|
|
321
|
+
const { postId, commentId, ...rest } = options;
|
|
322
|
+
return __classPrivateFieldGet(_a, _a, "m", _Comment_getCommentsListing).call(_a, {
|
|
323
|
+
postId: asT3ID(postId),
|
|
324
|
+
commentId: commentId ? asT1ID(commentId) : undefined,
|
|
325
|
+
...rest,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
/** @internal */
|
|
329
|
+
static async edit(options) {
|
|
330
|
+
const client = getRedditApiPlugins().LinksAndComments;
|
|
331
|
+
const { id } = options;
|
|
332
|
+
let richtextString;
|
|
333
|
+
if ('richtext' in options) {
|
|
334
|
+
richtextString = richtextToString(options.richtext);
|
|
335
|
+
}
|
|
336
|
+
const response = await client.EditUserText({
|
|
337
|
+
thingId: id,
|
|
338
|
+
text: 'text' in options ? options.text : '',
|
|
339
|
+
richtextJson: richtextString,
|
|
340
|
+
runAs: RunAs.APP,
|
|
341
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
342
|
+
if (response.json?.errors?.length) {
|
|
343
|
+
throw new Error('Failed to edit comment');
|
|
344
|
+
}
|
|
345
|
+
const comment = response.json?.data?.things?.[0]?.data;
|
|
346
|
+
assertNonNull(comment);
|
|
347
|
+
return new _a(comment);
|
|
348
|
+
}
|
|
349
|
+
/** @internal */
|
|
350
|
+
static async delete(id) {
|
|
351
|
+
const client = getRedditApiPlugins().LinksAndComments;
|
|
352
|
+
await client.Del({
|
|
353
|
+
id,
|
|
354
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
355
|
+
}
|
|
356
|
+
/** @internal */
|
|
357
|
+
static async approve(id) {
|
|
358
|
+
const client = getRedditApiPlugins().Moderation;
|
|
359
|
+
await client.Approve({
|
|
360
|
+
id,
|
|
361
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
362
|
+
}
|
|
363
|
+
/** @internal */
|
|
364
|
+
static async remove(id, isSpam = false) {
|
|
365
|
+
const client = getRedditApiPlugins().Moderation;
|
|
366
|
+
await client.Remove({
|
|
367
|
+
id,
|
|
368
|
+
spam: isSpam,
|
|
369
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
370
|
+
}
|
|
371
|
+
/** @internal */
|
|
372
|
+
static async lock(id) {
|
|
373
|
+
const client = getRedditApiPlugins().LinksAndComments;
|
|
374
|
+
await client.Lock({
|
|
375
|
+
id,
|
|
376
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
377
|
+
}
|
|
378
|
+
/** @internal */
|
|
379
|
+
static async unlock(id) {
|
|
380
|
+
const client = getRedditApiPlugins().LinksAndComments;
|
|
381
|
+
await client.Unlock({
|
|
382
|
+
id,
|
|
383
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
384
|
+
}
|
|
385
|
+
/** @internal */
|
|
386
|
+
static async submit(options) {
|
|
387
|
+
const { runAs = 'APP' } = options;
|
|
388
|
+
const runAsType = RunAs[runAs];
|
|
389
|
+
const client = runAsType === RunAs.USER ? getUserActionsPlugin() : getRedditApiPlugins().LinksAndComments;
|
|
390
|
+
const { id } = options;
|
|
391
|
+
let richtextString;
|
|
392
|
+
if ('richtext' in options) {
|
|
393
|
+
richtextString = richtextToString(options.richtext);
|
|
394
|
+
}
|
|
395
|
+
const response = await client.Comment({
|
|
396
|
+
thingId: id,
|
|
397
|
+
text: 'text' in options ? options.text : '',
|
|
398
|
+
richtextJson: richtextString,
|
|
399
|
+
runAs: runAsType,
|
|
400
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
401
|
+
// TODO: figure out a better errors to throw
|
|
402
|
+
if (response.json?.errors?.length) {
|
|
403
|
+
throw new Error('failed to reply to comment');
|
|
404
|
+
}
|
|
405
|
+
const data = response.json?.data?.things?.[0]?.data;
|
|
406
|
+
assertNonNull(data);
|
|
407
|
+
return new _a(data);
|
|
408
|
+
}
|
|
409
|
+
/** @internal */
|
|
410
|
+
static async distinguish(id, sticky, asAdmin) {
|
|
411
|
+
const client = getRedditApiPlugins().Moderation;
|
|
412
|
+
const response = await client.Distinguish({
|
|
413
|
+
id,
|
|
414
|
+
how: asAdmin ? 'admin' : 'yes',
|
|
415
|
+
sticky,
|
|
416
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
417
|
+
const comment = response.json?.data?.things?.[0]?.data;
|
|
418
|
+
assertNonNull(comment);
|
|
419
|
+
return {
|
|
420
|
+
distinguishedBy: comment.distinguished,
|
|
421
|
+
stickied: Boolean(comment.stickied),
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
/** @internal */
|
|
425
|
+
static async undistinguish(id) {
|
|
426
|
+
const client = getRedditApiPlugins().Moderation;
|
|
427
|
+
const response = await client.Distinguish({
|
|
428
|
+
id,
|
|
429
|
+
how: 'no',
|
|
430
|
+
sticky: false,
|
|
431
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
432
|
+
const comment = response.json?.data?.things?.[0]?.data;
|
|
433
|
+
assertNonNull(comment);
|
|
434
|
+
return {
|
|
435
|
+
distinguishedBy: comment.distinguished,
|
|
436
|
+
stickied: Boolean(comment.stickied),
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
/** @internal */
|
|
440
|
+
static getCommentsByUser(options) {
|
|
441
|
+
const client = getRedditApiPlugins().Users;
|
|
442
|
+
return new Listing({
|
|
443
|
+
hasMore: true,
|
|
444
|
+
before: options.before,
|
|
445
|
+
after: options.after,
|
|
446
|
+
pageSize: options.pageSize,
|
|
447
|
+
limit: options.limit,
|
|
448
|
+
fetch: async (fetchOptions) => {
|
|
449
|
+
const response = await client.UserWhere({
|
|
450
|
+
username: options.username,
|
|
451
|
+
where: 'comments',
|
|
452
|
+
...fetchOptions,
|
|
453
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
454
|
+
assertNonNull(response.data, 'Failed to get comments for user');
|
|
455
|
+
const children = response.data.children?.map((child) => new _a(child.data)) || [];
|
|
456
|
+
return {
|
|
457
|
+
children,
|
|
458
|
+
before: response.data.before,
|
|
459
|
+
after: response.data.after,
|
|
460
|
+
};
|
|
461
|
+
},
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
/** @internal */
|
|
465
|
+
static async ignoreReports(id) {
|
|
466
|
+
const client = getRedditApiPlugins().Moderation;
|
|
467
|
+
await client.IgnoreReports({
|
|
468
|
+
id,
|
|
469
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
470
|
+
}
|
|
471
|
+
/** @internal */
|
|
472
|
+
static async unignoreReports(id) {
|
|
473
|
+
const client = getRedditApiPlugins().Moderation;
|
|
474
|
+
await client.UnignoreReports({
|
|
475
|
+
id,
|
|
476
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
_a = Comment, _Comment_id = new WeakMap(), _Comment_authorId = new WeakMap(), _Comment_authorName = new WeakMap(), _Comment_body = new WeakMap(), _Comment_createdAt = new WeakMap(), _Comment_parentId = new WeakMap(), _Comment_postId = new WeakMap(), _Comment_subredditId = new WeakMap(), _Comment_subredditName = new WeakMap(), _Comment_replies = new WeakMap(), _Comment_approved = new WeakMap(), _Comment_approvedAtUtc = new WeakMap(), _Comment_bannedAtUtc = new WeakMap(), _Comment_edited = new WeakMap(), _Comment_locked = new WeakMap(), _Comment_removed = new WeakMap(), _Comment_stickied = new WeakMap(), _Comment_spam = new WeakMap(), _Comment_distinguishedBy = new WeakMap(), _Comment_numReports = new WeakMap(), _Comment_collapsedBecauseCrowdControl = new WeakMap(), _Comment_score = new WeakMap(), _Comment_permalink = new WeakMap(), _Comment_modReportReasons = new WeakMap(), _Comment_userReportReasons = new WeakMap(), _Comment_url = new WeakMap(), _Comment_ignoringReports = new WeakMap(), _Comment_getCommentsListing = function _Comment_getCommentsListing(options, depthOffset = 0) {
|
|
480
|
+
return new Listing({
|
|
481
|
+
limit: options.limit,
|
|
482
|
+
pageSize: options.pageSize,
|
|
483
|
+
fetch: async (fetchOptions) => {
|
|
484
|
+
let limit = fetchOptions.limit;
|
|
485
|
+
const listingsClient = getRedditApiPlugins().Listings;
|
|
486
|
+
const linksAndCommentsClient = getRedditApiPlugins().LinksAndComments;
|
|
487
|
+
let commentId = options.commentId;
|
|
488
|
+
if (fetchOptions.more) {
|
|
489
|
+
if (fetchOptions.more.children.length) {
|
|
490
|
+
const more = fetchOptions.more;
|
|
491
|
+
// The maximum page size for MoreChildren is 100
|
|
492
|
+
if (!limit || limit > 100) {
|
|
493
|
+
limit = 100;
|
|
494
|
+
}
|
|
495
|
+
const moreIds = more.children.splice(0, limit);
|
|
496
|
+
const response = await linksAndCommentsClient.MoreChildren({
|
|
497
|
+
linkId: options.postId,
|
|
498
|
+
children: moreIds,
|
|
499
|
+
sort: options.sort,
|
|
500
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
501
|
+
if (!response.json?.data?.things?.length) {
|
|
502
|
+
return { children: [] };
|
|
503
|
+
}
|
|
504
|
+
const { children } = __classPrivateFieldGet(_a, _a, "m", _Comment_buildCommentsTree).call(_a, response.json.data.things, options.postId, options);
|
|
505
|
+
return { children, more: more.children.length ? more : undefined };
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
// parentId is only ever T3 for the MoreChildren case.
|
|
509
|
+
commentId = fetchOptions.more.parentId;
|
|
510
|
+
depthOffset = depthOffset + fetchOptions.more.depth;
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
const response = await listingsClient.Comments({
|
|
514
|
+
article: options.postId.substring(3),
|
|
515
|
+
comment: commentId?.substring(3),
|
|
516
|
+
limit,
|
|
517
|
+
depth: options.depth,
|
|
518
|
+
sort: options.sort,
|
|
519
|
+
}, __classPrivateFieldGet(this, _a, "a", _Comment_metadata_get));
|
|
520
|
+
// The first item of `response.listings` is always the post (t3) listing
|
|
521
|
+
// and the second item is the comments (t1) listing.
|
|
522
|
+
let responseChildren = response.listings?.[1]?.data?.children ?? [];
|
|
523
|
+
const topLevelComment = responseChildren[0];
|
|
524
|
+
if (commentId && topLevelComment?.data?.replyList?.data) {
|
|
525
|
+
responseChildren = topLevelComment.data.replyList.data.children;
|
|
526
|
+
}
|
|
527
|
+
return __classPrivateFieldGet(_a, _a, "m", _Comment_buildCommentsTree).call(_a, responseChildren, commentId ?? options.postId, options, depthOffset);
|
|
528
|
+
},
|
|
529
|
+
});
|
|
530
|
+
}, _Comment_buildCommentsTree = function _Comment_buildCommentsTree(redditObjects, parentId, options, depthOffset = 0) {
|
|
531
|
+
const children = [];
|
|
532
|
+
let more;
|
|
533
|
+
// Map of comments to help set parent-child relationship between comments returned by MoreChildren.
|
|
534
|
+
const commentsMap = {};
|
|
535
|
+
for (const child of redditObjects) {
|
|
536
|
+
if (!child.data) {
|
|
537
|
+
continue;
|
|
538
|
+
}
|
|
539
|
+
if (child.data.depth != null) {
|
|
540
|
+
child.data.depth = child.data.depth + depthOffset;
|
|
541
|
+
}
|
|
542
|
+
// Prevent returning comments that are beyond the maximum depth requested.
|
|
543
|
+
if (child.data.depth != null && options.depth != null && child.data.depth >= options.depth) {
|
|
544
|
+
continue;
|
|
545
|
+
}
|
|
546
|
+
const parentComment = child.data.parentId ? commentsMap[child.data.parentId] : undefined;
|
|
547
|
+
if (child.kind === 't1') {
|
|
548
|
+
// Sometimes MoreChildren API returns a comment that has already been seen.
|
|
549
|
+
if (child.data.name === parentId) {
|
|
550
|
+
continue;
|
|
551
|
+
}
|
|
552
|
+
const comment = new _a(child.data);
|
|
553
|
+
commentsMap[comment.id] = comment;
|
|
554
|
+
__classPrivateFieldSet(comment, _Comment_replies, __classPrivateFieldGet(_a, _a, "m", _Comment_getCommentsListing).call(_a, {
|
|
555
|
+
...options,
|
|
556
|
+
postId: comment.postId,
|
|
557
|
+
commentId: comment.id,
|
|
558
|
+
}, depthOffset), "f");
|
|
559
|
+
// Preload the comment's replies Listing
|
|
560
|
+
if ('replyList' in child.data && child.data.replyList?.data) {
|
|
561
|
+
const { children, more } = __classPrivateFieldGet(_a, _a, "m", _Comment_buildCommentsTree).call(_a, child.data.replyList.data.children, comment.id, options, depthOffset);
|
|
562
|
+
if (children.length) {
|
|
563
|
+
comment.replies.children.push(...children);
|
|
564
|
+
}
|
|
565
|
+
if (more) {
|
|
566
|
+
comment.replies.setMore(more);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
// Since the replies for this comment were already load we can skip the first fetch call
|
|
570
|
+
comment.replies.preventInitialFetch();
|
|
571
|
+
if (parentComment) {
|
|
572
|
+
parentComment.replies.children.push(comment);
|
|
573
|
+
}
|
|
574
|
+
else {
|
|
575
|
+
children.push(comment);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
else if (child.kind === 'more' && child.data.parentId && child.data.depth != null) {
|
|
579
|
+
const thisMore = {
|
|
580
|
+
parentId: isCommentId(child.data.parentId)
|
|
581
|
+
? asT1ID(child.data.parentId)
|
|
582
|
+
: asT3ID(child.data.parentId),
|
|
583
|
+
children: child.data.children ?? [],
|
|
584
|
+
depth: child.data.depth,
|
|
585
|
+
};
|
|
586
|
+
if (parentComment) {
|
|
587
|
+
parentComment.replies.setMore(thisMore);
|
|
588
|
+
}
|
|
589
|
+
else if (thisMore.parentId === parentId) {
|
|
590
|
+
more = thisMore;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
return { children, more };
|
|
595
|
+
}, _Comment_metadata_get = function _Comment_metadata_get() {
|
|
596
|
+
return getContext().debug.metadata;
|
|
597
|
+
};
|