""" Общая SQLite-база для farmer.py и controller.py. Аккаунты (включая api_id/api_hash/session_name) регистрируются полностью через меню в controller.py — никакого ручного редактирования JSON. """ import sqlite3 import time import os DB_PATH = os.path.join(os.path.dirname(__file__), "farm_state.db") def _connect(): conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row return conn def init_db(): conn = _connect() conn.execute(""" CREATE TABLE IF NOT EXISTS accounts ( name TEXT PRIMARY KEY, api_id INTEGER NOT NULL, api_hash TEXT NOT NULL, session_name TEXT NOT NULL, phone TEXT, target_chat TEXT NOT NULL DEFAULT '', farm_command TEXT NOT NULL DEFAULT '', interval_hours REAL NOT NULL DEFAULT 4, last_farm_ts REAL NOT NULL DEFAULT 0, paused INTEGER NOT NULL DEFAULT 1, last_response TEXT DEFAULT '', session_ready INTEGER NOT NULL DEFAULT 0 ) """) conn.commit() conn.close() def account_exists(name): conn = _connect() row = conn.execute("SELECT 1 FROM accounts WHERE name = ?", (name,)).fetchone() conn.close() return row is not None def add_account(name, api_id, api_hash, session_name, phone): conn = _connect() conn.execute( """INSERT INTO accounts (name, api_id, api_hash, session_name, phone, paused) VALUES (?, ?, ?, ?, ?, 1)""", (name, api_id, api_hash, session_name, phone), ) conn.commit() conn.close() def remove_account(name): conn = _connect() conn.execute("DELETE FROM accounts WHERE name = ?", (name,)) conn.commit() conn.close() def mark_session_ready(name): conn = _connect() conn.execute("UPDATE accounts SET session_ready = 1 WHERE name = ?", (name,)) conn.commit() conn.close() def set_target(name, target_chat, farm_command): conn = _connect() conn.execute( "UPDATE accounts SET target_chat = ?, farm_command = ? WHERE name = ?", (target_chat, farm_command, name), ) conn.commit() conn.close() def get_state(name): conn = _connect() row = conn.execute("SELECT * FROM accounts WHERE name = ?", (name,)).fetchone() conn.close() return dict(row) if row else None def get_all_states(): conn = _connect() rows = conn.execute("SELECT * FROM accounts ORDER BY name").fetchall() conn.close() return [dict(r) for r in rows] def update_last_farm(name, ts=None): ts = ts if ts is not None else time.time() conn = _connect() conn.execute("UPDATE accounts SET last_farm_ts = ? WHERE name = ?", (ts, name)) conn.commit() conn.close() def set_paused(name, paused: bool): conn = _connect() if name == "all": conn.execute("UPDATE accounts SET paused = ?", (int(paused),)) else: conn.execute("UPDATE accounts SET paused = ? WHERE name = ?", (int(paused), name)) conn.commit() conn.close() def set_interval(name, hours: float): conn = _connect() conn.execute("UPDATE accounts SET interval_hours = ? WHERE name = ?", (hours, name)) conn.commit() conn.close() def force_farm_now(name): conn = _connect() conn.execute("UPDATE accounts SET last_farm_ts = 0 WHERE name = ?", (name,)) conn.commit() conn.close() def save_response(name, text: str): conn = _connect() conn.execute( "UPDATE accounts SET last_response = ? WHERE name = ?", (text[:300], name), ) conn.commit() conn.close()