138 lines
3.6 KiB
Python
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()
|