diff --git a/plugins/alert.py b/plugins/alert.py index c606096..bf6f7a4 100644 --- a/plugins/alert.py +++ b/plugins/alert.py @@ -109,12 +109,16 @@ def _db() -> sqlite3.Connection: short_id TEXT NOT NULL DEFAULT '' ) """) - try: - _conn.execute( - "ALTER TABLE results ADD COLUMN short_id TEXT NOT NULL DEFAULT ''" - ) - except sqlite3.OperationalError: - pass # column already exists + for col, default in [ + ("short_id", "''"), + ("short_url", "''"), + ]: + try: + _conn.execute( + f"ALTER TABLE results ADD COLUMN {col} TEXT NOT NULL DEFAULT {default}" + ) + except sqlite3.OperationalError: + pass # column already exists _conn.execute( "CREATE INDEX IF NOT EXISTS idx_results_alert ON results(channel, alert)" ) @@ -133,14 +137,16 @@ def _db() -> sqlite3.Connection: return _conn -def _save_result(channel: str, alert: str, backend: str, item: dict) -> str: +def _save_result(channel: str, alert: str, backend: str, item: dict, + short_url: str = "") -> str: """Persist a matched result to the history database. Returns short_id.""" short_id = _make_short_id(backend, item.get("id", "")) db = _db() db.execute( "INSERT INTO results" - " (channel, alert, backend, item_id, title, url, date, found_at, short_id)" - " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", + " (channel, alert, backend, item_id, title, url, date, found_at," + " short_id, short_url)" + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", ( channel, alert, @@ -151,6 +157,7 @@ def _save_result(channel: str, alert: str, backend: str, item: dict) -> str: item.get("date", ""), datetime.now(timezone.utc).isoformat(), short_id, + short_url, ), ) db.commit() @@ -1755,23 +1762,31 @@ async def _poll_once(bot, key: str, announce: bool = True) -> None: name = data["name"] fp = bot.registry._modules.get("flaskpaste") for item in matched: - short_id = _save_result(channel, name, tag, item) - title = _truncate(item["title"]) if item["title"] else "(no title)" url = item["url"] + display_url = url + short_url = "" if fp and url: try: - url = await loop.run_in_executor( + short_url = await loop.run_in_executor( None, fp.shorten_url, bot, url, ) + if short_url != url: + display_url = short_url + else: + short_url = "" except Exception: pass + short_id = _save_result( + channel, name, tag, item, short_url=short_url, + ) + title = _truncate(item["title"]) if item["title"] else "(no title)" date = item.get("date", "") line = f"[{name}/{tag}/{short_id}]" if date: line += f" ({date})" line += f" {title}" - if url: - line += f" -- {url}" + if display_url: + line += f" -- {display_url}" await bot.send(channel, line) for item in new_items: @@ -1937,7 +1952,8 @@ async def cmd_alert(bot, message): limit = 5 db = _db() rows = db.execute( - "SELECT backend, title, url, date, found_at, short_id FROM results" + "SELECT id, backend, title, url, date, found_at, short_id," + " short_url FROM results" " WHERE channel = ? AND alert = ? ORDER BY id DESC LIMIT ?", (channel, name, limit), ).fetchall() @@ -1946,19 +1962,27 @@ async def cmd_alert(bot, message): return loop = asyncio.get_running_loop() fp = bot.registry._modules.get("flaskpaste") - for backend, title, url, date, found_at, short_id in reversed(rows): + for row_id, backend, title, url, date, found_at, short_id, short_url in reversed(rows): ts = found_at[:10] title = _truncate(title) if title else "(no title)" - if fp and url: + display_url = short_url or url + if fp and url and not short_url: try: - url = await loop.run_in_executor( + new_short = await loop.run_in_executor( None, fp.shorten_url, bot, url, ) + if new_short != url: + display_url = new_short + db.execute( + "UPDATE results SET short_url = ? WHERE id = ?", + (new_short, row_id), + ) + db.commit() except Exception: pass line = f"[{name}/{backend}/{short_id}] ({date or ts}) {title}" - if url: - line += f" -- {url}" + if display_url: + line += f" -- {display_url}" await bot.reply(message, line) return