@mtcute/core 0.12.5 → 0.13.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.
- package/cjs/highlevel/client.d.ts +104 -2
- package/cjs/highlevel/client.js +27 -0
- package/cjs/highlevel/client.js.map +1 -1
- package/cjs/highlevel/methods/_imports.js.map +1 -1
- package/cjs/highlevel/methods/chats/archive-chats.js +2 -1
- package/cjs/highlevel/methods/chats/archive-chats.js.map +1 -1
- package/cjs/highlevel/methods/chats/get-nearby-chats.js +1 -1
- package/cjs/highlevel/methods/chats/get-nearby-chats.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/find-dialogs.d.ts +12 -0
- package/cjs/highlevel/methods/dialogs/find-dialogs.js +88 -0
- package/cjs/highlevel/methods/dialogs/find-dialogs.js.map +1 -0
- package/cjs/highlevel/methods/dialogs/get-chatlist-preview.d.ts +8 -0
- package/cjs/highlevel/methods/dialogs/get-chatlist-preview.js +18 -0
- package/cjs/highlevel/methods/dialogs/get-chatlist-preview.js.map +1 -0
- package/cjs/highlevel/methods/dialogs/get-peer-dialogs.js +2 -1
- package/cjs/highlevel/methods/dialogs/get-peer-dialogs.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/iter-dialogs.js +55 -4
- package/cjs/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
- package/cjs/highlevel/methods/dialogs/join-chatlist.d.ts +15 -0
- package/cjs/highlevel/methods/dialogs/join-chatlist.js +42 -0
- package/cjs/highlevel/methods/dialogs/join-chatlist.js.map +1 -0
- package/cjs/highlevel/methods/messages/_business-connection.d.ts +2 -1
- package/cjs/highlevel/methods/messages/_business-connection.js.map +1 -1
- package/cjs/highlevel/methods/messages/get-available-effects.d.ts +6 -0
- package/cjs/highlevel/methods/messages/get-available-effects.js +26 -0
- package/cjs/highlevel/methods/messages/get-available-effects.js.map +1 -0
- package/cjs/highlevel/methods/messages/get-fact-check.d.ts +11 -0
- package/cjs/highlevel/methods/messages/get-fact-check.js +27 -0
- package/cjs/highlevel/methods/messages/get-fact-check.js.map +1 -0
- package/cjs/highlevel/methods/messages/get-message-reactions.js +1 -0
- package/cjs/highlevel/methods/messages/get-message-reactions.js.map +1 -1
- package/cjs/highlevel/methods/messages/search-hashtag.d.ts +44 -0
- package/cjs/highlevel/methods/messages/search-hashtag.js +75 -0
- package/cjs/highlevel/methods/messages/search-hashtag.js.map +1 -0
- package/cjs/highlevel/methods/messages/send-common.d.ts +5 -0
- package/cjs/highlevel/methods/messages/send-common.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-media-group.js +1 -0
- package/cjs/highlevel/methods/messages/send-media-group.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-media.js +1 -0
- package/cjs/highlevel/methods/messages/send-media.js.map +1 -1
- package/cjs/highlevel/methods/messages/send-text.js +1 -0
- package/cjs/highlevel/methods/messages/send-text.js.map +1 -1
- package/cjs/highlevel/methods/misc/normalize-privacy-rules.js +2 -1
- package/cjs/highlevel/methods/misc/normalize-privacy-rules.js.map +1 -1
- package/cjs/highlevel/methods/premium/get-business-connection.js +1 -0
- package/cjs/highlevel/methods/premium/get-business-connection.js.map +1 -1
- package/cjs/highlevel/methods/users/resolve-peer-many.d.ts +6 -2
- package/cjs/highlevel/methods/users/resolve-peer-many.js +22 -6
- package/cjs/highlevel/methods/users/resolve-peer-many.js.map +1 -1
- package/cjs/highlevel/methods/users/resolve-peer.js +30 -11
- package/cjs/highlevel/methods/users/resolve-peer.js.map +1 -1
- package/cjs/highlevel/methods.d.ts +8 -0
- package/cjs/highlevel/methods.js +19 -4
- package/cjs/highlevel/methods.js.map +1 -1
- package/cjs/highlevel/types/conversation.js +1 -1
- package/cjs/highlevel/types/conversation.js.map +1 -1
- package/cjs/highlevel/types/messages/dialog.d.ts +2 -2
- package/cjs/highlevel/types/messages/dialog.js +2 -3
- package/cjs/highlevel/types/messages/dialog.js.map +1 -1
- package/cjs/highlevel/types/messages/fact-check.d.ts +30 -0
- package/cjs/highlevel/types/messages/fact-check.js +56 -0
- package/cjs/highlevel/types/messages/fact-check.js.map +1 -0
- package/cjs/highlevel/types/messages/index.d.ts +2 -0
- package/cjs/highlevel/types/messages/index.js +2 -0
- package/cjs/highlevel/types/messages/index.js.map +1 -1
- package/cjs/highlevel/types/messages/message-effect.d.ts +20 -0
- package/cjs/highlevel/types/messages/message-effect.js +69 -0
- package/cjs/highlevel/types/messages/message-effect.js.map +1 -0
- package/cjs/highlevel/types/messages/message-entity.d.ts +4 -1
- package/cjs/highlevel/types/messages/message-entity.js +1 -1
- package/cjs/highlevel/types/messages/message-entity.js.map +1 -1
- package/cjs/highlevel/types/messages/message.d.ts +12 -0
- package/cjs/highlevel/types/messages/message.js +23 -0
- package/cjs/highlevel/types/messages/message.js.map +1 -1
- package/cjs/highlevel/types/peers/chat.d.ts +2 -0
- package/cjs/highlevel/types/peers/chat.js +4 -0
- package/cjs/highlevel/types/peers/chat.js.map +1 -1
- package/cjs/highlevel/types/peers/chatlist-preview.d.ts +21 -0
- package/cjs/highlevel/types/peers/chatlist-preview.js +49 -0
- package/cjs/highlevel/types/peers/chatlist-preview.js.map +1 -0
- package/cjs/highlevel/types/peers/index.d.ts +1 -0
- package/cjs/highlevel/types/peers/index.js +1 -0
- package/cjs/highlevel/types/peers/index.js.map +1 -1
- package/cjs/network/network-manager.js +1 -1
- package/cjs/utils/links/misc.d.ts +6 -0
- package/cjs/utils/links/misc.js +24 -1
- package/cjs/utils/links/misc.js.map +1 -1
- package/esm/highlevel/client.d.ts +104 -2
- package/esm/highlevel/client.js +27 -0
- package/esm/highlevel/client.js.map +1 -1
- package/esm/highlevel/methods/_imports.js.map +1 -1
- package/esm/highlevel/methods/chats/archive-chats.js +2 -1
- package/esm/highlevel/methods/chats/archive-chats.js.map +1 -1
- package/esm/highlevel/methods/chats/get-nearby-chats.js +1 -1
- package/esm/highlevel/methods/chats/get-nearby-chats.js.map +1 -1
- package/esm/highlevel/methods/dialogs/find-dialogs.d.ts +12 -0
- package/esm/highlevel/methods/dialogs/find-dialogs.js +84 -0
- package/esm/highlevel/methods/dialogs/find-dialogs.js.map +1 -0
- package/esm/highlevel/methods/dialogs/get-chatlist-preview.d.ts +8 -0
- package/esm/highlevel/methods/dialogs/get-chatlist-preview.js +14 -0
- package/esm/highlevel/methods/dialogs/get-chatlist-preview.js.map +1 -0
- package/esm/highlevel/methods/dialogs/get-peer-dialogs.js +2 -1
- package/esm/highlevel/methods/dialogs/get-peer-dialogs.js.map +1 -1
- package/esm/highlevel/methods/dialogs/iter-dialogs.js +56 -5
- package/esm/highlevel/methods/dialogs/iter-dialogs.js.map +1 -1
- package/esm/highlevel/methods/dialogs/join-chatlist.d.ts +15 -0
- package/esm/highlevel/methods/dialogs/join-chatlist.js +38 -0
- package/esm/highlevel/methods/dialogs/join-chatlist.js.map +1 -0
- package/esm/highlevel/methods/messages/_business-connection.d.ts +2 -1
- package/esm/highlevel/methods/messages/_business-connection.js.map +1 -1
- package/esm/highlevel/methods/messages/get-available-effects.d.ts +6 -0
- package/esm/highlevel/methods/messages/get-available-effects.js +22 -0
- package/esm/highlevel/methods/messages/get-available-effects.js.map +1 -0
- package/esm/highlevel/methods/messages/get-fact-check.d.ts +11 -0
- package/esm/highlevel/methods/messages/get-fact-check.js +23 -0
- package/esm/highlevel/methods/messages/get-fact-check.js.map +1 -0
- package/esm/highlevel/methods/messages/get-message-reactions.js +1 -0
- package/esm/highlevel/methods/messages/get-message-reactions.js.map +1 -1
- package/esm/highlevel/methods/messages/search-hashtag.d.ts +44 -0
- package/esm/highlevel/methods/messages/search-hashtag.js +70 -0
- package/esm/highlevel/methods/messages/search-hashtag.js.map +1 -0
- package/esm/highlevel/methods/messages/send-common.d.ts +5 -0
- package/esm/highlevel/methods/messages/send-common.js.map +1 -1
- package/esm/highlevel/methods/messages/send-media-group.js +1 -0
- package/esm/highlevel/methods/messages/send-media-group.js.map +1 -1
- package/esm/highlevel/methods/messages/send-media.js +1 -0
- package/esm/highlevel/methods/messages/send-media.js.map +1 -1
- package/esm/highlevel/methods/messages/send-text.js +1 -0
- package/esm/highlevel/methods/messages/send-text.js.map +1 -1
- package/esm/highlevel/methods/misc/normalize-privacy-rules.js +2 -1
- package/esm/highlevel/methods/misc/normalize-privacy-rules.js.map +1 -1
- package/esm/highlevel/methods/premium/get-business-connection.js +1 -0
- package/esm/highlevel/methods/premium/get-business-connection.js.map +1 -1
- package/esm/highlevel/methods/users/resolve-peer-many.d.ts +6 -2
- package/esm/highlevel/methods/users/resolve-peer-many.js +22 -6
- package/esm/highlevel/methods/users/resolve-peer-many.js.map +1 -1
- package/esm/highlevel/methods/users/resolve-peer.js +30 -11
- package/esm/highlevel/methods/users/resolve-peer.js.map +1 -1
- package/esm/highlevel/methods.d.ts +8 -0
- package/esm/highlevel/methods.js +7 -0
- package/esm/highlevel/methods.js.map +1 -1
- package/esm/highlevel/types/conversation.js +1 -1
- package/esm/highlevel/types/conversation.js.map +1 -1
- package/esm/highlevel/types/messages/dialog.d.ts +2 -2
- package/esm/highlevel/types/messages/dialog.js +2 -3
- package/esm/highlevel/types/messages/dialog.js.map +1 -1
- package/esm/highlevel/types/messages/fact-check.d.ts +30 -0
- package/esm/highlevel/types/messages/fact-check.js +53 -0
- package/esm/highlevel/types/messages/fact-check.js.map +1 -0
- package/esm/highlevel/types/messages/index.d.ts +2 -0
- package/esm/highlevel/types/messages/index.js +2 -0
- package/esm/highlevel/types/messages/index.js.map +1 -1
- package/esm/highlevel/types/messages/message-effect.d.ts +20 -0
- package/esm/highlevel/types/messages/message-effect.js +66 -0
- package/esm/highlevel/types/messages/message-effect.js.map +1 -0
- package/esm/highlevel/types/messages/message-entity.d.ts +4 -1
- package/esm/highlevel/types/messages/message-entity.js +1 -1
- package/esm/highlevel/types/messages/message-entity.js.map +1 -1
- package/esm/highlevel/types/messages/message.d.ts +12 -0
- package/esm/highlevel/types/messages/message.js +23 -0
- package/esm/highlevel/types/messages/message.js.map +1 -1
- package/esm/highlevel/types/peers/chat.d.ts +2 -0
- package/esm/highlevel/types/peers/chat.js +4 -0
- package/esm/highlevel/types/peers/chat.js.map +1 -1
- package/esm/highlevel/types/peers/chatlist-preview.d.ts +21 -0
- package/esm/highlevel/types/peers/chatlist-preview.js +46 -0
- package/esm/highlevel/types/peers/chatlist-preview.js.map +1 -0
- package/esm/highlevel/types/peers/index.d.ts +1 -0
- package/esm/highlevel/types/peers/index.js +1 -0
- package/esm/highlevel/types/peers/index.js.map +1 -1
- package/esm/network/network-manager.js +1 -1
- package/esm/utils/links/misc.d.ts +6 -0
- package/esm/utils/links/misc.js +23 -0
- package/esm/utils/links/misc.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { tl } from '@mtcute/tl';
|
|
2
|
+
import { ITelegramClient } from '../../client.types.js';
|
|
3
|
+
import { Message } from '../../types/index.js';
|
|
4
|
+
import { ArrayPaginated } from '../../types/utils.js';
|
|
5
|
+
export interface SearchHashtagOffset {
|
|
6
|
+
rate: number;
|
|
7
|
+
peer: tl.TypeInputPeer;
|
|
8
|
+
id: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Perform a global hashtag search, across the entire Telegram
|
|
12
|
+
*
|
|
13
|
+
* @param hashtag Hashtag to search for
|
|
14
|
+
* @param params Additional parameters
|
|
15
|
+
*/
|
|
16
|
+
export declare function searchHashtag(client: ITelegramClient, hashtag: string, params?: {
|
|
17
|
+
/** Offset for the search */
|
|
18
|
+
offset?: SearchHashtagOffset;
|
|
19
|
+
/** Limit the number of results */
|
|
20
|
+
limit?: number;
|
|
21
|
+
}): Promise<ArrayPaginated<Message, SearchHashtagOffset>>;
|
|
22
|
+
/**
|
|
23
|
+
* Perform a global hashtag search, across the entire Telegram
|
|
24
|
+
*
|
|
25
|
+
* Iterable version of {@link searchHashtag}
|
|
26
|
+
*
|
|
27
|
+
* @param hashtag Hashtag to search for
|
|
28
|
+
* @param params Additional parameters
|
|
29
|
+
*/
|
|
30
|
+
export declare function iterSearchHashtag(client: ITelegramClient, hashtag: string, params?: Parameters<typeof searchHashtag>[2] & {
|
|
31
|
+
/**
|
|
32
|
+
* Limits the number of messages to be retrieved.
|
|
33
|
+
*
|
|
34
|
+
* @default `Infinity`, i.e. all messages are returned
|
|
35
|
+
*/
|
|
36
|
+
limit?: number;
|
|
37
|
+
/**
|
|
38
|
+
* Chunk size, which will be passed as `limit` parameter
|
|
39
|
+
* for `messages.search`. Usually you shouldn't care about this.
|
|
40
|
+
*
|
|
41
|
+
* @default 100
|
|
42
|
+
*/
|
|
43
|
+
chunkSize?: number;
|
|
44
|
+
}): AsyncIterableIterator<Message>;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { assertTypeIsNot } from '../../../utils/type-assertions.js';
|
|
2
|
+
import { Message, PeersIndex } from '../../types/index.js';
|
|
3
|
+
import { makeArrayPaginated } from '../../utils/misc-utils.js';
|
|
4
|
+
const defaultOffset = {
|
|
5
|
+
rate: 0,
|
|
6
|
+
peer: { _: 'inputPeerEmpty' },
|
|
7
|
+
id: 0,
|
|
8
|
+
};
|
|
9
|
+
// @available=user
|
|
10
|
+
/**
|
|
11
|
+
* Perform a global hashtag search, across the entire Telegram
|
|
12
|
+
*
|
|
13
|
+
* @param hashtag Hashtag to search for
|
|
14
|
+
* @param params Additional parameters
|
|
15
|
+
*/
|
|
16
|
+
export async function searchHashtag(client, hashtag, params) {
|
|
17
|
+
const { offset: { rate: offsetRate, peer: offsetPeer, id: offsetId } = defaultOffset, limit = 100 } = params ?? {};
|
|
18
|
+
const res = await client.call({
|
|
19
|
+
_: 'channels.searchPosts',
|
|
20
|
+
hashtag,
|
|
21
|
+
offsetId,
|
|
22
|
+
offsetRate,
|
|
23
|
+
offsetPeer,
|
|
24
|
+
limit,
|
|
25
|
+
});
|
|
26
|
+
assertTypeIsNot('searchHashtag', res, 'messages.messagesNotModified');
|
|
27
|
+
const peers = PeersIndex.from(res);
|
|
28
|
+
const msgs = res.messages.filter((msg) => msg._ !== 'messageEmpty').map((msg) => new Message(msg, peers));
|
|
29
|
+
const last = msgs[msgs.length - 1];
|
|
30
|
+
const next = last ?
|
|
31
|
+
{
|
|
32
|
+
rate: res.nextRate ?? last.raw.date,
|
|
33
|
+
peer: last.chat.inputPeer,
|
|
34
|
+
id: last.id,
|
|
35
|
+
} :
|
|
36
|
+
undefined;
|
|
37
|
+
return makeArrayPaginated(msgs, res.count ?? msgs.length, next);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Perform a global hashtag search, across the entire Telegram
|
|
41
|
+
*
|
|
42
|
+
* Iterable version of {@link searchHashtag}
|
|
43
|
+
*
|
|
44
|
+
* @param hashtag Hashtag to search for
|
|
45
|
+
* @param params Additional parameters
|
|
46
|
+
*/
|
|
47
|
+
export async function* iterSearchHashtag(client, hashtag, params) {
|
|
48
|
+
if (!params)
|
|
49
|
+
params = {};
|
|
50
|
+
const { limit = Infinity, chunkSize = 100 } = params;
|
|
51
|
+
let { offset } = params;
|
|
52
|
+
let current = 0;
|
|
53
|
+
for (;;) {
|
|
54
|
+
const res = await searchHashtag(client, hashtag, {
|
|
55
|
+
offset,
|
|
56
|
+
limit: Math.min(chunkSize, limit - current),
|
|
57
|
+
});
|
|
58
|
+
if (!res.length)
|
|
59
|
+
return;
|
|
60
|
+
for (const msg of res) {
|
|
61
|
+
yield msg;
|
|
62
|
+
if (++current >= limit)
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (!res.next)
|
|
66
|
+
return;
|
|
67
|
+
offset = res.next;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=search-hashtag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-hashtag.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/search-hashtag.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAS9D,MAAM,aAAa,GAAwB;IACvC,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE;IAC7B,EAAE,EAAE,CAAC;CACR,CAAA;AAED,kBAAkB;AAClB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,MAAuB,EACvB,OAAe,EACf,MAKC;IAED,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,MAAM,IAAI,EAAE,CAAA;IAClH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,sBAAsB;QACzB,OAAO;QACP,QAAQ;QACR,UAAU;QACV,UAAU;QACV,KAAK;KACR,CAAC,CAAA;IAEF,eAAe,CAAC,eAAe,EAAE,GAAG,EAAE,8BAA8B,CAAC,CAAA;IAErE,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IACzG,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAElC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC;QACf;YACI,IAAI,EAAG,GAAoC,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI;YACrE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;YACzB,EAAE,EAAE,IAAI,CAAC,EAAE;SACd,CAAC,CAAC;QACH,SAAS,CAAA;IAEb,OAAO,kBAAkB,CAAC,IAAI,EAAG,GAAoC,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AACrG,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,iBAAiB,CACpC,MAAuB,EACvB,OAAe,EACf,MAeC;IAED,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,EAAE,CAAA;IACxB,MAAM,EAAE,KAAK,GAAG,QAAQ,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,MAAM,CAAA;IACpD,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAA;IACvB,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,SAAS,CAAC;QACN,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE;YAC7C,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,GAAG,OAAO,CAAC;SAC9C,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAM;QAEvB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,MAAM,GAAG,CAAA;YAET,IAAI,EAAE,OAAO,IAAI,KAAK;gBAAE,OAAM;QAClC,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI;YAAE,OAAM;QACrB,MAAM,GAAG,GAAG,CAAC,IAAI,CAAA;IACrB,CAAC;AACL,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { assertTypeIsNot } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { Message, PeersIndex } from '../../types/index.js'\nimport { ArrayPaginated } from '../../types/utils.js'\nimport { makeArrayPaginated } from '../../utils/misc-utils.js'\n\n// @exported\nexport interface SearchHashtagOffset {\n rate: number\n peer: tl.TypeInputPeer\n id: number\n}\n\nconst defaultOffset: SearchHashtagOffset = {\n rate: 0,\n peer: { _: 'inputPeerEmpty' },\n id: 0,\n}\n\n// @available=user\n/**\n * Perform a global hashtag search, across the entire Telegram\n *\n * @param hashtag Hashtag to search for\n * @param params Additional parameters\n */\nexport async function searchHashtag(\n client: ITelegramClient,\n hashtag: string,\n params?: {\n /** Offset for the search */\n offset?: SearchHashtagOffset\n /** Limit the number of results */\n limit?: number\n },\n): Promise<ArrayPaginated<Message, SearchHashtagOffset>> {\n const { offset: { rate: offsetRate, peer: offsetPeer, id: offsetId } = defaultOffset, limit = 100 } = params ?? {}\n const res = await client.call({\n _: 'channels.searchPosts',\n hashtag,\n offsetId,\n offsetRate,\n offsetPeer,\n limit,\n })\n\n assertTypeIsNot('searchHashtag', res, 'messages.messagesNotModified')\n\n const peers = PeersIndex.from(res)\n const msgs = res.messages.filter((msg) => msg._ !== 'messageEmpty').map((msg) => new Message(msg, peers))\n const last = msgs[msgs.length - 1]\n\n const next = last ?\n {\n rate: (res as tl.messages.RawMessagesSlice).nextRate ?? last.raw.date,\n peer: last.chat.inputPeer,\n id: last.id,\n } :\n undefined\n\n return makeArrayPaginated(msgs, (res as tl.messages.RawMessagesSlice).count ?? msgs.length, next)\n}\n\n/**\n * Perform a global hashtag search, across the entire Telegram\n *\n * Iterable version of {@link searchHashtag}\n *\n * @param hashtag Hashtag to search for\n * @param params Additional parameters\n */\nexport async function* iterSearchHashtag(\n client: ITelegramClient,\n hashtag: string,\n params?: Parameters<typeof searchHashtag>[2] & {\n /**\n * Limits the number of messages to be retrieved.\n *\n * @default `Infinity`, i.e. all messages are returned\n */\n limit?: number\n\n /**\n * Chunk size, which will be passed as `limit` parameter\n * for `messages.search`. Usually you shouldn't care about this.\n *\n * @default 100\n */\n chunkSize?: number\n },\n): AsyncIterableIterator<Message> {\n if (!params) params = {}\n const { limit = Infinity, chunkSize = 100 } = params\n let { offset } = params\n let current = 0\n\n for (;;) {\n const res = await searchHashtag(client, hashtag, {\n offset,\n limit: Math.min(chunkSize, limit - current),\n })\n\n if (!res.length) return\n\n for (const msg of res) {\n yield msg\n\n if (++current >= limit) return\n }\n\n if (!res.next) return\n offset = res.next\n }\n}\n"]}
|
|
@@ -92,6 +92,11 @@ export interface CommonSendParams {
|
|
|
92
92
|
* the message will be sent
|
|
93
93
|
*/
|
|
94
94
|
businessConnectionId?: string;
|
|
95
|
+
/**
|
|
96
|
+
* ID of a message effect to use when sending the message
|
|
97
|
+
* (see {@link TelegramClient.getAvailableMessageEffects})
|
|
98
|
+
*/
|
|
99
|
+
effect?: tl.Long;
|
|
95
100
|
}
|
|
96
101
|
/**
|
|
97
102
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-common.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-common.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAI9D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"send-common.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-common.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAI9D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAkH/C;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CACxC,QAAqC;IAErC,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAA;IAE/B,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO;YACH,CAAC,EAAE,2BAA2B;YAC9B,UAAU,EAAE,QAAQ;SACvB,CAAA;IACL,CAAC;IAED,OAAO;QACH,CAAC,EAAE,yBAAyB;QAC5B,QAAQ;KACX,CAAA;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAC9C,MAAuB,EACvB,MAAqB,EACrB,MAAwB;IAExB,IAAI,IAAI,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAE5C,IAAI,OAAO,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAChD,MAAM,WAAW,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAA;IAEnG,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAE,CAAC,CAAA;IACtG,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,eAAe,CAAC,4CAA4C,CAAC,CAAA;QAC3E,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;QAEpD,IAAI,CAAC,GAAG,EAAE,CAAC;YACP,MAAM,IAAI,sBAAsB,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;QACnF,CAAC;IACL,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,IAAI,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,eAAe,CAAC,4DAA4D,CAAC,CAAA;IAC3F,CAAC;IAED,IAAI,SAAS,GAAoC,SAAS,CAAA;IAE1D,IAAI,OAAO,EAAE,CAAC;QACV,SAAS,GAAG;YACR,CAAC,EAAE,qBAAqB;YACxB,YAAY,EAAE,OAAO;YACrB,aAAa,EAAE,WAAW;YAC1B,SAAS,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI;YAC7B,aAAa,EAAE,MAAM,CAAC,KAAK,EAAE,QAAkC;YAC/D,WAAW,EAAE,MAAM,CAAC,WAAW;SAClC,CAAA;IACL,CAAC;SAAM,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC7B,SAAS,GAAG;YACR,CAAC,EAAE,mBAAmB;YACtB,OAAO,EAAE,MAAM,CAAC,YAAY;YAC5B,IAAI;SACP,CAAA;IACL,CAAC;IAED,IAAI,YAAY,GAAuB,SAAS,CAAA;IAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC/B,YAAY,GAAG,UAAU,CAAA;IAC7B,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACzB,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC;IAED,OAAO;QACH,IAAI;QACJ,OAAO,EAAE,SAAS;QAClB,YAAY;QACZ,kBAAkB,EAAE,4BAA4B,CAAC,MAAM,CAAC,UAAU,CAAC;QACnE,OAAO,EAAE,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;KACjD,CAAA;AACL,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MtArgumentError } from '../../../types/errors.js'\nimport { getMarkedPeerId } from '../../../utils/peer-utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtMessageNotFoundError } from '../../types/errors.js'\nimport { Message } from '../../types/messages/message.js'\nimport { TextWithEntities } from '../../types/misc/entities.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { normalizeDate, normalizeMessageId } from '../../utils/index.js'\nimport { _getPeerChainId } from '../misc/chain-id.js'\nimport { _normalizeInputText } from '../misc/normalize-text.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { _getDiscussionMessage } from './get-discussion-message.js'\nimport { getMessages } from './get-messages.js'\n\n// @exported\nexport interface CommonSendParams {\n /**\n * Message to reply to. Either a message object or message ID.\n *\n * For forums - can also be an ID of the topic (i.e. its top message ID)\n *\n * Can also be a message from another chat, in which case a quote will be sent.\n */\n replyTo?: number | Message\n\n /**\n * Whether to throw an error if {@link replyTo}\n * message does not exist.\n *\n * If that message was not found, `NotFoundError` is thrown,\n * with `text` set to `MESSAGE_NOT_FOUND`.\n *\n * Incurs an additional request, so only use when really needed.\n *\n * @default `false`\n */\n mustReply?: boolean\n\n /**\n * Message to comment to. Either a message object or message ID.\n *\n * This overwrites `replyTo` if it was passed\n */\n commentTo?: number | Message\n\n /**\n * Story to reply to.\n *\n * Must be the story sent by the peer you are sending the message to.\n *\n * Can't be used together with {@link replyTo} or {@link commentTo}.\n */\n replyToStory?: number\n\n /**\n * Quoted text. Must be exactly contained in the message\n * being quoted to be accepted by the server (as well as entities)\n */\n quote?: TextWithEntities\n\n /**\n * Offset of the start of the quote in the message.\n */\n quoteOffset?: number\n\n /**\n * Whether to send this message silently.\n */\n silent?: boolean\n\n /**\n * If set, the message will be scheduled to this date.\n * When passing a number, a UNIX time in ms is expected.\n *\n * You can also pass `online` - this will send the message\n * once the peer is online. Note that this requires that\n * peer's online status to be visible to you.\n */\n schedule?: Date | number | 'online'\n\n /**\n * Whether to clear draft after sending this message.\n *\n * @default `false`\n */\n clearDraft?: boolean\n\n /**\n * Whether to disallow further forwards of this message.\n *\n * Only for bots, works even if the target chat does not\n * have content protection.\n */\n forbidForwards?: boolean\n\n /**\n * Peer to use when sending the message.\n */\n sendAs?: InputPeerLike\n\n /**\n * If passed, instead of sending the message, it will be saved into the\n * given quick reply shortcut (either its ID or its shortcut string).\n */\n quickReply?: number | string\n\n /**\n * Whether to dispatch the returned message\n * to the client's update handler.\n */\n shouldDispatch?: true\n\n /**\n * Unique identifier of the business connection on behalf of which\n * the message will be sent\n */\n businessConnectionId?: string\n\n /**\n * ID of a message effect to use when sending the message\n * (see {@link TelegramClient.getAvailableMessageEffects})\n */\n effect?: tl.Long\n // todo: once we have a caching layer, we can accept an emoji here\n}\n\n/**\n * @internal\n * @noemit\n */\nexport function _normalizeQuickReplyShortcut(\n shortcut: number | string | undefined,\n): tl.TypeInputQuickReplyShortcut | undefined {\n if (!shortcut) return undefined\n\n if (typeof shortcut === 'number') {\n return {\n _: 'inputQuickReplyShortcutId',\n shortcutId: shortcut,\n }\n }\n\n return {\n _: 'inputQuickReplyShortcut',\n shortcut,\n }\n}\n\n/**\n * @internal\n * @noemit\n */\nexport async function _processCommonSendParameters(\n client: ITelegramClient,\n chatId: InputPeerLike,\n params: CommonSendParams,\n) {\n let peer = await resolvePeer(client, chatId)\n\n let replyTo = normalizeMessageId(params.replyTo)\n const replyToPeer = typeof params.replyTo === 'number' ? undefined : params.replyTo?.chat.inputPeer\n\n if (params.commentTo) {\n [peer, replyTo] = await _getDiscussionMessage(client, peer, normalizeMessageId(params.commentTo)!)\n }\n\n if (params.mustReply) {\n if (!replyTo) {\n throw new MtArgumentError('mustReply used, but replyTo was not passed')\n }\n\n const msg = await getMessages(client, peer, replyTo)\n\n if (!msg) {\n throw new MtMessageNotFoundError(getMarkedPeerId(peer), replyTo, 'to reply to')\n }\n }\n\n if (params.replyToStory && replyTo) {\n throw new MtArgumentError('replyTo/commentTo and replyToStory cannot be used together')\n }\n\n let tlReplyTo: tl.TypeInputReplyTo | undefined = undefined\n\n if (replyTo) {\n tlReplyTo = {\n _: 'inputReplyToMessage',\n replyToMsgId: replyTo,\n replyToPeerId: replyToPeer,\n quoteText: params.quote?.text,\n quoteEntities: params.quote?.entities as tl.TypeMessageEntity[],\n quoteOffset: params.quoteOffset,\n }\n } else if (params.replyToStory) {\n tlReplyTo = {\n _: 'inputReplyToStory',\n storyId: params.replyToStory,\n peer,\n }\n }\n\n let scheduleDate: number | undefined = undefined\n\n if (params.schedule === 'online') {\n scheduleDate = 0x7ffffffe\n } else if (params.schedule) {\n scheduleDate = normalizeDate(params.schedule)\n }\n\n return {\n peer,\n replyTo: tlReplyTo,\n scheduleDate,\n quickReplyShortcut: _normalizeQuickReplyShortcut(params.quickReply),\n chainId: _getPeerChainId(client, peer, 'send'),\n }\n}\n"]}
|
|
@@ -63,6 +63,7 @@ export async function sendMediaGroup(client, chatId, medias, params) {
|
|
|
63
63
|
sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : undefined,
|
|
64
64
|
invertMedia: params.invertMedia,
|
|
65
65
|
quickReplyShortcut,
|
|
66
|
+
effect: params.effect,
|
|
66
67
|
}, { chainId });
|
|
67
68
|
assertIsUpdatesGroup('sendMediaGroup', res);
|
|
68
69
|
client.handleClientUpdate(res);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-media-group.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-media-group.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAGzD,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AACzD,OAAO,EAAiB,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAA;AAE9E,OAAO,EAAE,4BAA4B,EAAoB,MAAM,kBAAkB,CAAA;AAEjF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,MAAuB,EACvB,MAAqB,EACrB,MAAmC,EACnC,MAmBC;IAED,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,EAAE,CAAA;IAExB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,4BAA4B,CACnG,MAAM,EACN,MAAM,EACN,MAAM,CACT,CAAA;IAED,MAAM,UAAU,GAA6B,EAAE,CAAA;IAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QAErB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,KAAK,GAAG;gBACJ,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,KAAK;aACd,CAAA;QACL,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,oBAAoB,CACzC,MAAM,EACN,KAAK,EACL;YACI,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,2DAA2D;YAC3D,8CAA8C;YAC9C,eAAe;YACf,UAAU,EAAE,IAAI;YAChB,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;SACpD,EACD,IAAI,CACP,CAAA;QAED,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,mBAAmB,CACjD,MAAM;QACN,yDAAyD;QACzD,oFAAoF;QACnF,KAAsD,CAAC,OAAO,CAClE,CAAA;QAED,UAAU,CAAC,IAAI,CAAC;YACZ,CAAC,EAAE,kBAAkB;YACrB,QAAQ,EAAE,UAAU,EAAE;YACtB,KAAK,EAAE,UAAU;YACjB,OAAO;YACP,QAAQ;SACX,CAAC,CAAA;IACN,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,kCAAkC,CAChD,MAAM,EACN,MAAM,CAAC,oBAAoB,EAC3B;QACI,CAAC,EAAE,yBAAyB;QAC5B,IAAI;QACJ,UAAU;QACV,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO;QACP,YAAY;QACZ,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,cAAc;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5E,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,kBAAkB;
|
|
1
|
+
{"version":3,"file":"send-media-group.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-media-group.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { randomLong } from '../../../utils/long-utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputMediaLike } from '../../types/media/input-media/types.js'\nimport { Message } from '../../types/messages/message.js'\nimport { InputPeerLike, PeersIndex } from '../../types/peers/index.js'\nimport { assertIsUpdatesGroup } from '../../updates/utils.js'\nimport { _normalizeInputMedia } from '../files/normalize-input-media.js'\nimport { _normalizeInputText } from '../misc/normalize-text.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { _maybeInvokeWithBusinessConnection } from './_business-connection.js'\nimport { _getDiscussionMessage } from './get-discussion-message.js'\nimport { _processCommonSendParameters, CommonSendParams } from './send-common.js'\n\n/**\n * Send a group of media.\n *\n * To add a caption to the group, add caption to the first\n * media in the group and don't add caption for any other.\n *\n * @param chatId ID of the chat, its username, phone or `\"me\"` or `\"self\"`\n * @param medias Medias contained in the message.\n * @param params Additional sending parameters\n * @link InputMedia\n */\nexport async function sendMediaGroup(\n client: ITelegramClient,\n chatId: InputPeerLike,\n medias: (InputMediaLike | string)[],\n params?: CommonSendParams & {\n /**\n * Whether to invert media position.\n *\n * Currently only supported for web previews and makes the\n * client render the preview above the caption and not below.\n */\n invertMedia?: boolean\n\n /**\n * Function that will be called after some part has been uploaded.\n * Only used when a file that requires uploading is passed,\n * and not used when uploading a thumbnail.\n *\n * @param index Index of the media in the original array\n * @param uploaded Number of bytes already uploaded\n * @param total Total file size\n */\n progressCallback?: (index: number, uploaded: number, total: number) => void\n },\n): Promise<Message[]> {\n if (!params) params = {}\n\n const { peer, replyTo, scheduleDate, chainId, quickReplyShortcut } = await _processCommonSendParameters(\n client,\n chatId,\n params,\n )\n\n const multiMedia: tl.RawInputSingleMedia[] = []\n\n for (let i = 0; i < medias.length; i++) {\n let media = medias[i]\n\n if (typeof media === 'string') {\n media = {\n type: 'auto',\n file: media,\n }\n }\n\n const inputMedia = await _normalizeInputMedia(\n client,\n media,\n {\n progressCallback: params.progressCallback?.bind(null, i),\n // i have no fucking clue why we should upload it manually,\n // but otherwise Telegram throws MEDIA_INVALID\n // fuck my life\n uploadPeer: peer,\n businessConnectionId: params.businessConnectionId,\n },\n true,\n )\n\n const [message, entities] = await _normalizeInputText(\n client,\n // some types dont have `caption` field, and ts warns us,\n // but since it's JS, they'll just be `undefined` and properly handled by the method\n (media as Extract<typeof media, { caption?: unknown }>).caption,\n )\n\n multiMedia.push({\n _: 'inputSingleMedia',\n randomId: randomLong(),\n media: inputMedia,\n message,\n entities,\n })\n }\n\n const res = await _maybeInvokeWithBusinessConnection(\n client,\n params.businessConnectionId,\n {\n _: 'messages.sendMultiMedia',\n peer,\n multiMedia,\n silent: params.silent,\n replyTo,\n scheduleDate,\n clearDraft: params.clearDraft,\n noforwards: params.forbidForwards,\n sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : undefined,\n invertMedia: params.invertMedia,\n quickReplyShortcut,\n effect: params.effect,\n },\n { chainId },\n )\n\n assertIsUpdatesGroup('sendMediaGroup', res)\n client.handleClientUpdate(res)\n\n const peers = PeersIndex.from(res)\n\n const msgs = res.updates\n .filter(\n (u): u is tl.RawUpdateNewMessage | tl.RawUpdateNewChannelMessage | tl.RawUpdateNewScheduledMessage =>\n u._ === 'updateNewMessage' || u._ === 'updateNewChannelMessage' || u._ === 'updateNewScheduledMessage',\n )\n .map((u) => new Message(u.message, peers, u._ === 'updateNewScheduledMessage'))\n\n return msgs\n}\n"]}
|
|
@@ -50,6 +50,7 @@ export async function sendMedia(client, chatId, media, params) {
|
|
|
50
50
|
sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : undefined,
|
|
51
51
|
invertMedia: params.invert,
|
|
52
52
|
quickReplyShortcut,
|
|
53
|
+
effect: params.effect,
|
|
53
54
|
}, { chainId });
|
|
54
55
|
const msg = _findMessageInUpdate(client, res, false, !params.shouldDispatch, false, randomId);
|
|
55
56
|
return msg;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-media.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAe,MAAM,qCAAqC,CAAA;AAK9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAA;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,OAAO,EAAE,4BAA4B,EAAoB,MAAM,kBAAkB,CAAA;AAEjF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,MAAuB,EACvB,MAAqB,EACrB,KAA8B,EAC9B,MAgCC;IAED,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,EAAE,CAAA;IAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,KAAK,GAAG;YACJ,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,KAAK;SACd,CAAA;IACL,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAEpE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,mBAAmB,CACjD,MAAM;IACN,yDAAyD;IACzD,oFAAoF;IACpF,MAAM,CAAC,OAAO,IAAK,KAAsD,CAAC,OAAO,CACpF,CAAA;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,4BAA4B,CACnG,MAAM,EACN,MAAM,EACN,MAAM,CACT,CAAA;IAED,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAA;IAC7B,MAAM,GAAG,GAAG,MAAM,kCAAkC,CAChD,MAAM,EACN,MAAM,CAAC,oBAAoB,EAC3B;QACI,CAAC,EAAE,oBAAoB;QACvB,IAAI;QACJ,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,OAAO;QACP,QAAQ;QACR,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,cAAc;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5E,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,kBAAkB;
|
|
1
|
+
{"version":3,"file":"send-media.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAe,MAAM,qCAAqC,CAAA;AAK9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAA;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,OAAO,EAAE,4BAA4B,EAAoB,MAAM,kBAAkB,CAAA;AAEjF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,MAAuB,EACvB,MAAqB,EACrB,KAA8B,EAC9B,MAgCC;IAED,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,EAAE,CAAA;IAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,KAAK,GAAG;YACJ,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,KAAK;SACd,CAAA;IACL,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAEpE,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,mBAAmB,CACjD,MAAM;IACN,yDAAyD;IACzD,oFAAoF;IACpF,MAAM,CAAC,OAAO,IAAK,KAAsD,CAAC,OAAO,CACpF,CAAA;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,4BAA4B,CACnG,MAAM,EACN,MAAM,EACN,MAAM,CACT,CAAA;IAED,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAA;IAC7B,MAAM,GAAG,GAAG,MAAM,kCAAkC,CAChD,MAAM,EACN,MAAM,CAAC,oBAAoB,EAC3B;QACI,CAAC,EAAE,oBAAoB;QACvB,IAAI;QACJ,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,OAAO;QACP,QAAQ;QACR,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,cAAc;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5E,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,kBAAkB;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM;KACxB,EACD,EAAE,OAAO,EAAE,CACd,CAAA;IAED,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IAE7F,OAAO,GAAG,CAAA;AACd,CAAC","sourcesContent":["import { randomLong } from '../../../utils/long-utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { BotKeyboard, ReplyMarkup } from '../../types/bots/keyboards/index.js'\nimport { InputMediaLike } from '../../types/media/input-media/types.js'\nimport { Message } from '../../types/messages/message.js'\nimport { InputText } from '../../types/misc/entities.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { _normalizeInputMedia } from '../files/normalize-input-media.js'\nimport { _normalizeInputText } from '../misc/normalize-text.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { _maybeInvokeWithBusinessConnection } from './_business-connection.js'\nimport { _findMessageInUpdate } from './find-in-update.js'\nimport { _getDiscussionMessage } from './get-discussion-message.js'\nimport { _processCommonSendParameters, CommonSendParams } from './send-common.js'\n\n/**\n * Send a single media (a photo or a document-based media)\n *\n * @param chatId ID of the chat, its username, phone or `\"me\"` or `\"self\"`\n * @param media\n * Media contained in the message. You can also pass TDLib\n * and Bot API compatible File ID, which will be wrapped\n * in {@link InputMedia.auto}\n * @param params Additional sending parameters\n * @link InputMedia\n */\nexport async function sendMedia(\n client: ITelegramClient,\n chatId: InputPeerLike,\n media: InputMediaLike | string,\n params?: CommonSendParams & {\n /**\n * For bots: inline or reply markup or an instruction\n * to hide a reply keyboard or to force a reply.\n */\n replyMarkup?: ReplyMarkup\n\n /**\n * Whether to invert media position.\n *\n * Currently only supported for web previews and makes the\n * client render the preview above the caption and not below.\n */\n invert?: boolean\n\n /**\n * Override caption for `media`.\n *\n * Can be used, for example. when using File IDs\n * or when using existing InputMedia objects.\n */\n caption?: InputText\n\n /**\n * Function that will be called after some part has been uploaded.\n * Only used when a file that requires uploading is passed,\n * and not used when uploading a thumbnail.\n *\n * @param uploaded Number of bytes already uploaded\n * @param total Total file size\n */\n progressCallback?: (uploaded: number, total: number) => void\n },\n): Promise<Message> {\n if (!params) params = {}\n\n if (typeof media === 'string') {\n media = {\n type: 'auto',\n file: media,\n }\n }\n\n const inputMedia = await _normalizeInputMedia(client, media, params)\n\n const [message, entities] = await _normalizeInputText(\n client,\n // some types dont have `caption` field, and ts warns us,\n // but since it's JS, they'll just be `undefined` and properly handled by the method\n params.caption || (media as Extract<typeof media, { caption?: unknown }>).caption,\n )\n\n const replyMarkup = BotKeyboard._convertToTl(params.replyMarkup)\n const { peer, replyTo, scheduleDate, chainId, quickReplyShortcut } = await _processCommonSendParameters(\n client,\n chatId,\n params,\n )\n\n const randomId = randomLong()\n const res = await _maybeInvokeWithBusinessConnection(\n client,\n params.businessConnectionId,\n {\n _: 'messages.sendMedia',\n peer,\n media: inputMedia,\n silent: params.silent,\n replyTo,\n randomId,\n scheduleDate,\n replyMarkup,\n message,\n entities,\n clearDraft: params.clearDraft,\n noforwards: params.forbidForwards,\n sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : undefined,\n invertMedia: params.invert,\n quickReplyShortcut,\n effect: params.effect,\n },\n { chainId },\n )\n\n const msg = _findMessageInUpdate(client, res, false, !params.shouldDispatch, false, randomId)\n\n return msg\n}\n"]}
|
|
@@ -42,6 +42,7 @@ export async function sendText(client, chatId, text, params) {
|
|
|
42
42
|
sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : undefined,
|
|
43
43
|
invertMedia: params.invertMedia,
|
|
44
44
|
quickReplyShortcut,
|
|
45
|
+
effect: params.effect,
|
|
45
46
|
}, { chainId });
|
|
46
47
|
if (res._ === 'updateShortSentMessage') {
|
|
47
48
|
// todo extract this to updates manager?
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-text.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-text.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAe,MAAM,qCAAqC,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAEzD,OAAO,EAAiB,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAA;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,OAAO,EAAE,4BAA4B,EAAoB,MAAM,kBAAkB,CAAA;AAEjF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC1B,MAAuB,EACvB,MAAqB,EACrB,IAAe,EACf,MAmBC;IAED,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,EAAE,CAAA;IAExB,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAEnE,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,4BAA4B,CACnG,MAAM,EACN,MAAM,EACN,MAAM,CACT,CAAA;IAED,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAA;IAC7B,MAAM,GAAG,GAAG,MAAM,kCAAkC,CAChD,MAAM,EACN,MAAM,CAAC,oBAAoB,EAC3B;QACI,CAAC,EAAE,sBAAsB;QACzB,IAAI;QACJ,SAAS,EAAE,MAAM,CAAC,iBAAiB;QACnC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,OAAO;QACP,QAAQ;QACR,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,cAAc;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5E,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,kBAAkB;
|
|
1
|
+
{"version":3,"file":"send-text.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/messages/send-text.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAe,MAAM,qCAAqC,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAEzD,OAAO,EAAiB,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAA;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAE1D,OAAO,EAAE,4BAA4B,EAAoB,MAAM,kBAAkB,CAAA;AAEjF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC1B,MAAuB,EACvB,MAAqB,EACrB,IAAe,EACf,MAmBC;IAED,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,EAAE,CAAA;IAExB,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAEnE,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,MAAM,4BAA4B,CACnG,MAAM,EACN,MAAM,EACN,MAAM,CACT,CAAA;IAED,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAA;IAC7B,MAAM,GAAG,GAAG,MAAM,kCAAkC,CAChD,MAAM,EACN,MAAM,CAAC,oBAAoB,EAC3B;QACI,CAAC,EAAE,sBAAsB;QACzB,IAAI;QACJ,SAAS,EAAE,MAAM,CAAC,iBAAiB;QACnC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,OAAO;QACP,QAAQ;QACR,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,cAAc;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5E,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,kBAAkB;QAClB,MAAM,EAAE,MAAM,CAAC,MAAM;KACxB,EACD,EAAE,OAAO,EAAE,CACd,CAAA;IAED,IAAI,GAAG,CAAC,CAAC,KAAK,wBAAwB,EAAE,CAAC;QACrC,wCAAwC;QACxC,MAAM,GAAG,GAAkB;YACvB,CAAC,EAAE,SAAS;YACZ,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC;YAC7B,MAAM,EAAE,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAG,CAAC,MAAM,EAAE;YAC1E,OAAO;YACP,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,WAAW;YACX,QAAQ,EAAE,GAAG,CAAC,QAAQ;SACzB,CAAA;QAED,kBAAkB;QAClB,wBAAwB;QACxB,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;QAEnE,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAA;QAE9B,MAAM,SAAS,GAAG,KAAK,EAAE,IAAoC,EAAiB,EAAE;YAC5E,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;YAEhC,IAAI,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;YAE3D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,GAAG,MAAM,kBAAkB,CAAC,MAAM,EAAE,MAAM,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;YAC9E,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,oBAAoB,CAAC,8BAA8B,EAAE,aAAa,EAAE,MAAM,CAAC,CAAA;YACzF,CAAC;YAED,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC;gBACf,KAAK,MAAM;oBACP,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;oBAClC,MAAK;gBACT,KAAK,MAAM,CAAC;gBACZ,KAAK,eAAe,CAAC;gBACrB,KAAK,SAAS,CAAC;gBACf,KAAK,kBAAkB;oBACnB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;oBAClC,MAAK;gBACT;oBACI,MAAM,IAAI,oBAAoB,CAC1B,6BAA6B,EAC7B,uBAAuB,EAAE,qCAAqC;oBAC9D,MAAM,CAAC,CAAC,CACX,CAAA;YACT,CAAC;QACL,CAAC,CAAA;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,MAAO,CAAC,CAAC,CAAC,CAAA;QAE5D,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAEnC,OAAO,GAAG,CAAA;IACd,CAAC;IAED,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IAE7F,OAAO,GAAG,CAAA;AACd,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { MtTypeAssertionError } from '../../../types/errors.js'\nimport { randomLong } from '../../../utils/long-utils.js'\nimport { getMarkedPeerId } from '../../../utils/peer-utils.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { BotKeyboard, ReplyMarkup } from '../../types/bots/keyboards/index.js'\nimport { Message } from '../../types/messages/message.js'\nimport { InputText } from '../../types/misc/entities.js'\nimport { InputPeerLike, PeersIndex } from '../../types/peers/index.js'\nimport { createDummyUpdate } from '../../updates/utils.js'\nimport { inputPeerToPeer } from '../../utils/peer-utils.js'\nimport { _getRawPeerBatched } from '../chats/batched-queries.js'\nimport { _normalizeInputText } from '../misc/normalize-text.js'\nimport { resolvePeer } from '../users/resolve-peer.js'\nimport { _maybeInvokeWithBusinessConnection } from './_business-connection.js'\nimport { _findMessageInUpdate } from './find-in-update.js'\nimport { _getDiscussionMessage } from './get-discussion-message.js'\nimport { _processCommonSendParameters, CommonSendParams } from './send-common.js'\n\n/**\n * Send a text message\n *\n * @param chatId ID of the chat, its username, phone or `\"me\"` or `\"self\"`\n * @param text Text of the message\n * @param params Additional sending parameters\n */\nexport async function sendText(\n client: ITelegramClient,\n chatId: InputPeerLike,\n text: InputText,\n params?: CommonSendParams & {\n /**\n * For bots: inline or reply markup or an instruction\n * to hide a reply keyboard or to force a reply.\n */\n replyMarkup?: ReplyMarkup\n\n /**\n * Whether to disable links preview in this message\n */\n disableWebPreview?: boolean\n\n /**\n * Whether to invert media position.\n *\n * Currently only supported for web previews and makes the\n * client render the preview above the caption and not below.\n */\n invertMedia?: boolean\n },\n): Promise<Message> {\n if (!params) params = {}\n\n const [message, entities] = await _normalizeInputText(client, text)\n\n const replyMarkup = BotKeyboard._convertToTl(params.replyMarkup)\n const { peer, replyTo, scheduleDate, chainId, quickReplyShortcut } = await _processCommonSendParameters(\n client,\n chatId,\n params,\n )\n\n const randomId = randomLong()\n const res = await _maybeInvokeWithBusinessConnection(\n client,\n params.businessConnectionId,\n {\n _: 'messages.sendMessage',\n peer,\n noWebpage: params.disableWebPreview,\n silent: params.silent,\n replyTo,\n randomId,\n scheduleDate,\n replyMarkup,\n message,\n entities,\n clearDraft: params.clearDraft,\n noforwards: params.forbidForwards,\n sendAs: params.sendAs ? await resolvePeer(client, params.sendAs) : undefined,\n invertMedia: params.invertMedia,\n quickReplyShortcut,\n effect: params.effect,\n },\n { chainId },\n )\n\n if (res._ === 'updateShortSentMessage') {\n // todo extract this to updates manager?\n const msg: tl.RawMessage = {\n _: 'message',\n id: res.id,\n peerId: inputPeerToPeer(peer),\n fromId: { _: 'peerUser', userId: client.storage.self.getCached()!.userId },\n message,\n date: res.date,\n out: res.out,\n replyMarkup,\n entities: res.entities,\n }\n\n // is this needed?\n // this._date = res.date\n client.handleClientUpdate(createDummyUpdate(res.pts, res.ptsCount))\n\n const peers = new PeersIndex()\n\n const fetchPeer = async (peer: tl.TypePeer | tl.TypeInputPeer): Promise<void> => {\n const id = getMarkedPeerId(peer)\n\n let cached = await client.storage.peers.getCompleteById(id)\n\n if (!cached) {\n cached = await _getRawPeerBatched(client, await resolvePeer(client, peer))\n }\n\n if (!cached) {\n throw new MtTypeAssertionError('sendText (@ getFullPeerById)', 'user | chat', 'null')\n }\n\n switch (cached._) {\n case 'user':\n peers.users.set(cached.id, cached)\n break\n case 'chat':\n case 'chatForbidden':\n case 'channel':\n case 'channelForbidden':\n peers.chats.set(cached.id, cached)\n break\n default:\n throw new MtTypeAssertionError(\n 'sendText (@ users.getUsers)',\n 'user | chat | channel', // not very accurate, but good enough\n cached._,\n )\n }\n }\n\n await Promise.all([fetchPeer(peer), fetchPeer(msg.fromId!)])\n\n const ret = new Message(msg, peers)\n\n return ret\n }\n\n const msg = _findMessageInUpdate(client, res, false, !params.shouldDispatch, false, randomId)\n\n return msg\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isPresent } from '../../../utils/type-assertions.js';
|
|
1
2
|
import { toInputUser } from '../../utils/index.js';
|
|
2
3
|
import { resolvePeerMany } from '../users/resolve-peer-many.js';
|
|
3
4
|
/**
|
|
@@ -23,7 +24,7 @@ export async function _normalizePrivacyRules(client, rules) {
|
|
|
23
24
|
const chats = await resolvePeerMany(client, rule.chats);
|
|
24
25
|
res.push({
|
|
25
26
|
_: rule.allow ? 'inputPrivacyValueAllowChatParticipants' : 'inputPrivacyValueDisallowChatParticipants',
|
|
26
|
-
chats: chats.map((peer) => {
|
|
27
|
+
chats: chats.filter(isPresent).map((peer) => {
|
|
27
28
|
if ('channelId' in peer)
|
|
28
29
|
return peer.channelId;
|
|
29
30
|
if ('chatId' in peer)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize-privacy-rules.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/misc/normalize-privacy-rules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"normalize-privacy-rules.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/misc/normalize-privacy-rules.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAE/D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,MAAuB,EACvB,KAAyB;IAEzB,MAAM,GAAG,GAA8B,EAAE,CAAA;IAEzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACd,SAAQ;QACZ,CAAC;QAED,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;YAEpE,GAAG,CAAC,IAAI,CAAC;gBACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,gCAAgC;gBAChF,KAAK;aACR,CAAC,CAAA;YACF,SAAQ;QACZ,CAAC;QAED,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;YAEvD,GAAG,CAAC,IAAI,CAAC;gBACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,2CAA2C;gBACtG,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBACxC,IAAI,WAAW,IAAI,IAAI;wBAAE,OAAO,IAAI,CAAC,SAAS,CAAA;oBAC9C,IAAI,QAAQ,IAAI,IAAI;wBAAE,OAAO,IAAI,CAAC,MAAM,CAAA;oBAExC,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAA;gBAClC,CAAC,CAAC;aACL,CAAC,CAAA;YACF,SAAQ;QACZ,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAA;AACd,CAAC","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { isPresent } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { InputPrivacyRule } from '../../types/index.js'\nimport { toInputUser } from '../../utils/index.js'\nimport { resolvePeerMany } from '../users/resolve-peer-many.js'\n\n/**\n * Normalize {@link InputPrivacyRule}[] to `tl.TypeInputPrivacyRule`,\n * resolving the peers if needed.\n */\nexport async function _normalizePrivacyRules(\n client: ITelegramClient,\n rules: InputPrivacyRule[],\n): Promise<tl.TypeInputPrivacyRule[]> {\n const res: tl.TypeInputPrivacyRule[] = []\n\n for (const rule of rules) {\n if ('_' in rule) {\n res.push(rule)\n continue\n }\n\n if ('users' in rule) {\n const users = await resolvePeerMany(client, rule.users, toInputUser)\n\n res.push({\n _: rule.allow ? 'inputPrivacyValueAllowUsers' : 'inputPrivacyValueDisallowUsers',\n users,\n })\n continue\n }\n\n if ('chats' in rule) {\n const chats = await resolvePeerMany(client, rule.chats)\n\n res.push({\n _: rule.allow ? 'inputPrivacyValueAllowChatParticipants' : 'inputPrivacyValueDisallowChatParticipants',\n chats: chats.filter(isPresent).map((peer) => {\n if ('channelId' in peer) return peer.channelId\n if ('chatId' in peer) return peer.chatId\n\n throw new Error('UNREACHABLE')\n }),\n })\n continue\n }\n }\n\n return res\n}\n"]}
|
|
@@ -14,6 +14,7 @@ export async function getBusinessConnection(client, connectionId) {
|
|
|
14
14
|
connectionId,
|
|
15
15
|
});
|
|
16
16
|
assertIsUpdatesGroup('account.getBotBusinessConnection', res);
|
|
17
|
+
client.handleClientUpdate(res);
|
|
17
18
|
assertTypeIs('account.getBotBusinessConnection', res.updates[0], 'updateBotBusinessConnect');
|
|
18
19
|
const peers = PeersIndex.from(res);
|
|
19
20
|
return new BusinessConnection(res.updates[0].connection, peers);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-business-connection.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/premium/get-business-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D,iBAAiB;AACjB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,MAAuB,EACvB,YAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,kCAAkC;QACrC,YAAY;KACf,CAAC,CAAA;IAEF,oBAAoB,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAA;IAC7D,YAAY,CAAC,kCAAkC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAA;IAE5F,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAElC,OAAO,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;AACnE,CAAC","sourcesContent":["import { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { PeersIndex } from '../../types/peers/peers-index.js'\nimport { BusinessConnection } from '../../types/premium/business-connection.js'\nimport { assertIsUpdatesGroup } from '../../updates/utils.js'\n\n// @available=bot\n/**\n * Get information about the connection of the bot with a business account\n *\n * @param connectionId ID of the business connection\n */\nexport async function getBusinessConnection(\n client: ITelegramClient,\n connectionId: string,\n): Promise<BusinessConnection> {\n const res = await client.call({\n _: 'account.getBotBusinessConnection',\n connectionId,\n })\n\n assertIsUpdatesGroup('account.getBotBusinessConnection', res)\n assertTypeIs('account.getBotBusinessConnection', res.updates[0], 'updateBotBusinessConnect')\n\n const peers = PeersIndex.from(res)\n\n return new BusinessConnection(res.updates[0].connection, peers)\n}\n"]}
|
|
1
|
+
{"version":3,"file":"get-business-connection.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/premium/get-business-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEhE,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D,iBAAiB;AACjB;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,MAAuB,EACvB,YAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC,EAAE,kCAAkC;QACrC,YAAY;KACf,CAAC,CAAA;IAEF,oBAAoB,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAA;IAC7D,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAC9B,YAAY,CAAC,kCAAkC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAA;IAE5F,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAElC,OAAO,IAAI,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;AACnE,CAAC","sourcesContent":["import { assertTypeIs } from '../../../utils/type-assertions.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { PeersIndex } from '../../types/peers/peers-index.js'\nimport { BusinessConnection } from '../../types/premium/business-connection.js'\nimport { assertIsUpdatesGroup } from '../../updates/utils.js'\n\n// @available=bot\n/**\n * Get information about the connection of the bot with a business account\n *\n * @param connectionId ID of the business connection\n */\nexport async function getBusinessConnection(\n client: ITelegramClient,\n connectionId: string,\n): Promise<BusinessConnection> {\n const res = await client.call({\n _: 'account.getBotBusinessConnection',\n connectionId,\n })\n\n assertIsUpdatesGroup('account.getBotBusinessConnection', res)\n client.handleClientUpdate(res)\n assertTypeIs('account.getBotBusinessConnection', res.updates[0], 'updateBotBusinessConnect')\n\n const peers = PeersIndex.from(res)\n\n return new BusinessConnection(res.updates[0].connection, peers)\n}\n"]}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { tl } from '@mtcute/tl';
|
|
2
2
|
import { ITelegramClient } from '../../client.types.js';
|
|
3
|
-
import { InputPeerLike } from '../../types/index.js';
|
|
3
|
+
import { InputPeerLike } from '../../types/peers/index.js';
|
|
4
4
|
/**
|
|
5
5
|
* Get multiple `InputPeer`s at once,
|
|
6
6
|
* while also normalizing and removing
|
|
7
7
|
* peers that can't be normalized to that type.
|
|
8
8
|
*
|
|
9
|
+
* If a peer was not found, it will be skipped.
|
|
10
|
+
*
|
|
9
11
|
* Uses async pool internally, with a concurrent limit of 8
|
|
10
12
|
*
|
|
11
13
|
* @param peerIds Peer Ids
|
|
@@ -15,8 +17,10 @@ export declare function resolvePeerMany<T extends tl.TypeInputPeer | tl.TypeInpu
|
|
|
15
17
|
/**
|
|
16
18
|
* Get multiple `InputPeer`s at once.
|
|
17
19
|
*
|
|
20
|
+
* If a peer was not found, `null` will be returned instead
|
|
21
|
+
*
|
|
18
22
|
* Uses async pool internally, with a concurrent limit of 8
|
|
19
23
|
*
|
|
20
24
|
* @param peerIds Peer Ids
|
|
21
25
|
*/
|
|
22
|
-
export declare function resolvePeerMany(client: ITelegramClient, peerIds: InputPeerLike[]): Promise<tl.TypeInputPeer[]>;
|
|
26
|
+
export declare function resolvePeerMany(client: ITelegramClient, peerIds: InputPeerLike[]): Promise<(tl.TypeInputPeer | null)[]>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ConditionVariable } from '../../../utils/condition-variable.js';
|
|
2
|
+
import { MtPeerNotFoundError } from '../../types/errors.js';
|
|
2
3
|
import { resolvePeer } from './resolve-peer.js';
|
|
3
4
|
/**
|
|
4
5
|
* @internal
|
|
@@ -8,10 +9,17 @@ export async function resolvePeerMany(client, peerIds, normalizer) {
|
|
|
8
9
|
const limit = 8;
|
|
9
10
|
if (peerIds.length < limit) {
|
|
10
11
|
// no point in using async pool for <limit peers
|
|
11
|
-
const res = await Promise.all(peerIds.map((it) => resolvePeer(client, it))
|
|
12
|
+
const res = await Promise.all(peerIds.map((it) => resolvePeer(client, it).catch((e) => {
|
|
13
|
+
if (e instanceof MtPeerNotFoundError) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
throw e;
|
|
17
|
+
})));
|
|
12
18
|
if (!normalizer)
|
|
13
19
|
return res;
|
|
14
20
|
for (const value of res) {
|
|
21
|
+
if (!value)
|
|
22
|
+
continue;
|
|
15
23
|
const norm = normalizer(value);
|
|
16
24
|
if (norm) {
|
|
17
25
|
ret.push(norm);
|
|
@@ -24,8 +32,17 @@ export async function resolvePeerMany(client, peerIds, normalizer) {
|
|
|
24
32
|
let nextIdx = 0;
|
|
25
33
|
let nextWorkerIdx = 0;
|
|
26
34
|
const fetchNext = async (idx = nextWorkerIdx++) => {
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
try {
|
|
36
|
+
const result = await resolvePeer(client, peerIds[idx]);
|
|
37
|
+
buffer[idx] = result;
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
if (e instanceof MtPeerNotFoundError) {
|
|
41
|
+
buffer[idx] = null;
|
|
42
|
+
}
|
|
43
|
+
else
|
|
44
|
+
throw e;
|
|
45
|
+
}
|
|
29
46
|
if (nextIdx === idx) {
|
|
30
47
|
cv.notify();
|
|
31
48
|
}
|
|
@@ -48,12 +65,11 @@ export async function resolvePeerMany(client, peerIds, normalizer) {
|
|
|
48
65
|
const buf = buffer[nextIdx];
|
|
49
66
|
delete buffer[nextIdx];
|
|
50
67
|
nextIdx++;
|
|
51
|
-
if (!buf)
|
|
52
|
-
continue;
|
|
53
68
|
if (!normalizer) {
|
|
54
69
|
ret.push(buf);
|
|
70
|
+
continue;
|
|
55
71
|
}
|
|
56
|
-
|
|
72
|
+
if (buf !== null) {
|
|
57
73
|
const norm = normalizer(buf);
|
|
58
74
|
if (norm) {
|
|
59
75
|
ret.push(norm);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-peer-many.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/users/resolve-peer-many.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;
|
|
1
|
+
{"version":3,"file":"resolve-peer-many.js","sourceRoot":"","sources":["../../../../../src/highlevel/methods/users/resolve-peer-many.ts"],"names":[],"mappings":"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","sourcesContent":["import { tl } from '@mtcute/tl'\n\nimport { ConditionVariable } from '../../../utils/condition-variable.js'\nimport { ITelegramClient } from '../../client.types.js'\nimport { MtPeerNotFoundError } from '../../types/errors.js'\nimport { InputPeerLike } from '../../types/peers/index.js'\nimport { resolvePeer } from './resolve-peer.js'\n\n/**\n * Get multiple `InputPeer`s at once,\n * while also normalizing and removing\n * peers that can't be normalized to that type.\n *\n * If a peer was not found, it will be skipped.\n *\n * Uses async pool internally, with a concurrent limit of 8\n *\n * @param peerIds Peer Ids\n * @param normalizer Normalization function\n */\nexport async function resolvePeerMany<T extends tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel>(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n normalizer: (obj: tl.TypeInputPeer) => T | null,\n): Promise<T[]>\n\n/**\n * Get multiple `InputPeer`s at once.\n *\n * If a peer was not found, `null` will be returned instead\n *\n * Uses async pool internally, with a concurrent limit of 8\n *\n * @param peerIds Peer Ids\n */\nexport async function resolvePeerMany(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n): Promise<(tl.TypeInputPeer | null)[]>\n\n/**\n * @internal\n */\nexport async function resolvePeerMany(\n client: ITelegramClient,\n peerIds: InputPeerLike[],\n normalizer?: (obj: tl.TypeInputPeer) => tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null,\n): Promise<(tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[]> {\n const ret: (tl.TypeInputPeer | tl.TypeInputUser | tl.TypeInputChannel | null)[] = []\n\n const limit = 8\n\n if (peerIds.length < limit) {\n // no point in using async pool for <limit peers\n const res = await Promise.all(\n peerIds.map((it) =>\n resolvePeer(client, it).catch((e) => {\n if (e instanceof MtPeerNotFoundError) {\n return null\n }\n throw e\n }),\n ),\n )\n\n if (!normalizer) return res\n\n for (const value of res) {\n if (!value) continue\n const norm = normalizer(value)\n\n if (norm) {\n ret.push(norm)\n }\n }\n\n return ret\n }\n\n const cv = new ConditionVariable()\n const buffer: Record<number, tl.TypeInputPeer | null> = {}\n\n let nextIdx = 0\n let nextWorkerIdx = 0\n\n const fetchNext = async (idx = nextWorkerIdx++): Promise<void> => {\n try {\n const result = await resolvePeer(client, peerIds[idx])\n buffer[idx] = result\n } catch (e) {\n if (e instanceof MtPeerNotFoundError) {\n buffer[idx] = null\n } else throw e\n }\n\n if (nextIdx === idx) {\n cv.notify()\n }\n\n if (nextWorkerIdx < peerIds.length) {\n await fetchNext(nextWorkerIdx++)\n }\n }\n\n let error: unknown = undefined\n void Promise.all(Array.from({ length: limit }, (_, i) => fetchNext(i))).catch((e) => {\n client.log.debug('resolvePeerMany errored: %s', e.message)\n error = e\n cv.notify()\n })\n\n while (nextIdx < peerIds.length) {\n await cv.wait()\n\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n if (error) throw error\n\n while (nextIdx in buffer) {\n const buf = buffer[nextIdx]\n delete buffer[nextIdx]\n\n nextIdx++\n\n if (!normalizer) {\n ret.push(buf)\n continue\n }\n\n if (buf !== null) {\n const norm = normalizer(buf)\n\n if (norm) {\n ret.push(norm)\n }\n }\n }\n }\n\n return ret\n}\n"]}
|
|
@@ -53,10 +53,19 @@ export async function resolvePeer(client, peerId, force = false) {
|
|
|
53
53
|
const fromStorage = await client.storage.peers.getByPhone(peerId);
|
|
54
54
|
if (fromStorage)
|
|
55
55
|
return fromStorage;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
try {
|
|
57
|
+
res = await client.call({
|
|
58
|
+
_: 'contacts.resolvePhone',
|
|
59
|
+
phone: peerId,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
if (tl.RpcError.is(e, 'PHONE_NOT_OCCUPIED')) {
|
|
64
|
+
throw new MtPeerNotFoundError(`Peer with phone number ${peerId} was not found`);
|
|
65
|
+
}
|
|
66
|
+
else
|
|
67
|
+
throw e;
|
|
68
|
+
}
|
|
60
69
|
}
|
|
61
70
|
else {
|
|
62
71
|
// username
|
|
@@ -65,10 +74,19 @@ export async function resolvePeer(client, peerId, force = false) {
|
|
|
65
74
|
if (fromStorage)
|
|
66
75
|
return fromStorage;
|
|
67
76
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
77
|
+
try {
|
|
78
|
+
res = await client.call({
|
|
79
|
+
_: 'contacts.resolveUsername',
|
|
80
|
+
username: peerId,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
if (tl.RpcError.is(e, 'USERNAME_NOT_OCCUPIED')) {
|
|
85
|
+
throw new MtPeerNotFoundError(`Peer with username ${peerId} was not found`);
|
|
86
|
+
}
|
|
87
|
+
else
|
|
88
|
+
throw e;
|
|
89
|
+
}
|
|
72
90
|
}
|
|
73
91
|
if (res.peer._ === 'peerUser') {
|
|
74
92
|
const id = res.peer.userId;
|
|
@@ -114,11 +132,12 @@ export async function resolvePeer(client, peerId, force = false) {
|
|
|
114
132
|
}
|
|
115
133
|
throw new MtPeerNotFoundError(`Could not find a peer by ${peerId}`);
|
|
116
134
|
}
|
|
117
|
-
// in some cases, the server allows
|
|
118
|
-
// particularly, when we're a bot or we're referencing a user
|
|
119
|
-
// who we have "seen" recently
|
|
135
|
+
// in some cases, the server allows bots to use access_hash=0.
|
|
120
136
|
// if it's not the case, we'll get an `PEER_ID_INVALID` error anyways
|
|
121
137
|
const [peerType, bareId] = parseMarkedPeerId(peerId);
|
|
138
|
+
if (peerType !== 'chat' && !client.storage.self.getCached(true)?.isBot) {
|
|
139
|
+
throw new MtPeerNotFoundError(`Peer ${peerId} is not found in local cache`);
|
|
140
|
+
}
|
|
122
141
|
switch (peerType) {
|
|
123
142
|
case 'user':
|
|
124
143
|
return {
|