@imessaging/core 0.3.0 → 0.5.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/package.json +1 -1
- package/src/index.ts +10 -1
- package/src/types.ts +117 -0
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
export { MemoryPeerStore } from "./memory-peer-store";
|
|
2
2
|
export { createPeerKey } from "./peer-key";
|
|
3
|
-
export { canEdit, isTelegramRecipient } from "./types";
|
|
3
|
+
export { canEdit, canReceive, canShowTyping, hasCommandMenu, isTelegramRecipient } from "./types";
|
|
4
|
+
export type { ButtonPress, ButtonPressTransport } from "./types";
|
|
5
|
+
export type {
|
|
6
|
+
ChannelCommand,
|
|
7
|
+
CommandMenuTransport,
|
|
8
|
+
IncomingAttachment,
|
|
9
|
+
IncomingMessage,
|
|
10
|
+
IncomingMessageTransport,
|
|
11
|
+
TypingTransport,
|
|
12
|
+
} from "./types";
|
|
4
13
|
export type {
|
|
5
14
|
EditableMessage,
|
|
6
15
|
EditableMessageTransport,
|
package/src/types.ts
CHANGED
|
@@ -142,3 +142,120 @@ export interface TelegramPeerStore {
|
|
|
142
142
|
): Promise<void>;
|
|
143
143
|
delete(accountId: string, recipient: MessageRecipient): Promise<void>;
|
|
144
144
|
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Нажатие на кнопку под сообщением.
|
|
148
|
+
*
|
|
149
|
+
* `data` — то, что положили в `OutboundButton.callbackData`. Транспорт не пытается его понимать:
|
|
150
|
+
* смысл строки принадлежит продукту, а не каналу связи.
|
|
151
|
+
*/
|
|
152
|
+
export type ButtonPress = {
|
|
153
|
+
/** Кто нажал. `null` — отправитель неизвестен каналу. */
|
|
154
|
+
senderId: number | null;
|
|
155
|
+
data: string;
|
|
156
|
+
/**
|
|
157
|
+
* Подтвердить нажатие, показав человеку текст.
|
|
158
|
+
*
|
|
159
|
+
* Вызывать ОБЯЗАТЕЛЬНО: Telegram крутит на кнопке часы, пока не получит ответ, и человек видит
|
|
160
|
+
* зависшую кнопку даже при успешно выполненном действии.
|
|
161
|
+
*/
|
|
162
|
+
answer(text: string): Promise<void>;
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Канал, умеющий не только слать, но и ПРИНИМАТЬ нажатия.
|
|
167
|
+
*
|
|
168
|
+
* Отдельно от `MessageTransport`, потому что умеют не все: почта кнопок не имеет вовсе, а
|
|
169
|
+
* реализация, которая только шлёт, не должна объяснять, почему у неё пустой приём.
|
|
170
|
+
*/
|
|
171
|
+
export interface ButtonPressTransport {
|
|
172
|
+
/** Подписаться на нажатия. Возврат — функция отписки. */
|
|
173
|
+
onButtonPress(handler: (press: ButtonPress) => void | Promise<void>): () => void;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Вложение входящего сообщения.
|
|
178
|
+
*
|
|
179
|
+
* Только описание: байты достаёт транспорт (`download`), потому что адрес файла у каждого канала
|
|
180
|
+
* свой и живёт он вместе с учёткой, а не с сообщением.
|
|
181
|
+
*/
|
|
182
|
+
export type IncomingAttachment = {
|
|
183
|
+
/** Идентификатор файла В КАНАЛЕ. Смысла вне своего транспорта не имеет. */
|
|
184
|
+
id: string;
|
|
185
|
+
filename: string;
|
|
186
|
+
mimeType?: string;
|
|
187
|
+
sizeBytes?: number;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Входящее сообщение — общий вид для всех каналов.
|
|
192
|
+
*
|
|
193
|
+
* `transportId` и `accountId` входят В САМО сообщение, а не подставляются потребителем: один
|
|
194
|
+
* продукт слушает несколько учёток сразу, и `chatId` уникален только внутри пары «канал + учётка».
|
|
195
|
+
*/
|
|
196
|
+
export type IncomingMessage = {
|
|
197
|
+
transportId: string;
|
|
198
|
+
accountId: string;
|
|
199
|
+
chatId: string;
|
|
200
|
+
chatType: "user" | "group" | "channel";
|
|
201
|
+
/** Кто написал. `null` — канал отправителя не называет (рассылка, служебное событие). */
|
|
202
|
+
senderId: string | null;
|
|
203
|
+
senderUsername?: string;
|
|
204
|
+
messageId: string;
|
|
205
|
+
text: string;
|
|
206
|
+
attachments: IncomingAttachment[];
|
|
207
|
+
replyToMessageId?: string;
|
|
208
|
+
threadId?: number;
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Канал, умеющий ПРИНИМАТЬ сообщения.
|
|
213
|
+
*
|
|
214
|
+
* Отдельно от `MessageTransport` по той же причине, что и `ButtonPressTransport`: принимать умеет
|
|
215
|
+
* не всякий канал — почте это несвойственно вовсе, — и обещать приём всем транспортам значит
|
|
216
|
+
* заставить половину из них объяснять пустоту.
|
|
217
|
+
*/
|
|
218
|
+
export interface IncomingMessageTransport extends MessageTransport {
|
|
219
|
+
/** Подписаться на входящие. Возврат — функция отписки. */
|
|
220
|
+
onMessage(handler: (message: IncomingMessage) => void | Promise<void>): () => void;
|
|
221
|
+
/** Байты вложения. Отдельным вызовом: скачивать всё подряд дороже, чем разобрать текст. */
|
|
222
|
+
download(attachment: IncomingAttachment): Promise<Uint8Array>;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export function canReceive(transport: MessageTransport): transport is IncomingMessageTransport {
|
|
226
|
+
return typeof (transport as IncomingMessageTransport).onMessage === "function";
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** Пункт меню команд канала: `/menu` и подпись рядом с ним. */
|
|
230
|
+
export type ChannelCommand = {
|
|
231
|
+
/** Без ведущей косой черты. */
|
|
232
|
+
command: string;
|
|
233
|
+
description: string;
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Канал с меню команд.
|
|
238
|
+
*
|
|
239
|
+
* Нужен ровно затем, чтобы продукт не звал Bot API мимо транспорта: меню — свойство канала, а не
|
|
240
|
+
* сообщения, и без него единственным способом убрать постоянную клавиатуру был бы прямой вызов.
|
|
241
|
+
*/
|
|
242
|
+
export interface CommandMenuTransport extends MessageTransport {
|
|
243
|
+
setCommands(commands: ChannelCommand[]): Promise<void>;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export function hasCommandMenu(transport: MessageTransport): transport is CommandMenuTransport {
|
|
247
|
+
return typeof (transport as CommandMenuTransport).setCommands === "function";
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Канал, умеющий показать «печатает…».
|
|
252
|
+
*
|
|
253
|
+
* Не украшение: ход агента занимает секунды, и без признака работы человек пишет второй раз.
|
|
254
|
+
*/
|
|
255
|
+
export interface TypingTransport extends MessageTransport {
|
|
256
|
+
typing(recipient: MessageRecipient): Promise<void>;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export function canShowTyping(transport: MessageTransport): transport is TypingTransport {
|
|
260
|
+
return typeof (transport as TypingTransport).typing === "function";
|
|
261
|
+
}
|