evogram-gramjs 1.0.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.
- package/.evogram/7878190870/database.db +0 -0
- package/lib/EvogramGramJS.d.ts +51 -0
- package/lib/EvogramGramJS.js +99 -0
- package/lib/commands/Accounts.command.d.ts +6 -0
- package/lib/commands/Accounts.command.js +90 -0
- package/lib/commands/AddAccount.command.d.ts +6 -0
- package/lib/commands/AddAccount.command.js +170 -0
- package/lib/commands/index.d.ts +0 -0
- package/lib/commands/index.js +1 -0
- package/lib/commands/managment/DeleteAccount.command.d.ts +0 -0
- package/lib/commands/managment/DeleteAccount.command.js +12 -0
- package/lib/config/database.config.d.ts +26 -0
- package/lib/config/database.config.js +31 -0
- package/lib/entities/Session.entity.d.ts +28 -0
- package/lib/entities/Session.entity.js +71 -0
- package/lib/entities/SessionEventLog.entity.d.ts +22 -0
- package/lib/entities/SessionEventLog.entity.js +50 -0
- package/lib/examples/auth.example.d.ts +10 -0
- package/lib/examples/auth.example.js +126 -0
- package/lib/examples/database.example.d.ts +13 -0
- package/lib/examples/database.example.js +109 -0
- package/lib/examples/usage.example.d.ts +13 -0
- package/lib/examples/usage.example.js +127 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +10 -0
- package/lib/services/DatabaseService.d.ts +30 -0
- package/lib/services/DatabaseService.js +93 -0
- package/lib/services/ImageUploadService.d.ts +15 -0
- package/lib/services/ImageUploadService.js +56 -0
- package/lib/sessions/Session.d.ts +13 -0
- package/lib/sessions/Session.js +25 -0
- package/lib/sessions/SessionAuth.d.ts +62 -0
- package/lib/sessions/SessionAuth.js +165 -0
- package/lib/sessions/SessionLogger.d.ts +84 -0
- package/lib/sessions/SessionLogger.js +196 -0
- package/lib/sessions/SessionManager.d.ts +79 -0
- package/lib/sessions/SessionManager.js +184 -0
- package/lib/types/auth.types.d.ts +90 -0
- package/lib/types/auth.types.js +19 -0
- package/lib/types/session.types.d.ts +87 -0
- package/lib/types/session.types.js +21 -0
- package/lib/utils/Deferrer.d.ts +6 -0
- package/lib/utils/Deferrer.js +14 -0
- package/package-lock.json +6 -0
- package/package.json +27 -0
- package/src/EvogramGramJS.ts +98 -0
- package/src/commands/Accounts.command.ts +84 -0
- package/src/commands/AddAccount.command.ts +171 -0
- package/src/commands/index.ts +0 -0
- package/src/commands/managment/DeleteAccount.command.ts +13 -0
- package/src/config/database.config.ts +75 -0
- package/src/entities/Session.entity.ts +58 -0
- package/src/entities/SessionEventLog.entity.ts +41 -0
- package/src/index.ts +7 -0
- package/src/services/DatabaseService.ts +82 -0
- package/src/services/ImageUploadService.ts +49 -0
- package/src/sessions/Session.ts +21 -0
- package/src/sessions/SessionAuth.ts +173 -0
- package/src/sessions/SessionLogger.ts +208 -0
- package/src/sessions/SessionManager.ts +190 -0
- package/src/types/auth.types.ts +94 -0
- package/src/types/session.types.ts +96 -0
- package/src/utils/Deferrer.ts +12 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,184 @@
|
|
|
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;
|
|
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
|
+
if (event instanceof network_1.UpdateConnectionState) {
|
|
74
|
+
const error = yield client
|
|
75
|
+
.getMe()
|
|
76
|
+
.then(() => undefined)
|
|
77
|
+
.catch((error) => error);
|
|
78
|
+
if (error) {
|
|
79
|
+
this.emit(session_types_1.SessionEvent.SESSION_INVALID, {
|
|
80
|
+
sessionId: config.sessionId,
|
|
81
|
+
error: error,
|
|
82
|
+
});
|
|
83
|
+
yield EvogramGramJS_1.EvogramGramJS.databaseService.updateSession(config.sessionId, { error: error.errorMessage });
|
|
84
|
+
yield this.disconnectSession(config.sessionId);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}));
|
|
88
|
+
const sessionAuth = new SessionAuth_1.SessionAuth(config.sessionId, client);
|
|
89
|
+
const sessionInfo = new Session_1.Session(config.sessionId, client, undefined, sessionAuth);
|
|
90
|
+
this.sessions.set(config.sessionId, sessionInfo);
|
|
91
|
+
// Генерируем событие добавления сессии
|
|
92
|
+
this.emit(session_types_1.SessionEvent.SESSION_ADDED, {
|
|
93
|
+
sessionId: config.sessionId,
|
|
94
|
+
sessionInfo,
|
|
95
|
+
});
|
|
96
|
+
return sessionInfo;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
disconnectSession(sessionId) {
|
|
100
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
101
|
+
const session = this.sessions.get(sessionId);
|
|
102
|
+
if (!session)
|
|
103
|
+
throw new Error(`Сессия с ID ${sessionId} не найдена`);
|
|
104
|
+
yield session.client.disconnect();
|
|
105
|
+
this.emit(session_types_1.SessionEvent.SESSION_DISCONNECTED, {
|
|
106
|
+
sessionId: sessionId,
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
getActiveSessions() {
|
|
111
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
112
|
+
const sessions = Array.from(this.sessions.values());
|
|
113
|
+
const results = yield Promise.all(sessions.map((session) => tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
114
|
+
const dbData = yield session.db();
|
|
115
|
+
return { session, hasError: !!(dbData === null || dbData === void 0 ? void 0 : dbData.error) };
|
|
116
|
+
})));
|
|
117
|
+
return results.filter((result) => !result.hasError).map((result) => result.session);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Получает информацию о сессии по ID
|
|
122
|
+
*
|
|
123
|
+
* @param sessionId Идентификатор сессии
|
|
124
|
+
* @returns Информация о сессии или undefined, если не найдена
|
|
125
|
+
*/
|
|
126
|
+
getSession(sessionId) {
|
|
127
|
+
const sessionInfo = this.sessions.get(sessionId);
|
|
128
|
+
return sessionInfo;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Получает Telegram клиент по ID сессии
|
|
132
|
+
*
|
|
133
|
+
* @param sessionId Идентификатор сессии
|
|
134
|
+
* @returns Telegram клиент или undefined, если сессия не найдена
|
|
135
|
+
*/
|
|
136
|
+
getClient(sessionId) {
|
|
137
|
+
var _a;
|
|
138
|
+
return (_a = this.getSession(sessionId)) === null || _a === void 0 ? void 0 : _a.client;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Получает логгер сессии по ID
|
|
142
|
+
*
|
|
143
|
+
* @param sessionId Идентификатор сессии
|
|
144
|
+
* @returns Логгер сессии или undefined, если сессия не найдена или логирование отключено
|
|
145
|
+
*/
|
|
146
|
+
getLogger(sessionId) {
|
|
147
|
+
var _a;
|
|
148
|
+
return (_a = this.getSession(sessionId)) === null || _a === void 0 ? void 0 : _a.logger;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Получает все активные сессии
|
|
152
|
+
*
|
|
153
|
+
* @returns Массив информации о всех сессиях
|
|
154
|
+
*/
|
|
155
|
+
getAllSessions() {
|
|
156
|
+
return Array.from(this.sessions.values());
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Получает список всех ID сессий
|
|
160
|
+
*
|
|
161
|
+
* @returns Массив идентификаторов сессий
|
|
162
|
+
*/
|
|
163
|
+
getAllSessionIds() {
|
|
164
|
+
return Array.from(this.sessions.keys());
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Проверяет, существует ли сессия с указанным ID
|
|
168
|
+
*
|
|
169
|
+
* @param sessionId Идентификатор сессии
|
|
170
|
+
* @returns true, если сессия существует, иначе false
|
|
171
|
+
*/
|
|
172
|
+
hasSession(sessionId) {
|
|
173
|
+
return this.sessions.has(sessionId);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Получает количество активных сессий
|
|
177
|
+
*
|
|
178
|
+
* @returns Количество сессий
|
|
179
|
+
*/
|
|
180
|
+
getSessionCount() {
|
|
181
|
+
return this.sessions.size;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
exports.SessionManager = SessionManager;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Состояния процесса авторизации
|
|
3
|
+
*/
|
|
4
|
+
export declare enum AuthState {
|
|
5
|
+
/** Начальное состояние - не авторизован */
|
|
6
|
+
INITIAL = "initial",
|
|
7
|
+
/** Ожидание кода подтверждения */
|
|
8
|
+
WAITING_CODE = "waiting_code",
|
|
9
|
+
/** Ожидание пароля (2FA) */
|
|
10
|
+
WAITING_PASSWORD = "waiting_password",
|
|
11
|
+
/** Авторизация завершена */
|
|
12
|
+
AUTHORIZED = "authorized",
|
|
13
|
+
/** Ошибка авторизации */
|
|
14
|
+
ERROR = "error"
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Информация о процессе авторизации
|
|
18
|
+
*/
|
|
19
|
+
export interface AuthInfo {
|
|
20
|
+
/** Идентификатор сессии */
|
|
21
|
+
sessionId: string;
|
|
22
|
+
/** Текущее состояние авторизации */
|
|
23
|
+
state: AuthState;
|
|
24
|
+
/** Номер телефона (если указан) */
|
|
25
|
+
phoneNumber?: string;
|
|
26
|
+
/** Требуется ли пароль (2FA) */
|
|
27
|
+
isRequiredPassword: boolean;
|
|
28
|
+
/** Код подтверждения (если ожидается) */
|
|
29
|
+
code?: string;
|
|
30
|
+
/** Пароль (2FA) (если ожидается) */
|
|
31
|
+
password?: string;
|
|
32
|
+
/** Хеш кода подтверждения */
|
|
33
|
+
phoneCodeHash?: string;
|
|
34
|
+
/** Сообщение об ошибке (если есть) */
|
|
35
|
+
error?: string;
|
|
36
|
+
/** Время начала авторизации */
|
|
37
|
+
startedAt: Date;
|
|
38
|
+
/** Время последнего обновления */
|
|
39
|
+
updatedAt: Date;
|
|
40
|
+
/** Промисы для ожидания кода и пароля */
|
|
41
|
+
_codeResolver?: (code: string) => void;
|
|
42
|
+
_codeRejecter?: (error: Error) => void;
|
|
43
|
+
_passwordResolver?: (password: string) => void;
|
|
44
|
+
_passwordRejecter?: (error: Error) => void;
|
|
45
|
+
/** Промис для отслеживания начальной ошибки (до запроса кода) */
|
|
46
|
+
_initialErrorRejecter?: (error: Error) => void;
|
|
47
|
+
/** Resolver для промиса, когда код был запрошен (успешное начало) */
|
|
48
|
+
_codeRequestedResolver?: () => void;
|
|
49
|
+
/** Флаг, что код был запрошен (для различения начальной ошибки от ошибки после запроса кода) */
|
|
50
|
+
_codeRequested?: boolean;
|
|
51
|
+
/** Флаг, что была ошибка неверного кода (для отслеживания повторной попытки) */
|
|
52
|
+
_hasCodeError?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Результат отправки кода
|
|
56
|
+
*/
|
|
57
|
+
export interface SendCodeResult {
|
|
58
|
+
/** Успешно ли отправлен код */
|
|
59
|
+
success: boolean;
|
|
60
|
+
/** Требуется ли пароль (2FA) */
|
|
61
|
+
isRequiredPassword: boolean;
|
|
62
|
+
/** Сообщение об ошибке (если есть) */
|
|
63
|
+
error?: string;
|
|
64
|
+
/** Тип отправки кода (sms, call, etc.) */
|
|
65
|
+
phoneCodeHash?: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Результат ввода кода
|
|
69
|
+
*/
|
|
70
|
+
export interface SignInResult {
|
|
71
|
+
/** Успешно ли авторизован */
|
|
72
|
+
success: boolean;
|
|
73
|
+
/** Требуется ли пароль (2FA) */
|
|
74
|
+
isRequiredPassword: boolean;
|
|
75
|
+
/** Сообщение об ошибке (если есть) */
|
|
76
|
+
error?: string;
|
|
77
|
+
/** Строка сессии (если авторизация успешна) */
|
|
78
|
+
sessionString?: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Результат ввода пароля
|
|
82
|
+
*/
|
|
83
|
+
export interface SignInWithPasswordResult {
|
|
84
|
+
/** Успешно ли авторизован */
|
|
85
|
+
success: boolean;
|
|
86
|
+
/** Сообщение об ошибке (если есть) */
|
|
87
|
+
error?: string;
|
|
88
|
+
/** Строка сессии (если авторизация успешна) */
|
|
89
|
+
sessionString?: string;
|
|
90
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthState = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Состояния процесса авторизации
|
|
6
|
+
*/
|
|
7
|
+
var AuthState;
|
|
8
|
+
(function (AuthState) {
|
|
9
|
+
/** Начальное состояние - не авторизован */
|
|
10
|
+
AuthState["INITIAL"] = "initial";
|
|
11
|
+
/** Ожидание кода подтверждения */
|
|
12
|
+
AuthState["WAITING_CODE"] = "waiting_code";
|
|
13
|
+
/** Ожидание пароля (2FA) */
|
|
14
|
+
AuthState["WAITING_PASSWORD"] = "waiting_password";
|
|
15
|
+
/** Авторизация завершена */
|
|
16
|
+
AuthState["AUTHORIZED"] = "authorized";
|
|
17
|
+
/** Ошибка авторизации */
|
|
18
|
+
AuthState["ERROR"] = "error";
|
|
19
|
+
})(AuthState || (exports.AuthState = AuthState = {}));
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Session } from '../sessions/Session';
|
|
2
|
+
/**
|
|
3
|
+
* Конфигурация для создания новой сессии
|
|
4
|
+
*/
|
|
5
|
+
export interface SessionConfig {
|
|
6
|
+
/** Уникальный идентификатор сессии */
|
|
7
|
+
sessionId: string;
|
|
8
|
+
/** API ID из Telegram */
|
|
9
|
+
apiId?: number;
|
|
10
|
+
/** API Hash из Telegram */
|
|
11
|
+
apiHash?: string;
|
|
12
|
+
/** Строка сессии (если уже существует) */
|
|
13
|
+
sessionString?: string;
|
|
14
|
+
/** Дополнительные опции для клиента */
|
|
15
|
+
clientOptions?: {
|
|
16
|
+
/** Использовать IPv6 */
|
|
17
|
+
useIPV6?: boolean;
|
|
18
|
+
/** Таймаут подключения */
|
|
19
|
+
connectionRetries?: number;
|
|
20
|
+
/** Максимальное количество попыток переподключения */
|
|
21
|
+
maxRetries?: number;
|
|
22
|
+
};
|
|
23
|
+
/** Настройки логирования */
|
|
24
|
+
logging?: {
|
|
25
|
+
/** Включить логирование (по умолчанию true) */
|
|
26
|
+
enabled?: boolean;
|
|
27
|
+
/** Директория для хранения логов (по умолчанию './logs') */
|
|
28
|
+
logsDirectory?: string;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Информация о сессии
|
|
33
|
+
* Использует класс Session для представления сессии
|
|
34
|
+
*/
|
|
35
|
+
export type SessionInfo = Session;
|
|
36
|
+
/**
|
|
37
|
+
* События, которые может генерировать менеджер сессий
|
|
38
|
+
*/
|
|
39
|
+
export declare enum SessionEvent {
|
|
40
|
+
/** Сессия была добавлена */
|
|
41
|
+
SESSION_ADDED = "session:added",
|
|
42
|
+
/** Сессия была удалена */
|
|
43
|
+
SESSION_REMOVED = "session:removed",
|
|
44
|
+
/** Сессия подключилась */
|
|
45
|
+
SESSION_CONNECTED = "session:connected",
|
|
46
|
+
/** Сессия отключилась */
|
|
47
|
+
SESSION_DISCONNECTED = "session:disconnected",
|
|
48
|
+
/** Произошла ошибка в сессии */
|
|
49
|
+
SESSION_ERROR = "session:error",
|
|
50
|
+
/** Сессия стала недействительной */
|
|
51
|
+
SESSION_INVALID = "session:invalid"
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Данные события добавления/удаления сессии
|
|
55
|
+
*/
|
|
56
|
+
export interface SessionEventData {
|
|
57
|
+
sessionId: string;
|
|
58
|
+
sessionInfo?: Session;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Данные события подключения/отключения
|
|
62
|
+
*/
|
|
63
|
+
export interface SessionConnectionEventData {
|
|
64
|
+
sessionId: string;
|
|
65
|
+
isConnected: boolean;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Данные события ошибки
|
|
69
|
+
*/
|
|
70
|
+
export interface SessionErrorEventData {
|
|
71
|
+
sessionId: string;
|
|
72
|
+
error: Error;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Данные события удаления сессии
|
|
76
|
+
*/
|
|
77
|
+
export interface SessionRemovedEventData {
|
|
78
|
+
sessionId: string;
|
|
79
|
+
error: Error;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Данные события недействительности сессии
|
|
83
|
+
*/
|
|
84
|
+
export interface SessionInvalidEventData {
|
|
85
|
+
sessionId: string;
|
|
86
|
+
error: Error;
|
|
87
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SessionEvent = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* События, которые может генерировать менеджер сессий
|
|
6
|
+
*/
|
|
7
|
+
var SessionEvent;
|
|
8
|
+
(function (SessionEvent) {
|
|
9
|
+
/** Сессия была добавлена */
|
|
10
|
+
SessionEvent["SESSION_ADDED"] = "session:added";
|
|
11
|
+
/** Сессия была удалена */
|
|
12
|
+
SessionEvent["SESSION_REMOVED"] = "session:removed";
|
|
13
|
+
/** Сессия подключилась */
|
|
14
|
+
SessionEvent["SESSION_CONNECTED"] = "session:connected";
|
|
15
|
+
/** Сессия отключилась */
|
|
16
|
+
SessionEvent["SESSION_DISCONNECTED"] = "session:disconnected";
|
|
17
|
+
/** Произошла ошибка в сессии */
|
|
18
|
+
SessionEvent["SESSION_ERROR"] = "session:error";
|
|
19
|
+
/** Сессия стала недействительной */
|
|
20
|
+
SessionEvent["SESSION_INVALID"] = "session:invalid";
|
|
21
|
+
})(SessionEvent || (exports.SessionEvent = SessionEvent = {}));
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Deferred = void 0;
|
|
4
|
+
class Deferred {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.resolve = () => { };
|
|
7
|
+
this.reject = () => { };
|
|
8
|
+
this.promise = new Promise((resolve, reject) => {
|
|
9
|
+
this.resolve = resolve;
|
|
10
|
+
this.reject = reject;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.Deferred = Deferred;
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "evogram-gramjs",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "./lib/index.js",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"axios": "^1.9.0",
|
|
8
|
+
"chalk": "^5.4.1",
|
|
9
|
+
"lodash": "^4.17.21",
|
|
10
|
+
"reflect-metadata": "^0.2.2",
|
|
11
|
+
"sqlite": "^5.1.1",
|
|
12
|
+
"typeorm": "^0.3.20"
|
|
13
|
+
},
|
|
14
|
+
"peerDependencies": {
|
|
15
|
+
"evogram": "^2.10.4",
|
|
16
|
+
"telegram": "^2.26.22"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/lodash": "^4.17.21",
|
|
20
|
+
"@types/node": "^24.3.0",
|
|
21
|
+
"evogram": "^2.10.4",
|
|
22
|
+
"telegram": "^2.26.22"
|
|
23
|
+
},
|
|
24
|
+
"optionalDependencies": {
|
|
25
|
+
"better-sqlite3": "^11.3.0"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { DatabaseConfig } from './config/database.config'
|
|
2
|
+
import { DatabaseService } from './services/DatabaseService'
|
|
3
|
+
import { SessionManager } from './sessions/SessionManager'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Главный статический класс для работы с EvogramGramJS
|
|
7
|
+
* Управляет сессиями Telegram и базой данных
|
|
8
|
+
*/
|
|
9
|
+
export class EvogramGramJS {
|
|
10
|
+
private static _sessionManager: SessionManager | null = null
|
|
11
|
+
private static _databaseService: DatabaseService | null = null
|
|
12
|
+
private static _telegramAppId: number | null = null
|
|
13
|
+
private static _telegramAppHash: string | null = null
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Инициализирует EvogramGramJS
|
|
17
|
+
*
|
|
18
|
+
* @param telegramAppId API ID из Telegram
|
|
19
|
+
* @param telegramAppHash API Hash из Telegram
|
|
20
|
+
* @param databaseConfig Конфигурация базы данных (опционально)
|
|
21
|
+
*/
|
|
22
|
+
static initialize(telegramAppId: number, telegramAppHash: string, databaseConfig?: DatabaseConfig): void {
|
|
23
|
+
this._telegramAppId = telegramAppId
|
|
24
|
+
this._telegramAppHash = telegramAppHash
|
|
25
|
+
|
|
26
|
+
// Инициализируем сервис базы данных
|
|
27
|
+
this._databaseService = new DatabaseService()
|
|
28
|
+
|
|
29
|
+
// Инициализируем менеджер сессий с поддержкой БД
|
|
30
|
+
this._sessionManager = new SessionManager(telegramAppId, telegramAppHash, this._databaseService)
|
|
31
|
+
|
|
32
|
+
// Инициализируем базу данных асинхронно
|
|
33
|
+
if (databaseConfig) {
|
|
34
|
+
this._databaseService
|
|
35
|
+
.initialize(databaseConfig)
|
|
36
|
+
.then(async () => {
|
|
37
|
+
// Автоматически загружаем сессии из базы данных после инициализации
|
|
38
|
+
if (this._sessionManager) await this._sessionManager.initialize()
|
|
39
|
+
})
|
|
40
|
+
.catch((error) => {
|
|
41
|
+
console.error('Ошибка инициализации базы данных:', error)
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Получает менеджер сессий
|
|
48
|
+
*
|
|
49
|
+
* @returns SessionManager
|
|
50
|
+
* @throws Error если EvogramGramJS не инициализирован
|
|
51
|
+
*/
|
|
52
|
+
static get sessionManager(): SessionManager {
|
|
53
|
+
if (!this._sessionManager) throw new Error('EvogramGramJS не инициализирован. Вызовите EvogramGramJS.initialize() сначала.')
|
|
54
|
+
|
|
55
|
+
return this._sessionManager
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Получает сервис базы данных
|
|
60
|
+
*
|
|
61
|
+
* @returns DatabaseService
|
|
62
|
+
* @throws Error если EvogramGramJS не инициализирован
|
|
63
|
+
*/
|
|
64
|
+
static get databaseService(): DatabaseService {
|
|
65
|
+
if (!this._databaseService) throw new Error('EvogramGramJS не инициализирован. Вызовите EvogramGramJS.initialize() сначала.')
|
|
66
|
+
|
|
67
|
+
return this._databaseService
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Инициализирует базу данных
|
|
72
|
+
*
|
|
73
|
+
* @param config Конфигурация базы данных
|
|
74
|
+
*/
|
|
75
|
+
static async initializeDatabase(config: DatabaseConfig): Promise<void> {
|
|
76
|
+
if (!this._databaseService) throw new Error('EvogramGramJS не инициализирован. Вызовите EvogramGramJS.initialize() сначала.')
|
|
77
|
+
await this._databaseService.initialize(config)
|
|
78
|
+
|
|
79
|
+
// Автоматически загружаем сессии из базы данных после инициализации
|
|
80
|
+
if (this._sessionManager) await this._sessionManager.initialize()
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Закрывает подключение к базе данных
|
|
85
|
+
*/
|
|
86
|
+
static async closeDatabase(): Promise<void> {
|
|
87
|
+
if (this._databaseService) await this._databaseService.close()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Проверяет, инициализирован ли EvogramGramJS
|
|
92
|
+
*
|
|
93
|
+
* @returns true, если инициализирован
|
|
94
|
+
*/
|
|
95
|
+
static isInitialized(): boolean {
|
|
96
|
+
return this._sessionManager !== null && this._databaseService !== null
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { Command, CommandArgument, CommandContext, CommandD, CommandUpdate, InlineQueryContext, MessageContext } from 'evogram'
|
|
2
|
+
import { EvogramGramJS } from '../EvogramGramJS'
|
|
3
|
+
import { AddAccountCommand } from './AddAccount.command'
|
|
4
|
+
|
|
5
|
+
@CommandD({ name: 'accounts' })
|
|
6
|
+
export class AccountsCommand extends Command {
|
|
7
|
+
public async execute(context: CommandContext, @CommandArgument('sessionId?') sessionId?: string) {
|
|
8
|
+
if (!sessionId)
|
|
9
|
+
//@ts-ignore
|
|
10
|
+
return context[context.callbackQuery ? 'edit' : 'send']?.({
|
|
11
|
+
// prettier-ignore
|
|
12
|
+
text:
|
|
13
|
+
'<blockquote><b>📊 Список аккаунтов</b></blockquote>\n\n' +
|
|
14
|
+
|
|
15
|
+
'<i>Панель управлениями Вашими аккаунтами</i>',
|
|
16
|
+
parse_mode: 'HTML',
|
|
17
|
+
reply_markup: {
|
|
18
|
+
inline_keyboard: [
|
|
19
|
+
[
|
|
20
|
+
{ text: 'Добавить', command: AddAccountCommand, payload: { phone: null, session: null, code: null, password: null } },
|
|
21
|
+
{ text: 'Список', command: AccountsCommand, switch_inline_query_current_chat: ' ' },
|
|
22
|
+
],
|
|
23
|
+
],
|
|
24
|
+
},
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
const session = EvogramGramJS.sessionManager.getSession(sessionId)
|
|
28
|
+
const db = await session?.db()
|
|
29
|
+
const me = await session?.client
|
|
30
|
+
.getMe()
|
|
31
|
+
.then((x) => x)
|
|
32
|
+
.catch(() => null)
|
|
33
|
+
|
|
34
|
+
//@ts-ignore
|
|
35
|
+
return context[context.callbackQuery ? 'edit' : 'send']?.({
|
|
36
|
+
// prettier-ignore
|
|
37
|
+
text:
|
|
38
|
+
`<blockquote><b>👤 Аккаунт <a href="tg://user?id=${db?.userId}">${db?.firstName}</a></b></blockquote>\n\n` +
|
|
39
|
+
|
|
40
|
+
`<i>— ID: ${db?.userId}</i>\n` +
|
|
41
|
+
`<i>— Phone: ${db?.phoneNumber}</i>\n\n` +
|
|
42
|
+
|
|
43
|
+
`<b>${me ? '✅ Активен и доступен к работе' : db?.error ? `❌ ${db?.error}` : '❌ Неавторизованный'}</b>`,
|
|
44
|
+
parse_mode: 'HTML',
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@CommandUpdate('message')
|
|
49
|
+
public async handleMessage(context: CommandContext, message: MessageContext) {
|
|
50
|
+
if (!message.viaBot) return
|
|
51
|
+
|
|
52
|
+
message.delete().catch(() => null)
|
|
53
|
+
return context.redirect(AccountsCommand, { sessionId: message.text })
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public async inlineExecute(context: InlineQueryContext) {
|
|
57
|
+
const accounts = EvogramGramJS.sessionManager.getAllSessions()
|
|
58
|
+
|
|
59
|
+
context.answer(
|
|
60
|
+
await Promise.all(
|
|
61
|
+
accounts.map(async (x) => {
|
|
62
|
+
const db = await x.db()
|
|
63
|
+
|
|
64
|
+
return {
|
|
65
|
+
type: 'article',
|
|
66
|
+
id: x.sessionId,
|
|
67
|
+
title: db ? `${db?.firstName} ${db?.lastName || ''}` : 'Безымянный',
|
|
68
|
+
description: db?.error ? `❌ ${db?.error}` : db ? '✅ Аккаунт активен' : '❌ Неавторизованный',
|
|
69
|
+
thumbnail_url: db?.avatarUrl || undefined,
|
|
70
|
+
input_message_content: {
|
|
71
|
+
message_text: x.sessionId,
|
|
72
|
+
},
|
|
73
|
+
}
|
|
74
|
+
})
|
|
75
|
+
),
|
|
76
|
+
{
|
|
77
|
+
switch_pm_text: accounts.length > 0 ? `Добавлено ${accounts.length} аккаунтов` : 'Нет доступных аккаунтов',
|
|
78
|
+
switch_pm_parameter: 'accounts',
|
|
79
|
+
cache_time: 0,
|
|
80
|
+
is_personal: true,
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
}
|