feat: add clip-vault clipboard history daemon with webhook fanout
This commit is contained in:
commit
013c550047
8 files changed
+549
No files matched your search
@@ -0,0 +1,100 @@
|
||||
import os
|
||||
import sqlite3
|
||||
import time
|
||||
|
||||
from clip_vault.config import configDir, dbPath
|
||||
|
||||
|
||||
def connect():
|
||||
os.makedirs(configDir, exist_ok=True)
|
||||
connection = sqlite3.connect(dbPath)
|
||||
connection.execute("""
|
||||
CREATE TABLE IF NOT EXISTS clips (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
content TEXT NOT NULL,
|
||||
contentHash TEXT NOT NULL,
|
||||
sourceWindow TEXT,
|
||||
createdAt REAL NOT NULL,
|
||||
pinned INTEGER NOT NULL DEFAULT 0,
|
||||
webhookSentTo TEXT
|
||||
)
|
||||
""")
|
||||
connection.execute("CREATE INDEX IF NOT EXISTS idxContentHash ON clips(contentHash)")
|
||||
return connection
|
||||
|
||||
|
||||
def addClip(content, contentHash, sourceWindow, webhookSentTo=None):
|
||||
connection = connect()
|
||||
existing = connection.execute(
|
||||
"SELECT id FROM clips WHERE contentHash = ? ORDER BY id DESC LIMIT 1", (contentHash,)
|
||||
).fetchone()
|
||||
if existing:
|
||||
connection.execute("DELETE FROM clips WHERE id = ?", (existing[0],))
|
||||
connection.execute(
|
||||
"INSERT INTO clips (content, contentHash, sourceWindow, createdAt, pinned, webhookSentTo) VALUES (?, ?, ?, ?, 0, ?)",
|
||||
(content, contentHash, sourceWindow, time.time(), webhookSentTo),
|
||||
)
|
||||
connection.commit()
|
||||
connection.close()
|
||||
|
||||
|
||||
def trimHistory(maxHistory):
|
||||
connection = connect()
|
||||
connection.execute(
|
||||
"""
|
||||
DELETE FROM clips WHERE id IN (
|
||||
SELECT id FROM clips WHERE pinned = 0
|
||||
ORDER BY createdAt DESC LIMIT -1 OFFSET ?
|
||||
)
|
||||
""",
|
||||
(maxHistory,),
|
||||
)
|
||||
connection.commit()
|
||||
connection.close()
|
||||
|
||||
|
||||
def listClips(limit=50, search=None):
|
||||
connection = connect()
|
||||
if search:
|
||||
rows = connection.execute(
|
||||
"SELECT id, content, sourceWindow, createdAt, pinned FROM clips WHERE content LIKE ? ORDER BY createdAt DESC LIMIT ?",
|
||||
(f"%{search}%", limit),
|
||||
).fetchall()
|
||||
else:
|
||||
rows = connection.execute(
|
||||
"SELECT id, content, sourceWindow, createdAt, pinned FROM clips ORDER BY createdAt DESC LIMIT ?",
|
||||
(limit,),
|
||||
).fetchall()
|
||||
connection.close()
|
||||
return rows
|
||||
|
||||
|
||||
def getClip(clipId):
|
||||
connection = connect()
|
||||
row = connection.execute("SELECT id, content, sourceWindow, createdAt, pinned FROM clips WHERE id = ?", (clipId,)).fetchone()
|
||||
connection.close()
|
||||
return row
|
||||
|
||||
|
||||
def setPinned(clipId, pinned):
|
||||
connection = connect()
|
||||
connection.execute("UPDATE clips SET pinned = ? WHERE id = ?", (1 if pinned else 0, clipId))
|
||||
connection.commit()
|
||||
connection.close()
|
||||
|
||||
|
||||
def deleteClip(clipId):
|
||||
connection = connect()
|
||||
connection.execute("DELETE FROM clips WHERE id = ?", (clipId,))
|
||||
connection.commit()
|
||||
connection.close()
|
||||
|
||||
|
||||
def clearHistory(keepPinned=True):
|
||||
connection = connect()
|
||||
if keepPinned:
|
||||
connection.execute("DELETE FROM clips WHERE pinned = 0")
|
||||
else:
|
||||
connection.execute("DELETE FROM clips")
|
||||
connection.commit()
|
||||
connection.close()
|
||||
Reference in new issue
Block a user