@atproto/api 0.4.4 → 0.5.1

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.
Files changed (64) hide show
  1. package/README.md +81 -0
  2. package/definitions/labels.json +212 -0
  3. package/definitions/locale/en/label-groups.json +38 -0
  4. package/definitions/locale/en/labels.json +366 -0
  5. package/definitions/locale/en/proposed-label-groups.json +38 -0
  6. package/definitions/locale/en/proposed-labels.json +632 -0
  7. package/definitions/moderation-behaviors.d.ts +48 -0
  8. package/definitions/post-moderation-behaviors.json +879 -0
  9. package/definitions/profile-moderation-behaviors.json +447 -0
  10. package/definitions/proposed-labels.json +326 -0
  11. package/dist/client/index.d.ts +3 -0
  12. package/dist/client/lexicons.d.ts +27 -1
  13. package/dist/client/types/app/bsky/unspecced/applyLabels.d.ts +18 -0
  14. package/dist/index.d.ts +4 -0
  15. package/dist/index.js +1401 -12
  16. package/dist/index.js.map +4 -4
  17. package/dist/moderation/accumulator.d.ts +14 -0
  18. package/dist/moderation/const/label-groups.d.ts +2 -0
  19. package/dist/moderation/const/labels.d.ts +2 -0
  20. package/dist/moderation/index.d.ts +44 -0
  21. package/dist/moderation/subjects/account.d.ts +3 -0
  22. package/dist/moderation/subjects/feed-generator.d.ts +2 -0
  23. package/dist/moderation/subjects/post.d.ts +2 -0
  24. package/dist/moderation/subjects/profile.d.ts +3 -0
  25. package/dist/moderation/subjects/quoted-post.d.ts +6 -0
  26. package/dist/moderation/subjects/user-list.d.ts +2 -0
  27. package/dist/moderation/types.d.ts +97 -0
  28. package/dist/moderation/util.d.ts +12 -0
  29. package/docs/labels.md +522 -0
  30. package/docs/moderation-behaviors/posts.md +1919 -0
  31. package/docs/moderation-behaviors/profiles.md +907 -0
  32. package/docs/moderation.md +144 -0
  33. package/package.json +5 -3
  34. package/scripts/code/label-groups.mjs +68 -0
  35. package/scripts/code/labels.mjs +68 -0
  36. package/scripts/docs/labels.mjs +164 -0
  37. package/scripts/docs/post-moderation-behaviors.mjs +122 -0
  38. package/scripts/docs/profile-moderation-behaviors.mjs +122 -0
  39. package/scripts/generate-code.mjs +4 -0
  40. package/scripts/generate-docs.mjs +5 -0
  41. package/src/client/index.ts +13 -0
  42. package/src/client/lexicons.ts +29 -3
  43. package/src/client/types/app/bsky/unspecced/applyLabels.ts +33 -0
  44. package/src/client/types/com/atproto/admin/enableAccountInvites.ts +1 -1
  45. package/src/client/types/com/atproto/moderation/defs.ts +1 -1
  46. package/src/index.ts +4 -0
  47. package/src/moderation/accumulator.ts +181 -0
  48. package/src/moderation/const/label-groups.ts +143 -0
  49. package/src/moderation/const/labels.ts +798 -0
  50. package/src/moderation/index.ts +343 -0
  51. package/src/moderation/subjects/account.ts +40 -0
  52. package/src/moderation/subjects/feed-generator.ts +13 -0
  53. package/src/moderation/subjects/post.ts +23 -0
  54. package/src/moderation/subjects/profile.ts +31 -0
  55. package/src/moderation/subjects/quoted-post.ts +62 -0
  56. package/src/moderation/subjects/user-list.ts +13 -0
  57. package/src/moderation/types.ts +141 -0
  58. package/src/moderation/util.ts +98 -0
  59. package/tests/post-moderation.test.ts +46 -0
  60. package/tests/profile-moderation.test.ts +46 -0
  61. package/tests/util/index.ts +176 -0
  62. package/tests/util/moderation-behavior.ts +180 -0
  63. package/tsconfig.build.tsbuildinfo +1 -1
  64. package/tests/_util.ts +0 -26
package/README.md CHANGED
@@ -160,6 +160,87 @@ console.log(rt3.length) // => 25
160
160
  console.log(rt3.graphemeLength) // => 1
161
161
  ```
162
162
 
163
+ ### Moderation
164
+
165
+ Applying the moderation system is a challenging task, but we've done our best to simplify it for you. The Moderation API helps handle a wide range of tasks, including:
166
+
167
+ - User muting (including mutelists)
168
+ - User blocking
169
+ - Moderator labeling
170
+
171
+ For more information, see the [Moderation Documentation](./docs/moderation.md) or the associated [Labels Reference](./docs/labels.md).
172
+
173
+ ```typescript
174
+ import {moderatePost, moderateProfile} from '@atproto/api'
175
+
176
+ // We call the appropriate moderation function for the content
177
+ // =
178
+
179
+ const postMod = moderatePost(postView, getOpts())
180
+ const profileMod = moderateProfile(profileView, getOpts())
181
+
182
+ // We then use the output to decide how to affect rendering
183
+ // =
184
+
185
+ if (postMod.content.filter) {
186
+ // dont render in feeds or similar
187
+ // in contexts where this is disruptive (eg threads) you should ignore this and instead check blur
188
+ }
189
+ if (postMod.content.blur) {
190
+ // render the whole object behind a cover (use postMod.content.cause to explain)
191
+ if (postMod.content.noOverride) {
192
+ // do not allow the cover the be removed
193
+ }
194
+ }
195
+ if (postMod.content.alert) {
196
+ // render a warning on the content (use postMod.content.cause to explain)
197
+ }
198
+ if (postMod.embed.blur) {
199
+ // render the embedded media behind a cover (use postMod.embed.cause to explain)
200
+ if (postMod.embed.noOverride) {
201
+ // do not allow the cover the be removed
202
+ }
203
+ }
204
+ if (postMod.embed.alert) {
205
+ // render a warning on the embedded media (use postMod.embed.cause to explain)
206
+ }
207
+ if (postMod.avatar.blur) {
208
+ // render the avatar behind a cover
209
+ }
210
+ if (postMod.avatar.alert) {
211
+ // render an alert on the avatar
212
+ }
213
+
214
+ // The options passed into `apply()` supply the user's preferences
215
+ // =
216
+
217
+ function getOpts() {
218
+ return {
219
+ // the logged-in user's DID
220
+ userDid: 'did:plc:1234...',
221
+
222
+ // is adult content allowed?
223
+ adultContentEnabled: true,
224
+
225
+ // the user's labeler settings
226
+ labelerSettings: [
227
+ {
228
+ labeler: {
229
+ did: '...',
230
+ displayName: 'My mod service'
231
+ },
232
+ settings: {
233
+ porn: 'hide',
234
+ sexual: 'warn',
235
+ nudity: 'ignore',
236
+ // ...
237
+ }
238
+ }
239
+ ]
240
+ }
241
+ }
242
+ ```
243
+
163
244
  ## Advanced
164
245
 
165
246
  ### Advanced API calls
@@ -0,0 +1,212 @@
1
+ [
2
+ {
3
+ "id": "system",
4
+ "configurable": false,
5
+ "labels": [
6
+ {
7
+ "id": "!hide",
8
+ "preferences": ["hide"],
9
+ "flags": ["no-override"],
10
+ "onwarn": "blur"
11
+ },
12
+ {
13
+ "id": "!no-promote",
14
+ "preferences": ["hide"],
15
+ "flags": [],
16
+ "onwarn": null
17
+ },
18
+ {
19
+ "id": "!warn",
20
+ "preferences": ["warn"],
21
+ "flags": [],
22
+ "onwarn": "blur"
23
+ }
24
+ ]
25
+ },
26
+ {
27
+ "id": "legal",
28
+ "configurable": false,
29
+ "labels": [
30
+ {
31
+ "id": "dmca-violation",
32
+ "preferences": ["hide"],
33
+ "flags": ["no-override"],
34
+ "onwarn": "blur"
35
+ },
36
+ {
37
+ "id": "doxxing",
38
+ "preferences": ["hide"],
39
+ "flags": ["no-override"],
40
+ "onwarn": "blur"
41
+ }
42
+ ]
43
+ },
44
+ {
45
+ "id": "sexual",
46
+ "configurable": true,
47
+ "labels": [
48
+ {
49
+ "id": "porn",
50
+ "preferences": ["ignore", "warn", "hide"],
51
+ "flags": ["adult"],
52
+ "onwarn": "blur-media"
53
+ },
54
+ {
55
+ "id": "sexual",
56
+ "preferences": ["ignore", "warn", "hide"],
57
+ "flags": ["adult"],
58
+ "onwarn": "blur-media"
59
+ },
60
+ {
61
+ "id": "nudity",
62
+ "preferences": ["ignore", "warn", "hide"],
63
+ "flags": ["adult"],
64
+ "onwarn": "blur-media"
65
+ }
66
+ ]
67
+ },
68
+ {
69
+ "id": "violence",
70
+ "configurable": true,
71
+ "labels": [
72
+ {
73
+ "id": "nsfl",
74
+ "preferences": ["ignore", "warn", "hide"],
75
+ "flags": ["adult"],
76
+ "onwarn": "blur-media"
77
+ },
78
+ {
79
+ "id": "corpse",
80
+ "preferences": ["ignore", "warn", "hide"],
81
+ "flags": ["adult"],
82
+ "onwarn": "blur-media"
83
+ },
84
+ {
85
+ "id": "gore",
86
+ "preferences": ["ignore", "warn", "hide"],
87
+ "flags": ["adult"],
88
+ "onwarn": "blur-media"
89
+ },
90
+ {
91
+ "id": "torture",
92
+ "preferences": ["ignore", "warn", "hide"],
93
+ "flags": ["adult"],
94
+ "onwarn": "blur"
95
+ },
96
+ {
97
+ "id": "self-harm",
98
+ "preferences": ["ignore", "warn", "hide"],
99
+ "flags": ["adult"],
100
+ "onwarn": "blur-media"
101
+ }
102
+ ]
103
+ },
104
+ {
105
+ "id": "intolerance",
106
+ "configurable": true,
107
+ "labels": [
108
+ {
109
+ "id": "intolerant-race",
110
+ "preferences": ["ignore", "warn", "hide"],
111
+ "flags": [],
112
+ "onwarn": "blur"
113
+ },
114
+ {
115
+ "id": "intolerant-gender",
116
+ "preferences": ["ignore", "warn", "hide"],
117
+ "flags": [],
118
+ "onwarn": "blur"
119
+ },
120
+ {
121
+ "id": "intolerant-sexual-orientation",
122
+ "preferences": ["ignore", "warn", "hide"],
123
+ "flags": [],
124
+ "onwarn": "blur"
125
+ },
126
+ {
127
+ "id": "intolerant-religion",
128
+ "preferences": ["ignore", "warn", "hide"],
129
+ "flags": [],
130
+ "onwarn": "blur"
131
+ },
132
+ {
133
+ "id": "intolerant",
134
+ "preferences": ["ignore", "warn", "hide"],
135
+ "flags": [],
136
+ "onwarn": "blur"
137
+ },
138
+ {
139
+ "id": "icon-intolerant",
140
+ "preferences": ["ignore", "warn", "hide"],
141
+ "flags": [],
142
+ "onwarn": "blur-media"
143
+ }
144
+ ]
145
+ },
146
+ {
147
+ "id": "rude",
148
+ "configurable": true,
149
+ "labels": [
150
+ {
151
+ "id": "threat",
152
+ "preferences": ["ignore", "warn", "hide"],
153
+ "flags": [],
154
+ "onwarn": "blur"
155
+ }
156
+ ]
157
+ },
158
+ {
159
+ "id": "curation",
160
+ "configurable": true,
161
+ "labels": [
162
+ {
163
+ "id": "spoiler",
164
+ "preferences": ["ignore", "warn", "hide"],
165
+ "flags": [],
166
+ "onwarn": "blur"
167
+ }
168
+ ]
169
+ },
170
+ {
171
+ "id": "spam",
172
+ "configurable": true,
173
+ "labels": [
174
+ {
175
+ "id": "spam",
176
+ "preferences": ["ignore", "warn", "hide"],
177
+ "flags": [],
178
+ "onwarn": "blur"
179
+ }
180
+ ]
181
+ },
182
+ {
183
+ "id": "misinfo",
184
+ "configurable": true,
185
+ "labels": [
186
+ {
187
+ "id": "account-security",
188
+ "preferences": ["ignore", "warn", "hide"],
189
+ "flags": [],
190
+ "onwarn": "blur"
191
+ },
192
+ {
193
+ "id": "net-abuse",
194
+ "preferences": ["ignore", "warn", "hide"],
195
+ "flags": [],
196
+ "onwarn": "blur"
197
+ },
198
+ {
199
+ "id": "impersonation",
200
+ "preferences": ["ignore", "warn", "hide"],
201
+ "flags": [],
202
+ "onwarn": "alert"
203
+ },
204
+ {
205
+ "id": "scam",
206
+ "preferences": ["ignore", "warn", "hide"],
207
+ "flags": [],
208
+ "onwarn": "alert"
209
+ }
210
+ ]
211
+ }
212
+ ]
@@ -0,0 +1,38 @@
1
+ {
2
+ "system": {
3
+ "name": "System",
4
+ "description": "Moderator overrides for special cases."
5
+ },
6
+ "legal": {
7
+ "name": "Legal",
8
+ "description": "Content removed for legal reasons."
9
+ },
10
+ "sexual": {
11
+ "name": "Adult Content",
12
+ "description": "Content which is sexual in nature."
13
+ },
14
+ "violence": {
15
+ "name": "Violence",
16
+ "description": "Content which is violent or deeply disturbing."
17
+ },
18
+ "intolerance": {
19
+ "name": "Intolerance",
20
+ "description": "Content or behavior which is hateful or intolerant toward a group of people."
21
+ },
22
+ "rude": {
23
+ "name": "Rude",
24
+ "description": "Behavior which is rude toward other users."
25
+ },
26
+ "curation": {
27
+ "name": "Curational",
28
+ "description": "Subjective moderation geared towards curating a more positive environment."
29
+ },
30
+ "spam": {
31
+ "name": "Spam",
32
+ "description": "Content which doesn't add to the conversation."
33
+ },
34
+ "misinfo": {
35
+ "name": "Misinformation",
36
+ "description": "Content which misleads or defrauds users."
37
+ }
38
+ }