111 lines
2.8 KiB
Python
Executable File
111 lines
2.8 KiB
Python
Executable File
import json
|
|
from glob import glob
|
|
from time import time_ns
|
|
import datetime
|
|
import os
|
|
from sys import argv
|
|
from subprocess import run
|
|
import tempfile
|
|
|
|
home = os.path.expanduser("~/.bink")
|
|
max_body_length = 64_000
|
|
|
|
try:
|
|
os.mkdir(home)
|
|
except FileExistsError:
|
|
pass
|
|
|
|
try:
|
|
editor = os.environ["EDITOR"]
|
|
except KeyError:
|
|
editor = "nano"
|
|
|
|
def create_post(body):
|
|
with open(f"{home}/{time_ns()}", "w", encoding="UTF-8") as f:
|
|
f.write(body)
|
|
|
|
def file_object(path):
|
|
split = path.split("/")
|
|
# example input: /home/nebula/.bink/999
|
|
# output: (999, "nebula", "/home/nebula/.bink/999")
|
|
return (int(split[-1]), split[2], path)
|
|
|
|
def generate_feed(before=None, count=50):
|
|
posts = [file_object(path) for path in glob("/home/**/.bink/*")]
|
|
if before:
|
|
posts = [post for post in posts if post[0] < before]
|
|
posts.sort(key=lambda x: x[0], reverse=True)
|
|
blogs = []
|
|
for time, user, path in posts[:count]:
|
|
# try:
|
|
with open(path, "r", encoding="UTF-8") as f:
|
|
body = f.read()
|
|
# except
|
|
obj = {
|
|
"user": user,
|
|
"time": time,
|
|
"body": body[:max_body_length],
|
|
}
|
|
blogs.append(obj)
|
|
return blogs
|
|
|
|
if "dump" in argv:
|
|
with open("/dev/stdout", "w") as f:
|
|
json.dump(generate_feed(), f)
|
|
exit()
|
|
|
|
import urwid
|
|
|
|
class App(object):
|
|
def __init__(self):
|
|
self.walker = urwid.SimpleListWalker([
|
|
self.post_to_widget(post) for post in generate_feed()
|
|
])
|
|
self.loop = urwid.MainLoop(
|
|
ActionBox(self.walker)
|
|
)
|
|
|
|
def update(self, before=None, count=50):
|
|
self.walker.clear()
|
|
for post in generate_feed(before=before, count=count):
|
|
self.walker.append(self.post_to_widget(post))
|
|
|
|
def post_to_widget(self, post):
|
|
time = post["time"] / 1_000_000_000
|
|
stamp = datetime.datetime.fromtimestamp(time)
|
|
return urwid.Pile([
|
|
urwid.Text([f"~{post['user']}", " @ ", stamp.strftime("%H:%M (%A, %B %d, %Y)")]),
|
|
urwid.Text(f" {post['body']}"),
|
|
urwid.Divider()
|
|
])
|
|
|
|
def write_with_editor(self):
|
|
self.loop.stop()
|
|
tmp = tempfile.NamedTemporaryFile()
|
|
run([editor, tmp.name])
|
|
with open(tmp.name, "r") as f:
|
|
body = f.read().strip()
|
|
if body:
|
|
create_post(body)
|
|
self.update()
|
|
self.loop.start()
|
|
|
|
|
|
class ActionBox(urwid.ListBox):
|
|
def keypress(self, size, key):
|
|
keyl = key.lower()
|
|
if keyl == "c":
|
|
app.write_with_editor()
|
|
elif keyl == "r":
|
|
app.update()
|
|
elif keyl in ("q", "x"):
|
|
app.loop.stop()
|
|
exit()
|
|
return super().keypress(size, key)
|
|
|
|
app = App()
|
|
try:
|
|
app.loop.run()
|
|
except KeyboardInterrupt:
|
|
app.loop.stop()
|