@will-17173/telegram-cli 0.1.1 → 0.2.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 (54) hide show
  1. package/README.md +109 -6
  2. package/README.zh-CN.md +110 -7
  3. package/dist/cli/app.js +3 -1
  4. package/dist/cli/app.js.map +1 -1
  5. package/dist/commands/account.js +3 -1
  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.js +107 -0
  10. package/dist/commands/group.js.map +1 -0
  11. package/dist/commands/telegram-runner.js +84 -0
  12. package/dist/commands/telegram-runner.js.map +1 -0
  13. package/dist/commands/telegram.js +92 -129
  14. package/dist/commands/telegram.js.map +1 -1
  15. package/dist/config/credential-store.js +76 -22
  16. package/dist/config/credential-store.js.map +1 -1
  17. package/dist/config/env.js +12 -1
  18. package/dist/config/env.js.map +1 -1
  19. package/dist/index.js +0 -0
  20. package/dist/presenters/group.js +106 -0
  21. package/dist/presenters/group.js.map +1 -0
  22. package/dist/presenters/human.js +7 -9
  23. package/dist/presenters/human.js.map +1 -1
  24. package/dist/presenters/ink/listen.js +376 -141
  25. package/dist/presenters/ink/listen.js.map +1 -1
  26. package/dist/presenters/listen-message.js +3 -236
  27. package/dist/presenters/listen-message.js.map +1 -1
  28. package/dist/services/attachment-download.js +5 -2
  29. package/dist/services/attachment-download.js.map +1 -1
  30. package/dist/services/auto-download-coordinator.js +214 -0
  31. package/dist/services/auto-download-coordinator.js.map +1 -0
  32. package/dist/services/group-service.js +164 -0
  33. package/dist/services/group-service.js.map +1 -0
  34. package/dist/services/listen-attachment.js +248 -0
  35. package/dist/services/listen-attachment.js.map +1 -0
  36. package/dist/services/message-service.js +54 -4
  37. package/dist/services/message-service.js.map +1 -1
  38. package/dist/services/query-service.js +37 -32
  39. package/dist/services/query-service.js.map +1 -1
  40. package/dist/services/sync-service.js +18 -6
  41. package/dist/services/sync-service.js.map +1 -1
  42. package/dist/telegram/client-factory.js +4 -2
  43. package/dist/telegram/client-factory.js.map +1 -1
  44. package/dist/telegram/fake-group-management.js +264 -0
  45. package/dist/telegram/fake-group-management.js.map +1 -0
  46. package/dist/telegram/group-types.js +19 -0
  47. package/dist/telegram/group-types.js.map +1 -0
  48. package/dist/telegram/mtcute-client.js +73 -8
  49. package/dist/telegram/mtcute-client.js.map +1 -1
  50. package/dist/telegram/mtcute-group-management.js +464 -0
  51. package/dist/telegram/mtcute-group-management.js.map +1 -0
  52. package/dist/telegram/proxy.js +27 -0
  53. package/dist/telegram/proxy.js.map +1 -0
  54. package/package.json +10 -12
@@ -1,13 +1,15 @@
1
1
  import { renderResult } from '../cli/output.js';
2
- import { validateCredentials, writeCredentials } from '../config/credential-store.js';
3
- import { getConfigPath } from '../config/env.js';
2
+ import { validateCredentials, writeConfiguration } from '../config/credential-store.js';
3
+ import { getConfigPath, getTelegramCredentials, getTelegramProxyConfiguration, } from '../config/env.js';
4
+ import { normalizeTelegramProxy } from '../telegram/proxy.js';
4
5
  import { outputFormatConflict } from './types.js';
5
6
  export function registerConfigCommands(app) {
6
7
  const config = app.command('config').description('Manage Telegram CLI configuration');
7
8
  config.command('set')
8
- .description('Save Telegram API credentials')
9
+ .description('Save Telegram API credentials and proxy settings')
9
10
  .option('--api-id <id>', 'Telegram API ID')
10
11
  .option('--api-hash <hash>', 'Telegram API hash')
12
+ .option('--proxy <url>', 'Telegram proxy URL')
11
13
  .option('--json')
12
14
  .option('--yaml')
13
15
  .action(async (options) => {
@@ -16,12 +18,29 @@ export function registerConfigCommands(app) {
16
18
  await renderResult(conflict, { yaml: true });
17
19
  return;
18
20
  }
21
+ const credentialsSupplied = options.apiId !== undefined || options.apiHash !== undefined;
22
+ const proxySupplied = options.proxy !== undefined;
23
+ if (!credentialsSupplied && !proxySupplied) {
24
+ await renderResult({
25
+ ok: false,
26
+ error: {
27
+ code: 'invalid_config',
28
+ message: 'Provide API credentials, a proxy, or both.',
29
+ },
30
+ }, options);
31
+ return;
32
+ }
19
33
  let credentials;
34
+ let proxy;
20
35
  try {
21
- credentials = validateCredentials({
22
- apiId: options.apiId,
23
- apiHash: options.apiHash,
24
- });
36
+ if (credentialsSupplied) {
37
+ credentials = validateCredentials({
38
+ apiId: options.apiId,
39
+ apiHash: options.apiHash,
40
+ });
41
+ }
42
+ if (proxySupplied)
43
+ proxy = normalizeTelegramProxy(options.proxy);
25
44
  }
26
45
  catch (error) {
27
46
  await renderResult({
@@ -34,30 +53,94 @@ export function registerConfigCommands(app) {
34
53
  return;
35
54
  }
36
55
  try {
37
- writeCredentials(getConfigPath(), credentials);
56
+ writeConfiguration(getConfigPath(), {
57
+ ...(credentials ? { credentials } : {}),
58
+ ...(proxy ? { proxy } : {}),
59
+ });
38
60
  }
39
61
  catch {
40
62
  await renderResult({
41
63
  ok: false,
42
64
  error: {
43
65
  code: 'config_write_failed',
44
- message: 'Failed to save Telegram API credentials.',
66
+ message: 'Failed to save Telegram configuration.',
45
67
  },
46
68
  }, options);
47
69
  return;
48
70
  }
71
+ const data = {
72
+ configured: true,
73
+ ...(credentials ? { api_id: credentials.apiId } : {}),
74
+ ...(proxy ? { proxy_configured: true } : {}),
75
+ };
49
76
  const result = {
50
77
  ok: true,
51
- data: {
52
- configured: true,
53
- api_id: credentials.apiId,
78
+ data,
79
+ human: {
80
+ kind: 'text',
81
+ text: credentials && proxy
82
+ ? 'Telegram API credentials and proxy saved.'
83
+ : credentials
84
+ ? 'Telegram API credentials saved.'
85
+ : 'Telegram proxy saved.',
54
86
  },
87
+ };
88
+ await renderResult(result, options);
89
+ });
90
+ config.command('list')
91
+ .description('Show effective Telegram CLI configuration')
92
+ .option('--show-secrets', 'Show the complete API hash')
93
+ .option('--json')
94
+ .option('--yaml')
95
+ .action(async (options) => {
96
+ const conflict = outputFormatConflict(options);
97
+ if (conflict) {
98
+ await renderResult(conflict, { yaml: true });
99
+ return;
100
+ }
101
+ let credentials;
102
+ let proxy;
103
+ try {
104
+ credentials = getTelegramCredentials();
105
+ proxy = getTelegramProxyConfiguration();
106
+ }
107
+ catch {
108
+ await renderResult({
109
+ ok: false,
110
+ error: {
111
+ code: 'invalid_config',
112
+ message: 'Telegram configuration is invalid.',
113
+ },
114
+ }, options);
115
+ return;
116
+ }
117
+ const data = {
118
+ api_id: credentials.apiId,
119
+ api_hash: options.showSecrets ? credentials.apiHash : maskSecret(credentials.apiHash),
120
+ credentials_source: credentials.source,
121
+ proxy: proxy?.url ?? null,
122
+ proxy_source: proxy?.source ?? null,
123
+ };
124
+ const result = {
125
+ ok: true,
126
+ data,
55
127
  human: {
56
128
  kind: 'text',
57
- text: 'Telegram API credentials saved.',
129
+ text: [
130
+ `API ID ${data.api_id}`,
131
+ `API hash ${data.api_hash}`,
132
+ `Credentials source ${data.credentials_source}`,
133
+ `Proxy ${data.proxy ?? 'none'}`,
134
+ `Proxy source ${data.proxy_source ?? 'none'}`,
135
+ ].join('\n'),
58
136
  },
59
137
  };
60
138
  await renderResult(result, options);
61
139
  });
62
140
  }
141
+ function maskSecret(secret) {
142
+ if (secret.length <= 4)
143
+ return '*'.repeat(secret.length);
144
+ return `${'*'.repeat(secret.length - 4)}${secret.slice(-4)}`;
145
+ }
63
146
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAAwC,MAAM,YAAY,CAAA;AAOvF,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAA;IAErF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SAClB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC;SAC1C,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5C,OAAM;QACR,CAAC;QAED,IAAI,WAAW,CAAA;QACf,IAAI,CAAC;YACH,WAAW,GAAG,mBAAmB,CAAC;gBAChC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC;gBACjB,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC;iBAC3F;aACF,EAAE,OAAO,CAAC,CAAA;YACX,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,gBAAgB,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAA;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,YAAY,CAAC;gBACjB,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,0CAA0C;iBACpD;aACF,EAAE,OAAO,CAAC,CAAA;YACX,OAAM;QACR,CAAC;QAED,MAAM,MAAM,GAAwD;YAClE,EAAE,EAAE,IAAI;YACR,IAAI,EAAE;gBACJ,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,WAAW,CAAC,KAAK;aAC1B;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,iCAAiC;aACxC;SACF,CAAA;QACD,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACN,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AACvF,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,6BAA6B,GAG9B,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAwC,MAAM,YAAY,CAAA;AA0BvF,MAAM,UAAU,sBAAsB,CAAC,GAAY;IACjD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,mCAAmC,CAAC,CAAA;IAErF,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SAClB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,iBAAiB,CAAC;SAC1C,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,eAAe,EAAE,oBAAoB,CAAC;SAC7C,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5C,OAAM;QACR,CAAC;QAED,MAAM,mBAAmB,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,CAAA;QACxF,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAA;QAEjD,IAAI,CAAC,mBAAmB,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3C,MAAM,YAAY,CAAC;gBACjB,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,4CAA4C;iBACtD;aACF,EAAE,OAAO,CAAC,CAAA;YACX,OAAM;QACR,CAAC;QAED,IAAI,WAAW,CAAA;QACf,IAAI,KAAK,CAAA;QACT,IAAI,CAAC;YACH,IAAI,mBAAmB,EAAE,CAAC;gBACxB,WAAW,GAAG,mBAAmB,CAAC;oBAChC,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,OAAO,EAAE,OAAO,CAAC,OAAO;iBACzB,CAAC,CAAA;YACJ,CAAC;YACD,IAAI,aAAa;gBAAE,KAAK,GAAG,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAClE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,CAAC;gBACjB,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC;iBAC3F;aACF,EAAE,OAAO,CAAC,CAAA;YACX,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,kBAAkB,CAAC,aAAa,EAAE,EAAE;gBAClC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5B,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,YAAY,CAAC;gBACjB,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,wCAAwC;iBAClD;aACF,EAAE,OAAO,CAAC,CAAA;YACX,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAkB;YAC1B,UAAU,EAAE,IAAI;YAChB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,IAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtD,CAAA;QACD,MAAM,MAAM,GAAiC;YAC3C,EAAE,EAAE,IAAI;YACR,IAAI;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,WAAW,IAAI,KAAK;oBACxB,CAAC,CAAC,2CAA2C;oBAC7C,CAAC,CAAC,WAAW;wBACX,CAAC,CAAC,iCAAiC;wBACnC,CAAC,CAAC,uBAAuB;aAC9B;SACF,CAAA;QACD,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEJ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SACnB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;SACtD,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,QAAQ,CAAC;SAChB,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5C,OAAM;QACR,CAAC;QAED,IAAI,WAAW,CAAA;QACf,IAAI,KAAK,CAAA;QACT,IAAI,CAAC;YACH,WAAW,GAAG,sBAAsB,EAAE,CAAA;YACtC,KAAK,GAAG,6BAA6B,EAAE,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,YAAY,CAAC;gBACjB,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,oCAAoC;iBAC9C;aACF,EAAE,OAAO,CAAC,CAAA;YACX,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAmB;YAC3B,MAAM,EAAE,WAAW,CAAC,KAAK;YACzB,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC;YACrF,kBAAkB,EAAE,WAAW,CAAC,MAAM;YACtC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,IAAI;YACzB,YAAY,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI;SACpC,CAAA;QACD,MAAM,MAAM,GAAkC;YAC5C,EAAE,EAAE,IAAI;YACR,IAAI;YACJ,KAAK,EAAE;gBACL,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;oBACJ,wBAAwB,IAAI,CAAC,MAAM,EAAE;oBACrC,wBAAwB,IAAI,CAAC,QAAQ,EAAE;oBACvC,wBAAwB,IAAI,CAAC,kBAAkB,EAAE;oBACjD,wBAAwB,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE;oBAC9C,wBAAwB,IAAI,CAAC,YAAY,IAAI,MAAM,EAAE;iBACtD,CAAC,IAAI,CAAC,IAAI,CAAC;aACb;SACF,CAAA;QACD,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACN,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACxD,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9D,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { renderResult } from '../cli/output.js';
2
+ import { groupAuditTable, groupInfoDetail, groupMemberDetail, groupMembersTable, } from '../presenters/group.js';
3
+ import { GroupService, validateGroupAuditOptions, validateGroupMembersOptions, } from '../services/group-service.js';
4
+ import { runTelegramCommand } from './telegram-runner.js';
5
+ import { outputFormatConflict } from './types.js';
6
+ export function registerGroupCommands(app) {
7
+ const group = app.command('group')
8
+ .description('Inspect Telegram groups, members, and audit events');
9
+ group.command('info')
10
+ .description('Show Telegram group information')
11
+ .argument('<chat>')
12
+ .option('--json')
13
+ .option('--yaml')
14
+ .action(async (chat, _localOptions, command) => {
15
+ const options = optionsWithGlobals(command);
16
+ await runTelegramCommand(options, async (client) => {
17
+ const result = await new GroupService(client.groups).info(chat);
18
+ return result.ok ? { ...result, human: groupInfoDetail(result.data) } : result;
19
+ });
20
+ });
21
+ group.command('members')
22
+ .description('List Telegram group members')
23
+ .argument('<chat>')
24
+ .option('--type <type>', 'Member filter')
25
+ .option('--query <query>', 'Search member names and usernames')
26
+ .option('--limit <limit>', 'Maximum members to return')
27
+ .option('--json')
28
+ .option('--yaml')
29
+ .action(async (chat, _localOptions, command) => {
30
+ const options = optionsWithGlobals(command);
31
+ const requested = {
32
+ chat,
33
+ type: options.type,
34
+ query: options.query,
35
+ limit: options.limit,
36
+ };
37
+ if (await renderConflict(options))
38
+ return;
39
+ const validation = validateGroupMembersOptions(requested);
40
+ if (!validation.ok) {
41
+ await renderResult(validation, options);
42
+ return;
43
+ }
44
+ await runTelegramCommand(options, async (client) => {
45
+ const result = await new GroupService(client.groups).members(validation.options);
46
+ return result.ok ? { ...result, human: groupMembersTable(result.data) } : result;
47
+ });
48
+ });
49
+ group.command('member')
50
+ .description('Show a Telegram group member')
51
+ .argument('<chat>')
52
+ .argument('<user>')
53
+ .option('--json')
54
+ .option('--yaml')
55
+ .action(async (chat, user, _localOptions, command) => {
56
+ const options = optionsWithGlobals(command);
57
+ await runTelegramCommand(options, async (client) => {
58
+ const result = await new GroupService(client.groups).member(chat, user);
59
+ return result.ok ? { ...result, human: groupMemberDetail(result.data) } : result;
60
+ });
61
+ });
62
+ group.command('audit')
63
+ .description('List Telegram group audit events')
64
+ .argument('<chat>')
65
+ .option('--query <query>', 'Search audit event summaries')
66
+ .option('--user <user>', 'Filter by action author', collect)
67
+ .option('--type <type>', 'Filter by audit event type', collect)
68
+ .option('--limit <limit>', 'Maximum audit events to return')
69
+ .option('--json')
70
+ .option('--yaml')
71
+ .action(async (chat, _localOptions, command) => {
72
+ const options = optionsWithGlobals(command);
73
+ const requested = {
74
+ chat,
75
+ query: options.query,
76
+ users: options.user,
77
+ types: options.type,
78
+ limit: options.limit,
79
+ };
80
+ if (await renderConflict(options))
81
+ return;
82
+ const validation = validateGroupAuditOptions(requested);
83
+ if (!validation.ok) {
84
+ await renderResult(validation, options);
85
+ return;
86
+ }
87
+ await runTelegramCommand(options, async (client) => {
88
+ const result = await new GroupService(client.groups).audit(validation.options);
89
+ return result.ok ? { ...result, human: groupAuditTable(result.data) } : result;
90
+ });
91
+ });
92
+ }
93
+ async function renderConflict(options) {
94
+ const conflict = outputFormatConflict(options);
95
+ if (conflict) {
96
+ await renderResult(conflict, { yaml: true });
97
+ return true;
98
+ }
99
+ return false;
100
+ }
101
+ function optionsWithGlobals(command) {
102
+ return command.optsWithGlobals();
103
+ }
104
+ function collect(value, previous) {
105
+ return [...(previous ?? []), value];
106
+ }
107
+ //# sourceMappingURL=group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.js","sourceRoot":"","sources":["../../src/commands/group.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { createTelegramClient } from '../telegram/client-factory.js';
2
+ import { runWithAccountContext } from './account-options.js';
3
+ const BENIGN_UPDATE_WARNINGS = [
4
+ 'pts_before does not match local_pts',
5
+ 'local pts not available for postponed updateNewChannelMessage',
6
+ 'error fetching common difference',
7
+ 'error fetching difference for',
8
+ 'Session is reset',
9
+ 'MtprotoSession.resetState',
10
+ ];
11
+ export async function runTelegramCommand(options, handler) {
12
+ await runWithAccountContext(options, async (context) => {
13
+ const restoreStdoutWarnings = hideBenignUpdateWarnings(process.stdout);
14
+ const restoreStderrWarnings = hideBenignUpdateWarnings(process.stderr);
15
+ let client;
16
+ try {
17
+ client = createTelegramClient(context.sessionPath);
18
+ }
19
+ catch (error) {
20
+ restoreStdoutWarnings();
21
+ restoreStderrWarnings();
22
+ return commandFailure('config_error', error);
23
+ }
24
+ try {
25
+ return await handler(client, context);
26
+ }
27
+ catch (error) {
28
+ const authError = toAuthSessionError(error, context.account.name);
29
+ return authError ?? commandFailure('telegram_error', error);
30
+ }
31
+ finally {
32
+ restoreStdoutWarnings();
33
+ restoreStderrWarnings();
34
+ await client.close().catch(() => undefined);
35
+ }
36
+ });
37
+ }
38
+ export function hideBenignUpdateWarnings(stream) {
39
+ const write = stream.write;
40
+ stream.write = ((chunk, encoding, cb) => {
41
+ const rendered = typeof chunk === 'string' ? chunk : Buffer.from(chunk).toString();
42
+ const isBenignUpdateWarning = BENIGN_UPDATE_WARNINGS.some((warning) => rendered.includes(warning))
43
+ || (rendered.includes('error fetching difference for') && rendered.includes('400 CHANNEL_INVALID'));
44
+ if (isBenignUpdateWarning) {
45
+ return true;
46
+ }
47
+ return write.call(stream, chunk, encoding, cb);
48
+ });
49
+ return () => {
50
+ stream.write = write;
51
+ };
52
+ }
53
+ function toAuthSessionError(error, accountName) {
54
+ if (isAuthKeyUnregistered(error)) {
55
+ return {
56
+ ok: false,
57
+ error: {
58
+ code: 'telegram_account_session_expired',
59
+ message: `Session for account "${accountName}" is no longer valid. Re-add the account: tg account remove ${accountName} --force && tg account add.`,
60
+ },
61
+ };
62
+ }
63
+ return null;
64
+ }
65
+ function isAuthKeyUnregistered(error) {
66
+ if (error === null || typeof error !== 'object')
67
+ return false;
68
+ const candidate = error;
69
+ const text = typeof candidate.text === 'string'
70
+ ? candidate.text
71
+ : undefined;
72
+ if (text === 'AUTH_KEY_UNREGISTERED')
73
+ return true;
74
+ const code = typeof candidate.code === 'number' ? candidate.code : undefined;
75
+ const message = typeof candidate.message === 'string' ? candidate.message : '';
76
+ return message.includes('AUTH_KEY_UNREGISTERED') && code === 401;
77
+ }
78
+ function commandFailure(code, error) {
79
+ return { ok: false, error: { code, message: errorMessage(error) } };
80
+ }
81
+ function errorMessage(error) {
82
+ return error instanceof Error ? error.message : String(error);
83
+ }
84
+ //# sourceMappingURL=telegram-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-runner.js","sourceRoot":"","sources":["../../src/commands/telegram-runner.ts"],"names":[],"mappings":"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"}