@cyberdrk/tg 0.1.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.
Files changed (91) hide show
  1. package/README.md +123 -0
  2. package/SKILL.md +110 -0
  3. package/dist/auth.d.ts +4 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +61 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/client.d.ts +63 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +396 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/commands/auth.d.ts +3 -0
  12. package/dist/commands/auth.d.ts.map +1 -0
  13. package/dist/commands/auth.js +21 -0
  14. package/dist/commands/auth.js.map +1 -0
  15. package/dist/commands/chats.d.ts +3 -0
  16. package/dist/commands/chats.d.ts.map +1 -0
  17. package/dist/commands/chats.js +42 -0
  18. package/dist/commands/chats.js.map +1 -0
  19. package/dist/commands/check.d.ts +3 -0
  20. package/dist/commands/check.d.ts.map +1 -0
  21. package/dist/commands/check.js +28 -0
  22. package/dist/commands/check.js.map +1 -0
  23. package/dist/commands/contact.d.ts +3 -0
  24. package/dist/commands/contact.d.ts.map +1 -0
  25. package/dist/commands/contact.js +38 -0
  26. package/dist/commands/contact.js.map +1 -0
  27. package/dist/commands/groups.d.ts +3 -0
  28. package/dist/commands/groups.d.ts.map +1 -0
  29. package/dist/commands/groups.js +45 -0
  30. package/dist/commands/groups.js.map +1 -0
  31. package/dist/commands/inbox.d.ts +3 -0
  32. package/dist/commands/inbox.d.ts.map +1 -0
  33. package/dist/commands/inbox.js +42 -0
  34. package/dist/commands/inbox.js.map +1 -0
  35. package/dist/commands/index.d.ts +14 -0
  36. package/dist/commands/index.d.ts.map +1 -0
  37. package/dist/commands/index.js +14 -0
  38. package/dist/commands/index.js.map +1 -0
  39. package/dist/commands/members.d.ts +4 -0
  40. package/dist/commands/members.d.ts.map +1 -0
  41. package/dist/commands/members.js +73 -0
  42. package/dist/commands/members.js.map +1 -0
  43. package/dist/commands/read.d.ts +3 -0
  44. package/dist/commands/read.d.ts.map +1 -0
  45. package/dist/commands/read.js +69 -0
  46. package/dist/commands/read.js.map +1 -0
  47. package/dist/commands/reply.d.ts +3 -0
  48. package/dist/commands/reply.d.ts.map +1 -0
  49. package/dist/commands/reply.js +37 -0
  50. package/dist/commands/reply.js.map +1 -0
  51. package/dist/commands/search.d.ts +3 -0
  52. package/dist/commands/search.d.ts.map +1 -0
  53. package/dist/commands/search.js +53 -0
  54. package/dist/commands/search.js.map +1 -0
  55. package/dist/commands/send.d.ts +3 -0
  56. package/dist/commands/send.d.ts.map +1 -0
  57. package/dist/commands/send.js +35 -0
  58. package/dist/commands/send.js.map +1 -0
  59. package/dist/commands/sync.d.ts +3 -0
  60. package/dist/commands/sync.d.ts.map +1 -0
  61. package/dist/commands/sync.js +89 -0
  62. package/dist/commands/sync.js.map +1 -0
  63. package/dist/commands/whoami.d.ts +3 -0
  64. package/dist/commands/whoami.d.ts.map +1 -0
  65. package/dist/commands/whoami.js +40 -0
  66. package/dist/commands/whoami.js.map +1 -0
  67. package/dist/config.d.ts +18 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +106 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/formatters/index.d.ts +10 -0
  72. package/dist/formatters/index.d.ts.map +1 -0
  73. package/dist/formatters/index.js +11 -0
  74. package/dist/formatters/index.js.map +1 -0
  75. package/dist/formatters/json.d.ts +2 -0
  76. package/dist/formatters/json.d.ts.map +1 -0
  77. package/dist/formatters/json.js +4 -0
  78. package/dist/formatters/json.js.map +1 -0
  79. package/dist/formatters/markdown.d.ts +21 -0
  80. package/dist/formatters/markdown.d.ts.map +1 -0
  81. package/dist/formatters/markdown.js +87 -0
  82. package/dist/formatters/markdown.js.map +1 -0
  83. package/dist/formatters/plain.d.ts +27 -0
  84. package/dist/formatters/plain.d.ts.map +1 -0
  85. package/dist/formatters/plain.js +121 -0
  86. package/dist/formatters/plain.js.map +1 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +29 -0
  90. package/dist/index.js.map +1 -0
  91. package/package.json +52 -0
package/dist/client.js ADDED
@@ -0,0 +1,396 @@
1
+ import { TelegramClient, Api } from 'telegram';
2
+ import { StringSession } from 'telegram/sessions/index.js';
3
+ import { getCredentials, getSessionString, setSessionString, isConfigured } from './config.js';
4
+ import bigInt from 'big-integer';
5
+ let clientInstance = null;
6
+ export async function getClient() {
7
+ if (clientInstance?.connected) {
8
+ return clientInstance;
9
+ }
10
+ if (!isConfigured()) {
11
+ throw new Error('Not configured. Run "tg auth" first to set up your API credentials.');
12
+ }
13
+ const { apiId, apiHash } = getCredentials();
14
+ const sessionString = getSessionString() || '';
15
+ const session = new StringSession(sessionString);
16
+ clientInstance = new TelegramClient(session, apiId, apiHash, {
17
+ connectionRetries: 5,
18
+ });
19
+ await clientInstance.connect();
20
+ if (!await clientInstance.isUserAuthorized()) {
21
+ throw new Error('Not authenticated. Run "tg auth" to log in.');
22
+ }
23
+ return clientInstance;
24
+ }
25
+ export async function createClient(apiId, apiHash) {
26
+ const session = new StringSession('');
27
+ const client = new TelegramClient(session, apiId, apiHash, {
28
+ connectionRetries: 5,
29
+ });
30
+ await client.connect();
31
+ return client;
32
+ }
33
+ export async function saveSession(client) {
34
+ const sessionString = client.session.save();
35
+ setSessionString(sessionString);
36
+ }
37
+ export async function disconnectClient() {
38
+ if (clientInstance) {
39
+ await clientInstance.disconnect();
40
+ clientInstance = null;
41
+ }
42
+ }
43
+ export async function getMe(client) {
44
+ const me = await client.getMe();
45
+ if (!me || !(me instanceof Api.User)) {
46
+ throw new Error('Failed to get user info');
47
+ }
48
+ return me;
49
+ }
50
+ export async function getDialogs(client, limit = 100) {
51
+ const dialogs = await client.getDialogs({ limit });
52
+ const chats = [];
53
+ for (const dialog of dialogs) {
54
+ let type = 'user';
55
+ let title = dialog.title || 'Unknown';
56
+ let username;
57
+ if (dialog.isUser) {
58
+ type = 'user';
59
+ const entity = dialog.entity;
60
+ username = entity.username ?? undefined;
61
+ }
62
+ else if (dialog.isGroup) {
63
+ type = 'group';
64
+ }
65
+ else if (dialog.isChannel) {
66
+ const entity = dialog.entity;
67
+ type = entity.megagroup ? 'supergroup' : 'channel';
68
+ username = entity.username ?? undefined;
69
+ }
70
+ chats.push({
71
+ id: dialog.id?.toString() || '',
72
+ title,
73
+ type,
74
+ username,
75
+ unreadCount: dialog.unreadCount,
76
+ lastMessage: dialog.message?.message,
77
+ lastMessageDate: dialog.message?.date ? new Date(dialog.message.date * 1000) : undefined,
78
+ });
79
+ }
80
+ return chats;
81
+ }
82
+ export async function getMessages(client, chatIdentifier, options = {}) {
83
+ const { limit = 50, offsetId, minDate, maxDate } = options;
84
+ // Find the chat by name or username
85
+ const entity = await resolveChat(client, chatIdentifier);
86
+ const chatTitle = getChatTitle(entity);
87
+ const messages = [];
88
+ // Use iterMessages for better control over parameters
89
+ const iterParams = {
90
+ limit: limit * 2, // Get more to filter by date
91
+ };
92
+ if (offsetId) {
93
+ iterParams.offsetId = offsetId;
94
+ }
95
+ const result = await client.getMessages(entity, iterParams);
96
+ for (const msg of result) {
97
+ if (msg instanceof Api.Message) {
98
+ const msgDate = new Date(msg.date * 1000);
99
+ // Filter by date if specified
100
+ if (minDate && msgDate < minDate)
101
+ continue;
102
+ if (maxDate && msgDate > maxDate)
103
+ continue;
104
+ if (messages.length >= limit)
105
+ break;
106
+ let sender = 'Unknown';
107
+ let senderId;
108
+ if (msg.fromId) {
109
+ try {
110
+ const senderEntity = await client.getEntity(msg.fromId);
111
+ if (senderEntity instanceof Api.User) {
112
+ sender = senderEntity.firstName || senderEntity.username || 'Unknown';
113
+ senderId = senderEntity.id.toString();
114
+ }
115
+ else if (senderEntity instanceof Api.Channel || senderEntity instanceof Api.Chat) {
116
+ sender = senderEntity.title || 'Unknown';
117
+ senderId = senderEntity.id.toString();
118
+ }
119
+ }
120
+ catch {
121
+ // Ignore entity resolution errors
122
+ }
123
+ }
124
+ messages.push({
125
+ id: msg.id,
126
+ date: msgDate,
127
+ sender,
128
+ senderId,
129
+ text: msg.message || '',
130
+ replyToMsgId: msg.replyTo?.replyToMsgId,
131
+ isOutgoing: msg.out ?? false,
132
+ });
133
+ }
134
+ }
135
+ return { messages, chatTitle };
136
+ }
137
+ export async function searchMessages(client, query, options = {}) {
138
+ const { chat, limit = 50 } = options;
139
+ const results = [];
140
+ if (chat) {
141
+ const entity = await resolveChat(client, chat);
142
+ const chatTitle = getChatTitle(entity);
143
+ const searchResult = await client.invoke(new Api.messages.Search({
144
+ peer: entity,
145
+ q: query,
146
+ filter: new Api.InputMessagesFilterEmpty(),
147
+ minDate: 0,
148
+ maxDate: 0,
149
+ offsetId: 0,
150
+ addOffset: 0,
151
+ limit,
152
+ maxId: 0,
153
+ minId: 0,
154
+ hash: bigInt(0),
155
+ }));
156
+ const messages = [];
157
+ if ('messages' in searchResult) {
158
+ for (const msg of searchResult.messages) {
159
+ if (msg instanceof Api.Message) {
160
+ let sender = 'Unknown';
161
+ if ('users' in searchResult) {
162
+ const user = searchResult.users.find((u) => u instanceof Api.User && u.id.equals(msg.fromId instanceof Api.PeerUser ? msg.fromId.userId : bigInt(0)));
163
+ if (user) {
164
+ sender = user.firstName || user.username || 'Unknown';
165
+ }
166
+ }
167
+ messages.push({
168
+ id: msg.id,
169
+ date: new Date(msg.date * 1000),
170
+ sender,
171
+ text: msg.message || '',
172
+ replyToMsgId: msg.replyTo?.replyToMsgId,
173
+ isOutgoing: msg.out ?? false,
174
+ });
175
+ }
176
+ }
177
+ }
178
+ results.push({ messages, chatTitle });
179
+ }
180
+ else {
181
+ // Global search
182
+ const searchResult = await client.invoke(new Api.messages.SearchGlobal({
183
+ q: query,
184
+ filter: new Api.InputMessagesFilterEmpty(),
185
+ minDate: 0,
186
+ maxDate: 0,
187
+ offsetRate: 0,
188
+ offsetPeer: new Api.InputPeerEmpty(),
189
+ offsetId: 0,
190
+ limit,
191
+ }));
192
+ const messages = [];
193
+ if ('messages' in searchResult) {
194
+ for (const msg of searchResult.messages) {
195
+ if (msg instanceof Api.Message) {
196
+ messages.push({
197
+ id: msg.id,
198
+ date: new Date(msg.date * 1000),
199
+ sender: 'Unknown',
200
+ text: msg.message || '',
201
+ replyToMsgId: msg.replyTo?.replyToMsgId,
202
+ isOutgoing: msg.out ?? false,
203
+ });
204
+ }
205
+ }
206
+ }
207
+ results.push({ messages });
208
+ }
209
+ return results;
210
+ }
211
+ export async function sendMessage(client, chatIdentifier, text, replyToMsgId) {
212
+ const entity = await resolveChat(client, chatIdentifier);
213
+ const result = await client.sendMessage(entity, {
214
+ message: text,
215
+ replyTo: replyToMsgId,
216
+ });
217
+ return result;
218
+ }
219
+ export async function getContactInfo(client, identifier) {
220
+ const entity = await client.getEntity(identifier);
221
+ if (!(entity instanceof Api.User)) {
222
+ throw new Error('Not a user');
223
+ }
224
+ let bio;
225
+ try {
226
+ const fullUser = await client.invoke(new Api.users.GetFullUser({ id: entity }));
227
+ bio = fullUser.fullUser.about ?? undefined;
228
+ }
229
+ catch {
230
+ // Ignore
231
+ }
232
+ return {
233
+ id: entity.id.toString(),
234
+ firstName: entity.firstName ?? undefined,
235
+ lastName: entity.lastName ?? undefined,
236
+ username: entity.username ?? undefined,
237
+ phone: entity.phone ?? undefined,
238
+ bio,
239
+ isBot: entity.bot ?? false,
240
+ isMutualContact: entity.mutualContact ?? false,
241
+ };
242
+ }
243
+ export async function getChatMembers(client, chatIdentifier, options = {}) {
244
+ const { adminsOnly = false, limit = 200 } = options;
245
+ const entity = await resolveChat(client, chatIdentifier);
246
+ if (entity instanceof Api.Channel) {
247
+ const filter = adminsOnly
248
+ ? new Api.ChannelParticipantsAdmins()
249
+ : new Api.ChannelParticipantsRecent();
250
+ const result = await client.invoke(new Api.channels.GetParticipants({
251
+ channel: entity,
252
+ filter,
253
+ offset: 0,
254
+ limit,
255
+ hash: bigInt(0),
256
+ }));
257
+ if (!(result instanceof Api.channels.ChannelParticipants)) {
258
+ return [];
259
+ }
260
+ const members = [];
261
+ for (const participant of result.participants) {
262
+ const userId = 'userId' in participant ? participant.userId : null;
263
+ if (!userId)
264
+ continue;
265
+ const user = result.users.find((u) => u instanceof Api.User && u.id.equals(userId));
266
+ if (user) {
267
+ const isAdmin = participant instanceof Api.ChannelParticipantAdmin ||
268
+ participant instanceof Api.ChannelParticipantCreator;
269
+ members.push({
270
+ id: user.id.toString(),
271
+ name: [user.firstName, user.lastName].filter(Boolean).join(' ') || user.username || 'Unknown',
272
+ username: user.username ?? undefined,
273
+ isAdmin,
274
+ });
275
+ }
276
+ }
277
+ return members;
278
+ }
279
+ else if (entity instanceof Api.Chat) {
280
+ const fullChat = await client.invoke(new Api.messages.GetFullChat({ chatId: entity.id }));
281
+ if (!('fullChat' in fullChat) || !(fullChat.fullChat instanceof Api.ChatFull)) {
282
+ return [];
283
+ }
284
+ const members = [];
285
+ if (fullChat.fullChat.participants instanceof Api.ChatParticipants) {
286
+ for (const participant of fullChat.fullChat.participants.participants) {
287
+ const userId = participant.userId;
288
+ const user = fullChat.users.find((u) => u instanceof Api.User && u.id.equals(userId));
289
+ if (user) {
290
+ const isAdmin = participant instanceof Api.ChatParticipantAdmin ||
291
+ participant instanceof Api.ChatParticipantCreator;
292
+ if (!adminsOnly || isAdmin) {
293
+ members.push({
294
+ id: user.id.toString(),
295
+ name: [user.firstName, user.lastName].filter(Boolean).join(' ') || user.username || 'Unknown',
296
+ username: user.username ?? undefined,
297
+ isAdmin,
298
+ });
299
+ }
300
+ }
301
+ }
302
+ }
303
+ return members;
304
+ }
305
+ throw new Error('Not a group chat');
306
+ }
307
+ export async function getAdminGroups(client) {
308
+ const dialogs = await client.getDialogs({ limit: 500 });
309
+ const adminGroups = [];
310
+ for (const dialog of dialogs) {
311
+ if (dialog.isGroup || dialog.isChannel) {
312
+ const entity = dialog.entity;
313
+ if (entity instanceof Api.Channel) {
314
+ if (entity.adminRights || entity.creator) {
315
+ adminGroups.push({
316
+ id: dialog.id?.toString() || '',
317
+ title: dialog.title || 'Unknown',
318
+ type: entity.megagroup ? 'supergroup' : 'channel',
319
+ username: entity.username ?? undefined,
320
+ unreadCount: dialog.unreadCount,
321
+ });
322
+ }
323
+ }
324
+ else if (entity instanceof Api.Chat) {
325
+ // For regular groups, we need to check participants
326
+ try {
327
+ const fullChat = await client.invoke(new Api.messages.GetFullChat({ chatId: entity.id }));
328
+ const me = await client.getMe();
329
+ if ('fullChat' in fullChat && fullChat.fullChat instanceof Api.ChatFull) {
330
+ if (fullChat.fullChat.participants instanceof Api.ChatParticipants) {
331
+ const myParticipant = fullChat.fullChat.participants.participants.find(p => p.userId.equals(me.id));
332
+ if (myParticipant instanceof Api.ChatParticipantAdmin ||
333
+ myParticipant instanceof Api.ChatParticipantCreator) {
334
+ adminGroups.push({
335
+ id: dialog.id?.toString() || '',
336
+ title: dialog.title || 'Unknown',
337
+ type: 'group',
338
+ unreadCount: dialog.unreadCount,
339
+ });
340
+ }
341
+ }
342
+ }
343
+ }
344
+ catch {
345
+ // Skip if we can't get chat info
346
+ }
347
+ }
348
+ }
349
+ }
350
+ return adminGroups;
351
+ }
352
+ async function resolveChat(client, identifier) {
353
+ // Check if it's a username (starts with @)
354
+ if (identifier.startsWith('@')) {
355
+ const entity = await client.getEntity(identifier);
356
+ if (entity instanceof Api.User || entity instanceof Api.Chat || entity instanceof Api.Channel) {
357
+ return entity;
358
+ }
359
+ throw new Error(`Invalid entity type for: ${identifier}`);
360
+ }
361
+ // Try to find by exact name in dialogs
362
+ const dialogs = await client.getDialogs({ limit: 500 });
363
+ // First try exact match
364
+ let dialog = dialogs.find(d => d.title?.toLowerCase() === identifier.toLowerCase());
365
+ // Then try partial match
366
+ if (!dialog) {
367
+ dialog = dialogs.find(d => d.title?.toLowerCase().includes(identifier.toLowerCase()));
368
+ }
369
+ if (dialog && dialog.entity) {
370
+ const entity = dialog.entity;
371
+ if (entity instanceof Api.User || entity instanceof Api.Chat || entity instanceof Api.Channel) {
372
+ return entity;
373
+ }
374
+ }
375
+ // Try as a direct entity identifier
376
+ try {
377
+ const entity = await client.getEntity(identifier);
378
+ if (entity instanceof Api.User || entity instanceof Api.Chat || entity instanceof Api.Channel) {
379
+ return entity;
380
+ }
381
+ throw new Error(`Invalid entity type for: ${identifier}`);
382
+ }
383
+ catch {
384
+ throw new Error(`Chat not found: ${identifier}`);
385
+ }
386
+ }
387
+ function getChatTitle(entity) {
388
+ if (entity instanceof Api.User) {
389
+ return entity.firstName || entity.username || 'Unknown';
390
+ }
391
+ if (entity instanceof Api.Chat || entity instanceof Api.Channel) {
392
+ return entity.title;
393
+ }
394
+ return 'Unknown';
395
+ }
396
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const authCommand: Command;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SAgBpB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { Command } from 'commander';
2
+ import { authenticate } from '../auth.js';
3
+ import { isConfigured } from '../config.js';
4
+ export const authCommand = new Command('auth')
5
+ .description('Authenticate with Telegram')
6
+ .action(async () => {
7
+ if (isConfigured()) {
8
+ console.log('Already configured. Run "tg check" to verify your session.');
9
+ console.log('To re-authenticate, delete ~/.config/tg/config.json5 and run "tg auth" again.');
10
+ return;
11
+ }
12
+ try {
13
+ const client = await authenticate();
14
+ await client.disconnect();
15
+ }
16
+ catch (error) {
17
+ console.error('Authentication failed:', error instanceof Error ? error.message : error);
18
+ process.exit(1);
19
+ }
20
+ });
21
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,YAAY,EAAE,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAC;QAC7F,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;QACpC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const chatsCommand: Command;
3
+ //# sourceMappingURL=chats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../src/commands/chats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,YAAY,SAsCrB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { Command } from 'commander';
2
+ import { getClient, getDialogs, disconnectClient } from '../client.js';
3
+ import { formatJson } from '../formatters/json.js';
4
+ import { formatChats } from '../formatters/plain.js';
5
+ import { formatChatsMarkdown } from '../formatters/markdown.js';
6
+ import { getOutputFormat } from '../formatters/index.js';
7
+ import ora from 'ora';
8
+ export const chatsCommand = new Command('chats')
9
+ .description('List all chats')
10
+ .option('-n, --limit <number>', 'Maximum number of chats', '100')
11
+ .option('--json', 'Output as JSON')
12
+ .option('--markdown', 'Output as Markdown')
13
+ .option('--type <type>', 'Filter by type: user, group, supergroup, channel')
14
+ .action(async (options) => {
15
+ const spinner = ora('Fetching chats...').start();
16
+ try {
17
+ const client = await getClient();
18
+ let chats = await getDialogs(client, parseInt(options.limit));
19
+ if (options.type) {
20
+ chats = chats.filter(c => c.type === options.type);
21
+ }
22
+ spinner.stop();
23
+ const format = getOutputFormat(options);
24
+ switch (format) {
25
+ case 'json':
26
+ console.log(formatJson(chats));
27
+ break;
28
+ case 'markdown':
29
+ console.log(formatChatsMarkdown(chats));
30
+ break;
31
+ default:
32
+ console.log(formatChats(chats));
33
+ }
34
+ await disconnectClient();
35
+ }
36
+ catch (error) {
37
+ spinner.fail('Failed to fetch chats');
38
+ console.error(error instanceof Error ? error.message : error);
39
+ process.exit(1);
40
+ }
41
+ });
42
+ //# sourceMappingURL=chats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chats.js","sourceRoot":"","sources":["../../src/commands/chats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,gBAAgB,CAAC;KAC7B,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,EAAE,KAAK,CAAC;KAChE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC;KAC1C,MAAM,CAAC,eAAe,EAAE,kDAAkD,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,IAAI,KAAK,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAE9D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAExC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;gBACxC,MAAM;YACR;gBACE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const checkCommand: Command;
3
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,YAAY,SAwBrB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Command } from 'commander';
2
+ import { getClient, getMe, disconnectClient } from '../client.js';
3
+ import { isConfigured } from '../config.js';
4
+ import chalk from 'chalk';
5
+ import ora from 'ora';
6
+ export const checkCommand = new Command('check')
7
+ .description('Verify session and credentials')
8
+ .action(async () => {
9
+ if (!isConfigured()) {
10
+ console.log(chalk.red('Not configured. Run "tg auth" first.'));
11
+ process.exit(1);
12
+ }
13
+ const spinner = ora('Checking session...').start();
14
+ try {
15
+ const client = await getClient();
16
+ const me = await getMe(client);
17
+ spinner.succeed(chalk.green('Session valid'));
18
+ console.log(`Logged in as: ${me.firstName || ''} ${me.lastName || ''} (@${me.username || 'no username'})`);
19
+ await disconnectClient();
20
+ }
21
+ catch (error) {
22
+ spinner.fail(chalk.red('Session invalid or expired'));
23
+ console.error(error instanceof Error ? error.message : error);
24
+ console.log('\nRun "tg auth" to re-authenticate.');
25
+ process.exit(1);
26
+ }
27
+ });
28
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QAE/B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC,QAAQ,IAAI,EAAE,MAAM,EAAE,CAAC,QAAQ,IAAI,aAAa,GAAG,CAAC,CAAC;QAE3G,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const contactCommand: Command;
3
+ //# sourceMappingURL=contact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact.d.ts","sourceRoot":"","sources":["../../src/commands/contact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,cAAc,SAiCvB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { Command } from 'commander';
2
+ import { getClient, getContactInfo, disconnectClient } from '../client.js';
3
+ import { formatJson } from '../formatters/json.js';
4
+ import { formatContact } from '../formatters/plain.js';
5
+ import { formatContactMarkdown } from '../formatters/markdown.js';
6
+ import { getOutputFormat } from '../formatters/index.js';
7
+ import ora from 'ora';
8
+ export const contactCommand = new Command('contact')
9
+ .description('Get contact information')
10
+ .argument('<user>', 'Username (@user) or phone number')
11
+ .option('--json', 'Output as JSON')
12
+ .option('--markdown', 'Output as Markdown')
13
+ .action(async (user, options) => {
14
+ const spinner = ora(`Fetching contact info for "${user}"...`).start();
15
+ try {
16
+ const client = await getClient();
17
+ const contact = await getContactInfo(client, user);
18
+ spinner.stop();
19
+ const format = getOutputFormat(options);
20
+ switch (format) {
21
+ case 'json':
22
+ console.log(formatJson(contact));
23
+ break;
24
+ case 'markdown':
25
+ console.log(formatContactMarkdown(contact));
26
+ break;
27
+ default:
28
+ console.log(formatContact(contact));
29
+ }
30
+ await disconnectClient();
31
+ }
32
+ catch (error) {
33
+ spinner.fail('Failed to fetch contact info');
34
+ console.error(error instanceof Error ? error.message : error);
35
+ process.exit(1);
36
+ }
37
+ });
38
+ //# sourceMappingURL=contact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contact.js","sourceRoot":"","sources":["../../src/commands/contact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,yBAAyB,CAAC;KACtC,QAAQ,CAAC,QAAQ,EAAE,kCAAkC,CAAC;KACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,YAAY,EAAE,oBAAoB,CAAC;KAC1C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,8BAA8B,IAAI,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;IAEtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEnD,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAExC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM;gBACT,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5C,MAAM;YACR;gBACE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,gBAAgB,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const groupsCommand: Command;
3
+ //# sourceMappingURL=groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/commands/groups.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,eAAO,MAAM,aAAa,SAyCtB,CAAC"}