Spaces:
Paused
Paused
| import fs from 'fs'; | |
| import path from 'path'; | |
| import { fileURLToPath } from 'url'; | |
| const __filename = fileURLToPath(import.meta.url); | |
| const __dirname = path.dirname(__filename); | |
| let pointer = 0; | |
| // Директория для хранения сессий и данных аккаунтов | |
| const SESSION_DIR = path.join(__dirname, '..', '..', 'session'); | |
| const ACCOUNTS_DIR = path.join(SESSION_DIR, 'accounts'); | |
| const TOKENS_FILE = path.join(SESSION_DIR, 'tokens.json'); | |
| function ensureSessionDir() { | |
| if (!fs.existsSync(SESSION_DIR)) { | |
| fs.mkdirSync(SESSION_DIR, { recursive: true }); | |
| } | |
| if (!fs.existsSync(ACCOUNTS_DIR)) { | |
| fs.mkdirSync(ACCOUNTS_DIR, { recursive: true }); | |
| } | |
| } | |
| export function loadTokens() { | |
| ensureSessionDir(); | |
| if (!fs.existsSync(TOKENS_FILE)) { | |
| return []; | |
| } | |
| try { | |
| const data = fs.readFileSync(TOKENS_FILE, 'utf8'); | |
| return JSON.parse(data); | |
| } catch (e) { | |
| console.error('TokenManager: ошибка чтения tokens.json:', e); | |
| return []; | |
| } | |
| } | |
| export function saveTokens(tokens) { | |
| ensureSessionDir(); | |
| try { | |
| fs.writeFileSync(TOKENS_FILE, JSON.stringify(tokens, null, 2), 'utf8'); | |
| } catch (e) { | |
| console.error('TokenManager: ошибка сохранения tokens.json:', e); | |
| } | |
| } | |
| export async function getAvailableToken() { | |
| const tokens = loadTokens(); | |
| const now = Date.now(); | |
| const valid = tokens.filter(t => (!t.resetAt || new Date(t.resetAt).getTime() <= now) && !t.invalid); | |
| if (!valid.length) return null; | |
| const token = valid[pointer % valid.length]; | |
| pointer = (pointer + 1) % valid.length; | |
| return token; | |
| } | |
| export function hasValidTokens() { | |
| const tokens = loadTokens(); | |
| const now = Date.now(); | |
| return tokens.some(t => (!t.resetAt || new Date(t.resetAt).getTime() <= now) && !t.invalid); | |
| } | |
| export function markRateLimited(id, hours = 24) { | |
| const tokens = loadTokens(); | |
| const idx = tokens.findIndex(t => t.id === id); | |
| if (idx !== -1) { | |
| const until = new Date(Date.now() + hours * 3600 * 1000).toISOString(); | |
| tokens[idx].resetAt = until; | |
| saveTokens(tokens); | |
| } | |
| } | |
| export function removeToken(id) { | |
| const tokens = loadTokens(); | |
| const filtered = tokens.filter(t => t.id !== id); | |
| saveTokens(filtered); | |
| } | |
| export { removeToken as removeInvalidToken }; | |
| export function markInvalid(id) { | |
| const tokens = loadTokens(); | |
| const idx = tokens.findIndex(t => t.id === id); | |
| if (idx !== -1) { | |
| tokens[idx].invalid = true; | |
| saveTokens(tokens); | |
| } | |
| } | |
| export function markValid(id, newToken) { | |
| const tokens = loadTokens(); | |
| const idx = tokens.findIndex(t => t.id === id); | |
| if (idx !== -1) { | |
| tokens[idx].invalid = false; | |
| tokens[idx].resetAt = null; | |
| if (newToken) tokens[idx].token = newToken; | |
| saveTokens(tokens); | |
| } | |
| } | |
| export function listTokens() { | |
| return loadTokens(); | |
| } |