@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,165 @@
1
+ import { GROUP_COMMAND_CATALOG } from '../group-commands/catalog.js';
2
+ import { TelegramGroupAdminRequiredError, TelegramGroupFloodWaitError, TelegramGroupMemberNotFoundError, TelegramGroupMembersNotAddedError, TelegramGroupMissingPermissionError, TelegramGroupNotFoundError, TelegramGroupPasswordRequiredError, TelegramUnsupportedGroupTypeError, } from '../telegram/group-types.js';
3
+ export const ADMIN_RIGHT_KEYS = ['change_info', 'delete_messages', 'ban_users', 'invite_users', 'pin_messages', 'add_admins', 'manage_call', 'anonymous', 'manage_topics'];
4
+ const allAdminRightsCovered = true;
5
+ void allAdminRightsCovered;
6
+ function isAdminRight(value) { return ADMIN_RIGHT_KEYS.some(key => key === value); }
7
+ const selectedAdminRights = (names) => {
8
+ const has = (name) => names?.includes(name) === true;
9
+ return { change_info: has('change_info'), delete_messages: has('delete_messages'), ban_users: has('ban_users'), invite_users: has('invite_users'), pin_messages: has('pin_messages'), add_admins: has('add_admins'), manage_call: has('manage_call'), anonymous: has('anonymous'), manage_topics: has('manage_topics') };
10
+ };
11
+ const selectedRestrictions = (names) => {
12
+ const has = (name) => names.includes(name);
13
+ return { view_messages: has('view_messages'), send_messages: has('send_messages'), send_media: has('send_media'), send_stickers: has('send_stickers'), send_gifs: has('send_gifs'), send_games: has('send_games'), send_inline: has('send_inline'), embed_links: has('embed_links'), send_polls: has('send_polls'), change_info: has('change_info'), invite_users: has('invite_users'), pin_messages: has('pin_messages'), manage_topics: has('manage_topics') };
14
+ };
15
+ export const GROUP_RESTRICTION_KEYS = ['view_messages', 'send_messages', 'send_media', 'send_stickers', 'send_gifs', 'send_games', 'send_inline', 'embed_links', 'send_polls', 'change_info', 'invite_users', 'pin_messages', 'manage_topics'];
16
+ const allRestrictionsCovered = true;
17
+ void allRestrictionsCovered;
18
+ function isGroupRestriction(value) { return GROUP_RESTRICTION_KEYS.some(key => key === value); }
19
+ const nullable = (value) => value === 'off' ? null : value;
20
+ const commandHandlers = {
21
+ 'member add': ({ chat, values }, g) => g.addMembers({ chat, users: [...values.users] }),
22
+ 'member kick': ({ chat, values }, g) => g.kickMember({ chat, user: values.user }),
23
+ 'member ban': ({ chat, values }, g) => g.banMember({ chat, user: values.user, seconds: null }),
24
+ 'member unban': ({ chat, values }, g) => g.unbanMember({ chat, user: values.user }),
25
+ 'member mute': ({ chat, values }, g) => g.muteMember({ chat, user: values.user, seconds: values.durationSeconds ?? null }),
26
+ 'member unmute': ({ chat, values }, g) => g.unmuteMember({ chat, user: values.user }),
27
+ 'member purge': ({ chat, values }, g) => g.purgeMember({ chat, user: values.user }),
28
+ 'admin promote': ({ chat, values }, g) => g.promoteAdmin({ chat, user: values.user, rights: selectedAdminRights(values.permissions) }),
29
+ 'admin demote': ({ chat, values }, g) => g.demoteAdmin({ chat, user: values.user }),
30
+ 'admin rank': ({ chat, values }, g) => g.setAdminRank({ chat, user: values.user, rank: values.text }),
31
+ 'admin transfer-owner': ({ chat, values }, g) => g.transferOwnership({ chat, user: values.user }),
32
+ 'chat title': ({ chat, values }, g) => g.setTitle({ chat, title: values.text }),
33
+ 'chat description': ({ chat, values }, g) => g.setDescription({ chat, text: values.text }),
34
+ 'chat username': ({ chat, values }, g) => g.setUsername({ chat, username: nullable(values.username) }),
35
+ 'chat photo': ({ chat, values }, g) => g.setPhoto({ chat, path: nullable(values.path) }),
36
+ 'chat slowmode': ({ chat, values }, g) => g.setSlowMode({ chat, seconds: values.durationSeconds }),
37
+ 'chat ttl': ({ chat, values }, g) => g.setTtl({ chat, seconds: values.durationSeconds }),
38
+ 'chat protect': ({ chat, values }, g) => g.setContentProtection({ chat, enabled: values.enabled }),
39
+ 'chat join-requests': ({ chat, values }, g) => g.setJoinRequests({ chat, enabled: values.enabled }),
40
+ 'chat join-to-send': ({ chat, values }, g) => g.setJoinToSend({ chat, enabled: values.enabled }),
41
+ 'chat default-permissions': ({ chat, values }, g) => g.setDefaultPermissions({ chat, permissions: selectedRestrictions(values.permissions) }),
42
+ 'chat sticker-set': ({ chat, values }, g) => g.setStickerSet({ chat, sticker: nullable(values.sticker) }),
43
+ 'chat leave': ({ chat }, g) => g.leaveGroup({ chat }), 'chat delete': ({ chat }, g) => g.deleteGroup({ chat }),
44
+ 'invite list': ({ chat }, g) => g.listInvites({ chat, limit: 100 }), 'invite show': ({ chat, values }, g) => g.getInvite({ chat, link: values.invite }),
45
+ 'invite create': ({ chat, values }, g) => g.createInvite({ chat, options: { title: values.title, expireSeconds: values.expireSeconds, usageLimit: values.limit, requestNeeded: values.requestNeeded } }),
46
+ 'invite edit': ({ chat, values }, g) => g.editInvite({ chat, link: values.invite, options: { title: values.title, expireSeconds: values.expireSeconds, usageLimit: values.limit, requestNeeded: values.requestNeeded } }),
47
+ 'invite revoke': ({ chat, values }, g) => g.revokeInvite({ chat, link: values.invite }), 'invite members': ({ chat, values }, g) => g.listInviteMembers({ chat, link: values.invite, limit: 100 }),
48
+ 'invite approve': ({ chat, values }, g) => g.approveJoinRequest({ chat, user: values.user }), 'invite decline': ({ chat, values }, g) => g.declineJoinRequest({ chat, user: values.user }),
49
+ 'invite approve-all': ({ chat }, g) => g.approveAllJoinRequests({ chat }), 'invite decline-all': ({ chat }, g) => g.declineAllJoinRequests({ chat }),
50
+ 'topic list': ({ chat }, g) => g.listTopics({ chat, limit: 100 }), 'topic create': ({ chat, values }, g) => g.createTopic({ chat, title: values.title }),
51
+ 'topic edit': ({ chat, values }, g) => g.editTopic({ chat, topicId: values.id, title: values.title }), 'topic close': ({ chat, values }, g) => g.setTopicClosed({ chat, topicId: values.id, enabled: true }),
52
+ 'topic reopen': ({ chat, values }, g) => g.setTopicClosed({ chat, topicId: values.id, enabled: false }), 'topic pin': ({ chat, values }, g) => g.setTopicPinned({ chat, topicId: values.id, enabled: true }),
53
+ 'topic unpin': ({ chat, values }, g) => g.setTopicPinned({ chat, topicId: values.id, enabled: false }), 'topic reorder': ({ chat, values }, g) => g.reorderPinnedTopics({ chat, topicIds: [...values.ids] }),
54
+ 'topic delete': ({ chat, values }, g) => g.deleteTopic({ chat, topicId: values.id }), 'topic general-hidden': ({ chat, values }, g) => g.setGeneralTopicHidden({ chat, enabled: values.hidden }),
55
+ 'message pin': ({ chat, values }, g) => g.pinMessage({ chat, messageId: values.id }), 'message unpin': ({ chat, values }, g) => g.unpinMessage({ chat, messageId: values.id }),
56
+ 'message unpin-all': ({ chat }, g) => g.unpinAllMessages({ chat }), 'message delete': ({ chat, values }, g) => g.deleteGroupMessages({ chat, messageIds: [...values.ids] }),
57
+ };
58
+ export const COMMAND_HANDLERS = commandHandlers;
59
+ export function canonicalCommandKey(request) {
60
+ const canonical = GROUP_COMMAND_CATALOG[request.key];
61
+ return canonical === request.definition && request.path === canonical.path ? request.key : undefined;
62
+ }
63
+ export class GroupWriteService {
64
+ groups;
65
+ static paths = Object.keys(COMMAND_HANDLERS);
66
+ constructor(groups) {
67
+ this.groups = groups;
68
+ }
69
+ async execute(request) {
70
+ const key = canonicalCommandKey(request);
71
+ if (!key)
72
+ return failure('invalid_command', 'Invalid or noncanonical group command.');
73
+ if (request.key === 'admin promote' && (!request.values.permissions || request.values.permissions.length === 0)) {
74
+ return failure('permissions_required', 'Select at least one administrator permission.');
75
+ }
76
+ if (request.key === 'admin promote' && request.values.permissions?.some(permission => !isAdminRight(permission))) {
77
+ return failure('invalid_option', `Administrator permissions must be one or more of: ${ADMIN_RIGHT_KEYS.join(', ')}.`);
78
+ }
79
+ if (request.key === 'chat default-permissions' && request.values.permissions.some(permission => !isGroupRestriction(permission))) {
80
+ return failure('invalid_option', `Default permissions must be one or more of: ${GROUP_RESTRICTION_KEYS.join(', ')}.`);
81
+ }
82
+ if ((request.key === 'invite create' || request.key === 'invite edit') && request.values.requestNeeded === true && request.values.limit != null) {
83
+ return failure('invalid_option', 'Approval-required invite links cannot have a usage limit.');
84
+ }
85
+ try {
86
+ return { ok: true, data: await dispatch(request, this.groups) };
87
+ }
88
+ catch (error) {
89
+ return groupWriteFailure(error);
90
+ }
91
+ }
92
+ }
93
+ function dispatch(request, groups) {
94
+ switch (request.key) {
95
+ case 'member add': return COMMAND_HANDLERS[request.key](request, groups);
96
+ case 'member kick': return COMMAND_HANDLERS[request.key](request, groups);
97
+ case 'member ban': return COMMAND_HANDLERS[request.key](request, groups);
98
+ case 'member unban': return COMMAND_HANDLERS[request.key](request, groups);
99
+ case 'member mute': return COMMAND_HANDLERS[request.key](request, groups);
100
+ case 'member unmute': return COMMAND_HANDLERS[request.key](request, groups);
101
+ case 'member purge': return COMMAND_HANDLERS[request.key](request, groups);
102
+ case 'admin promote': return COMMAND_HANDLERS[request.key](request, groups);
103
+ case 'admin demote': return COMMAND_HANDLERS[request.key](request, groups);
104
+ case 'admin rank': return COMMAND_HANDLERS[request.key](request, groups);
105
+ case 'admin transfer-owner': return COMMAND_HANDLERS[request.key](request, groups);
106
+ case 'chat title': return COMMAND_HANDLERS[request.key](request, groups);
107
+ case 'chat description': return COMMAND_HANDLERS[request.key](request, groups);
108
+ case 'chat username': return COMMAND_HANDLERS[request.key](request, groups);
109
+ case 'chat photo': return COMMAND_HANDLERS[request.key](request, groups);
110
+ case 'chat slowmode': return COMMAND_HANDLERS[request.key](request, groups);
111
+ case 'chat ttl': return COMMAND_HANDLERS[request.key](request, groups);
112
+ case 'chat protect': return COMMAND_HANDLERS[request.key](request, groups);
113
+ case 'chat join-requests': return COMMAND_HANDLERS[request.key](request, groups);
114
+ case 'chat join-to-send': return COMMAND_HANDLERS[request.key](request, groups);
115
+ case 'chat default-permissions': return COMMAND_HANDLERS[request.key](request, groups);
116
+ case 'chat sticker-set': return COMMAND_HANDLERS[request.key](request, groups);
117
+ case 'chat leave': return COMMAND_HANDLERS[request.key](request, groups);
118
+ case 'chat delete': return COMMAND_HANDLERS[request.key](request, groups);
119
+ case 'invite list': return COMMAND_HANDLERS[request.key](request, groups);
120
+ case 'invite show': return COMMAND_HANDLERS[request.key](request, groups);
121
+ case 'invite create': return COMMAND_HANDLERS[request.key](request, groups);
122
+ case 'invite edit': return COMMAND_HANDLERS[request.key](request, groups);
123
+ case 'invite revoke': return COMMAND_HANDLERS[request.key](request, groups);
124
+ case 'invite members': return COMMAND_HANDLERS[request.key](request, groups);
125
+ case 'invite approve': return COMMAND_HANDLERS[request.key](request, groups);
126
+ case 'invite decline': return COMMAND_HANDLERS[request.key](request, groups);
127
+ case 'invite approve-all': return COMMAND_HANDLERS[request.key](request, groups);
128
+ case 'invite decline-all': return COMMAND_HANDLERS[request.key](request, groups);
129
+ case 'topic list': return COMMAND_HANDLERS[request.key](request, groups);
130
+ case 'topic create': return COMMAND_HANDLERS[request.key](request, groups);
131
+ case 'topic edit': return COMMAND_HANDLERS[request.key](request, groups);
132
+ case 'topic close': return COMMAND_HANDLERS[request.key](request, groups);
133
+ case 'topic reopen': return COMMAND_HANDLERS[request.key](request, groups);
134
+ case 'topic pin': return COMMAND_HANDLERS[request.key](request, groups);
135
+ case 'topic unpin': return COMMAND_HANDLERS[request.key](request, groups);
136
+ case 'topic reorder': return COMMAND_HANDLERS[request.key](request, groups);
137
+ case 'topic delete': return COMMAND_HANDLERS[request.key](request, groups);
138
+ case 'topic general-hidden': return COMMAND_HANDLERS[request.key](request, groups);
139
+ case 'message pin': return COMMAND_HANDLERS[request.key](request, groups);
140
+ case 'message unpin': return COMMAND_HANDLERS[request.key](request, groups);
141
+ case 'message unpin-all': return COMMAND_HANDLERS[request.key](request, groups);
142
+ case 'message delete': return COMMAND_HANDLERS[request.key](request, groups);
143
+ }
144
+ }
145
+ function groupWriteFailure(error) {
146
+ if (error instanceof TelegramGroupNotFoundError)
147
+ return failure('group_not_found', 'Telegram group not found.');
148
+ if (error instanceof TelegramGroupMemberNotFoundError)
149
+ return failure('member_not_found', 'Telegram group member not found.');
150
+ if (error instanceof TelegramGroupMembersNotAddedError)
151
+ return failure('members_not_added', error.message, { chat: error.chat, missing: error.missing.map(item => ({ ...item })) });
152
+ if (error instanceof TelegramGroupAdminRequiredError)
153
+ return failure('admin_required', 'Telegram group administrator privileges are required.');
154
+ if (error instanceof TelegramGroupMissingPermissionError)
155
+ return failure('permission_missing', error.message, { permission: error.permission });
156
+ if (error instanceof TelegramUnsupportedGroupTypeError)
157
+ return failure('unsupported_group', error.message, { chat: error.chat });
158
+ if (error instanceof TelegramGroupFloodWaitError)
159
+ return failure('flood_wait', error.message, { seconds: error.seconds });
160
+ if (error instanceof TelegramGroupPasswordRequiredError)
161
+ return failure('password_required', error.message);
162
+ return failure('telegram_error', error instanceof Error && error.message.trim() ? error.message : 'Telegram request failed.');
163
+ }
164
+ function failure(code, message, details) { return { ok: false, error: { code, message, ...(details === undefined ? {} : { details }) } }; }
165
+ //# sourceMappingURL=group-write-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-write-service.js","sourceRoot":"","sources":["../../src/services/group-write-service.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { extractGroupedId } from '../telegram/raw-message.js';
1
2
  export class ListenAlbumAggregator {
2
3
  options;
3
4
  pending = new Map();
@@ -9,7 +10,7 @@ export class ListenAlbumAggregator {
9
10
  add(message) {
10
11
  const groupedId = extractGroupedId(message.raw_json);
11
12
  if (groupedId == null) {
12
- this.options.emit([message]);
13
+ this.emit([message]);
13
14
  return;
14
15
  }
15
16
  const key = `${message.chat_id}:${groupedId}`;
@@ -35,38 +36,17 @@ export class ListenAlbumAggregator {
35
36
  return;
36
37
  clearTimeout(album.timer);
37
38
  this.pending.delete(key);
38
- this.options.emit([...album.messages].sort((left, right) => left.msg_id - right.msg_id));
39
+ this.emit([...album.messages].sort((left, right) => left.msg_id - right.msg_id));
39
40
  }
40
- }
41
- function extractGroupedId(rawJson) {
42
- const raw = parseRawJson(rawJson);
43
- if (raw == null)
44
- return null;
45
- const groupedId = raw.groupedId ?? raw.grouped_id;
46
- if (typeof groupedId === 'string' || typeof groupedId === 'number')
47
- return String(groupedId);
48
- if (isRecord(groupedId)) {
49
- const low = groupedId.low;
50
- const high = groupedId.high;
51
- if ((typeof low === 'number' || typeof low === 'string') && (typeof high === 'number' || typeof high === 'string')) {
52
- return `${low}:${high}`;
53
- }
54
- }
55
- return null;
56
- }
57
- function parseRawJson(value) {
58
- if (typeof value === 'string') {
41
+ emit(messages) {
59
42
  try {
60
- const parsed = JSON.parse(value);
61
- return isRecord(parsed) ? parsed : null;
43
+ this.options.emit(messages);
62
44
  }
63
- catch {
64
- return null;
45
+ catch (error) {
46
+ if (this.options.onError == null)
47
+ throw error;
48
+ this.options.onError(error);
65
49
  }
66
50
  }
67
- return isRecord(value) ? value : null;
68
- }
69
- function isRecord(value) {
70
- return value != null && typeof value === 'object' && !Array.isArray(value);
71
51
  }
72
52
  //# sourceMappingURL=listen-album-aggregator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"listen-album-aggregator.js","sourceRoot":"","sources":["../../src/services/listen-album-aggregator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"listen-album-aggregator.js","sourceRoot":"","sources":["../../src/services/listen-album-aggregator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAe7D,MAAM,OAAO,qBAAqB;IAIH;IAHZ,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAA;IACzC,OAAO,CAAQ;IAEhC,YAA6B,OAAqC;QAArC,YAAO,GAAP,OAAO,CAA8B;QAChE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,GAAG,CAAA;IACvC,CAAC;IAED,GAAG,CAAC,OAA2B;QAC7B,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACpD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;YACpB,OAAM;QACR,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,EAAE,CAAA;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,QAAQ,IAAI,IAAI;YAAE,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAClD,MAAM,QAAQ,GAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC/E,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5C,CAAC;IAED,KAAK;QACH,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACnE,CAAC;IAED,OAAO;QACL,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACpE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;IAEO,WAAW,CAAC,GAAW;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,KAAK,IAAI,IAAI;YAAE,OAAM;QACzB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IAClF,CAAC;IAEO,IAAI,CAAC,QAA8B;QACzC,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI;gBAAE,MAAM,KAAK,CAAA;YAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC7B,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,265 @@
1
+ export function discoverListenAttachments(message) {
2
+ let previewAssigned = false;
3
+ return extractMediaLabels(message.raw_json).map((attachment) => {
4
+ const preview = attachment.kind === 'Photo' && !previewAssigned
5
+ ? message.preview_jpeg_base64
6
+ : undefined;
7
+ if (attachment.kind === 'Photo' && !previewAssigned)
8
+ previewAssigned = true;
9
+ return {
10
+ ...attachment,
11
+ chatId: message.chat_id,
12
+ messageId: message.msg_id,
13
+ ...(preview == null ? {} : { previewJpegBase64: preview }),
14
+ };
15
+ });
16
+ }
17
+ export function listenAttachmentKey(attachment, index) {
18
+ return `${attachment.chatId}:${attachment.messageId}:${index}`;
19
+ }
20
+ export function attachmentFileName(attachment) {
21
+ if (attachment.fileName != null)
22
+ return attachment.fileName;
23
+ const extension = attachment.mimeType == null
24
+ ? MEDIA_EXTENSIONS[attachment.kind] ?? 'bin'
25
+ : MIME_EXTENSIONS[attachment.mimeType.toLowerCase()] ?? MEDIA_EXTENSIONS[attachment.kind] ?? 'bin';
26
+ return `${attachment.chatId}-${attachment.messageId}.${extension}`;
27
+ }
28
+ export function attachmentDownloadTarget(attachment) {
29
+ return { chat: attachment.chatId, msgId: attachment.messageId };
30
+ }
31
+ function extractMediaLabels(raw) {
32
+ const root = parseRawJson(raw);
33
+ if (root == null)
34
+ return [];
35
+ return dedupeAttachments(collectMediaNodes(root).flatMap(describeMediaNode));
36
+ }
37
+ function collectMediaNodes(root) {
38
+ const nodes = [root];
39
+ const pushIfObject = (value) => {
40
+ if (value == null)
41
+ return;
42
+ if (Array.isArray(value)) {
43
+ for (const item of value) {
44
+ if (item != null && typeof item === 'object' && !Array.isArray(item))
45
+ nodes.push(item);
46
+ }
47
+ return;
48
+ }
49
+ if (typeof value === 'object')
50
+ nodes.push(value);
51
+ };
52
+ pushIfObject(root.media);
53
+ pushIfObject(root.photo);
54
+ pushIfObject(root.document);
55
+ pushIfObject(root.video);
56
+ pushIfObject(root.audio);
57
+ pushIfObject(root.voice);
58
+ pushIfObject(root.sticker);
59
+ pushIfObject(root.animation);
60
+ pushIfObject(root.poll);
61
+ pushIfObject(root.geo);
62
+ pushIfObject(root.location);
63
+ pushIfObject(root.contact);
64
+ pushIfObject(root.venue);
65
+ pushIfObject(root.file);
66
+ pushIfObject(root.webpage);
67
+ pushIfObject(root.invoice);
68
+ pushIfObject(root.round_message);
69
+ const mediaItem = root['media_item'];
70
+ if (mediaItem != null && !Array.isArray(mediaItem) && typeof mediaItem === 'object')
71
+ nodes.push(mediaItem);
72
+ return nodes;
73
+ }
74
+ function describeMediaNode(node) {
75
+ const kind = detectMediaKind(node);
76
+ if (kind == null)
77
+ return [];
78
+ const details = buildMediaDetails(node, kind);
79
+ const source = mediaDetailSource(node, kind);
80
+ return [{
81
+ kind,
82
+ label: kind === 'Contact'
83
+ ? `👤 Contact${details.length > 0 ? ` · ${details}` : ''}`
84
+ : `📎 ${kind}${details.length > 0 ? ` (${details})` : ''}`,
85
+ fileName: firstString(source.fileName, source.file_name, source.filename, source.name),
86
+ mimeType: mediaMimeType(node, source),
87
+ downloadable: DOWNLOADABLE_MEDIA_KINDS.has(kind),
88
+ }];
89
+ }
90
+ function detectMediaKind(node) {
91
+ const typeTag = firstString(node._);
92
+ if (typeTag != null && MEDIA_TYPE_LABELS[typeTag] != null) {
93
+ const taggedKind = MEDIA_TYPE_LABELS[typeTag];
94
+ return taggedKind === 'Document' ? inferDocumentKind(node) : taggedKind;
95
+ }
96
+ if (node.photo != null)
97
+ return 'Photo';
98
+ if (node.document != null || node.file != null || node.mime_type != null || node.mimeType != null || node.mime != null) {
99
+ return inferDocumentKind(node);
100
+ }
101
+ if (node.video != null || node.video_duration != null || node.videoStartTs != null)
102
+ return 'Video';
103
+ if (node.audio != null || node.duration != null || node.voice != null || node.voice_note != null)
104
+ return 'Audio';
105
+ if (node.sticker != null)
106
+ return 'Sticker';
107
+ if (node.animation != null)
108
+ return 'Animation';
109
+ if (node.poll != null)
110
+ return 'Poll';
111
+ if (node.location != null || node.geo != null)
112
+ return 'Location';
113
+ if (node.contact != null)
114
+ return 'Contact';
115
+ if (node.venue != null)
116
+ return 'Venue';
117
+ if (node.webpage != null)
118
+ return 'Webpage';
119
+ if (node.invoice != null)
120
+ return 'Invoice';
121
+ return null;
122
+ }
123
+ function inferDocumentKind(node) {
124
+ const source = mediaDetailSource(node, 'Document');
125
+ const mimeType = mediaMimeType(node, source)?.toLowerCase();
126
+ if (mimeType?.startsWith('video/'))
127
+ return 'Video';
128
+ if (mimeType?.startsWith('audio/'))
129
+ return 'Audio';
130
+ if (mimeType?.startsWith('image/'))
131
+ return 'Photo';
132
+ return 'Document';
133
+ }
134
+ function buildMediaDetails(node, kind) {
135
+ const source = mediaDetailSource(node, kind);
136
+ if (kind === 'Contact')
137
+ return buildContactDetails(source);
138
+ const fileName = firstString(source.fileName, source.file_name, source.filename, source.name);
139
+ const mimeType = mediaMimeType(node, source);
140
+ const size = firstNumber(source.size, source.size_bytes, source.file_size);
141
+ const caption = firstString(node.caption);
142
+ const parts = [];
143
+ if (kind === 'Poll')
144
+ return 'poll';
145
+ if (fileName != null)
146
+ parts.push(fileName);
147
+ if (mimeType != null)
148
+ parts.push(mimeType);
149
+ if (size != null)
150
+ parts.push(humanizeBytes(size));
151
+ if (caption != null)
152
+ parts.push(`caption: ${caption}`);
153
+ return parts.join(' • ');
154
+ }
155
+ function mediaMimeType(node, source) {
156
+ return firstString(source.mime_type, source.mimeType, source.mime, node.mime_type, node.mimeType, node.mime);
157
+ }
158
+ function buildContactDetails(source) {
159
+ const firstName = firstString(source.firstName, source.first_name);
160
+ const lastName = firstString(source.lastName, source.last_name);
161
+ const phoneNumber = firstString(source.phoneNumber, source.phone_number);
162
+ const displayName = [firstName, lastName]
163
+ .filter((part) => part != null)
164
+ .join(' ');
165
+ return [displayName, phoneNumber]
166
+ .filter((part) => part != null && part.length > 0)
167
+ .join(' · ');
168
+ }
169
+ function mediaDetailSource(node, kind) {
170
+ if (kind === 'Contact' && isRecord(node.contact))
171
+ return node.contact;
172
+ if (kind === 'Photo' && node.photo != null && typeof node.photo === 'object')
173
+ return node.photo;
174
+ if (kind === 'Video' && node.video != null && typeof node.video === 'object')
175
+ return node.video;
176
+ if ((kind === 'Audio' || kind === 'Voice') && node.audio != null && typeof node.audio === 'object')
177
+ return node.audio;
178
+ if (kind === 'Document' && node.document != null && typeof node.document === 'object')
179
+ return node.document;
180
+ if (node.document != null && typeof node.document === 'object')
181
+ return node.document;
182
+ if (node.file != null && typeof node.file === 'object')
183
+ return node.file;
184
+ return node;
185
+ }
186
+ function parseRawJson(raw) {
187
+ if (raw == null)
188
+ return null;
189
+ if (typeof raw === 'string') {
190
+ try {
191
+ const parsed = JSON.parse(raw);
192
+ return isRecord(parsed) ? parsed : null;
193
+ }
194
+ catch {
195
+ return null;
196
+ }
197
+ }
198
+ return isRecord(raw) ? raw : null;
199
+ }
200
+ function isRecord(value) {
201
+ return value != null && typeof value === 'object' && !Array.isArray(value);
202
+ }
203
+ function dedupeAttachments(values) {
204
+ const unique = new Set();
205
+ return values.filter((value) => {
206
+ const lower = value.label.toLowerCase();
207
+ if (unique.has(lower))
208
+ return false;
209
+ unique.add(lower);
210
+ return true;
211
+ });
212
+ }
213
+ function firstString(...values) {
214
+ for (const value of values) {
215
+ if (typeof value === 'string' && value.trim().length > 0)
216
+ return value.trim();
217
+ }
218
+ return null;
219
+ }
220
+ function firstNumber(...values) {
221
+ for (const value of values) {
222
+ if (typeof value === 'number' && Number.isFinite(value))
223
+ return value;
224
+ if (typeof value === 'string') {
225
+ const parsed = Number.parseInt(value, 10);
226
+ if (!Number.isNaN(parsed))
227
+ return parsed;
228
+ }
229
+ }
230
+ return null;
231
+ }
232
+ function humanizeBytes(size) {
233
+ const units = ['B', 'KB', 'MB', 'GB'];
234
+ let value = size;
235
+ let index = 0;
236
+ while (value >= 1024 && index < units.length - 1) {
237
+ value /= 1024;
238
+ index += 1;
239
+ }
240
+ return `${value.toFixed(index === 0 ? 0 : 1)} ${units[index]}`;
241
+ }
242
+ const MEDIA_TYPE_LABELS = {
243
+ messageMediaPhoto: 'Photo', messageMediaDocument: 'Document', messageMediaVideo: 'Video',
244
+ messageMediaAudio: 'Audio', messageMediaVoice: 'Voice', messageMediaDoc: 'Document',
245
+ messageMediaWebPage: 'Webpage', messageMediaGeo: 'Location', messageMediaContact: 'Contact',
246
+ messageMediaVenue: 'Venue', messageMediaPoll: 'Poll', messageMediaInvoice: 'Invoice',
247
+ messageMediaSticker: 'Sticker', messageMediaAnimation: 'Animation',
248
+ };
249
+ const DOWNLOADABLE_MEDIA_KINDS = new Set(['Photo', 'Document', 'Video', 'Audio', 'Voice', 'Sticker', 'Animation']);
250
+ const MEDIA_EXTENSIONS = {
251
+ Photo: 'jpg', Video: 'mp4', Audio: 'mp3', Voice: 'ogg', Sticker: 'webp',
252
+ Animation: 'mp4', Document: 'bin',
253
+ };
254
+ const MIME_EXTENSIONS = {
255
+ 'application/pdf': 'pdf',
256
+ 'audio/mpeg': 'mp3',
257
+ 'audio/ogg': 'ogg',
258
+ 'image/gif': 'gif',
259
+ 'image/jpeg': 'jpg',
260
+ 'image/png': 'png',
261
+ 'image/webp': 'webp',
262
+ 'video/mp4': 'mp4',
263
+ 'video/webm': 'webm',
264
+ };
265
+ //# sourceMappingURL=listen-attachment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen-attachment.js","sourceRoot":"","sources":["../../src/services/listen-attachment.ts"],"names":[],"mappings":"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"}