@will-17173/telegram-cli 0.1.1 → 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.
Files changed (111) hide show
  1. package/README.md +169 -10
  2. package/README.zh-CN.md +169 -11
  3. package/dist/cli/app.js +3 -1
  4. package/dist/cli/app.js.map +1 -1
  5. package/dist/commands/account.js +51 -5
  6. package/dist/commands/account.js.map +1 -1
  7. package/dist/commands/config.js +96 -13
  8. package/dist/commands/config.js.map +1 -1
  9. package/dist/commands/group-write.js +88 -0
  10. package/dist/commands/group-write.js.map +1 -0
  11. package/dist/commands/group.js +121 -0
  12. package/dist/commands/group.js.map +1 -0
  13. package/dist/commands/telegram-runner.js +84 -0
  14. package/dist/commands/telegram-runner.js.map +1 -0
  15. package/dist/commands/telegram.js +154 -172
  16. package/dist/commands/telegram.js.map +1 -1
  17. package/dist/config/credential-store.js +76 -22
  18. package/dist/config/credential-store.js.map +1 -1
  19. package/dist/config/env.js +12 -1
  20. package/dist/config/env.js.map +1 -1
  21. package/dist/group-commands/catalog.js +69 -0
  22. package/dist/group-commands/catalog.js.map +1 -0
  23. package/dist/group-commands/executor.js +93 -0
  24. package/dist/group-commands/executor.js.map +1 -0
  25. package/dist/group-commands/parser.js +268 -0
  26. package/dist/group-commands/parser.js.map +1 -0
  27. package/dist/group-commands/tokenize.js +51 -0
  28. package/dist/group-commands/tokenize.js.map +1 -0
  29. package/dist/group-commands/types.js +2 -0
  30. package/dist/group-commands/types.js.map +1 -0
  31. package/dist/listen-commands/catalog.js +61 -0
  32. package/dist/listen-commands/catalog.js.map +1 -0
  33. package/dist/listen-commands/dispatch.js +46 -0
  34. package/dist/listen-commands/dispatch.js.map +1 -0
  35. package/dist/listen-commands/match.js +113 -0
  36. package/dist/listen-commands/match.js.map +1 -0
  37. package/dist/presenters/group.js +130 -0
  38. package/dist/presenters/group.js.map +1 -0
  39. package/dist/presenters/human.js +29 -9
  40. package/dist/presenters/human.js.map +1 -1
  41. package/dist/presenters/ink/display-width.js +45 -7
  42. package/dist/presenters/ink/display-width.js.map +1 -1
  43. package/dist/presenters/ink/group-command-confirm.js +13 -0
  44. package/dist/presenters/ink/group-command-confirm.js.map +1 -0
  45. package/dist/presenters/ink/group-command-result.js +21 -0
  46. package/dist/presenters/ink/group-command-result.js.map +1 -0
  47. package/dist/presenters/ink/listen-command-menu.js +38 -0
  48. package/dist/presenters/ink/listen-command-menu.js.map +1 -0
  49. package/dist/presenters/ink/listen-scroll.js +5 -1
  50. package/dist/presenters/ink/listen-scroll.js.map +1 -1
  51. package/dist/presenters/ink/listen.js +806 -171
  52. package/dist/presenters/ink/listen.js.map +1 -1
  53. package/dist/presenters/ink/use-group-command.js +125 -0
  54. package/dist/presenters/ink/use-group-command.js.map +1 -0
  55. package/dist/presenters/listen-message.js +25 -241
  56. package/dist/presenters/listen-message.js.map +1 -1
  57. package/dist/presenters/logical-message.js +78 -0
  58. package/dist/presenters/logical-message.js.map +1 -0
  59. package/dist/services/attachment-download.js +5 -2
  60. package/dist/services/attachment-download.js.map +1 -1
  61. package/dist/services/auto-download-coordinator.js +214 -0
  62. package/dist/services/auto-download-coordinator.js.map +1 -0
  63. package/dist/services/group-service.js +164 -0
  64. package/dist/services/group-service.js.map +1 -0
  65. package/dist/services/group-write-service.js +165 -0
  66. package/dist/services/group-write-service.js.map +1 -0
  67. package/dist/services/listen-album-aggregator.js +9 -29
  68. package/dist/services/listen-album-aggregator.js.map +1 -1
  69. package/dist/services/listen-attachment.js +265 -0
  70. package/dist/services/listen-attachment.js.map +1 -0
  71. package/dist/services/listen-composer-command.js +102 -0
  72. package/dist/services/listen-composer-command.js.map +1 -0
  73. package/dist/services/listen-reply-resolver.js +126 -0
  74. package/dist/services/listen-reply-resolver.js.map +1 -0
  75. package/dist/services/message-service.js +54 -4
  76. package/dist/services/message-service.js.map +1 -1
  77. package/dist/services/query-service.js +95 -34
  78. package/dist/services/query-service.js.map +1 -1
  79. package/dist/services/reply-context.js +29 -0
  80. package/dist/services/reply-context.js.map +1 -0
  81. package/dist/services/sync-service.js +18 -6
  82. package/dist/services/sync-service.js.map +1 -1
  83. package/dist/storage/message-db.js +241 -5
  84. package/dist/storage/message-db.js.map +1 -1
  85. package/dist/telegram/client-factory.js +4 -2
  86. package/dist/telegram/client-factory.js.map +1 -1
  87. package/dist/telegram/fake-group-management.js +381 -0
  88. package/dist/telegram/fake-group-management.js.map +1 -0
  89. package/dist/telegram/group-types.js +59 -0
  90. package/dist/telegram/group-types.js.map +1 -0
  91. package/dist/telegram/group-write-types.js +2 -0
  92. package/dist/telegram/group-write-types.js.map +1 -0
  93. package/dist/telegram/mtcute-client.js +74 -9
  94. package/dist/telegram/mtcute-client.js.map +1 -1
  95. package/dist/telegram/mtcute-group-helpers.js +56 -0
  96. package/dist/telegram/mtcute-group-helpers.js.map +1 -0
  97. package/dist/telegram/mtcute-group-invites.js +82 -0
  98. package/dist/telegram/mtcute-group-invites.js.map +1 -0
  99. package/dist/telegram/mtcute-group-management.js +493 -0
  100. package/dist/telegram/mtcute-group-management.js.map +1 -0
  101. package/dist/telegram/mtcute-group-members.js +118 -0
  102. package/dist/telegram/mtcute-group-members.js.map +1 -0
  103. package/dist/telegram/mtcute-group-settings.js +146 -0
  104. package/dist/telegram/mtcute-group-settings.js.map +1 -0
  105. package/dist/telegram/mtcute-group-topics.js +63 -0
  106. package/dist/telegram/mtcute-group-topics.js.map +1 -0
  107. package/dist/telegram/proxy.js +27 -0
  108. package/dist/telegram/proxy.js.map +1 -0
  109. package/dist/telegram/raw-message.js +46 -0
  110. package/dist/telegram/raw-message.js.map +1 -0
  111. package/package.json +9 -1
@@ -0,0 +1,381 @@
1
+ export { TelegramGroupAdminRequiredError, TelegramGroupMemberNotFoundError, TelegramGroupNotFoundError, } from './group-types.js';
2
+ import { TelegramGroupMemberNotFoundError, TelegramGroupNotFoundError, } from './group-types.js';
3
+ export class FakeTelegramGroupManagement {
4
+ getGroupCalls = [];
5
+ listMembersCalls = [];
6
+ getMemberCalls = [];
7
+ listAuditEventsCalls = [];
8
+ writeCalls = [];
9
+ group;
10
+ members;
11
+ membersByFilter;
12
+ auditEvents;
13
+ getGroupFailure;
14
+ listMembersFailure;
15
+ getMemberFailure;
16
+ listAuditEventsFailure;
17
+ writeResults;
18
+ writeFailures;
19
+ constructor(options = {}) {
20
+ this.membersByFilter = cloneMembersByFilter(options.membersByFilter ?? {});
21
+ this.members = mergeMemberDetails((options.members ?? defaultMembers()).map(cloneMember), this.membersByFilter);
22
+ this.group = cloneGroup(options.group ?? {
23
+ ...defaultGroup(),
24
+ member_count: this.members.length,
25
+ });
26
+ this.auditEvents = (options.auditEvents ?? defaultAuditEvents()).map(cloneAuditEvent);
27
+ this.getGroupFailure = options.getGroupFailure;
28
+ this.listMembersFailure = options.listMembersFailure;
29
+ this.getMemberFailure = options.getMemberFailure;
30
+ this.listAuditEventsFailure = options.listAuditEventsFailure;
31
+ this.writeResults = cloneSerializable(options.writeResults ?? {});
32
+ this.writeFailures = { ...options.writeFailures };
33
+ }
34
+ async getGroup(chat) {
35
+ this.getGroupCalls.push(chat);
36
+ if (this.getGroupFailure)
37
+ throw this.getGroupFailure;
38
+ this.assertGroup(chat);
39
+ return cloneGroup(this.group);
40
+ }
41
+ async listMembers(request) {
42
+ this.listMembersCalls.push({ ...request });
43
+ if (this.listMembersFailure)
44
+ throw this.listMembersFailure;
45
+ this.assertGroup(request.chat);
46
+ const configuredMembers = this.membersByFilter[request.type];
47
+ const candidates = configuredMembers == null
48
+ ? defaultMembersForFilter(this.members, request.type)
49
+ : configuredMembers;
50
+ const query = request.query?.toLocaleLowerCase() ?? null;
51
+ const matching = candidates.filter((member) => {
52
+ const queryMatches = query == null
53
+ || member.display_name.toLocaleLowerCase().includes(query)
54
+ || member.username?.toLocaleLowerCase().includes(query) === true;
55
+ return queryMatches;
56
+ });
57
+ const members = matching.slice(0, request.limit).map(cloneMemberSummary);
58
+ return {
59
+ chat_id: this.group.id,
60
+ chat_title: this.group.title,
61
+ filter: request.type,
62
+ query: request.query ?? null,
63
+ limit: request.limit,
64
+ total: matching.length,
65
+ members,
66
+ };
67
+ }
68
+ async getMember(chat, user) {
69
+ this.getMemberCalls.push({ chat, user });
70
+ if (this.getMemberFailure)
71
+ throw this.getMemberFailure;
72
+ this.assertGroup(chat);
73
+ const member = this.members.find((candidate) => peerMatches(user, candidate.id, [candidate.username, candidate.display_name]));
74
+ if (!member)
75
+ throw new TelegramGroupMemberNotFoundError(chat, user);
76
+ return { chat_id: this.group.id, member: cloneMember(member) };
77
+ }
78
+ async listAuditEvents(request) {
79
+ this.listAuditEventsCalls.push({
80
+ ...request,
81
+ users: request.users == null ? undefined : [...request.users],
82
+ types: request.types == null ? undefined : [...request.types],
83
+ });
84
+ if (this.listAuditEventsFailure)
85
+ throw this.listAuditEventsFailure;
86
+ this.assertGroup(request.chat);
87
+ const query = request.query?.toLocaleLowerCase();
88
+ const events = this.auditEvents.filter((event) => {
89
+ const matchesQuery = query == null || event.summary.toLocaleLowerCase().includes(query);
90
+ const matchesType = request.types == null || request.types.includes(event.type);
91
+ const matchesUser = request.users == null || request.users.some((user) => actorMatches(event.actor, user));
92
+ return matchesQuery && matchesType && matchesUser;
93
+ }).slice(0, request.limit).map(cloneAuditEvent);
94
+ return { chat_id: this.group.id, chat_title: this.group.title, events };
95
+ }
96
+ addMembers = (r) => this.write('addMembers', r);
97
+ kickMember = (r) => this.write('kickMember', r);
98
+ banMember = (r) => this.write('banMember', r);
99
+ unbanMember = (r) => this.write('unbanMember', r);
100
+ muteMember = (r) => this.write('muteMember', r);
101
+ unmuteMember = (r) => this.write('unmuteMember', r);
102
+ purgeMember = (r) => this.write('purgeMember', r);
103
+ promoteAdmin = (r) => this.write('promoteAdmin', r);
104
+ demoteAdmin = (r) => this.write('demoteAdmin', r);
105
+ setAdminRank = (r) => this.write('setAdminRank', r);
106
+ transferOwnership = (r) => this.write('transferOwnership', r);
107
+ setTitle = (r) => this.write('setTitle', r);
108
+ setDescription = (r) => this.write('setDescription', r);
109
+ setUsername = (r) => this.write('setUsername', r);
110
+ setPhoto = (r) => this.write('setPhoto', r);
111
+ setSlowMode = (r) => this.write('setSlowMode', r);
112
+ setTtl = (r) => this.write('setTtl', r);
113
+ setContentProtection = (r) => this.write('setContentProtection', r);
114
+ setJoinRequests = (r) => this.write('setJoinRequests', r);
115
+ setJoinToSend = (r) => this.write('setJoinToSend', r);
116
+ setDefaultPermissions = (r) => this.write('setDefaultPermissions', r);
117
+ setStickerSet = (r) => this.write('setStickerSet', r);
118
+ leaveGroup = (r) => this.write('leaveGroup', r);
119
+ deleteGroup = (r) => this.write('deleteGroup', r);
120
+ listInvites = (r) => this.invitePage('listInvites', r);
121
+ getInvite = (r) => this.inviteResult('getInvite', r);
122
+ createInvite = (r) => this.inviteResult('createInvite', r);
123
+ editInvite = (r) => this.inviteResult('editInvite', r);
124
+ revokeInvite = (r) => this.inviteResult('revokeInvite', r);
125
+ listInviteMembers = (r) => this.inviteMemberPage('listInviteMembers', r);
126
+ approveJoinRequest = (r) => this.write('approveJoinRequest', r);
127
+ declineJoinRequest = (r) => this.write('declineJoinRequest', r);
128
+ approveAllJoinRequests = (r) => this.write('approveAllJoinRequests', r);
129
+ declineAllJoinRequests = (r) => this.write('declineAllJoinRequests', r);
130
+ listTopics = (r) => this.topicPage('listTopics', r);
131
+ createTopic = (r) => this.topicResult('createTopic', r);
132
+ editTopic = (r) => this.topicResult('editTopic', r);
133
+ setTopicClosed = (r) => this.write('setTopicClosed', r);
134
+ setTopicPinned = (r) => this.write('setTopicPinned', r);
135
+ reorderPinnedTopics = (r) => this.write('reorderPinnedTopics', r);
136
+ deleteTopic = (r) => this.write('deleteTopic', r);
137
+ setGeneralTopicHidden = (r) => this.write('setGeneralTopicHidden', r);
138
+ pinMessage = (r) => this.write('pinMessage', r);
139
+ unpinMessage = (r) => this.write('unpinMessage', r);
140
+ unpinAllMessages = (r) => this.write('unpinAllMessages', r);
141
+ deleteGroupMessages = (r) => this.write('deleteGroupMessages', r);
142
+ async write(operation, request) {
143
+ this.recordWrite(operation, request);
144
+ this.throwWriteFailure(operation);
145
+ const configured = this.writeResults[operation];
146
+ if (isMutationResultFor(configured, operation))
147
+ return cloneSerializable(configured);
148
+ const source = request;
149
+ return { operation, chat_id: numericPeer(source.chat), target_id: source.user ?? source.topicId ?? source.messageId };
150
+ }
151
+ async invitePage(operation, request) {
152
+ this.recordWrite(operation, request);
153
+ this.throwWriteFailure(operation);
154
+ return cloneSerializable(this.writeResults[operation] ?? { chat_id: numericPeer(request.chat), invites: [], total: 0 });
155
+ }
156
+ async inviteResult(operation, request) {
157
+ this.recordWrite(operation, request);
158
+ this.throwWriteFailure(operation);
159
+ const r = request;
160
+ return cloneSerializable(this.writeResults[operation] ?? { chat_id: numericPeer(r.chat), invite: defaultInvite(r.link, r.options) });
161
+ }
162
+ async inviteMemberPage(operation, request) {
163
+ this.recordWrite(operation, request);
164
+ this.throwWriteFailure(operation);
165
+ return cloneSerializable(this.writeResults[operation] ?? { chat_id: numericPeer(request.chat), link: request.link, members: [], total: 0 });
166
+ }
167
+ async topicPage(operation, request) {
168
+ this.recordWrite(operation, request);
169
+ this.throwWriteFailure(operation);
170
+ return cloneSerializable(this.writeResults[operation] ?? { chat_id: numericPeer(request.chat), topics: [], total: 0 });
171
+ }
172
+ async topicResult(operation, request) {
173
+ this.recordWrite(operation, request);
174
+ this.throwWriteFailure(operation);
175
+ const r = request;
176
+ return cloneSerializable(this.writeResults[operation] ?? { chat_id: numericPeer(r.chat), topic: { id: r.topicId ?? 1, title: r.title ?? 'Topic', icon_color: null, icon_emoji_id: null, closed: false, pinned: false, hidden: false } });
177
+ }
178
+ recordWrite(operation, request) {
179
+ this.writeCalls.push({ operation, request: cloneSerializable(request) });
180
+ }
181
+ throwWriteFailure(operation) {
182
+ const failure = this.writeFailures[operation];
183
+ if (failure)
184
+ throw failure;
185
+ }
186
+ assertGroup(chat) {
187
+ if (!peerMatches(chat, this.group.id, [this.group.title, this.group.username])) {
188
+ throw new TelegramGroupNotFoundError(chat);
189
+ }
190
+ }
191
+ }
192
+ function matchesMemberFilter(member, filter) {
193
+ if (filter === 'admins')
194
+ return member.status === 'creator' || member.status === 'admin';
195
+ if (filter === 'banned')
196
+ return member.status === 'banned';
197
+ if (filter === 'restricted')
198
+ return member.status === 'restricted';
199
+ return true;
200
+ }
201
+ function defaultMembersForFilter(members, filter) {
202
+ if (filter === 'bots' || filter === 'contacts')
203
+ return [];
204
+ return members.filter((member) => matchesMemberFilter(member, filter)).map(toSummary);
205
+ }
206
+ function cloneMembersByFilter(membersByFilter) {
207
+ const cloned = {};
208
+ for (const filter of Object.keys(membersByFilter)) {
209
+ cloned[filter] = membersByFilter[filter]?.map(cloneMemberSummary);
210
+ }
211
+ return cloned;
212
+ }
213
+ function mergeMemberDetails(explicitMembers, membersByFilter) {
214
+ const merged = explicitMembers.map(cloneMember);
215
+ const memberIds = new Set(merged.map((member) => member.id));
216
+ for (const members of Object.values(membersByFilter)) {
217
+ for (const member of members ?? []) {
218
+ if (memberIds.has(member.id))
219
+ continue;
220
+ merged.push({
221
+ ...cloneMemberSummary(member),
222
+ admin_rights: null,
223
+ restrictions: null,
224
+ });
225
+ memberIds.add(member.id);
226
+ }
227
+ }
228
+ return merged;
229
+ }
230
+ function defaultGroup() {
231
+ return {
232
+ id: 100,
233
+ title: 'TestGroup',
234
+ username: 'testgroup',
235
+ type: 'supergroup',
236
+ member_count: 4,
237
+ current_user_role: 'admin',
238
+ current_user_rank: 'Moderator',
239
+ permissions: adminRights(),
240
+ default_restrictions: restrictions(),
241
+ slow_mode_seconds: null,
242
+ message_ttl_seconds: null,
243
+ content_protected: false,
244
+ forum: false,
245
+ };
246
+ }
247
+ function defaultMembers() {
248
+ return [
249
+ member(1, 'Alice Admin', 'alice', 'creator', 'Owner', adminRights()),
250
+ member(2, 'Test User', 'test', 'admin', 'Moderator', adminRights()),
251
+ member(3, 'Bob Member', 'bob', 'member', null, null),
252
+ {
253
+ ...member(4, 'Restricted User', null, 'restricted', null, null),
254
+ restricted_until: '2026-12-31T23:59:59.000Z',
255
+ restrictions: restrictions({ send_messages: true }),
256
+ },
257
+ ];
258
+ }
259
+ function defaultAuditEvents() {
260
+ return [{
261
+ id: 'audit-1',
262
+ date: '2026-03-09T10:00:00.000Z',
263
+ type: 'info_changed',
264
+ actor: { id: 1, display_name: 'Alice Admin', username: 'alice' },
265
+ target: null,
266
+ summary: 'Alice Admin changed the group title to TestGroup',
267
+ }];
268
+ }
269
+ function member(id, displayName, username, status, rank, rights) {
270
+ return {
271
+ id,
272
+ display_name: displayName,
273
+ username,
274
+ status,
275
+ rank,
276
+ joined_at: '2026-03-01T10:00:00.000Z',
277
+ restricted_until: null,
278
+ admin_rights: rights,
279
+ restrictions: null,
280
+ };
281
+ }
282
+ function adminRights() {
283
+ return {
284
+ change_info: true,
285
+ delete_messages: true,
286
+ ban_users: true,
287
+ invite_users: true,
288
+ pin_messages: true,
289
+ add_admins: false,
290
+ manage_call: true,
291
+ anonymous: false,
292
+ manage_topics: true,
293
+ };
294
+ }
295
+ function restrictions(overrides = {}) {
296
+ return {
297
+ view_messages: false,
298
+ send_messages: false,
299
+ send_media: false,
300
+ send_stickers: false,
301
+ send_gifs: false,
302
+ send_games: false,
303
+ send_inline: false,
304
+ embed_links: false,
305
+ send_polls: false,
306
+ change_info: false,
307
+ invite_users: false,
308
+ pin_messages: false,
309
+ manage_topics: false,
310
+ ...overrides,
311
+ };
312
+ }
313
+ function actorMatches(actor, user) {
314
+ if (actor == null)
315
+ return false;
316
+ return peerMatches(user, actor.id, [actor.username, actor.display_name]);
317
+ }
318
+ function peerMatches(reference, numericId, names) {
319
+ const canonical = canonicalPeerReference(reference);
320
+ return canonical.numeric_id === numericId
321
+ || names.some((name) => name?.toLocaleLowerCase() === canonical.text);
322
+ }
323
+ function canonicalPeerReference(reference) {
324
+ const text = String(reference).trim().replace(/^@/, '').toLocaleLowerCase();
325
+ const numeric = /^[-+]?\d+$/.test(text) ? Number(text) : Number.NaN;
326
+ return {
327
+ numeric_id: Number.isSafeInteger(numeric) ? numeric : null,
328
+ text,
329
+ };
330
+ }
331
+ function numericPeer(peer) {
332
+ return typeof peer === 'number' ? peer : 100;
333
+ }
334
+ function defaultInvite(link, options) {
335
+ return {
336
+ link: link ?? 'https://t.me/+fake-invite',
337
+ title: options?.title ?? null,
338
+ creator_id: 1,
339
+ created_at: '2026-01-01T00:00:00.000Z',
340
+ expires_at: null,
341
+ usage_limit: options?.usageLimit ?? null,
342
+ usage_count: 0,
343
+ request_needed: options?.requestNeeded ?? false,
344
+ revoked: false,
345
+ };
346
+ }
347
+ function cloneSerializable(value) {
348
+ return structuredClone(value);
349
+ }
350
+ function isMutationResultFor(result, operation) {
351
+ return result != null && 'operation' in result && result.operation === operation;
352
+ }
353
+ function cloneGroup(group) {
354
+ return {
355
+ ...group,
356
+ permissions: group.permissions == null ? null : { ...group.permissions },
357
+ default_restrictions: group.default_restrictions == null ? null : { ...group.default_restrictions },
358
+ };
359
+ }
360
+ function toSummary(memberDetails) {
361
+ const { admin_rights: _adminRights, restrictions: _restrictions, ...member } = memberDetails;
362
+ return cloneMemberSummary(member);
363
+ }
364
+ function cloneMemberSummary(member) {
365
+ return { ...member };
366
+ }
367
+ function cloneMember(memberDetails) {
368
+ return {
369
+ ...memberDetails,
370
+ admin_rights: memberDetails.admin_rights == null ? null : { ...memberDetails.admin_rights },
371
+ restrictions: memberDetails.restrictions == null ? null : { ...memberDetails.restrictions },
372
+ };
373
+ }
374
+ function cloneAuditEvent(event) {
375
+ return {
376
+ ...event,
377
+ actor: event.actor == null ? null : { ...event.actor },
378
+ target: event.target == null ? null : { ...event.target },
379
+ };
380
+ }
381
+ //# sourceMappingURL=fake-group-management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-group-management.js","sourceRoot":"","sources":["../../src/telegram/fake-group-management.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ export class TelegramGroupNotFoundError extends Error {
2
+ constructor(chat) {
3
+ super(`Telegram group not found: ${String(chat)}`);
4
+ this.name = 'TelegramGroupNotFoundError';
5
+ }
6
+ }
7
+ export class TelegramGroupMemberNotFoundError extends Error {
8
+ constructor(chat, user) {
9
+ super(`Telegram group member not found: ${String(user)} in ${String(chat)}`);
10
+ this.name = 'TelegramGroupMemberNotFoundError';
11
+ }
12
+ }
13
+ export class TelegramGroupMembersNotAddedError extends Error {
14
+ chat;
15
+ missing;
16
+ constructor(chat, missing) {
17
+ super(`Telegram group members not added: ${missing.map((item) => String(item.user_id)).join(', ')} in ${String(chat)}`);
18
+ this.name = 'TelegramGroupMembersNotAddedError';
19
+ this.chat = chat;
20
+ this.missing = missing.map((item) => ({ ...item }));
21
+ }
22
+ }
23
+ export class TelegramGroupAdminRequiredError extends Error {
24
+ constructor(chat) {
25
+ super(`Telegram group administrator privileges required: ${String(chat)}`);
26
+ this.name = 'TelegramGroupAdminRequiredError';
27
+ }
28
+ }
29
+ export class TelegramUnsupportedGroupTypeError extends Error {
30
+ chat;
31
+ constructor(chat) {
32
+ super(`Unsupported Telegram group type: ${String(chat)}`);
33
+ this.name = 'TelegramUnsupportedGroupTypeError';
34
+ this.chat = chat;
35
+ }
36
+ }
37
+ export class TelegramGroupMissingPermissionError extends Error {
38
+ permission;
39
+ constructor(permission) {
40
+ super(`Missing Telegram group permission: ${permission}`);
41
+ this.name = 'TelegramGroupMissingPermissionError';
42
+ this.permission = permission;
43
+ }
44
+ }
45
+ export class TelegramGroupFloodWaitError extends Error {
46
+ seconds;
47
+ constructor(seconds) {
48
+ super(`Telegram flood wait: ${seconds} seconds`);
49
+ this.name = 'TelegramGroupFloodWaitError';
50
+ this.seconds = seconds;
51
+ }
52
+ }
53
+ export class TelegramGroupPasswordRequiredError extends Error {
54
+ constructor() {
55
+ super('Telegram account password required');
56
+ this.name = 'TelegramGroupPasswordRequiredError';
57
+ }
58
+ }
59
+ //# sourceMappingURL=group-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-types.js","sourceRoot":"","sources":["../../src/telegram/group-types.ts"],"names":[],"mappings":"AAkJA,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACnD,YAAY,IAAqB;QAC/B,KAAK,CAAC,6BAA6B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAClD,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,gCAAiC,SAAQ,KAAK;IACzD,YAAY,IAAqB,EAAE,IAAqB;QACtD,KAAK,CAAC,oCAAoC,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC5E,IAAI,CAAC,IAAI,GAAG,kCAAkC,CAAA;IAChD,CAAC;CACF;AAOD,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IACjD,IAAI,CAAW;IACf,OAAO,CAAwC;IACxD,YAAY,IAAe,EAAE,OAA+C;QAC1E,KAAK,CAAC,qCAAqC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACvH,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAA;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAA;IACrD,CAAC;CACF;AAED,MAAM,OAAO,+BAAgC,SAAQ,KAAK;IACxD,YAAY,IAAqB;QAC/B,KAAK,CAAC,qDAAqD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC1E,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAA;IAC/C,CAAC;CACF;AAED,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IACjD,IAAI,CAAW;IACxB,YAAY,IAAe;QACzB,KAAK,CAAC,oCAAoC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACzD,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAA;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED,MAAM,OAAO,mCAAoC,SAAQ,KAAK;IACnD,UAAU,CAAgC;IACnD,YAAY,UAA0C;QACpD,KAAK,CAAC,sCAAsC,UAAU,EAAE,CAAC,CAAA;QACzD,IAAI,CAAC,IAAI,GAAG,qCAAqC,CAAA;QACjD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAC3C,OAAO,CAAQ;IACxB,YAAY,OAAe;QACzB,KAAK,CAAC,wBAAwB,OAAO,UAAU,CAAC,CAAA;QAChD,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAA;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;CACF;AAED,MAAM,OAAO,kCAAmC,SAAQ,KAAK;IAC3D;QACE,KAAK,CAAC,oCAAoC,CAAC,CAAA;QAC3C,IAAI,CAAC,IAAI,GAAG,oCAAoC,CAAA;IAClD,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=group-write-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-write-types.js","sourceRoot":"","sources":["../../src/telegram/group-write-types.ts"],"names":[],"mappings":""}
@@ -1,11 +1,15 @@
1
1
  import { Buffer } from 'node:buffer';
2
- import { Thumbnail } from '@mtcute/node';
2
+ import { setTimeout } from 'node:timers/promises';
3
+ import { InputMedia, Thumbnail, tl } from '@mtcute/node';
3
4
  import { FileLocation, MtPeerNotFoundError } from '@mtcute/node';
5
+ import { MtcuteGroupManagement } from './mtcute-group-management.js';
4
6
  export class MtcuteTelegramClient {
5
7
  client;
8
+ groups;
6
9
  isReady = false;
7
10
  constructor(client) {
8
11
  this.client = client;
12
+ this.groups = new MtcuteGroupManagement(client, () => this.ensureReady());
9
13
  }
10
14
  async close() {
11
15
  try {
@@ -52,7 +56,7 @@ export class MtcuteTelegramClient {
52
56
  await this.ensureReady();
53
57
  try {
54
58
  const parsed = normalizeChatId(chat);
55
- const peer = await this.client.getChat(parsed);
59
+ const peer = await this.client.getPeer(parsed);
56
60
  const full = await this.fetchFullChat(parsed);
57
61
  const info = {
58
62
  ID: String(peer.id),
@@ -86,12 +90,43 @@ export class MtcuteTelegramClient {
86
90
  }
87
91
  async fetchHistory(options) {
88
92
  await this.ensureReady();
89
- const history = await this.client.getHistory(normalizeChatId(options.chat), {
90
- limit: options.limit,
91
- minId: options.minId,
92
- });
93
- const rows = history.map((message) => toStoredMessage(message));
94
- options.onProgress?.(rows.length);
93
+ const rows = [];
94
+ let offset;
95
+ let floodRetries = 0;
96
+ while (rows.length < options.limit) {
97
+ const pageOptions = {
98
+ limit: Math.min(100, options.limit - rows.length),
99
+ minId: options.minId,
100
+ offset,
101
+ };
102
+ let page;
103
+ while (true) {
104
+ try {
105
+ page = await this.client.getHistory(normalizeChatId(options.chat), pageOptions);
106
+ break;
107
+ }
108
+ catch (error) {
109
+ const floodSeconds = tl.RpcError.is(error, 'FLOOD_WAIT_%d')
110
+ ? error.seconds
111
+ : tl.RpcError.is(error) ? Number(/^FLOOD_WAIT_(\d+)$/.exec(error.text)?.[1]) : Number.NaN;
112
+ if (!Number.isFinite(floodSeconds) || floodRetries >= 5)
113
+ throw error;
114
+ floodRetries += 1;
115
+ await setTimeout((floodSeconds + 1) * 1000);
116
+ }
117
+ }
118
+ for (const message of page) {
119
+ rows.push(toStoredMessage(message));
120
+ options.onProgress?.(rows.length);
121
+ }
122
+ if (rows.length >= options.limit || page.next == null)
123
+ break;
124
+ offset = page.next;
125
+ if (options.pageDelay) {
126
+ const jitter = options.pageDelay * (Math.random() * 0.4 - 0.2);
127
+ await setTimeout((options.pageDelay + jitter) * 1000);
128
+ }
129
+ }
95
130
  return rows;
96
131
  }
97
132
  async downloadMessageMedia(options) {
@@ -109,7 +144,19 @@ export class MtcuteTelegramClient {
109
144
  async sendMessage(options) {
110
145
  await this.ensureReady();
111
146
  const sent = await this.client.sendText(normalizeChatId(options.chat), options.message, { replyTo: options.reply, disableWebPreview: !options.linkPreview });
112
- return { msg_id: sent.id };
147
+ return { msg_id: sent.id, sent_message: toStoredMessage(sent) };
148
+ }
149
+ async sendMedia(options) {
150
+ if (options.files.length === 0)
151
+ throw new Error('At least one media file is required.');
152
+ await this.ensureReady();
153
+ const chat = normalizeChatId(options.chat);
154
+ if (options.files.length === 1) {
155
+ const sent = await this.client.sendMedia(chat, inputMediaForFile(options.files[0]), { caption: options.caption, replyTo: options.reply });
156
+ return { messages: [toSendMediaMessage(sent)] };
157
+ }
158
+ const sent = await this.client.sendMediaGroup(chat, options.files.map((file, index) => inputMediaForFile(file, index === 0 ? options.caption : undefined)), { replyTo: options.reply });
159
+ return { messages: sent.map(toSendMediaMessage) };
113
160
  }
114
161
  async editMessage(options) {
115
162
  await this.ensureReady();
@@ -208,6 +255,24 @@ function normalizeChatId(chat) {
208
255
  const numeric = Number.parseInt(trimmed, 10);
209
256
  return Number.isNaN(numeric) ? chat : String(numeric) === trimmed ? numeric : chat;
210
257
  }
258
+ function inputMediaForFile(file, caption) {
259
+ const extension = /(?:^|\/)[^/]*?(\.[^.\/]+)$/.exec(file)?.[1]?.toLowerCase();
260
+ const params = caption == null ? undefined : { caption };
261
+ const localFile = `file:${file}`;
262
+ if (extension && ['.jpg', '.jpeg', '.png', '.webp'].includes(extension)) {
263
+ return InputMedia.photo(localFile, params);
264
+ }
265
+ if (extension && ['.mp4', '.mov', '.m4v', '.webm'].includes(extension)) {
266
+ return InputMedia.video(localFile, params);
267
+ }
268
+ return InputMedia.document(localFile, params);
269
+ }
270
+ function toSendMediaMessage(message) {
271
+ return {
272
+ msg_id: message.id,
273
+ sent_message: toStoredMessage(message),
274
+ };
275
+ }
211
276
  function getUserPhone(peer) {
212
277
  if (peer == null || typeof peer !== 'object')
213
278
  return null;