aboutsummaryrefslogtreecommitdiff
path: root/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'utils.py')
-rw-r--r--utils.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/utils.py b/utils.py
new file mode 100644
index 0000000..aea653b
--- /dev/null
+++ b/utils.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python3
+from pathlib import Path
+from datetime import datetime
+
+
+def now_str() -> str:
+ return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+
+
+def nots(line: str) -> str:
+ if line.startswith("[") and "]" in line:
+ return line.split("]", 1)[1].lstrip()
+ return line
+
+
+def tail_lines(path: Path, n: int) -> list[str]:
+ # grabs the last n lines without reading the whole file into memory first,
+ # since memory.txt only ever grows and reading it fully every message doesn't scale
+ if n <= 0:
+ return []
+ avg_line_bytes = 200
+ with path.open("rb") as f:
+ f.seek(0, 2)
+ file_size = f.tell()
+ if file_size == 0:
+ return []
+ block_size = n * avg_line_bytes
+ data = b""
+ lines = []
+ while True:
+ seek_pos = max(file_size - block_size, 0)
+ f.seek(seek_pos)
+ data = f.read(file_size - seek_pos)
+ lines = data.splitlines()
+ if len(lines) > n or seek_pos == 0:
+ break
+ block_size *= 2
+ return [l.decode("utf-8", errors="ignore").strip() for l in lines[-n:] if l.strip()]