mirror of
https://git.squeakyrat.moe/faggot-chan/
synced 2026-11-04 18:35:45 +01:00
39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
#!/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()]
|