itd-api 0.1.0 → 0.3.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/README.md +121 -495
- package/dist/index.cjs +9212 -412
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5176 -1
- package/dist/index.d.ts +5176 -1
- package/dist/index.js +9118 -2
- package/dist/index.js.map +1 -1
- package/dist/multi-storage-BhcA2Izn.d.ts +198 -0
- package/dist/multi-storage-CyMe404l.js +805 -0
- package/dist/multi-storage-CyMe404l.js.map +1 -0
- package/dist/multi-storage-D1keK2Op.cjs +930 -0
- package/dist/multi-storage-D1keK2Op.cjs.map +1 -0
- package/dist/multi-storage-NDqzRQcD.d.cts +198 -0
- package/dist/node.cjs +225 -548
- package/dist/node.cjs.map +1 -1
- package/dist/node.d.cts +46 -59
- package/dist/node.d.ts +46 -59
- package/dist/node.js +223 -126
- package/dist/node.js.map +1 -1
- package/dist/runtime-CFEsf-jD.cjs +185 -0
- package/dist/runtime-CFEsf-jD.cjs.map +1 -0
- package/dist/runtime-DHxDn8gf.js +126 -0
- package/dist/runtime-DHxDn8gf.js.map +1 -0
- package/dist/storage-BjNRlkbE.d.cts +82 -0
- package/dist/storage-BjNRlkbE.d.ts +82 -0
- package/dist/storage-D9tfHx7Z.js +424 -0
- package/dist/storage-D9tfHx7Z.js.map +1 -0
- package/dist/storage-ycBqLBRB.cjs +615 -0
- package/dist/storage-ycBqLBRB.cjs.map +1 -0
- package/dist/web.cjs +87 -0
- package/dist/web.cjs.map +1 -0
- package/dist/web.d.cts +27 -0
- package/dist/web.d.ts +27 -0
- package/dist/web.js +86 -0
- package/dist/web.js.map +1 -0
- package/package.json +34 -14
- package/dist/chunk-6FB4HTKH.js +0 -7763
- package/dist/chunk-6FB4HTKH.js.map +0 -1
- package/dist/chunk-73CISRBG.cjs +0 -7873
- package/dist/chunk-73CISRBG.cjs.map +0 -1
- package/dist/index-BZF4K90s.d.cts +0 -4961
- package/dist/index-BZF4K90s.d.ts +0 -4961
- package/guides/README.md +0 -24
- package/guides/authentication/README.md +0 -176
- package/guides/authentication/examples/bot-with-session.mjs +0 -98
- package/guides/authentication/examples/turnstile-login.mjs +0 -56
- package/guides/integrations/README.md +0 -62
- package/guides/integrations/examples/proxy.mjs +0 -26
- package/guides/multi-accounts/README.md +0 -143
- package/guides/multi-accounts/examples/multi-accounts.mjs +0 -71
- package/guides/plugins/README.md +0 -253
- package/guides/plugins/examples/cache.mjs +0 -33
- package/guides/plugins/examples/crypto.mjs +0 -54
- package/guides/quickstart/README.md +0 -124
- package/guides/quickstart/examples/quick-start.mjs +0 -44
- package/guides/quickstart/examples/typescript.ts +0 -90
- package/guides/realtime/README.md +0 -109
- package/guides/realtime/examples/notifications.mjs +0 -62
- package/guides/reference/README.md +0 -67
- package/guides/reference/accounts.md +0 -101
- package/guides/reference/auth.md +0 -141
- package/guides/reference/builders.md +0 -135
- package/guides/reference/client.md +0 -184
- package/guides/reference/comments.md +0 -58
- package/guides/reference/discovery.md +0 -81
- package/guides/reference/enums.md +0 -103
- package/guides/reference/errors.md +0 -107
- package/guides/reference/files.md +0 -73
- package/guides/reference/models.md +0 -448
- package/guides/reference/notifications.md +0 -77
- package/guides/reference/pagination.md +0 -82
- package/guides/reference/platform.md +0 -47
- package/guides/reference/posts.md +0 -157
- package/guides/reference/realtime.md +0 -78
- package/guides/reference/reports.md +0 -28
- package/guides/reference/subscription.md +0 -41
- package/guides/reference/users.md +0 -146
- package/guides/reference/verification.md +0 -24
- package/guides/text-markup/README.md +0 -214
- package/guides/text-markup/examples/create-post.mjs +0 -64
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
# Посты — `itd.posts`
|
|
2
|
-
|
|
3
|
-
Лента, публикация, реакции, репосты, опросы и комментарии к постам. Публикующие методы
|
|
4
|
-
принимают объект, [билдер](./builders.md) или функцию-настройщик.
|
|
5
|
-
|
|
6
|
-
## Лента
|
|
7
|
-
|
|
8
|
-
```ts
|
|
9
|
-
list(params?: FeedParams): Promise<Page<Post>>
|
|
10
|
-
iterate(params?: FeedParams): Paginator<Post>
|
|
11
|
-
```
|
|
12
|
-
Страница ленты / перебор ленты. Курсорная пагинация. См. [`Post`](./models.md#post),
|
|
13
|
-
[`FeedTab`](./enums.md#feedtab).
|
|
14
|
-
|
|
15
|
-
## Публикация
|
|
16
|
-
|
|
17
|
-
```ts
|
|
18
|
-
create(input: PostInput): Promise<Post>
|
|
19
|
-
```
|
|
20
|
-
Публикует пост. Файлы из поля `files` загружаются автоматически, порядок вложений сохраняется.
|
|
21
|
-
|
|
22
|
-
```ts
|
|
23
|
-
get(postId: string): Promise<Post>
|
|
24
|
-
```
|
|
25
|
-
Один пост вместе с топовыми комментариями (заполнено поле `comments`).
|
|
26
|
-
|
|
27
|
-
```ts
|
|
28
|
-
update(postId: string, input: PostUpdateInput): Promise<Post>
|
|
29
|
-
```
|
|
30
|
-
Редактирует текст и разметку. Поля создания (вложения, опрос, стена) отвергаются до запроса.
|
|
31
|
-
`content` обязателен.
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
remove(postId: string): Promise<void>
|
|
35
|
-
restore(postId: string): Promise<Post>
|
|
36
|
-
```
|
|
37
|
-
Удаляет / восстанавливает пост.
|
|
38
|
-
|
|
39
|
-
## Реакции, репосты, закрепление
|
|
40
|
-
|
|
41
|
-
```ts
|
|
42
|
-
like(postId: string): Promise<LikeResult>
|
|
43
|
-
unlike(postId: string): Promise<LikeResult>
|
|
44
|
-
```
|
|
45
|
-
Ставит / убирает реакцию. См. [`LikeResult`](./models.md#likeresult).
|
|
46
|
-
|
|
47
|
-
```ts
|
|
48
|
-
repost(postId: string, content?: string): Promise<Post>
|
|
49
|
-
unrepost(postId: string): Promise<void>
|
|
50
|
-
```
|
|
51
|
-
Репост с необязательным комментарием / отмена репоста. Вложения к репосту не поддерживаются.
|
|
52
|
-
|
|
53
|
-
```ts
|
|
54
|
-
pin(postId: string): Promise<PinPostResult>
|
|
55
|
-
unpin(postId: string): Promise<PinPostResult>
|
|
56
|
-
```
|
|
57
|
-
Закрепляет / открепляет пост в профиле. См. [`PinPostResult`](./models.md#pinpostresult).
|
|
58
|
-
|
|
59
|
-
## Опросы
|
|
60
|
-
|
|
61
|
-
```ts
|
|
62
|
-
vote(postId: string, optionIds: string[]): Promise<Poll>
|
|
63
|
-
```
|
|
64
|
-
Голосует в опросе. Несколько вариантов допустимы только при `multipleChoice`. См.
|
|
65
|
-
[`Poll`](./models.md#poll).
|
|
66
|
-
|
|
67
|
-
## Счётчики
|
|
68
|
-
|
|
69
|
-
```ts
|
|
70
|
-
stats(ids: string[]): Promise<PostStats[]>
|
|
71
|
-
```
|
|
72
|
-
Счётчики сразу для нескольких постов. См. [`PostStats`](./models.md#poststats).
|
|
73
|
-
|
|
74
|
-
## Стена и лайки пользователя
|
|
75
|
-
|
|
76
|
-
```ts
|
|
77
|
-
byUser(user: UserRef, params?: UserPostsParams): Promise<Page<Post>>
|
|
78
|
-
iterateByUser(user: UserRef, params?: UserPostsParams): Paginator<Post>
|
|
79
|
-
```
|
|
80
|
-
Стена пользователя.
|
|
81
|
-
|
|
82
|
-
> ⚠️ Это **не только его собственные посты**: сюда попадают и записи, которые другие оставили
|
|
83
|
-
> на его стене (у них `author` чужой, `wallRecipient` — владелец стены). Поэтому записей обычно
|
|
84
|
-
> больше, чем `postsCount` в профиле. Нужны только авторские — отфильтруйте по `post.author.id`.
|
|
85
|
-
|
|
86
|
-
```ts
|
|
87
|
-
likedByUser(user: UserRef, params?: UserPostsParams): Promise<Page<Post>>
|
|
88
|
-
iterateLikedByUser(user: UserRef, params?: UserPostsParams): Paginator<Post>
|
|
89
|
-
```
|
|
90
|
-
Посты, которые пользователь отметил реакцией.
|
|
91
|
-
|
|
92
|
-
## Комментарии к посту
|
|
93
|
-
|
|
94
|
-
Комментарии **к посту** живут здесь; ответы на комментарии — в [`itd.comments`](./comments.md).
|
|
95
|
-
|
|
96
|
-
```ts
|
|
97
|
-
comments(postId: string, params?: CommentsParams): Promise<Page<Comment>>
|
|
98
|
-
iterateComments(postId: string, params?: CommentsParams): Paginator<Comment>
|
|
99
|
-
```
|
|
100
|
-
Комментарии к посту. Курсорная пагинация. См. [`Comment`](./models.md#comment),
|
|
101
|
-
[`CommentSort`](./enums.md#commentsort).
|
|
102
|
-
|
|
103
|
-
```ts
|
|
104
|
-
comment(postId: string, input: CommentInput | string): Promise<Comment>
|
|
105
|
-
```
|
|
106
|
-
Комментирует пост. Строка — это просто текст.
|
|
107
|
-
|
|
108
|
-
```ts
|
|
109
|
-
voiceComment(postId: string, audio: FileInput): Promise<Comment>
|
|
110
|
-
```
|
|
111
|
-
Голосовой комментарий: без текста, одно аудиовложение `audio/ogg`.
|
|
112
|
-
|
|
113
|
-
## Типы
|
|
114
|
-
|
|
115
|
-
```ts
|
|
116
|
-
type PostInput = CreatePostInput | PostBuilder | ((b: PostBuilder) => PostBuilder | CreatePostInput);
|
|
117
|
-
type PostUpdateInput = UpdatePostInput | PostBuilder | ((b: PostBuilder) => PostBuilder | UpdatePostInput);
|
|
118
|
-
type CommentInput = CreateCommentInput | CommentBuilder | ((b: CommentBuilder) => CommentBuilder | CreateCommentInput);
|
|
119
|
-
|
|
120
|
-
interface CreatePostInput {
|
|
121
|
-
content?: string;
|
|
122
|
-
spans?: Span[]; // проверяются относительно content
|
|
123
|
-
wallRecipientId?: UserId | null; // строго UUID
|
|
124
|
-
attachmentIds?: string[]; // заранее загруженные вложения
|
|
125
|
-
files?: FileInput[]; // загрузятся перед публикацией, порядок сохраняется
|
|
126
|
-
poll?: PollInput;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
interface UpdatePostInput {
|
|
130
|
-
content: string; // обязателен
|
|
131
|
-
spans?: Span[];
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
interface FeedParams extends RequestOptions {
|
|
135
|
-
tab?: FeedTab; // по умолчанию популярное
|
|
136
|
-
limit?: number;
|
|
137
|
-
cursor?: string; // непрозрачный, из nextCursor
|
|
138
|
-
maxPages?: number;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
interface UserPostsParams extends RequestOptions {
|
|
142
|
-
limit?: number;
|
|
143
|
-
cursor?: string;
|
|
144
|
-
sort?: string;
|
|
145
|
-
pinnedPostId?: string; // поднять закреплённый пост наверх
|
|
146
|
-
maxPages?: number;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
interface CommentsParams extends RequestOptions {
|
|
150
|
-
limit?: number;
|
|
151
|
-
cursor?: string; // id последнего полученного комментария
|
|
152
|
-
sort?: CommentSort;
|
|
153
|
-
maxPages?: number;
|
|
154
|
-
}
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
См. также [Билдеры](./builders.md) (`post()`, `comment()`, `poll()`, разметка текста).
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# Realtime — `itd.realtime()`
|
|
2
|
-
|
|
3
|
-
Поток уведомлений в реальном времени. Создаётся `itd.realtime(options?)`, соединение
|
|
4
|
-
поднимается `connect()` и держится само: обрывы, обновление токена, keep-alive и повторные
|
|
5
|
-
попытки — внутри. Транспорт выбирается автоматически: SSE, а если среда не умеет читать тело
|
|
6
|
-
по частям — опрос REST. Полное руководство — [Realtime](../realtime/README.md).
|
|
7
|
-
|
|
8
|
-
```ts
|
|
9
|
-
const stream = itd.realtime(options?: RealtimeOptions): ItdRealtime
|
|
10
|
-
```
|
|
11
|
-
|
|
12
|
-
## Методы `ItdRealtime`
|
|
13
|
-
|
|
14
|
-
```ts
|
|
15
|
-
connect(): Promise<void>
|
|
16
|
-
```
|
|
17
|
-
Поднимает соединение. Повторный вызов при живом соединении ничего не делает. Возвращает
|
|
18
|
-
управление сразу — соединение живёт в фоне.
|
|
19
|
-
|
|
20
|
-
```ts
|
|
21
|
-
disconnect(): void
|
|
22
|
-
```
|
|
23
|
-
Закрывает соединение и отменяет запланированные попытки.
|
|
24
|
-
|
|
25
|
-
```ts
|
|
26
|
-
on<K>(event: K, listener): Unsubscribe
|
|
27
|
-
once<K>(event: K, listener): Unsubscribe
|
|
28
|
-
removeAllListeners(): void
|
|
29
|
-
```
|
|
30
|
-
Подписка на события / однократная подписка / снятие всех подписок (соединение при этом
|
|
31
|
-
не закрывается).
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
get status: RealtimeStatus // 'connecting' | 'connected' | 'error' | 'disconnected'
|
|
35
|
-
get transport: string // 'sse' | 'poll'
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## События (`RealtimeEvents`)
|
|
39
|
-
|
|
40
|
-
| Событие | Данные | Когда |
|
|
41
|
-
|---|---|---|
|
|
42
|
-
| `notification` | `NotificationEvent` | пришло новое уведомление |
|
|
43
|
-
| `ready` | `{ userId?: string }` | сервер подтвердил подключение (первый кадр) |
|
|
44
|
-
| `unreadCount` | `number` | сервер сообщил число непрочитанных (на практике редко — держите счётчик сами) |
|
|
45
|
-
| `status` | `RealtimeStatus` | изменилось состояние соединения |
|
|
46
|
-
| `error` | `{ error, willReconnect }` | соединение оборвалось |
|
|
47
|
-
| `reconnect` | `{ attempt, delay }` | запланировано переподключение |
|
|
48
|
-
| `giveup` | — | попытки исчерпаны; нужен ручной `connect()` |
|
|
49
|
-
| `parseError` | `{ error, raw }` | сообщение не удалось разобрать (соединение живо) |
|
|
50
|
-
| `message` | `{ name, data }` | любое событие потока в необработанном виде |
|
|
51
|
-
|
|
52
|
-
`NotificationEvent` содержит `{ notification: Notification; unreadCount?: number }`; уведомление
|
|
53
|
-
в той же форме, что и в [`itd.notifications`](./notifications.md).
|
|
54
|
-
|
|
55
|
-
## Опции (`RealtimeOptions`)
|
|
56
|
-
|
|
57
|
-
```ts
|
|
58
|
-
interface RealtimeOptions {
|
|
59
|
-
transport?: 'auto' | 'sse' | 'poll' | RealtimeTransport; // по умолчанию 'auto'
|
|
60
|
-
idleTimeout?: number; // молчание сервера = мёртвое соединение; 90000
|
|
61
|
-
pollInterval?: number; // период опроса для запасного транспорта
|
|
62
|
-
syncCount?: boolean; // запросить число непрочитанных при connect; true
|
|
63
|
-
reconnectOnVisible?: boolean; // переподключаться при возврате вкладки; true (браузер)
|
|
64
|
-
reconnectOnOnline?: boolean; // переподключаться при восстановлении сети; true (браузер)
|
|
65
|
-
// из ReconnectOptions:
|
|
66
|
-
maxAttempts?: number;
|
|
67
|
-
backoff?: number[]; // лестница пауз переподключения
|
|
68
|
-
jitter?: number; // 0…1
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const RealtimeTransportKind = { Auto: 'auto', Sse: 'sse', Poll: 'poll' } as const;
|
|
72
|
-
const RealtimeStatus = {
|
|
73
|
-
Connecting: 'connecting', Connected: 'connected', Error: 'error', Disconnected: 'disconnected',
|
|
74
|
-
} as const;
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
Можно передать и свою реализацию `RealtimeTransport` — например для WebSocket. Смена
|
|
78
|
-
авторизации на другого пользователя завершает все потоки клиента; смена только сессии — нет.
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# Жалобы — `itd.reports`
|
|
2
|
-
|
|
3
|
-
Жалобы на контент и пользователей. Принимает объект или [билдер](./builders.md)
|
|
4
|
-
`report`, у которого тип объекта и его идентификатор задаются одновременно.
|
|
5
|
-
|
|
6
|
-
## Метод
|
|
7
|
-
|
|
8
|
-
```ts
|
|
9
|
-
create(input: ReportInput): Promise<Report>
|
|
10
|
-
```
|
|
11
|
-
Отправляет жалобу. Повторная жалоба на тот же объект отклоняется сервером. См.
|
|
12
|
-
[`Report`](./models.md#report).
|
|
13
|
-
|
|
14
|
-
## Типы
|
|
15
|
-
|
|
16
|
-
```ts
|
|
17
|
-
type ReportInput = CreateReportInput | ReportBuilder | ((b: ReportBuilder) => ReportBuilder | CreateReportInput);
|
|
18
|
-
|
|
19
|
-
interface CreateReportInput {
|
|
20
|
-
targetType: ReportTargetType; // 'post' | 'comment' | 'user'
|
|
21
|
-
targetId: string;
|
|
22
|
-
reason: ReportReason; // 'spam' | 'violence' | 'hate' | 'adult' | 'fraud' | 'other'
|
|
23
|
-
description?: string; // пояснение в свободной форме
|
|
24
|
-
}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
См. [`ReportTargetType`](./enums.md#reporttargettype), [`ReportReason`](./enums.md#reportreason)
|
|
28
|
-
и билдер [`report`](./builders.md).
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Подписка — `itd.subscription`
|
|
2
|
-
|
|
3
|
-
Состояние платной подписки (премиум NUKSTA), автопродление и способы оплаты. Форма ответа
|
|
4
|
-
у платёжных методов в документации API не описана, поэтому часть возвращает `unknown`.
|
|
5
|
-
|
|
6
|
-
## Методы
|
|
7
|
-
|
|
8
|
-
```ts
|
|
9
|
-
status(): Promise<Subscription>
|
|
10
|
-
```
|
|
11
|
-
Состояние подписки и её цена. См. [`Subscription`](./models.md#subscription).
|
|
12
|
-
|
|
13
|
-
```ts
|
|
14
|
-
pay(): Promise<unknown>
|
|
15
|
-
```
|
|
16
|
-
Запускает оплату подписки.
|
|
17
|
-
|
|
18
|
-
```ts
|
|
19
|
-
setAutoRenewal(enabled: boolean): Promise<unknown>
|
|
20
|
-
```
|
|
21
|
-
Включает / отключает автопродление.
|
|
22
|
-
|
|
23
|
-
```ts
|
|
24
|
-
bindCard(): Promise<unknown>
|
|
25
|
-
```
|
|
26
|
-
Запускает привязку карты.
|
|
27
|
-
|
|
28
|
-
```ts
|
|
29
|
-
methods(): Promise<PaymentMethod[]>
|
|
30
|
-
```
|
|
31
|
-
Список способов оплаты. Пустой массив, если карт нет. См. [`PaymentMethod`](./models.md#paymentmethod).
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
setDefaultMethod(methodId: string): Promise<unknown>
|
|
35
|
-
```
|
|
36
|
-
Делает способ оплаты основным.
|
|
37
|
-
|
|
38
|
-
```ts
|
|
39
|
-
removeMethod(methodId: string): Promise<void>
|
|
40
|
-
```
|
|
41
|
-
Удаляет способ оплаты.
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
# Пользователи — `itd.users`
|
|
2
|
-
|
|
3
|
-
Профили, подписки, блокировки, приватность и значки. Методы принимают
|
|
4
|
-
[`UserRef`](./README.md#общие-соглашения) — UUID **или** имя пользователя, если не
|
|
5
|
-
указано иное.
|
|
6
|
-
|
|
7
|
-
## Свой профиль
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
me(): Promise<MyProfile>
|
|
11
|
-
```
|
|
12
|
-
Свой профиль — с подпиской и признаком подтверждённого телефона. См. [`MyProfile`](./models.md#myprofile).
|
|
13
|
-
|
|
14
|
-
```ts
|
|
15
|
-
updateMe(input: UpdateProfileInput): Promise<MyProfile>
|
|
16
|
-
```
|
|
17
|
-
Обновляет свой профиль. Передавайте только изменяемые поля.
|
|
18
|
-
|
|
19
|
-
```ts
|
|
20
|
-
createProfile(input: { username: string; displayName: string; avatar?: string }): Promise<MyProfile>
|
|
21
|
-
```
|
|
22
|
-
Создаёт профиль после регистрации.
|
|
23
|
-
|
|
24
|
-
```ts
|
|
25
|
-
deactivate(): Promise<void>
|
|
26
|
-
restore(): Promise<void>
|
|
27
|
-
```
|
|
28
|
-
Деактивирует / восстанавливает аккаунт.
|
|
29
|
-
|
|
30
|
-
## Чужие профили
|
|
31
|
-
|
|
32
|
-
```ts
|
|
33
|
-
get(user: UserRef): Promise<PublicProfile>
|
|
34
|
-
```
|
|
35
|
-
Профиль пользователя по UUID или имени. См. [`PublicProfile`](./models.md#publicprofile).
|
|
36
|
-
|
|
37
|
-
```ts
|
|
38
|
-
checkUsername(username: string): Promise<boolean>
|
|
39
|
-
```
|
|
40
|
-
Свободно ли имя пользователя.
|
|
41
|
-
|
|
42
|
-
## Подписки
|
|
43
|
-
|
|
44
|
-
```ts
|
|
45
|
-
follow(user: UserRef): Promise<FollowResult>
|
|
46
|
-
```
|
|
47
|
-
Подписывается. У закрытого профиля отправляется заявка — видно по полю `status`. См.
|
|
48
|
-
[`FollowResult`](./models.md#followresult).
|
|
49
|
-
|
|
50
|
-
```ts
|
|
51
|
-
unfollow(user: UserRef): Promise<void>
|
|
52
|
-
```
|
|
53
|
-
Отписывается.
|
|
54
|
-
|
|
55
|
-
```ts
|
|
56
|
-
followStatus(userIds: UserId[]): Promise<Record<string, boolean>>
|
|
57
|
-
```
|
|
58
|
-
Проверяет подписку сразу для нескольких пользователей. Возвращает «идентификатор → подписаны ли вы».
|
|
59
|
-
|
|
60
|
-
```ts
|
|
61
|
-
followers(user: UserRef, params?: UserListParams): Promise<Page<UserSummary>>
|
|
62
|
-
iterateFollowers(user: UserRef, params?: UserListParams): Paginator<UserSummary>
|
|
63
|
-
following(user: UserRef, params?: UserListParams): Promise<Page<UserSummary>>
|
|
64
|
-
iterateFollowing(user: UserRef, params?: UserListParams): Paginator<UserSummary>
|
|
65
|
-
```
|
|
66
|
-
Подписчики и подписки. См. [`UserSummary`](./models.md#usersummary).
|
|
67
|
-
|
|
68
|
-
> ⚠️ **Сервер эти списки не листает.** Возвращаются первые 20 записей: `page` игнорируется,
|
|
69
|
-
> `limit` больше 20 молча уменьшается, `hasMore` всегда `false`. Полю `total` доверять тоже
|
|
70
|
-
> нельзя — оно расходится с `followersCount` из профиля. Методы-итераторы закончатся после
|
|
71
|
-
> первых 20 записей и оставлены на случай, если пагинацию починят.
|
|
72
|
-
|
|
73
|
-
## Блокировки
|
|
74
|
-
|
|
75
|
-
```ts
|
|
76
|
-
block(user: UserRef): Promise<void>
|
|
77
|
-
unblock(user: UserRef): Promise<void>
|
|
78
|
-
```
|
|
79
|
-
Блокирует / снимает блокировку.
|
|
80
|
-
|
|
81
|
-
```ts
|
|
82
|
-
blocked(params?: UserListParams): Promise<Page<UserSummary>>
|
|
83
|
-
iterateBlocked(params?: UserListParams): Paginator<UserSummary>
|
|
84
|
-
```
|
|
85
|
-
Заблокированные пользователи. Ограничения листания те же, что у `followers`.
|
|
86
|
-
|
|
87
|
-
## Приватность
|
|
88
|
-
|
|
89
|
-
```ts
|
|
90
|
-
getPrivacy(): Promise<PrivacySettings>
|
|
91
|
-
updatePrivacy(input: UpdatePrivacyInput): Promise<PrivacySettings>
|
|
92
|
-
```
|
|
93
|
-
Читает / обновляет настройки приватности. См. [`PrivacySettings`](./models.md#privacysettings).
|
|
94
|
-
|
|
95
|
-
## Значки профиля («пины»)
|
|
96
|
-
|
|
97
|
-
```ts
|
|
98
|
-
pins(): Promise<PinsResult>
|
|
99
|
-
```
|
|
100
|
-
Значки профиля и выбранный из них. `activePin` — строка-идентификатор, а не объект. См.
|
|
101
|
-
[`PinsResult`](./models.md#pinsresult).
|
|
102
|
-
|
|
103
|
-
```ts
|
|
104
|
-
setPin(slug: string): Promise<void>
|
|
105
|
-
removePin(): Promise<void>
|
|
106
|
-
```
|
|
107
|
-
Выбирает / снимает активный значок.
|
|
108
|
-
|
|
109
|
-
## Поиск и рекомендации
|
|
110
|
-
|
|
111
|
-
Также описаны в разделе [Поиск и обнаружение](./discovery.md).
|
|
112
|
-
|
|
113
|
-
```ts
|
|
114
|
-
search(query: string, params?: { limit?: number }): Promise<UserSummary[]>
|
|
115
|
-
```
|
|
116
|
-
Ищет пользователей по строке запроса.
|
|
117
|
-
|
|
118
|
-
```ts
|
|
119
|
-
whoToFollow(): Promise<UserSummary[]>
|
|
120
|
-
```
|
|
121
|
-
Рекомендации, на кого подписаться.
|
|
122
|
-
|
|
123
|
-
```ts
|
|
124
|
-
topClans(): Promise<Clan[]>
|
|
125
|
-
```
|
|
126
|
-
Рейтинг кланов. См. [`Clan`](./models.md#clan).
|
|
127
|
-
|
|
128
|
-
## Типы
|
|
129
|
-
|
|
130
|
-
```ts
|
|
131
|
-
interface UpdateProfileInput {
|
|
132
|
-
displayName?: string;
|
|
133
|
-
username?: string;
|
|
134
|
-
avatar?: string; // эмодзи-символ клана, а не URL картинки
|
|
135
|
-
bio?: string;
|
|
136
|
-
banner?: string; // URL изображения-шапки
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
type UpdatePrivacyInput = Partial<PrivacySettings>;
|
|
140
|
-
|
|
141
|
-
interface UserListParams extends RequestOptions {
|
|
142
|
-
limit?: number; // > 20 сервер зажимает до 20
|
|
143
|
-
page?: number; // сервер игнорирует
|
|
144
|
-
maxPages?: number;
|
|
145
|
-
}
|
|
146
|
-
```
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# Верификация — `itd.verification`
|
|
2
|
-
|
|
3
|
-
Статус заявки на верификацию профиля и её подача.
|
|
4
|
-
|
|
5
|
-
## Методы
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
status(): Promise<VerificationStatus>
|
|
9
|
-
```
|
|
10
|
-
Статус заявки. Значение `'none'` означает, что заявка не подавалась. См.
|
|
11
|
-
[`VerificationStatus`](./models.md#verificationstatus).
|
|
12
|
-
|
|
13
|
-
```ts
|
|
14
|
-
submit(videoUrl: string): Promise<unknown>
|
|
15
|
-
```
|
|
16
|
-
Подаёт заявку на верификацию с видео.
|
|
17
|
-
|
|
18
|
-
## Типы
|
|
19
|
-
|
|
20
|
-
```ts
|
|
21
|
-
interface VerificationStatus {
|
|
22
|
-
status: 'none' | 'pending' | 'approved' | 'rejected' | (string & {});
|
|
23
|
-
}
|
|
24
|
-
```
|
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
# Разметка текста
|
|
2
|
-
|
|
3
|
-
ИТД хранит форматирование отдельным массивом `spans`. Каждый span задаёт тип, смещение и
|
|
4
|
-
длину фрагмента:
|
|
5
|
-
|
|
6
|
-
```ts
|
|
7
|
-
{
|
|
8
|
-
type: 'bold',
|
|
9
|
-
offset: 0,
|
|
10
|
-
length: 5,
|
|
11
|
-
}
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
Смещения измеряются в UTF-16 code units — тех же единицах, которые используют
|
|
15
|
-
`String#slice`, `substring` и DOM Selection. Поэтому эмодзи вне BMP обычно занимает две
|
|
16
|
-
единицы.
|
|
17
|
-
|
|
18
|
-
## Создание поста
|
|
19
|
-
|
|
20
|
-
`markup()` собирает текст и вычисляет смещения одновременно:
|
|
21
|
-
|
|
22
|
-
```ts
|
|
23
|
-
import { post } from 'itd-api';
|
|
24
|
-
|
|
25
|
-
await itd.posts.create(
|
|
26
|
-
post().markup((m) =>
|
|
27
|
-
m
|
|
28
|
-
.text('смотрите ')
|
|
29
|
-
.hashtag('котики')
|
|
30
|
-
.text(' от ')
|
|
31
|
-
.mention('durov')
|
|
32
|
-
.newline()
|
|
33
|
-
.bold('важно')
|
|
34
|
-
.text(': ')
|
|
35
|
-
.link('документация', 'https://example.com/docs'),
|
|
36
|
-
),
|
|
37
|
-
);
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Доступны:
|
|
41
|
-
|
|
42
|
-
- `bold`, `italic`, `underline`, `strike`;
|
|
43
|
-
- `spoiler`, `monospace`, `quote`;
|
|
44
|
-
- `link`, `hashtag`, `mention`;
|
|
45
|
-
- произвольный `span()`;
|
|
46
|
-
- несколько стилей сразу через `styled()`.
|
|
47
|
-
|
|
48
|
-
Билдер неизменяемый: каждый вызов возвращает новый экземпляр.
|
|
49
|
-
|
|
50
|
-
## Несколько стилей и пересечения
|
|
51
|
-
|
|
52
|
-
API хранит каждый стиль отдельным span, поэтому один диапазон может быть одновременно
|
|
53
|
-
жирным и подчёркнутым:
|
|
54
|
-
|
|
55
|
-
```ts
|
|
56
|
-
import { SpanType, markup } from 'itd-api';
|
|
57
|
-
|
|
58
|
-
const sameRange = markup()
|
|
59
|
-
.styled('жирный и подчёркнутый', SpanType.Bold, SpanType.Underline)
|
|
60
|
-
.build();
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
Вложенность выражает частичное пересечение без ручных offsets:
|
|
64
|
-
|
|
65
|
-
```ts
|
|
66
|
-
const nested = markup()
|
|
67
|
-
.bold((m) => m.text('весь жирный, ').underline('а это ещё и подчёркнуто'))
|
|
68
|
-
.build();
|
|
69
|
-
|
|
70
|
-
const linked = markup()
|
|
71
|
-
.link((m) => m.bold('документация'), 'https://example.com')
|
|
72
|
-
.build();
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
При сборке spans стабильно сортируются по `offset`, а при одинаковом начале — от длинного
|
|
76
|
-
к короткому.
|
|
77
|
-
|
|
78
|
-
## Автоматическая разметка
|
|
79
|
-
|
|
80
|
-
Для готового текста `autoSpans()` находит HTTP(S)-ссылки, хэштеги и упоминания:
|
|
81
|
-
|
|
82
|
-
```ts
|
|
83
|
-
await itd.posts.create(
|
|
84
|
-
post('#котики от @durov: https://example.com').autoSpans(),
|
|
85
|
-
);
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
Метод сохраняет ручные стили и не создаёт дубли при повторном вызове. Отдельная функция
|
|
89
|
-
возвращает только найденный массив:
|
|
90
|
-
|
|
91
|
-
```ts
|
|
92
|
-
import { autoSpans } from 'itd-api';
|
|
93
|
-
|
|
94
|
-
const spans = autoSpans('спасибо @durov. #котики', {
|
|
95
|
-
links: true,
|
|
96
|
-
mentions: true,
|
|
97
|
-
hashtags: true,
|
|
98
|
-
});
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Сущности внутри URL не размечаются, даже если `{ links: false }`: ссылки всё равно
|
|
102
|
-
распознаются как защищённые диапазоны, но не попадают в результат.
|
|
103
|
-
|
|
104
|
-
## Замена текста
|
|
105
|
-
|
|
106
|
-
Spans рассчитаны для конкретной строки. Поэтому `.content()` заменяет текст и сбрасывает
|
|
107
|
-
старую разметку:
|
|
108
|
-
|
|
109
|
-
```ts
|
|
110
|
-
post('#старый')
|
|
111
|
-
.autoSpans()
|
|
112
|
-
.content('новый текст')
|
|
113
|
-
.build();
|
|
114
|
-
|
|
115
|
-
// { content: 'новый текст' }
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
После `.content()` вызовите `.spans()`, `.markup()` или `.autoSpans()` заново. Метод
|
|
119
|
-
`.append()` сохраняет существующие spans: старые offsets при дописывании текста не меняются.
|
|
120
|
-
|
|
121
|
-
## Сырые spans
|
|
122
|
-
|
|
123
|
-
Готовый массив можно передать объектом или через билдер:
|
|
124
|
-
|
|
125
|
-
```ts
|
|
126
|
-
import { SpanType } from 'itd-api';
|
|
127
|
-
|
|
128
|
-
await itd.posts.create({
|
|
129
|
-
content: 'важно',
|
|
130
|
-
spans: [{ type: SpanType.Bold, offset: 0, length: 5 }],
|
|
131
|
-
});
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
Перед запросом библиотека проверяет, что каждый диапазон непустой и целиком лежит внутри
|
|
135
|
-
`content`. Spans без текста также отклоняются. Семантику типа проверить невозможно:
|
|
136
|
-
формально валидный диапазон остаётся ответственностью вызывающего кода.
|
|
137
|
-
|
|
138
|
-
У `link` адрес лежит в `url`, у `hashtag` имя — в `tag`, у `mention` — в `username`.
|
|
139
|
-
Старые ответы сервера могут хранить username упоминания в `tag`.
|
|
140
|
-
|
|
141
|
-
## Обновление поста
|
|
142
|
-
|
|
143
|
-
`posts.update()` принимает объект, билдер или функцию-настройщик:
|
|
144
|
-
|
|
145
|
-
```ts
|
|
146
|
-
await itd.posts.update(postId, post().markup((m) => m.bold('новый текст')));
|
|
147
|
-
await itd.posts.update(postId, (p) => p.content('#новый текст').autoSpans());
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
Update endpoint меняет только `content` и `spans`. Вложения, опрос и чужая стена
|
|
151
|
-
отклоняются до запроса. `content` требуется задать явно, чтобы `{}` или обновление только
|
|
152
|
-
spans не стёрло текущий текст.
|
|
153
|
-
|
|
154
|
-
Явный пустой текст разрешён одинаково во всех формах:
|
|
155
|
-
|
|
156
|
-
```ts
|
|
157
|
-
await itd.posts.update(postId, { content: '' });
|
|
158
|
-
await itd.posts.update(postId, post(''));
|
|
159
|
-
await itd.posts.update(postId, (p) => p.content(''));
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
## Отображение
|
|
163
|
-
|
|
164
|
-
`renderSpans()` поддерживает HTML, Markdown и ANSI:
|
|
165
|
-
|
|
166
|
-
```ts
|
|
167
|
-
import { renderSpans } from 'itd-api';
|
|
168
|
-
|
|
169
|
-
renderSpans(post.content, post.spans); // безопасный HTML по умолчанию
|
|
170
|
-
renderSpans(post.content, post.spans, { format: 'markdown' });
|
|
171
|
-
renderSpans(post.content, post.spans, { format: 'ansi' });
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
HTML экранируется, опасные схемы ссылок не превращаются в `<a>`. Для собственного
|
|
175
|
-
приложения можно заменить маршруты и CSS-префикс:
|
|
176
|
-
|
|
177
|
-
```ts
|
|
178
|
-
renderSpans(post.content, post.spans, {
|
|
179
|
-
mentionUrl: (username) => `/users/${username}`,
|
|
180
|
-
hashtagUrl: (tag) => `/topics/${tag}`,
|
|
181
|
-
classPrefix: 'feed',
|
|
182
|
-
});
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
Возврат `null` из `mentionUrl` или `hashtagUrl` отключает соответствующую ссылку,
|
|
186
|
-
`classPrefix: null` отключает классы. По умолчанию используются `/@username`,
|
|
187
|
-
`/hashtag/name` и классы `itd-*`.
|
|
188
|
-
|
|
189
|
-
Пересекающиеся spans разбиваются на корректно вложенные сегменты. В Markdown цитаты
|
|
190
|
-
применяются после сборки сегментов, а code spans выбирают забор длиннее внутренних
|
|
191
|
-
последовательностей обратных апострофов.
|
|
192
|
-
|
|
193
|
-
## Комментарии
|
|
194
|
-
|
|
195
|
-
Сервер может вернуть `comment.spans`; поле необязательно, поэтому оба вызова безопасны:
|
|
196
|
-
|
|
197
|
-
```ts
|
|
198
|
-
renderSpans(comment.content, comment.spans);
|
|
199
|
-
renderSpans(comment.content);
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
Скачанный клиент сайта и документированный API комментариев отправляют при создании и
|
|
203
|
-
редактировании только текст и вложения. Поэтому библиотека читает разметку комментариев,
|
|
204
|
-
но не обещает неподтверждённую сервером запись ручных spans.
|
|
205
|
-
|
|
206
|
-
## Запускаемый пример
|
|
207
|
-
|
|
208
|
-
Пример создаёт один настоящий пост и показывает авторазметку, пересечения и рендер:
|
|
209
|
-
|
|
210
|
-
```bash
|
|
211
|
-
ITD_TOKEN=<accessToken> node guides/text-markup/examples/create-post.mjs
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
Исходник: [`examples/create-post.mjs`](./examples/create-post.mjs).
|