pybot/db.py
2026-09-03 23:15:10 +03:00

138 lines
3.6 KiB
Python

"""
Общая 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()