evogram-gramjs 1.1.0 → 1.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 (62) hide show
  1. package/lib/EvogramGramJS.d.ts +51 -0
  2. package/lib/EvogramGramJS.js +99 -0
  3. package/lib/commands/Accounts.command.d.ts +6 -0
  4. package/lib/commands/Accounts.command.js +95 -0
  5. package/lib/commands/AddAccount.command.d.ts +19 -0
  6. package/lib/commands/AddAccount.command.js +461 -0
  7. package/lib/commands/index.d.ts +2 -0
  8. package/lib/commands/index.js +5 -0
  9. package/lib/commands/managment/DeleteAccount.command.d.ts +0 -0
  10. package/{src/commands/managment/DeleteAccount.command.ts → lib/commands/managment/DeleteAccount.command.js} +1 -2
  11. package/lib/config/database.config.d.ts +26 -0
  12. package/lib/config/database.config.js +31 -0
  13. package/lib/entities/Session.entity.d.ts +28 -0
  14. package/lib/entities/Session.entity.js +71 -0
  15. package/lib/entities/SessionEventLog.entity.d.ts +22 -0
  16. package/lib/entities/SessionEventLog.entity.js +50 -0
  17. package/lib/examples/auth.example.d.ts +10 -0
  18. package/lib/examples/auth.example.js +126 -0
  19. package/lib/examples/database.example.d.ts +13 -0
  20. package/lib/examples/database.example.js +109 -0
  21. package/lib/examples/usage.example.d.ts +13 -0
  22. package/lib/examples/usage.example.js +127 -0
  23. package/lib/index.d.ts +7 -0
  24. package/lib/index.js +10 -0
  25. package/lib/services/DatabaseService.d.ts +30 -0
  26. package/lib/services/DatabaseService.js +93 -0
  27. package/lib/services/ImageUploadService.d.ts +15 -0
  28. package/lib/services/ImageUploadService.js +56 -0
  29. package/lib/sessions/Session.d.ts +13 -0
  30. package/lib/sessions/Session.js +25 -0
  31. package/lib/sessions/SessionAuth.d.ts +72 -0
  32. package/lib/sessions/SessionAuth.js +327 -0
  33. package/lib/sessions/SessionLogger.d.ts +84 -0
  34. package/lib/sessions/SessionLogger.js +196 -0
  35. package/lib/sessions/SessionManager.d.ts +84 -0
  36. package/lib/sessions/SessionManager.js +198 -0
  37. package/lib/test.d.ts +1 -0
  38. package/lib/test.js +144 -0
  39. package/lib/types/auth.types.d.ts +90 -0
  40. package/lib/types/auth.types.js +19 -0
  41. package/lib/types/session.types.d.ts +87 -0
  42. package/lib/types/session.types.js +21 -0
  43. package/lib/utils/Deferrer.d.ts +6 -0
  44. package/lib/utils/Deferrer.js +14 -0
  45. package/package.json +1 -2
  46. package/src/EvogramGramJS.ts +0 -98
  47. package/src/commands/Accounts.command.ts +0 -89
  48. package/src/commands/AddAccount.command.ts +0 -449
  49. package/src/commands/index.ts +0 -2
  50. package/src/config/database.config.ts +0 -75
  51. package/src/entities/Session.entity.ts +0 -58
  52. package/src/entities/SessionEventLog.entity.ts +0 -41
  53. package/src/index.ts +0 -7
  54. package/src/services/DatabaseService.ts +0 -82
  55. package/src/services/ImageUploadService.ts +0 -49
  56. package/src/sessions/Session.ts +0 -21
  57. package/src/sessions/SessionAuth.ts +0 -356
  58. package/src/sessions/SessionLogger.ts +0 -208
  59. package/src/sessions/SessionManager.ts +0 -211
  60. package/src/types/auth.types.ts +0 -94
  61. package/src/types/session.types.ts +0 -96
  62. package/src/utils/Deferrer.ts +0 -12
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionLogger = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_1 = require("fs");
6
+ const promises_1 = require("fs/promises");
7
+ const path_1 = require("path");
8
+ /**
9
+ * Логгер для отдельной сессии
10
+ * Записывает все действия и активность сессии в отдельный файл
11
+ */
12
+ class SessionLogger {
13
+ /**
14
+ * @param sessionId Идентификатор сессии
15
+ * @param logsDirectory Директория для хранения логов (по умолчанию './logs')
16
+ */
17
+ constructor(sessionId, logsDirectory = './logs') {
18
+ this.sessionId = sessionId;
19
+ this.logsDirectory = logsDirectory;
20
+ this.logStream = null;
21
+ this.isInitialized = false;
22
+ // Формируем путь к файлу лога
23
+ const sanitizedSessionId = this.sanitizeFileName(sessionId);
24
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
25
+ this.logFilePath = (0, path_1.join)(this.logsDirectory, `session-${sanitizedSessionId}-${timestamp}.log`);
26
+ }
27
+ /**
28
+ * Инициализирует логгер (создает директорию и файл)
29
+ */
30
+ initialize() {
31
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
32
+ if (this.isInitialized)
33
+ return;
34
+ try {
35
+ // Создаем директорию для логов, если её нет
36
+ yield (0, promises_1.mkdir)(this.logsDirectory, { recursive: true });
37
+ // Создаем поток записи в файл (режим append)
38
+ this.logStream = (0, fs_1.createWriteStream)(this.logFilePath, { flags: 'a' });
39
+ // Записываем заголовок
40
+ this.writeLog('INFO', `Логгер инициализирован для сессии: ${this.sessionId}`);
41
+ this.writeLog('INFO', `Файл лога: ${this.logFilePath}`);
42
+ this.writeLog('INFO', `Время создания: ${new Date().toISOString()}`);
43
+ this.writeLog('INFO', '─'.repeat(80));
44
+ this.isInitialized = true;
45
+ }
46
+ catch (error) {
47
+ console.error(`Ошибка инициализации логгера для сессии ${this.sessionId}:`, error);
48
+ throw error;
49
+ }
50
+ });
51
+ }
52
+ /**
53
+ * Записывает лог-запись в файл
54
+ *
55
+ * @param level Уровень логирования (INFO, WARN, ERROR, DEBUG)
56
+ * @param message Сообщение для логирования
57
+ * @param data Дополнительные данные (опционально)
58
+ */
59
+ log(level, message, data) {
60
+ if (!this.isInitialized) {
61
+ // Если логгер еще не инициализирован, инициализируем синхронно
62
+ this.initialize().catch((error) => {
63
+ console.error(`Ошибка инициализации логгера:`, error);
64
+ });
65
+ return;
66
+ }
67
+ this.writeLog(level, message, data);
68
+ }
69
+ /**
70
+ * Логирует информацию
71
+ */
72
+ info(message, data) {
73
+ this.log('INFO', message, data);
74
+ }
75
+ /**
76
+ * Логирует предупреждение
77
+ */
78
+ warn(message, data) {
79
+ this.log('WARN', message, data);
80
+ }
81
+ /**
82
+ * Логирует ошибку
83
+ */
84
+ error(message, error) {
85
+ const errorMessage = error instanceof Error ? error.message : String(error);
86
+ const errorStack = error instanceof Error ? error.stack : undefined;
87
+ this.log('ERROR', message, { error: errorMessage, stack: errorStack });
88
+ }
89
+ /**
90
+ * Логирует отладочную информацию
91
+ */
92
+ debug(message, data) {
93
+ this.log('DEBUG', message, data);
94
+ }
95
+ /**
96
+ * Логирует действие сессии
97
+ *
98
+ * @param action Название действия
99
+ * @param details Детали действия
100
+ */
101
+ logAction(action, details) {
102
+ this.info(`Действие: ${action}`, details);
103
+ }
104
+ /**
105
+ * Логирует событие от Telegram клиента
106
+ *
107
+ * @param eventName Название события
108
+ * @param eventData Данные события
109
+ */
110
+ logTelegramEvent(eventName, eventData) {
111
+ this.debug(`Telegram событие: ${eventName}`, eventData);
112
+ }
113
+ /**
114
+ * Закрывает поток записи
115
+ */
116
+ close() {
117
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
118
+ if (this.logStream) {
119
+ this.writeLog('INFO', '─'.repeat(80));
120
+ this.writeLog('INFO', `Логгер закрыт для сессии: ${this.sessionId}`);
121
+ this.writeLog('INFO', `Время закрытия: ${new Date().toISOString()}`);
122
+ return new Promise((resolve, reject) => {
123
+ this.logStream.end((error) => {
124
+ if (error) {
125
+ reject(error);
126
+ }
127
+ else {
128
+ this.logStream = null;
129
+ this.isInitialized = false;
130
+ resolve();
131
+ }
132
+ });
133
+ });
134
+ }
135
+ });
136
+ }
137
+ /**
138
+ * Получает путь к файлу лога
139
+ */
140
+ getLogFilePath() {
141
+ return this.logFilePath;
142
+ }
143
+ /**
144
+ * Внутренний метод для записи в файл
145
+ *
146
+ * @private
147
+ */
148
+ writeLog(level, message, data) {
149
+ if (!this.logStream) {
150
+ // Если поток еще не создан, выводим в консоль
151
+ console.log(`[${this.sessionId}] [${level}] ${message}`, data || '');
152
+ return;
153
+ }
154
+ const timestamp = new Date().toISOString();
155
+ const logEntry = {
156
+ timestamp,
157
+ level,
158
+ sessionId: this.sessionId,
159
+ message,
160
+ };
161
+ if (data !== undefined) {
162
+ logEntry.data = data;
163
+ }
164
+ // Форматируем запись для удобного чтения
165
+ const logLine = this.formatLogEntry(logEntry);
166
+ this.logStream.write(logLine + '\n');
167
+ }
168
+ /**
169
+ * Форматирует запись лога для записи в файл
170
+ *
171
+ * @private
172
+ */
173
+ formatLogEntry(entry) {
174
+ const { timestamp, level, message, data } = entry;
175
+ let logLine = `[${timestamp}] [${level}] ${message}`;
176
+ if (data !== undefined) {
177
+ try {
178
+ const dataStr = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
179
+ logLine += `\n${dataStr}`;
180
+ }
181
+ catch (error) {
182
+ logLine += `\n[Не удалось сериализовать данные]`;
183
+ }
184
+ }
185
+ return logLine;
186
+ }
187
+ /**
188
+ * Очищает имя файла от недопустимых символов
189
+ *
190
+ * @private
191
+ */
192
+ sanitizeFileName(fileName) {
193
+ return fileName.replace(/[^a-zA-Z0-9_-]/g, '_');
194
+ }
195
+ }
196
+ exports.SessionLogger = SessionLogger;
@@ -0,0 +1,84 @@
1
+ import { EventEmitter } from 'events';
2
+ import { Api, TelegramClient } from 'telegram';
3
+ import { Session as SessionEntity } from '../entities/Session.entity';
4
+ import { DatabaseService } from '../services/DatabaseService';
5
+ import { SessionConfig, SessionInfo } from '../types/session.types';
6
+ import { SessionLogger } from './SessionLogger';
7
+ /**
8
+ * Сервис для управления множеством сессий Telegram клиентов
9
+ *
10
+ * Предоставляет удобный API для:
11
+ * - Добавления и удаления сессий
12
+ * - Получения информации о сессиях
13
+ * - Отслеживания событий (подключение, отключение, ошибки)
14
+ * - Сохранения данных в базе данных
15
+ */
16
+ export declare class SessionManager extends EventEmitter {
17
+ private readonly TELEGRAM_APP_ID;
18
+ private readonly TELEGRAM_APP_HASH;
19
+ private readonly databaseService?;
20
+ constructor(TELEGRAM_APP_ID: number, TELEGRAM_APP_HASH: string, databaseService?: DatabaseService | undefined);
21
+ /** Хранилище всех активных сессий */
22
+ private sessions;
23
+ initialize(): Promise<void>;
24
+ /**
25
+ * Добавляет новую сессию
26
+ *
27
+ * @param config Конфигурация сессии
28
+ * @returns Promise с информацией о созданной сессии
29
+ * @throws Error если сессия с таким ID уже существует
30
+ */
31
+ addSession(config: SessionConfig): Promise<SessionInfo>;
32
+ disconnectSession(sessionId: string): Promise<void>;
33
+ getActiveSessions(): Promise<SessionInfo[]>;
34
+ /**
35
+ * Получает информацию о сессии по ID
36
+ *
37
+ * @param sessionId Идентификатор сессии
38
+ * @returns Информация о сессии или undefined, если не найдена
39
+ */
40
+ getSession(sessionId: string): SessionInfo | undefined;
41
+ /**
42
+ * Получает Telegram клиент по ID сессии
43
+ *
44
+ * @param sessionId Идентификатор сессии
45
+ * @returns Telegram клиент или undefined, если сессия не найдена
46
+ */
47
+ getClient(sessionId: string): TelegramClient | undefined;
48
+ /**
49
+ * Получает логгер сессии по ID
50
+ *
51
+ * @param sessionId Идентификатор сессии
52
+ * @returns Логгер сессии или undefined, если сессия не найдена или логирование отключено
53
+ */
54
+ getLogger(sessionId: string): SessionLogger | undefined;
55
+ /**
56
+ * Получает все активные сессии
57
+ *
58
+ * @returns Массив информации о всех сессиях
59
+ */
60
+ getAllSessions(): SessionInfo[];
61
+ getAllLoadedSessions(): Promise<({
62
+ db: SessionEntity | null;
63
+ user: Api.User | null;
64
+ } & Omit<SessionInfo, 'db' | 'user'>)[]>;
65
+ /**
66
+ * Получает список всех ID сессий
67
+ *
68
+ * @returns Массив идентификаторов сессий
69
+ */
70
+ getAllSessionIds(): string[];
71
+ /**
72
+ * Проверяет, существует ли сессия с указанным ID
73
+ *
74
+ * @param sessionId Идентификатор сессии
75
+ * @returns true, если сессия существует, иначе false
76
+ */
77
+ hasSession(sessionId: string): boolean;
78
+ /**
79
+ * Получает количество активных сессий
80
+ *
81
+ * @returns Количество сессий
82
+ */
83
+ getSessionCount(): number;
84
+ }
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionManager = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const events_1 = require("events");
6
+ const telegram_1 = require("telegram");
7
+ const network_1 = require("telegram/network");
8
+ const sessions_1 = require("telegram/sessions");
9
+ const EvogramGramJS_1 = require("../EvogramGramJS");
10
+ const session_types_1 = require("../types/session.types");
11
+ const Session_1 = require("./Session");
12
+ const SessionAuth_1 = require("./SessionAuth");
13
+ /**
14
+ * Сервис для управления множеством сессий Telegram клиентов
15
+ *
16
+ * Предоставляет удобный API для:
17
+ * - Добавления и удаления сессий
18
+ * - Получения информации о сессиях
19
+ * - Отслеживания событий (подключение, отключение, ошибки)
20
+ * - Сохранения данных в базе данных
21
+ */
22
+ class SessionManager extends events_1.EventEmitter {
23
+ constructor(TELEGRAM_APP_ID, TELEGRAM_APP_HASH, databaseService) {
24
+ super();
25
+ this.TELEGRAM_APP_ID = TELEGRAM_APP_ID;
26
+ this.TELEGRAM_APP_HASH = TELEGRAM_APP_HASH;
27
+ this.databaseService = databaseService;
28
+ /** Хранилище всех активных сессий */
29
+ this.sessions = new Map();
30
+ }
31
+ initialize() {
32
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
33
+ var _a;
34
+ const sessions = yield ((_a = this.databaseService) === null || _a === void 0 ? void 0 : _a.getSessions());
35
+ if (!sessions || sessions.length === 0)
36
+ return;
37
+ for (const session of sessions) {
38
+ yield this.addSession({
39
+ sessionId: session.sessionId,
40
+ sessionString: session.sessionString,
41
+ apiId: session.apiId,
42
+ apiHash: session.apiHash,
43
+ clientOptions: session.clientOptions ? JSON.parse(session.clientOptions) : undefined,
44
+ });
45
+ }
46
+ });
47
+ }
48
+ /**
49
+ * Добавляет новую сессию
50
+ *
51
+ * @param config Конфигурация сессии
52
+ * @returns Promise с информацией о созданной сессии
53
+ * @throws Error если сессия с таким ID уже существует
54
+ */
55
+ addSession(config) {
56
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
57
+ var _a, _b, _c, _d, _e, _f;
58
+ // Проверяем, не существует ли уже сессия с таким ID в памяти
59
+ if (this.sessions.has(config.sessionId))
60
+ return this.sessions.get(config.sessionId);
61
+ // Создаем строковую сессию (если не предоставлена, создается пустая)
62
+ const session = new sessions_1.StringSession(config.sessionString || '');
63
+ // Создаем Telegram клиент
64
+ const client = new telegram_1.TelegramClient(session, (_a = config.apiId) !== null && _a !== void 0 ? _a : this.TELEGRAM_APP_ID, (_b = config.apiHash) !== null && _b !== void 0 ? _b : this.TELEGRAM_APP_HASH, {
65
+ useIPV6: (_d = (_c = config.clientOptions) === null || _c === void 0 ? void 0 : _c.useIPV6) !== null && _d !== void 0 ? _d : false,
66
+ connectionRetries: (_f = (_e = config.clientOptions) === null || _e === void 0 ? void 0 : _e.connectionRetries) !== null && _f !== void 0 ? _f : 5,
67
+ });
68
+ yield client.connect();
69
+ client.addEventHandler((event) => tslib_1.__awaiter(this, void 0, void 0, function* () {
70
+ var _a, _b, _c, _d;
71
+ if ((_b = (yield ((_a = this.getSession(config.sessionId)) === null || _a === void 0 ? void 0 : _a.db()))) === null || _b === void 0 ? void 0 : _b.error)
72
+ return;
73
+ else if (!((_d = (yield ((_c = this.getSession(config.sessionId)) === null || _c === void 0 ? void 0 : _c.db()))) === null || _d === void 0 ? void 0 : _d.sessionString))
74
+ return;
75
+ if (event instanceof network_1.UpdateConnectionState) {
76
+ const error = yield client
77
+ .getMe()
78
+ .then(() => undefined)
79
+ .catch((error) => error);
80
+ if (error) {
81
+ this.emit(session_types_1.SessionEvent.SESSION_INVALID, {
82
+ sessionId: config.sessionId,
83
+ error: error,
84
+ });
85
+ yield EvogramGramJS_1.EvogramGramJS.databaseService.updateSession(config.sessionId, { error: error.errorMessage });
86
+ yield this.disconnectSession(config.sessionId);
87
+ }
88
+ }
89
+ }));
90
+ const sessionAuth = new SessionAuth_1.SessionAuth(config.sessionId, client);
91
+ const sessionInfo = new Session_1.Session(config.sessionId, client, undefined, sessionAuth);
92
+ this.sessions.set(config.sessionId, sessionInfo);
93
+ // Генерируем событие добавления сессии
94
+ this.emit(session_types_1.SessionEvent.SESSION_ADDED, {
95
+ sessionId: config.sessionId,
96
+ sessionInfo,
97
+ });
98
+ return sessionInfo;
99
+ });
100
+ }
101
+ disconnectSession(sessionId) {
102
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
103
+ const session = this.sessions.get(sessionId);
104
+ if (!session)
105
+ throw new Error(`Сессия с ID ${sessionId} не найдена`);
106
+ yield session.client.disconnect();
107
+ this.emit(session_types_1.SessionEvent.SESSION_DISCONNECTED, {
108
+ sessionId: sessionId,
109
+ });
110
+ });
111
+ }
112
+ getActiveSessions() {
113
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
114
+ const sessions = Array.from(this.sessions.values());
115
+ const results = yield Promise.all(sessions.map((session) => tslib_1.__awaiter(this, void 0, void 0, function* () {
116
+ const dbData = yield session.db();
117
+ return { session, hasError: !!(dbData === null || dbData === void 0 ? void 0 : dbData.error) };
118
+ })));
119
+ return results.filter((result) => !result.hasError).map((result) => result.session);
120
+ });
121
+ }
122
+ /**
123
+ * Получает информацию о сессии по ID
124
+ *
125
+ * @param sessionId Идентификатор сессии
126
+ * @returns Информация о сессии или undefined, если не найдена
127
+ */
128
+ getSession(sessionId) {
129
+ const sessionInfo = this.sessions.get(sessionId);
130
+ return sessionInfo;
131
+ }
132
+ /**
133
+ * Получает Telegram клиент по ID сессии
134
+ *
135
+ * @param sessionId Идентификатор сессии
136
+ * @returns Telegram клиент или undefined, если сессия не найдена
137
+ */
138
+ getClient(sessionId) {
139
+ var _a;
140
+ return (_a = this.getSession(sessionId)) === null || _a === void 0 ? void 0 : _a.client;
141
+ }
142
+ /**
143
+ * Получает логгер сессии по ID
144
+ *
145
+ * @param sessionId Идентификатор сессии
146
+ * @returns Логгер сессии или undefined, если сессия не найдена или логирование отключено
147
+ */
148
+ getLogger(sessionId) {
149
+ var _a;
150
+ return (_a = this.getSession(sessionId)) === null || _a === void 0 ? void 0 : _a.logger;
151
+ }
152
+ /**
153
+ * Получает все активные сессии
154
+ *
155
+ * @returns Массив информации о всех сессиях
156
+ */
157
+ getAllSessions() {
158
+ return Array.from(this.sessions.values());
159
+ }
160
+ getAllLoadedSessions() {
161
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
162
+ const sessions = Array.from(this.sessions.values());
163
+ const results = yield Promise.all(sessions
164
+ .filter((x) => x.sessionId)
165
+ .map((session) => tslib_1.__awaiter(this, void 0, void 0, function* () {
166
+ return Object.assign(Object.assign({}, session), { db: yield session.db().catch(() => null), user: yield session.user().catch(() => null) });
167
+ })));
168
+ //@ts-ignore
169
+ return results;
170
+ });
171
+ }
172
+ /**
173
+ * Получает список всех ID сессий
174
+ *
175
+ * @returns Массив идентификаторов сессий
176
+ */
177
+ getAllSessionIds() {
178
+ return Array.from(this.sessions.keys());
179
+ }
180
+ /**
181
+ * Проверяет, существует ли сессия с указанным ID
182
+ *
183
+ * @param sessionId Идентификатор сессии
184
+ * @returns true, если сессия существует, иначе false
185
+ */
186
+ hasSession(sessionId) {
187
+ return this.sessions.has(sessionId);
188
+ }
189
+ /**
190
+ * Получает количество активных сессий
191
+ *
192
+ * @returns Количество сессий
193
+ */
194
+ getSessionCount() {
195
+ return this.sessions.size;
196
+ }
197
+ }
198
+ exports.SessionManager = SessionManager;
package/lib/test.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/lib/test.js ADDED
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const path = tslib_1.__importStar(require("path"));
5
+ const QRCode = tslib_1.__importStar(require("qrcode"));
6
+ const telegram_1 = require("telegram");
7
+ const EvogramGramJS_1 = require("./EvogramGramJS");
8
+ const ImageUploadService_1 = require("./services/ImageUploadService");
9
+ /**
10
+ * Пример авторизации через QR-код
11
+ */
12
+ function authWithQRCode() {
13
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
14
+ EvogramGramJS_1.EvogramGramJS.initialize(29997404, '475e53e15bcb402f3a218e1141a585cf', {
15
+ type: 'sqlite',
16
+ database: './evogramjs.sqlite',
17
+ synchronize: true,
18
+ });
19
+ // Убедитесь, что EvogramGramJS инициализирован перед использованием
20
+ // EvogramGramJS.initialize(apiId, apiHash, databaseConfig)
21
+ const sessionId = `qr-auth-${Date.now()}`;
22
+ try {
23
+ // Создаем новую сессию
24
+ const session = yield EvogramGramJS_1.EvogramGramJS.sessionManager.addSession({
25
+ sessionId,
26
+ logging: {
27
+ enabled: true,
28
+ logsDirectory: './logs',
29
+ },
30
+ });
31
+ console.log('🔐 Начинаем авторизацию через QR-код...');
32
+ // Получаем API credentials из клиента
33
+ const apiCredentials = {
34
+ apiId: session.client.apiId,
35
+ apiHash: session.client.apiHash,
36
+ };
37
+ // Выполняем авторизацию через QR-код
38
+ const user = yield session.client.signInUserWithQrCode(apiCredentials, {
39
+ qrCode: (qrCode) => tslib_1.__awaiter(this, void 0, void 0, function* () {
40
+ // Преобразуем токен в URL для сканирования
41
+ const qrToken = qrCode.token.toString('base64url');
42
+ const qrUrl = `tg://login?token=${qrToken}`;
43
+ console.log('\n📱 Отсканируйте QR-код в приложении Telegram:');
44
+ console.log(`\n🔗 URL: ${qrUrl}`);
45
+ console.log(`\n⏱️ QR-код действителен до: ${new Date(Date.now() + qrCode.expires * 1000).toLocaleString()}`);
46
+ try {
47
+ // Генерируем QR-код для терминала
48
+ const qrCodeTerminal = yield QRCode.toString(qrUrl, { type: 'terminal', small: true });
49
+ console.log('\n📱 QR-код (терминал):');
50
+ console.log(qrCodeTerminal);
51
+ // Генерируем QR-код как изображение PNG
52
+ const qrCodeFileName = `qr-code-${sessionId}.png`;
53
+ const qrCodeFilePath = path.join(process.cwd(), qrCodeFileName);
54
+ yield QRCode.toFile(qrCodeFilePath, qrUrl, {
55
+ type: 'png',
56
+ width: 500,
57
+ margin: 2,
58
+ color: {
59
+ dark: '#000000',
60
+ light: '#FFFFFF',
61
+ },
62
+ });
63
+ console.log(`\n💾 QR-код сохранен в файл: ${qrCodeFilePath}`);
64
+ console.log(`\n💡 Откройте файл и отсканируйте QR-код в приложении Telegram`);
65
+ }
66
+ catch (error) {
67
+ console.error('⚠️ Ошибка при генерации QR-кода:', error);
68
+ console.log('\n💡 Вы можете использовать URL выше для генерации QR-кода вручную');
69
+ }
70
+ }),
71
+ password: (hint) => tslib_1.__awaiter(this, void 0, void 0, function* () {
72
+ // Если требуется пароль 2FA
73
+ console.log(`\n🔒 Требуется пароль 2FA${hint ? ` (подсказка: ${hint})` : ''}`);
74
+ // В реальном приложении здесь нужно запросить пароль у пользователя
75
+ // Для примера возвращаем пустую строку (это вызовет ошибку)
76
+ throw new Error('Пароль 2FA не предоставлен. Реализуйте логику получения пароля.');
77
+ }),
78
+ onError: (error) => tslib_1.__awaiter(this, void 0, void 0, function* () {
79
+ console.error('\n❌ Ошибка авторизации:', error.message);
80
+ // Возвращаем false, чтобы продолжить попытки авторизации
81
+ return false;
82
+ }),
83
+ });
84
+ console.log('\n✅ Авторизация успешна!');
85
+ // Проверяем, что это реальный пользователь, а не UserEmpty
86
+ if (!(user instanceof telegram_1.Api.User)) {
87
+ throw new Error('Получен неверный тип пользователя');
88
+ }
89
+ console.log(`👤 Пользователь: ${user.firstName || ''} ${user.lastName || ''} (@${user.username || 'без username'})`);
90
+ console.log(`📞 Телефон: ${user.phone || 'не указан'}`);
91
+ // Сохраняем сессию в базу данных
92
+ try {
93
+ let avatarBuffer = yield session.client.downloadProfilePhoto('me');
94
+ let avatarUrl;
95
+ if (avatarBuffer) {
96
+ avatarUrl = yield ImageUploadService_1.ImageUploadService.uploadToImgbox(Buffer.isBuffer(avatarBuffer) ? avatarBuffer : Buffer.from(avatarBuffer));
97
+ }
98
+ yield EvogramGramJS_1.EvogramGramJS.databaseService.saveSession({
99
+ sessionId: session.sessionId,
100
+ apiId: session.client.apiId,
101
+ apiHash: session.client.apiHash,
102
+ userId: Number(user.id),
103
+ username: user.username,
104
+ firstName: user.firstName,
105
+ lastName: user.lastName,
106
+ phoneNumber: user.phone,
107
+ sessionString: session.client.session.save(),
108
+ avatarUrl,
109
+ });
110
+ console.log('💾 Сессия сохранена в базу данных');
111
+ }
112
+ catch (error) {
113
+ console.error('⚠️ Ошибка при сохранении сессии:', error);
114
+ }
115
+ return {
116
+ success: true,
117
+ user,
118
+ sessionId: session.sessionId,
119
+ };
120
+ }
121
+ catch (error) {
122
+ console.error('\n❌ Критическая ошибка:', error);
123
+ return {
124
+ success: false,
125
+ error: error instanceof Error ? error.message : String(error),
126
+ };
127
+ }
128
+ });
129
+ }
130
+ // Запускаем авторизацию
131
+ authWithQRCode()
132
+ .then((result) => {
133
+ if (result.success) {
134
+ console.log('\n🎉 Авторизация завершена успешно!');
135
+ }
136
+ else {
137
+ console.log('\n💥 Авторизация не удалась');
138
+ }
139
+ process.exit(0);
140
+ })
141
+ .catch((error) => {
142
+ console.error('💥 Необработанная ошибка:', error);
143
+ process.exit(1);
144
+ });